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_new_text ();
113 g_signal_connect (omenu, "changed",
114 G_CALLBACK (func), data);
116 for (i = 0; i < num_items; i++)
117 gtk_combo_box_append_text (GTK_COMBO_BOX (omenu), items[i]);
119 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
125 * Windows with an alpha channel
130 on_alpha_window_expose (GtkWidget *widget,
131 GdkEventExpose *expose)
133 GtkAllocation allocation;
135 cairo_pattern_t *pattern;
138 cr = gdk_cairo_create (gtk_widget_get_window (widget));
140 gtk_widget_get_allocation (widget, &allocation);
142 radius = MIN (allocation.width, allocation.height) / 2;
143 pattern = cairo_pattern_create_radial (allocation.width / 2,
144 allocation.height / 2,
146 allocation.width / 2,
147 allocation.height / 2,
150 if (gdk_screen_get_rgba_colormap (gtk_widget_get_screen (widget)) &&
151 gtk_widget_is_composited (widget))
152 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
154 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
156 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
159 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
160 1.0, 0.75, 0.0, 1.0); /* solid orange */
161 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
162 1.0, 0.75, 0.0, 0.0); /* transparent orange */
164 cairo_set_source (cr, pattern);
165 cairo_pattern_destroy (pattern);
167 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
176 build_alpha_widgets (void)
179 GtkWidget *radio_button;
184 table = gtk_table_new (1, 1, FALSE);
186 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
187 gtk_table_attach (GTK_TABLE (table),
190 GTK_EXPAND | GTK_FILL, 0,
193 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
194 gtk_table_attach (GTK_TABLE (table),
197 GTK_EXPAND | GTK_FILL, 0,
200 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
201 gtk_table_attach (GTK_TABLE (table),
204 GTK_EXPAND | GTK_FILL, 0,
207 gtk_table_attach (GTK_TABLE (table),
208 gtk_check_button_new_with_label ("Sedentary"),
210 GTK_EXPAND | GTK_FILL, 0,
212 gtk_table_attach (GTK_TABLE (table),
213 gtk_check_button_new_with_label ("Nocturnal"),
215 GTK_EXPAND | GTK_FILL, 0,
217 gtk_table_attach (GTK_TABLE (table),
218 gtk_check_button_new_with_label ("Compulsive"),
220 GTK_EXPAND | GTK_FILL, 0,
223 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
224 gtk_table_attach (GTK_TABLE (table),
227 GTK_EXPAND | GTK_FILL, 0,
230 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
231 gtk_table_attach (GTK_TABLE (table),
234 GTK_EXPAND | GTK_FILL, 0,
237 hbox = gtk_hbox_new (FALSE, 0);
238 label = gtk_label_new (NULL);
239 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
240 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
241 entry = gtk_entry_new ();
242 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
243 gtk_table_attach (GTK_TABLE (table),
246 GTK_EXPAND | GTK_FILL, 0,
253 on_alpha_screen_changed (GtkWidget *widget,
254 GdkScreen *old_screen,
257 GdkScreen *screen = gtk_widget_get_screen (widget);
258 GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
262 colormap = gdk_screen_get_default_colormap (screen);
263 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
267 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
270 gtk_widget_set_colormap (widget, colormap);
274 on_composited_changed (GtkWidget *window,
277 gboolean is_composited = gtk_widget_is_composited (window);
280 gtk_label_set_text (label, "Composited");
282 gtk_label_set_text (label, "Not composited");
286 create_alpha_window (GtkWidget *widget)
288 static GtkWidget *window;
292 GtkWidget *content_area;
296 window = gtk_dialog_new_with_buttons ("Alpha Window",
297 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
301 gtk_widget_set_app_paintable (window, TRUE);
302 g_signal_connect (window, "expose-event",
303 G_CALLBACK (on_alpha_window_expose), NULL);
305 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
307 vbox = gtk_vbox_new (FALSE, 8);
308 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
309 gtk_box_pack_start (GTK_BOX (content_area), vbox,
312 label = gtk_label_new (NULL);
313 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
314 on_alpha_screen_changed (window, NULL, label);
315 g_signal_connect (window, "screen-changed",
316 G_CALLBACK (on_alpha_screen_changed), label);
318 label = gtk_label_new (NULL);
319 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
320 on_composited_changed (window, GTK_LABEL (label));
321 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
323 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
325 g_signal_connect (window, "destroy",
326 G_CALLBACK (gtk_widget_destroyed),
329 g_signal_connect (window, "response",
330 G_CALLBACK (gtk_widget_destroy),
334 if (!gtk_widget_get_visible (window))
335 gtk_widget_show_all (window);
337 gtk_widget_destroy (window);
341 * Composited non-toplevel window
344 /* The expose event handler for the event box.
346 * This function simply draws a transparency onto a widget on the area
347 * for which it receives expose events. This is intended to give the
348 * event box a "transparent" background.
350 * In order for this to work properly, the widget must have an RGBA
351 * colourmap. The widget should also be set as app-paintable since it
352 * doesn't make sense for GTK to draw a background if we are drawing it
353 * (and because GTK might actually replace our transparency with its
354 * default background colour).
357 transparent_expose (GtkWidget *widget,
358 GdkEventExpose *event)
362 cr = gdk_cairo_create (gtk_widget_get_window (widget));
363 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
364 gdk_cairo_region (cr, event->region);
371 /* The expose event handler for the window.
373 * This function performs the actual compositing of the event box onto
374 * the already-existing background of the window at 50% normal opacity.
376 * In this case we do not want app-paintable to be set on the widget
377 * since we want it to draw its own (red) background. Because of this,
378 * however, we must ensure that we use g_signal_register_after so that
379 * this handler is called after the red has been drawn. If it was
380 * called before then GTK would just blindly paint over our work.
383 window_expose_event (GtkWidget *widget,
384 GdkEventExpose *event)
386 GtkAllocation allocation;
387 cairo_region_t *region;
391 /* get our child (in this case, the event box) */
392 child = gtk_bin_get_child (GTK_BIN (widget));
394 /* create a cairo context to draw to the window */
395 cr = gdk_cairo_create (gtk_widget_get_window (widget));
397 gtk_widget_get_allocation (child, &allocation);
399 /* the source data is the (composited) event box */
400 gdk_cairo_set_source_pixmap (cr, gtk_widget_get_window (child),
404 /* draw no more than our expose event intersects our child */
405 region = cairo_region_create_rectangle (&allocation);
406 cairo_region_intersect (region, event->region);
407 gdk_cairo_region (cr, region);
410 /* composite, with a 50% opacity */
411 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
412 cairo_paint_with_alpha (cr, 0.5);
421 create_composited_window (GtkWidget *widget)
423 static GtkWidget *window;
427 GtkWidget *event, *button;
432 /* make the widgets */
433 button = gtk_button_new_with_label ("A Button");
434 event = gtk_event_box_new ();
435 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
437 g_signal_connect (window, "destroy",
438 G_CALLBACK (gtk_widget_destroyed),
441 /* put a red background on the window */
442 gdk_color_parse ("red", &red);
443 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
445 /* set the colourmap for the event box.
446 * must be done before the event box is realised.
448 screen = gtk_widget_get_screen (event);
449 rgba = gdk_screen_get_rgba_colormap (screen);
450 gtk_widget_set_colormap (event, rgba);
452 /* set our event box to have a fully-transparent background
453 * drawn on it. currently there is no way to simply tell gtk
454 * that "transparency" is the background colour for a widget.
456 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
457 g_signal_connect (event, "expose-event",
458 G_CALLBACK (transparent_expose), NULL);
460 /* put them inside one another */
461 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
462 gtk_container_add (GTK_CONTAINER (window), event);
463 gtk_container_add (GTK_CONTAINER (event), button);
465 /* realise and show everything */
466 gtk_widget_realize (button);
468 /* set the event box GdkWindow to be composited.
469 * obviously must be performed after event box is realised.
471 gdk_window_set_composited (gtk_widget_get_window (event),
474 /* set up the compositing handler.
475 * note that we do _after so that the normal (red) background is drawn
476 * by gtk before our compositing occurs.
478 g_signal_connect_after (window, "expose-event",
479 G_CALLBACK (window_expose_event), NULL);
482 if (!gtk_widget_get_visible (window))
483 gtk_widget_show_all (window);
485 gtk_widget_destroy (window);
489 * Big windows and guffaw scrolling
493 pattern_expose (GtkWidget *widget,
494 GdkEventExpose *event,
498 GdkWindow *window = event->window;
500 color = g_object_get_data (G_OBJECT (window), "pattern-color");
503 cairo_t *cr = gdk_cairo_create (window);
505 gdk_cairo_set_source_color (cr, color);
506 gdk_cairo_rectangle (cr, &event->area);
516 pattern_set_bg (GtkWidget *widget,
520 static const GdkColor colors[] = {
521 { 0, 0x4444, 0x4444, 0xffff },
522 { 0, 0x8888, 0x8888, 0xffff },
523 { 0, 0xaaaa, 0xaaaa, 0xffff }
526 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
527 gdk_window_set_user_data (child, widget);
531 create_pattern (GtkWidget *widget,
542 while (2 * h <= height)
547 while (2 * w <= width)
549 if ((i + j) % 2 == 0)
554 GdkWindowAttr attributes;
556 attributes.window_type = GDK_WINDOW_CHILD;
559 attributes.width = w;
560 attributes.height = h;
561 attributes.wclass = GDK_INPUT_OUTPUT;
562 attributes.event_mask = GDK_EXPOSURE_MASK;
563 attributes.visual = gtk_widget_get_visual (widget);
564 attributes.colormap = gtk_widget_get_colormap (widget);
566 child = gdk_window_new (parent, &attributes,
567 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
569 pattern_set_bg (widget, child, level);
572 create_pattern (widget, child, level + 1, w, h);
574 gdk_window_show (child);
584 #define PATTERN_SIZE (1 << 18)
587 pattern_hadj_changed (GtkAdjustment *adj,
590 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
591 gint new_value = adj->value;
593 if (gtk_widget_get_realized (darea))
595 gdk_window_scroll (gtk_widget_get_window (darea),
596 *old_value - new_value, 0);
597 *old_value = new_value;
602 pattern_vadj_changed (GtkAdjustment *adj,
605 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
606 gint new_value = adj->value;
608 if (gtk_widget_get_realized (darea))
610 gdk_window_scroll (gtk_widget_get_window (darea),
611 0, *old_value - new_value);
612 *old_value = new_value;
617 pattern_realize (GtkWidget *widget,
622 window = gtk_widget_get_window (widget);
623 pattern_set_bg (widget, window, 0);
624 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
628 create_big_windows (GtkWidget *widget)
630 static GtkWidget *window = NULL;
631 GtkWidget *content_area;
632 GtkWidget *darea, *table, *scrollbar;
636 static gint current_x;
637 static gint current_y;
644 window = gtk_dialog_new_with_buttons ("Big Windows",
650 gtk_window_set_screen (GTK_WINDOW (window),
651 gtk_widget_get_screen (widget));
653 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
655 g_signal_connect (window, "destroy",
656 G_CALLBACK (gtk_widget_destroyed),
659 g_signal_connect (window, "response",
660 G_CALLBACK (gtk_widget_destroy),
663 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
665 table = gtk_table_new (2, 2, FALSE);
666 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
668 darea = gtk_drawing_area_new ();
670 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
671 g_signal_connect (hadj, "value_changed",
672 G_CALLBACK (pattern_hadj_changed), darea);
673 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
675 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
676 g_signal_connect (vadj, "value_changed",
677 G_CALLBACK (pattern_vadj_changed), darea);
678 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
680 g_signal_connect (darea, "realize",
681 G_CALLBACK (pattern_realize),
683 g_signal_connect (darea, "expose_event",
684 G_CALLBACK (pattern_expose),
687 eventbox = gtk_event_box_new ();
688 gtk_table_attach (GTK_TABLE (table), eventbox,
690 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
693 gtk_container_add (GTK_CONTAINER (eventbox), darea);
695 scrollbar = gtk_hscrollbar_new (hadj);
696 gtk_table_attach (GTK_TABLE (table), scrollbar,
698 GTK_FILL | GTK_EXPAND, GTK_FILL,
701 scrollbar = gtk_vscrollbar_new (vadj);
702 gtk_table_attach (GTK_TABLE (table), scrollbar,
704 GTK_FILL, GTK_EXPAND | GTK_FILL,
709 if (!gtk_widget_get_visible (window))
710 gtk_widget_show_all (window);
712 gtk_widget_hide (window);
720 button_window (GtkWidget *widget,
723 if (!gtk_widget_get_visible (button))
724 gtk_widget_show (button);
726 gtk_widget_hide (button);
730 create_buttons (GtkWidget *widget)
732 static GtkWidget *window = NULL;
736 GtkWidget *button[10];
737 GtkWidget *separator;
741 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
742 gtk_window_set_screen (GTK_WINDOW (window),
743 gtk_widget_get_screen (widget));
745 g_signal_connect (window, "destroy",
746 G_CALLBACK (gtk_widget_destroyed),
749 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
750 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
752 box1 = gtk_vbox_new (FALSE, 0);
753 gtk_container_add (GTK_CONTAINER (window), box1);
755 table = gtk_table_new (3, 3, FALSE);
756 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
757 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
758 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
759 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
761 button[0] = gtk_button_new_with_label ("button1");
762 button[1] = gtk_button_new_with_mnemonic ("_button2");
763 button[2] = gtk_button_new_with_mnemonic ("_button3");
764 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
765 button[4] = gtk_button_new_with_label ("button5");
766 button[5] = gtk_button_new_with_label ("button6");
767 button[6] = gtk_button_new_with_label ("button7");
768 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
769 button[8] = gtk_button_new_with_label ("button9");
771 g_signal_connect (button[0], "clicked",
772 G_CALLBACK (button_window),
775 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
776 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
778 g_signal_connect (button[1], "clicked",
779 G_CALLBACK (button_window),
782 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
783 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
785 g_signal_connect (button[2], "clicked",
786 G_CALLBACK (button_window),
788 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
789 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
791 g_signal_connect (button[3], "clicked",
792 G_CALLBACK (button_window),
794 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
795 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
797 g_signal_connect (button[4], "clicked",
798 G_CALLBACK (button_window),
800 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
801 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
803 g_signal_connect (button[5], "clicked",
804 G_CALLBACK (button_window),
806 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
807 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
809 g_signal_connect (button[6], "clicked",
810 G_CALLBACK (button_window),
812 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
813 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
815 g_signal_connect (button[7], "clicked",
816 G_CALLBACK (button_window),
818 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
819 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
821 g_signal_connect (button[8], "clicked",
822 G_CALLBACK (button_window),
824 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
825 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
827 separator = gtk_hseparator_new ();
828 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
830 box2 = gtk_vbox_new (FALSE, 10);
831 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
832 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
834 button[9] = gtk_button_new_with_label ("close");
835 g_signal_connect_swapped (button[9], "clicked",
836 G_CALLBACK (gtk_widget_destroy),
838 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
839 gtk_widget_set_can_default (button[9], TRUE);
840 gtk_widget_grab_default (button[9]);
843 if (!gtk_widget_get_visible (window))
844 gtk_widget_show_all (window);
846 gtk_widget_destroy (window);
854 create_toggle_buttons (GtkWidget *widget)
856 static GtkWidget *window = NULL;
860 GtkWidget *separator;
864 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
865 gtk_window_set_screen (GTK_WINDOW (window),
866 gtk_widget_get_screen (widget));
868 g_signal_connect (window, "destroy",
869 G_CALLBACK (gtk_widget_destroyed),
872 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
873 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
875 box1 = gtk_vbox_new (FALSE, 0);
876 gtk_container_add (GTK_CONTAINER (window), box1);
878 box2 = gtk_vbox_new (FALSE, 10);
879 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
880 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
882 button = gtk_toggle_button_new_with_label ("button1");
883 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
885 button = gtk_toggle_button_new_with_label ("button2");
886 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
888 button = gtk_toggle_button_new_with_label ("button3");
889 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
891 button = gtk_toggle_button_new_with_label ("inconsistent");
892 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
893 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
895 separator = gtk_hseparator_new ();
896 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
898 box2 = gtk_vbox_new (FALSE, 10);
899 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
900 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
902 button = gtk_button_new_with_label ("close");
903 g_signal_connect_swapped (button, "clicked",
904 G_CALLBACK (gtk_widget_destroy),
906 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
907 gtk_widget_set_can_default (button, TRUE);
908 gtk_widget_grab_default (button);
911 if (!gtk_widget_get_visible (window))
912 gtk_widget_show_all (window);
914 gtk_widget_destroy (window);
918 create_widget_grid (GType widget_type)
921 GtkWidget *group_widget = NULL;
924 table = gtk_table_new (FALSE, 3, 3);
926 for (i = 0; i < 5; i++)
928 for (j = 0; j < 5; j++)
933 if (i == 0 && j == 0)
939 tmp = g_strdup_printf ("%d", j);
940 widget = gtk_label_new (tmp);
945 tmp = g_strdup_printf ("%c", 'A' + i - 1);
946 widget = gtk_label_new (tmp);
951 widget = g_object_new (widget_type, NULL);
953 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
956 group_widget = widget;
958 g_object_set (widget, "group", group_widget, NULL);
963 gtk_table_attach (GTK_TABLE (table), widget,
978 create_check_buttons (GtkWidget *widget)
980 static GtkWidget *window = NULL;
984 GtkWidget *separator;
989 window = gtk_dialog_new_with_buttons ("Check Buttons",
995 gtk_window_set_screen (GTK_WINDOW (window),
996 gtk_widget_get_screen (widget));
998 g_signal_connect (window, "destroy",
999 G_CALLBACK (gtk_widget_destroyed),
1001 g_signal_connect (window, "response",
1002 G_CALLBACK (gtk_widget_destroy),
1005 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1007 box2 = gtk_vbox_new (FALSE, 10);
1008 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1009 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1011 button = gtk_check_button_new_with_mnemonic ("_button1");
1012 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1014 button = gtk_check_button_new_with_label ("button2");
1015 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1017 button = gtk_check_button_new_with_label ("button3");
1018 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1020 button = gtk_check_button_new_with_label ("inconsistent");
1021 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1022 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1024 separator = gtk_hseparator_new ();
1025 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1027 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
1028 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1029 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1032 if (!gtk_widget_get_visible (window))
1033 gtk_widget_show_all (window);
1035 gtk_widget_destroy (window);
1043 create_radio_buttons (GtkWidget *widget)
1045 static GtkWidget *window = NULL;
1049 GtkWidget *separator;
1054 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1060 gtk_window_set_screen (GTK_WINDOW (window),
1061 gtk_widget_get_screen (widget));
1063 g_signal_connect (window, "destroy",
1064 G_CALLBACK (gtk_widget_destroyed),
1066 g_signal_connect (window, "response",
1067 G_CALLBACK (gtk_widget_destroy),
1070 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1072 box2 = gtk_vbox_new (FALSE, 10);
1073 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1074 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1076 button = gtk_radio_button_new_with_label (NULL, "button1");
1077 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1079 button = gtk_radio_button_new_with_label (
1080 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1082 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1083 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1085 button = gtk_radio_button_new_with_label (
1086 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1088 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1090 button = gtk_radio_button_new_with_label (
1091 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1093 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1094 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1096 separator = gtk_hseparator_new ();
1097 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1099 box2 = gtk_vbox_new (FALSE, 10);
1100 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1101 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1103 button = gtk_radio_button_new_with_label (NULL, "button4");
1104 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1105 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1107 button = gtk_radio_button_new_with_label (
1108 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1110 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1111 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1112 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1114 button = gtk_radio_button_new_with_label (
1115 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1117 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1118 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1120 separator = gtk_hseparator_new ();
1121 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1123 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1124 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1125 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1128 if (!gtk_widget_get_visible (window))
1129 gtk_widget_show_all (window);
1131 gtk_widget_destroy (window);
1139 create_bbox (gint horizontal,
1150 frame = gtk_frame_new (title);
1153 bbox = gtk_hbutton_box_new ();
1155 bbox = gtk_vbutton_box_new ();
1157 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1158 gtk_container_add (GTK_CONTAINER (frame), bbox);
1160 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1161 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1163 button = gtk_button_new_with_label ("OK");
1164 gtk_container_add (GTK_CONTAINER (bbox), button);
1166 button = gtk_button_new_with_label ("Cancel");
1167 gtk_container_add (GTK_CONTAINER (bbox), button);
1169 button = gtk_button_new_with_label ("Help");
1170 gtk_container_add (GTK_CONTAINER (bbox), button);
1176 create_button_box (GtkWidget *widget)
1178 static GtkWidget* window = NULL;
1179 GtkWidget *main_vbox;
1182 GtkWidget *frame_horz;
1183 GtkWidget *frame_vert;
1187 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1188 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1189 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1191 g_signal_connect (window, "destroy",
1192 G_CALLBACK (gtk_widget_destroyed),
1195 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1197 main_vbox = gtk_vbox_new (FALSE, 0);
1198 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1200 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1201 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1203 vbox = gtk_vbox_new (FALSE, 0);
1204 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1205 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1207 gtk_box_pack_start (GTK_BOX (vbox),
1208 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1211 gtk_box_pack_start (GTK_BOX (vbox),
1212 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1215 gtk_box_pack_start (GTK_BOX (vbox),
1216 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1219 gtk_box_pack_start (GTK_BOX (vbox),
1220 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1223 gtk_box_pack_start (GTK_BOX (vbox),
1224 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1227 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1228 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1230 hbox = gtk_hbox_new (FALSE, 0);
1231 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1232 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1234 gtk_box_pack_start (GTK_BOX (hbox),
1235 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1238 gtk_box_pack_start (GTK_BOX (hbox),
1239 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1242 gtk_box_pack_start (GTK_BOX (hbox),
1243 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1246 gtk_box_pack_start (GTK_BOX (hbox),
1247 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1250 gtk_box_pack_start (GTK_BOX (hbox),
1251 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1255 if (!gtk_widget_get_visible (window))
1256 gtk_widget_show_all (window);
1258 gtk_widget_destroy (window);
1266 new_pixbuf (char *filename,
1268 GdkColor *background)
1273 if (strcmp (filename, "test.xpm") == 0)
1276 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1279 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1281 widget = gtk_image_new_from_pixbuf (pixbuf);
1283 g_object_unref (pixbuf);
1290 set_toolbar_small_stock (GtkWidget *widget,
1293 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1297 set_toolbar_large_stock (GtkWidget *widget,
1300 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1304 set_toolbar_horizontal (GtkWidget *widget,
1307 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1311 set_toolbar_vertical (GtkWidget *widget,
1314 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1318 set_toolbar_icons (GtkWidget *widget,
1321 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1325 set_toolbar_text (GtkWidget *widget,
1328 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1332 set_toolbar_both (GtkWidget *widget,
1335 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1339 set_toolbar_both_horiz (GtkWidget *widget,
1342 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1346 set_toolbar_enable (GtkWidget *widget,
1349 GtkSettings *settings = gtk_widget_get_settings (widget);
1350 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1354 set_toolbar_disable (GtkWidget *widget,
1357 GtkSettings *settings = gtk_widget_get_settings (widget);
1358 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1361 static GtkActionEntry create_toolbar_items[] = {
1362 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1363 G_CALLBACK (set_toolbar_small_stock) },
1364 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1365 G_CALLBACK (set_toolbar_large_stock) },
1366 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1367 G_CALLBACK (set_toolbar_horizontal) },
1368 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1369 G_CALLBACK (set_toolbar_vertical) },
1371 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1372 G_CALLBACK (set_toolbar_icons) },
1373 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1374 G_CALLBACK (set_toolbar_text) },
1375 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1376 G_CALLBACK (set_toolbar_both) },
1377 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1378 G_CALLBACK (set_toolbar_both_horiz) },
1380 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1384 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1385 G_CALLBACK (set_toolbar_enable) },
1386 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1387 G_CALLBACK (set_toolbar_disable) },
1389 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1391 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1394 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1396 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1401 create_toolbar (GtkWidget *widget)
1403 static GtkWidget *window = NULL;
1410 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1411 gtk_window_set_screen (GTK_WINDOW (window),
1412 gtk_widget_get_screen (widget));
1414 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1416 g_signal_connect (window, "destroy",
1417 G_CALLBACK (gtk_widget_destroyed),
1420 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1421 gtk_widget_realize (window);
1423 toolbar = gtk_toolbar_new ();
1424 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1426 GtkToolItem *toolitem;
1428 if (create_toolbar_items[i].tooltip == NULL)
1429 toolitem = gtk_separator_tool_item_new ();
1430 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1434 toolitem = gtk_tool_item_new ();
1435 entry = gtk_entry_new ();
1436 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1438 else if (create_toolbar_items[i].stock_id)
1439 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1444 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window),
1445 >k_widget_get_style (window)->bg[GTK_STATE_NORMAL]);
1446 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1448 if (create_toolbar_items[i].callback)
1449 g_signal_connect (toolitem, "clicked",
1450 create_toolbar_items[i].callback, toolbar);
1451 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1452 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1455 gtk_container_add (GTK_CONTAINER (window), toolbar);
1457 gtk_widget_set_size_request (toolbar, 200, -1);
1460 if (!gtk_widget_get_visible (window))
1461 gtk_widget_show_all (window);
1463 gtk_widget_destroy (window);
1466 static GtkActionEntry make_toolbar_items[] = {
1467 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1468 G_CALLBACK (set_toolbar_horizontal) },
1469 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1470 G_CALLBACK (set_toolbar_vertical) },
1472 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1473 G_CALLBACK (set_toolbar_icons) },
1474 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1475 G_CALLBACK (set_toolbar_text) },
1476 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1477 G_CALLBACK (set_toolbar_both) },
1479 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1481 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1484 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1485 G_CALLBACK (set_toolbar_enable) },
1486 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1487 G_CALLBACK (set_toolbar_disable) },
1489 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1491 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1496 make_toolbar (GtkWidget *window)
1501 if (!gtk_widget_get_realized (window))
1502 gtk_widget_realize (window);
1504 toolbar = gtk_toolbar_new ();
1505 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1508 GtkToolItem *toolitem;
1510 if (make_toolbar_items[i].label == NULL)
1512 toolitem = gtk_separator_tool_item_new ();
1515 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window),
1516 >k_widget_get_style (window)->bg[GTK_STATE_NORMAL]);
1517 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1518 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1519 if (make_toolbar_items[i].callback != NULL)
1520 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1521 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1531 static guint statusbar_counter = 1;
1534 statusbar_push (GtkWidget *button,
1535 GtkStatusbar *statusbar)
1539 sprintf (text, "something %d", statusbar_counter++);
1541 gtk_statusbar_push (statusbar, 1, text);
1545 statusbar_push_long (GtkWidget *button,
1546 GtkStatusbar *statusbar)
1550 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\").");
1552 gtk_statusbar_push (statusbar, 1, text);
1556 statusbar_pop (GtkWidget *button,
1557 GtkStatusbar *statusbar)
1559 gtk_statusbar_pop (statusbar, 1);
1563 statusbar_steal (GtkWidget *button,
1564 GtkStatusbar *statusbar)
1566 gtk_statusbar_remove (statusbar, 1, 4);
1570 statusbar_popped (GtkStatusbar *statusbar,
1575 statusbar_counter = 1;
1579 statusbar_contexts (GtkStatusbar *statusbar)
1583 string = "any context";
1584 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1586 gtk_statusbar_get_context_id (statusbar, string));
1588 string = "idle messages";
1589 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1591 gtk_statusbar_get_context_id (statusbar, string));
1593 string = "some text";
1594 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1596 gtk_statusbar_get_context_id (statusbar, string));
1598 string = "hit the mouse";
1599 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1601 gtk_statusbar_get_context_id (statusbar, string));
1603 string = "hit the mouse2";
1604 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1606 gtk_statusbar_get_context_id (statusbar, string));
1610 create_statusbar (GtkWidget *widget)
1612 static GtkWidget *window = NULL;
1616 GtkWidget *separator;
1617 GtkWidget *statusbar;
1621 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1622 gtk_window_set_screen (GTK_WINDOW (window),
1623 gtk_widget_get_screen (widget));
1625 g_signal_connect (window, "destroy",
1626 G_CALLBACK (gtk_widget_destroyed),
1629 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1630 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1632 box1 = gtk_vbox_new (FALSE, 0);
1633 gtk_container_add (GTK_CONTAINER (window), box1);
1635 box2 = gtk_vbox_new (FALSE, 10);
1636 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1637 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1639 statusbar = gtk_statusbar_new ();
1640 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1641 g_signal_connect (statusbar,
1643 G_CALLBACK (statusbar_popped),
1646 button = g_object_new (gtk_button_get_type (),
1647 "label", "push something",
1651 g_object_connect (button,
1652 "signal::clicked", statusbar_push, statusbar,
1655 button = g_object_connect (g_object_new (gtk_button_get_type (),
1660 "signal_after::clicked", statusbar_pop, statusbar,
1663 button = g_object_connect (g_object_new (gtk_button_get_type (),
1664 "label", "steal #4",
1668 "signal_after::clicked", statusbar_steal, statusbar,
1671 button = g_object_connect (g_object_new (gtk_button_get_type (),
1672 "label", "test contexts",
1676 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1679 button = g_object_connect (g_object_new (gtk_button_get_type (),
1680 "label", "push something long",
1684 "signal_after::clicked", statusbar_push_long, statusbar,
1687 separator = gtk_hseparator_new ();
1688 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1690 box2 = gtk_vbox_new (FALSE, 10);
1691 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1692 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1694 button = gtk_button_new_with_label ("close");
1695 g_signal_connect_swapped (button, "clicked",
1696 G_CALLBACK (gtk_widget_destroy),
1698 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1699 gtk_widget_set_can_default (button, TRUE);
1700 gtk_widget_grab_default (button);
1703 if (!gtk_widget_get_visible (window))
1704 gtk_widget_show_all (window);
1706 gtk_widget_destroy (window);
1712 #define GRID_SIZE 20
1713 #define DEFAULT_GEOMETRY "10x10"
1716 gridded_geometry_expose (GtkWidget *widget,
1717 GdkEventExpose *event)
1719 GtkAllocation allocation;
1725 gtk_widget_get_allocation (widget, &allocation);
1726 style = gtk_widget_get_style (widget);
1727 state = gtk_widget_get_state (widget);
1729 cr = gdk_cairo_create (gtk_widget_get_window (widget));
1731 cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
1732 gdk_cairo_set_source_color (cr, &style->base[state]);
1735 for (i = 0 ; i * GRID_SIZE < allocation.width; i++)
1736 for (j = 0 ; j * GRID_SIZE < allocation.height; j++)
1738 if ((i + j) % 2 == 0)
1739 cairo_rectangle (cr, i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1742 gdk_cairo_set_source_color (cr, &style->text[state]);
1751 gridded_geometry_subresponse (GtkDialog *dialog,
1753 gchar *geometry_string)
1755 if (response_id == GTK_RESPONSE_NONE)
1757 gtk_widget_destroy (GTK_WIDGET (dialog));
1761 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1763 g_print ("Can't parse geometry string %s\n", geometry_string);
1764 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1770 gridded_geometry_response (GtkDialog *dialog,
1774 if (response_id == GTK_RESPONSE_NONE)
1776 gtk_widget_destroy (GTK_WIDGET (dialog));
1780 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1781 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1782 GtkWidget *content_area;
1784 GtkWidget *drawing_area;
1786 GdkGeometry geometry;
1788 window = gtk_dialog_new_with_buttons (title,
1791 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1794 gtk_window_set_screen (GTK_WINDOW (window),
1795 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1797 g_signal_connect (window, "response",
1798 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1800 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1802 box = gtk_vbox_new (FALSE, 0);
1803 gtk_box_pack_start (GTK_BOX (content_area), box, TRUE, TRUE, 0);
1805 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1807 drawing_area = gtk_drawing_area_new ();
1808 g_signal_connect (drawing_area, "expose_event",
1809 G_CALLBACK (gridded_geometry_expose), NULL);
1810 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1812 /* Gross hack to work around bug 68668... if we set the size request
1813 * large enough, then the current
1815 * request_of_window - request_of_geometry_widget
1817 * method of getting the base size works more or less works.
1819 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1821 geometry.base_width = 0;
1822 geometry.base_height = 0;
1823 geometry.min_width = 2 * GRID_SIZE;
1824 geometry.min_height = 2 * GRID_SIZE;
1825 geometry.width_inc = GRID_SIZE;
1826 geometry.height_inc = GRID_SIZE;
1828 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1830 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1832 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1834 g_print ("Can't parse geometry string %s\n", geometry_string);
1835 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1838 gtk_widget_show_all (window);
1843 create_gridded_geometry (GtkWidget *widget)
1845 static GtkWidget *window = NULL;
1846 gpointer window_ptr;
1847 GtkWidget *content_area;
1853 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1856 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1859 gtk_window_set_screen (GTK_WINDOW (window),
1860 gtk_widget_get_screen (widget));
1862 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1864 label = gtk_label_new ("Geometry string:");
1865 gtk_box_pack_start (GTK_BOX (content_area), label, FALSE, FALSE, 0);
1867 entry = gtk_entry_new ();
1868 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1869 gtk_box_pack_start (GTK_BOX (content_area), entry, FALSE, FALSE, 0);
1871 g_signal_connect (window, "response",
1872 G_CALLBACK (gridded_geometry_response), entry);
1873 window_ptr = &window;
1874 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
1876 gtk_widget_show_all (window);
1879 gtk_widget_destroy (window);
1887 handle_box_child_signal (GtkHandleBox *hb,
1889 const gchar *action)
1891 printf ("%s: child <%s> %sed\n",
1892 g_type_name (G_OBJECT_TYPE (hb)),
1893 g_type_name (G_OBJECT_TYPE (child)),
1898 create_handle_box (GtkWidget *widget)
1900 static GtkWidget* window = NULL;
1901 GtkWidget *handle_box;
1902 GtkWidget *handle_box2;
1907 GtkWidget *separator;
1911 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1913 gtk_window_set_screen (GTK_WINDOW (window),
1914 gtk_widget_get_screen (widget));
1915 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1916 gtk_window_set_title (GTK_WINDOW (window),
1918 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1920 g_signal_connect (window, "destroy",
1921 G_CALLBACK (gtk_widget_destroyed),
1924 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1926 vbox = gtk_vbox_new (FALSE, 0);
1927 gtk_container_add (GTK_CONTAINER (window), vbox);
1928 gtk_widget_show (vbox);
1930 label = gtk_label_new ("Above");
1931 gtk_container_add (GTK_CONTAINER (vbox), label);
1932 gtk_widget_show (label);
1934 separator = gtk_hseparator_new ();
1935 gtk_container_add (GTK_CONTAINER (vbox), separator);
1936 gtk_widget_show (separator);
1938 hbox = gtk_hbox_new (FALSE, 10);
1939 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1940 gtk_widget_show (hbox);
1942 separator = gtk_hseparator_new ();
1943 gtk_container_add (GTK_CONTAINER (vbox), separator);
1944 gtk_widget_show (separator);
1946 label = gtk_label_new ("Below");
1947 gtk_container_add (GTK_CONTAINER (vbox), label);
1948 gtk_widget_show (label);
1950 handle_box = gtk_handle_box_new ();
1951 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1952 g_signal_connect (handle_box,
1954 G_CALLBACK (handle_box_child_signal),
1956 g_signal_connect (handle_box,
1958 G_CALLBACK (handle_box_child_signal),
1960 gtk_widget_show (handle_box);
1962 toolbar = make_toolbar (window);
1964 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1965 gtk_widget_show (toolbar);
1967 handle_box = gtk_handle_box_new ();
1968 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1969 g_signal_connect (handle_box,
1971 G_CALLBACK (handle_box_child_signal),
1973 g_signal_connect (handle_box,
1975 G_CALLBACK (handle_box_child_signal),
1977 gtk_widget_show (handle_box);
1979 handle_box2 = gtk_handle_box_new ();
1980 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1981 g_signal_connect (handle_box2,
1983 G_CALLBACK (handle_box_child_signal),
1985 g_signal_connect (handle_box2,
1987 G_CALLBACK (handle_box_child_signal),
1989 gtk_widget_show (handle_box2);
1991 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
1992 label = gtk_label_new ("Fooo!");
1993 gtk_container_add (GTK_CONTAINER (hbox), label);
1994 gtk_widget_show (label);
1995 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1998 if (!gtk_widget_get_visible (window))
1999 gtk_widget_show (window);
2001 gtk_widget_destroy (window);
2008 sensitivity_toggled (GtkWidget *toggle,
2011 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2015 create_sensitivity_control (GtkWidget *widget)
2019 button = gtk_toggle_button_new_with_label ("Sensitive");
2021 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2022 gtk_widget_is_sensitive (widget));
2024 g_signal_connect (button,
2026 G_CALLBACK (sensitivity_toggled),
2029 gtk_widget_show_all (button);
2035 set_selectable_recursive (GtkWidget *widget,
2038 if (GTK_IS_CONTAINER (widget))
2043 children = gtk_container_get_children (GTK_CONTAINER (widget));
2047 set_selectable_recursive (tmp->data, setting);
2051 g_list_free (children);
2053 else if (GTK_IS_LABEL (widget))
2055 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2060 selectable_toggled (GtkWidget *toggle,
2063 set_selectable_recursive (widget,
2064 GTK_TOGGLE_BUTTON (toggle)->active);
2068 create_selectable_control (GtkWidget *widget)
2072 button = gtk_toggle_button_new_with_label ("Selectable");
2074 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2077 g_signal_connect (button,
2079 G_CALLBACK (selectable_toggled),
2082 gtk_widget_show_all (button);
2088 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
2092 gtk_widget_destroy (dialog);
2094 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2095 "as hyperlinks, which can be clicked\n"
2096 "or activated via <a href=\"keynav\">keynav</a>.\n"
2097 "The links remain the same.";
2098 gtk_label_set_markup (label, text);
2102 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
2104 if (g_strcmp0 (uri, "keynav") == 0)
2108 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
2109 GTK_DIALOG_DESTROY_WITH_PARENT,
2112 "The term <i>keynav</i> is a shorthand for "
2113 "keyboard navigation and refers to the process of using a program "
2114 "(exclusively) via keyboard input.");
2116 gtk_window_present (GTK_WINDOW (dialog));
2118 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
2126 void create_labels (GtkWidget *widget)
2128 static GtkWidget *window = NULL;
2137 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2139 gtk_window_set_screen (GTK_WINDOW (window),
2140 gtk_widget_get_screen (widget));
2142 g_signal_connect (window, "destroy",
2143 G_CALLBACK (gtk_widget_destroyed),
2146 gtk_window_set_title (GTK_WINDOW (window), "Label");
2148 vbox = gtk_vbox_new (FALSE, 5);
2150 hbox = gtk_hbox_new (FALSE, 5);
2151 gtk_container_add (GTK_CONTAINER (window), vbox);
2153 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2155 button = create_sensitivity_control (hbox);
2157 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2159 button = create_selectable_control (hbox);
2161 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2163 vbox = gtk_vbox_new (FALSE, 5);
2165 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2166 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2168 frame = gtk_frame_new ("Normal Label");
2169 label = gtk_label_new ("This is a Normal label");
2170 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2171 gtk_container_add (GTK_CONTAINER (frame), label);
2172 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2174 frame = gtk_frame_new ("Multi-line Label");
2175 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2176 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
2177 gtk_container_add (GTK_CONTAINER (frame), label);
2178 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2180 frame = gtk_frame_new ("Left Justified Label");
2181 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2182 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
2183 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2184 gtk_container_add (GTK_CONTAINER (frame), label);
2185 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2187 frame = gtk_frame_new ("Right Justified Label");
2188 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2189 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2190 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2191 gtk_container_add (GTK_CONTAINER (frame), label);
2192 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2194 frame = gtk_frame_new ("Internationalized Label");
2195 label = gtk_label_new (NULL);
2196 gtk_label_set_markup (GTK_LABEL (label),
2197 "French (Fran\303\247ais) Bonjour, Salut\n"
2198 "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"
2199 "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"
2200 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2201 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2202 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2203 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2204 gtk_container_add (GTK_CONTAINER (frame), label);
2205 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2207 frame = gtk_frame_new ("Bidirection Label");
2208 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"
2209 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
2210 gtk_container_add (GTK_CONTAINER (frame), label);
2211 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2213 frame = gtk_frame_new ("Links in a label");
2214 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2215 "as hyperlinks, which can be clicked\n"
2216 "or activated via <a href=\"keynav\">keynav</a>");
2217 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
2218 gtk_container_add (GTK_CONTAINER (frame), label);
2219 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2220 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
2222 vbox = gtk_vbox_new (FALSE, 5);
2223 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2224 frame = gtk_frame_new ("Line wrapped label");
2225 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2226 "up the entire "/* big space to test spacing */\
2227 "width allocated to it, but automatically wraps the words to fit. "\
2228 "The time has come, for all good men, to come to the aid of their party. "\
2229 "The sixth sheik's six sheep's sick.\n"\
2230 " It supports multiple paragraphs correctly, and correctly adds "\
2231 "many extra spaces. ");
2233 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2234 gtk_container_add (GTK_CONTAINER (frame), label);
2235 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2237 frame = gtk_frame_new ("Filled, wrapped label");
2238 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2239 "up the entire width allocated to it. Here is a seneance to prove "\
2240 "my point. Here is another sentence. "\
2241 "Here comes the sun, do de do de do.\n"\
2242 " This is a new paragraph.\n"\
2243 " This is another newer, longer, better paragraph. It is coming to an end, "\
2245 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2246 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2247 gtk_container_add (GTK_CONTAINER (frame), label);
2248 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2250 frame = gtk_frame_new ("Underlined label");
2251 label = gtk_label_new ("This label is underlined!\n"
2252 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2253 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2254 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2255 gtk_container_add (GTK_CONTAINER (frame), label);
2256 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2258 frame = gtk_frame_new ("Markup label");
2259 label = gtk_label_new (NULL);
2261 /* There's also a gtk_label_set_markup() without accel if you
2262 * don't have an accelerator key
2264 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2265 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2266 "<b>markup</b> _such as "
2267 "<big><i>Big Italics</i></big>\n"
2268 "<tt>Monospace font</tt>\n"
2269 "<u>Underline!</u>\n"
2271 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2272 "and nothing on this line,\n"
2275 "or even on this one\n"
2276 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2277 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2278 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2280 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2282 gtk_container_add (GTK_CONTAINER (frame), label);
2283 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2286 if (!gtk_widget_get_visible (window))
2287 gtk_widget_show_all (window);
2289 gtk_widget_destroy (window);
2293 on_angle_scale_changed (GtkRange *range,
2296 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2300 create_rotated_label (GtkWidget *widget)
2302 static GtkWidget *window = NULL;
2303 GtkWidget *content_area;
2307 GtkWidget *scale_label;
2308 GtkWidget *scale_hbox;
2312 window = gtk_dialog_new_with_buttons ("Rotated Label",
2313 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2314 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2317 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2319 gtk_window_set_screen (GTK_WINDOW (window),
2320 gtk_widget_get_screen (widget));
2322 g_signal_connect (window, "response",
2323 G_CALLBACK (gtk_object_destroy), NULL);
2324 g_signal_connect (window, "destroy",
2325 G_CALLBACK (gtk_widget_destroyed), &window);
2327 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2329 vbox = gtk_vbox_new (FALSE, 5);
2330 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2331 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2333 label = gtk_label_new (NULL);
2334 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2335 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2337 scale_hbox = gtk_hbox_new (FALSE, 0);
2338 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2340 scale_label = gtk_label_new (NULL);
2341 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2342 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2344 hscale = gtk_hscale_new_with_range (0, 360, 5);
2345 g_signal_connect (hscale, "value-changed",
2346 G_CALLBACK (on_angle_scale_changed), label);
2348 gtk_range_set_value (GTK_RANGE (hscale), 45);
2349 gtk_widget_set_size_request (hscale, 200, -1);
2350 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2353 if (!gtk_widget_get_visible (window))
2354 gtk_widget_show_all (window);
2356 gtk_widget_destroy (window);
2359 #define DEFAULT_TEXT_RADIUS 200
2362 on_rotated_text_unrealize (GtkWidget *widget)
2364 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2368 on_rotated_text_expose (GtkWidget *widget,
2369 GdkEventExpose *event,
2370 GdkPixbuf *tile_pixbuf)
2372 GtkAllocation allocation;
2373 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2374 "had", "10,000", "men" };
2378 PangoLayout *layout;
2379 PangoContext *context;
2380 PangoFontDescription *desc;
2383 cr = gdk_cairo_create (event->window);
2387 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2388 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2391 cairo_set_source_rgb (cr, 0, 0, 0);
2393 gtk_widget_get_allocation (widget, &allocation);
2395 radius = MIN (allocation.width, allocation.height) / 2.;
2397 cairo_translate (cr,
2398 radius + (allocation.width - 2 * radius) / 2,
2399 radius + (allocation.height - 2 * radius) / 2);
2400 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2402 context = gtk_widget_get_pango_context (widget);
2403 layout = pango_layout_new (context);
2404 desc = pango_font_description_from_string ("Sans Bold 30");
2405 pango_layout_set_font_description (layout, desc);
2406 pango_font_description_free (desc);
2408 n_words = G_N_ELEMENTS (words);
2409 for (i = 0; i < n_words; i++)
2415 cairo_rotate (cr, 2 * G_PI * i / n_words);
2416 pango_cairo_update_layout (cr, layout);
2418 pango_layout_set_text (layout, words[i], -1);
2419 pango_layout_get_size (layout, &width, &height);
2421 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2422 pango_cairo_show_layout (cr, layout);
2427 g_object_unref (layout);
2434 create_rotated_text (GtkWidget *widget)
2436 static GtkWidget *window = NULL;
2440 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
2441 GtkRequisition requisition;
2442 GtkWidget *content_area;
2443 GtkWidget *drawing_area;
2444 GdkPixbuf *tile_pixbuf;
2446 window = gtk_dialog_new_with_buttons ("Rotated Text",
2447 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2448 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2451 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2453 gtk_window_set_screen (GTK_WINDOW (window),
2454 gtk_widget_get_screen (widget));
2456 g_signal_connect (window, "response",
2457 G_CALLBACK (gtk_object_destroy), NULL);
2458 g_signal_connect (window, "destroy",
2459 G_CALLBACK (gtk_widget_destroyed), &window);
2461 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2463 drawing_area = gtk_drawing_area_new ();
2464 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2465 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
2467 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2469 g_signal_connect (drawing_area, "expose-event",
2470 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
2471 g_signal_connect (drawing_area, "unrealize",
2472 G_CALLBACK (on_rotated_text_unrealize), NULL);
2474 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2476 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2477 gtk_size_request_get_size (GTK_SIZE_REQUEST (window),
2478 &requisition, NULL);
2479 gtk_widget_set_size_request (drawing_area, -1, -1);
2480 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2483 if (!gtk_widget_get_visible (window))
2484 gtk_widget_show (window);
2486 gtk_widget_destroy (window);
2494 reparent_label (GtkWidget *widget,
2495 GtkWidget *new_parent)
2499 label = g_object_get_data (G_OBJECT (widget), "user_data");
2501 gtk_widget_reparent (label, new_parent);
2505 set_parent_signal (GtkWidget *child,
2506 GtkWidget *old_parent,
2511 parent = gtk_widget_get_parent (child);
2512 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2513 g_type_name (G_OBJECT_TYPE (child)),
2514 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2515 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2516 GPOINTER_TO_INT (func_data));
2520 create_reparent (GtkWidget *widget)
2522 static GtkWidget *window = NULL;
2529 GtkWidget *separator;
2530 GtkWidget *event_box;
2534 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2536 gtk_window_set_screen (GTK_WINDOW (window),
2537 gtk_widget_get_screen (widget));
2539 g_signal_connect (window, "destroy",
2540 G_CALLBACK (gtk_widget_destroyed),
2543 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2544 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2546 box1 = gtk_vbox_new (FALSE, 0);
2547 gtk_container_add (GTK_CONTAINER (window), box1);
2549 box2 = gtk_hbox_new (FALSE, 5);
2550 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2551 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2553 label = gtk_label_new ("Hello World");
2555 frame = gtk_frame_new ("Frame 1");
2556 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2558 box3 = gtk_vbox_new (FALSE, 5);
2559 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2560 gtk_container_add (GTK_CONTAINER (frame), box3);
2562 button = gtk_button_new_with_label ("switch");
2563 g_object_set_data (G_OBJECT (button), "user_data", label);
2564 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2566 event_box = gtk_event_box_new ();
2567 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2568 gtk_container_add (GTK_CONTAINER (event_box), label);
2570 g_signal_connect (button, "clicked",
2571 G_CALLBACK (reparent_label),
2574 g_signal_connect (label, "parent_set",
2575 G_CALLBACK (set_parent_signal),
2576 GINT_TO_POINTER (42));
2578 frame = gtk_frame_new ("Frame 2");
2579 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2581 box3 = gtk_vbox_new (FALSE, 5);
2582 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2583 gtk_container_add (GTK_CONTAINER (frame), box3);
2585 button = gtk_button_new_with_label ("switch");
2586 g_object_set_data (G_OBJECT (button), "user_data", label);
2587 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2589 event_box = gtk_event_box_new ();
2590 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2592 g_signal_connect (button, "clicked",
2593 G_CALLBACK (reparent_label),
2596 separator = gtk_hseparator_new ();
2597 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2599 box2 = gtk_vbox_new (FALSE, 10);
2600 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2601 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2603 button = gtk_button_new_with_label ("close");
2604 g_signal_connect_swapped (button, "clicked",
2605 G_CALLBACK (gtk_widget_destroy), window);
2606 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2607 gtk_widget_set_can_default (button, TRUE);
2608 gtk_widget_grab_default (button);
2611 if (!gtk_widget_get_visible (window))
2612 gtk_widget_show_all (window);
2614 gtk_widget_destroy (window);
2621 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2623 if (event->type == GDK_BUTTON_PRESS)
2625 if (event->button == 1)
2626 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2627 event->button, event->x_root, event->y_root,
2629 else if (event->button == 2)
2630 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2631 event->button, event->x_root, event->y_root,
2638 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
2640 GtkAllocation allocation;
2642 gtk_widget_get_allocation (area, &allocation);
2643 gtk_paint_resize_grip (gtk_widget_get_style (area),
2644 gtk_widget_get_window (area),
2645 gtk_widget_get_state (area),
2651 allocation.width, allocation.height);
2657 create_resize_grips (GtkWidget *widget)
2659 static GtkWidget *window = NULL;
2661 GtkWidget *hbox, *vbox;
2664 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2666 gtk_window_set_screen (GTK_WINDOW (window),
2667 gtk_widget_get_screen (widget));
2669 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2671 g_signal_connect (window, "destroy",
2672 G_CALLBACK (gtk_widget_destroyed),
2675 vbox = gtk_vbox_new (FALSE, 0);
2676 gtk_container_add (GTK_CONTAINER (window), vbox);
2678 hbox = gtk_hbox_new (FALSE, 0);
2679 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2682 area = gtk_drawing_area_new ();
2683 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2684 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2685 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2686 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2687 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2688 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2691 area = gtk_drawing_area_new ();
2692 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2693 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2694 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2695 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2696 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2697 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2700 area = gtk_drawing_area_new ();
2701 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2702 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2703 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2704 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2705 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2706 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2708 hbox = gtk_hbox_new (FALSE, 0);
2709 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2712 area = gtk_drawing_area_new ();
2713 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2714 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2715 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2716 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2717 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2718 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2721 area = gtk_drawing_area_new ();
2722 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2725 area = gtk_drawing_area_new ();
2726 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2727 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2728 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2729 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2730 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2731 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2734 hbox = gtk_hbox_new (FALSE, 0);
2735 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2738 area = gtk_drawing_area_new ();
2739 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2740 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2741 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2742 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2743 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2744 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2746 area = gtk_drawing_area_new ();
2747 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2748 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2749 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2750 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2751 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2752 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2755 area = gtk_drawing_area_new ();
2756 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2757 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2758 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2759 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2760 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2761 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2764 if (!gtk_widget_get_visible (window))
2765 gtk_widget_show_all (window);
2767 gtk_widget_destroy (window);
2773 gint upositionx = 0;
2774 gint upositiony = 0;
2777 uposition_configure (GtkWidget *window)
2783 lx = g_object_get_data (G_OBJECT (window), "x");
2784 ly = g_object_get_data (G_OBJECT (window), "y");
2786 gdk_window_get_root_origin (gtk_widget_get_window (window),
2787 &upositionx, &upositiony);
2788 sprintf (buffer, "%d", upositionx);
2789 gtk_label_set_text (lx, buffer);
2790 sprintf (buffer, "%d", upositiony);
2791 gtk_label_set_text (ly, buffer);
2797 uposition_stop_configure (GtkToggleButton *toggle,
2801 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2803 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2807 create_saved_position (GtkWidget *widget)
2809 static GtkWidget *window = NULL;
2814 GtkWidget *main_vbox;
2822 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2823 "type", GTK_WINDOW_TOPLEVEL,
2824 "title", "Saved Position",
2826 "signal::configure_event", uposition_configure, NULL,
2829 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2831 gtk_window_set_screen (GTK_WINDOW (window),
2832 gtk_widget_get_screen (widget));
2835 g_signal_connect (window, "destroy",
2836 G_CALLBACK (gtk_widget_destroyed),
2839 main_vbox = gtk_vbox_new (FALSE, 5);
2840 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2841 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2844 g_object_new (gtk_vbox_get_type (),
2845 "GtkBox::homogeneous", FALSE,
2846 "GtkBox::spacing", 5,
2847 "GtkContainer::border_width", 10,
2848 "GtkWidget::parent", main_vbox,
2849 "GtkWidget::visible", TRUE,
2850 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2851 "label", "Stop Events",
2855 "signal::clicked", uposition_stop_configure, window,
2859 hbox = gtk_hbox_new (FALSE, 0);
2860 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2861 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2863 label = gtk_label_new ("X Origin : ");
2864 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2865 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2867 x_label = gtk_label_new ("");
2868 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2869 g_object_set_data (G_OBJECT (window), "x", x_label);
2871 hbox = gtk_hbox_new (FALSE, 0);
2872 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2873 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2875 label = gtk_label_new ("Y Origin : ");
2876 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2877 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2879 y_label = gtk_label_new ("");
2880 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2881 g_object_set_data (G_OBJECT (window), "y", y_label);
2884 g_object_new (gtk_hseparator_get_type (),
2885 "GtkWidget::visible", TRUE,
2887 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2889 hbox = gtk_hbox_new (FALSE, 0);
2890 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2891 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2893 button = gtk_button_new_with_label ("Close");
2894 g_signal_connect_swapped (button, "clicked",
2895 G_CALLBACK (gtk_widget_destroy),
2897 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2898 gtk_widget_set_can_default (button, TRUE);
2899 gtk_widget_grab_default (button);
2901 gtk_widget_show_all (window);
2904 gtk_widget_destroy (window);
2912 create_pixbuf (GtkWidget *widget)
2914 static GtkWidget *window = NULL;
2920 GtkWidget *separator;
2921 GtkWidget *pixbufwid;
2922 GdkWindow *gdk_window;
2926 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2928 gtk_window_set_screen (GTK_WINDOW (window),
2929 gtk_widget_get_screen (widget));
2931 g_signal_connect (window, "destroy",
2932 G_CALLBACK (gtk_widget_destroyed),
2935 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2936 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2937 gtk_widget_realize(window);
2939 box1 = gtk_vbox_new (FALSE, 0);
2940 gtk_container_add (GTK_CONTAINER (window), box1);
2942 box2 = gtk_vbox_new (FALSE, 10);
2943 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2944 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2946 button = gtk_button_new ();
2947 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2949 gdk_window = gtk_widget_get_window (window);
2951 pixbufwid = new_pixbuf ("test.xpm", gdk_window, NULL);
2953 label = gtk_label_new ("Pixbuf\ntest");
2954 box3 = gtk_hbox_new (FALSE, 0);
2955 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2956 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2957 gtk_container_add (GTK_CONTAINER (box3), label);
2958 gtk_container_add (GTK_CONTAINER (button), box3);
2960 button = gtk_button_new ();
2961 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2963 pixbufwid = new_pixbuf ("test.xpm", gdk_window, NULL);
2965 label = gtk_label_new ("Pixbuf\ntest");
2966 box3 = gtk_hbox_new (FALSE, 0);
2967 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2968 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2969 gtk_container_add (GTK_CONTAINER (box3), label);
2970 gtk_container_add (GTK_CONTAINER (button), box3);
2972 gtk_widget_set_sensitive (button, FALSE);
2974 separator = gtk_hseparator_new ();
2975 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2977 box2 = gtk_vbox_new (FALSE, 10);
2978 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2979 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2981 button = gtk_button_new_with_label ("close");
2982 g_signal_connect_swapped (button, "clicked",
2983 G_CALLBACK (gtk_widget_destroy),
2985 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2986 gtk_widget_set_can_default (button, TRUE);
2987 gtk_widget_grab_default (button);
2990 if (!gtk_widget_get_visible (window))
2991 gtk_widget_show_all (window);
2993 gtk_widget_destroy (window);
2997 create_tooltips (GtkWidget *widget)
2999 static GtkWidget *window = NULL;
3006 GtkWidget *separator;
3011 g_object_new (gtk_window_get_type (),
3012 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3013 "GtkContainer::border_width", 0,
3014 "GtkWindow::title", "Tooltips",
3015 "GtkWindow::resizable", FALSE,
3018 gtk_window_set_screen (GTK_WINDOW (window),
3019 gtk_widget_get_screen (widget));
3021 box1 = gtk_vbox_new (FALSE, 0);
3022 gtk_container_add (GTK_CONTAINER (window), box1);
3024 box2 = gtk_vbox_new (FALSE, 10);
3025 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3026 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3028 button = gtk_toggle_button_new_with_label ("button1");
3029 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3031 gtk_widget_set_tooltip_text (button, "This is button 1");
3033 button = gtk_toggle_button_new_with_label ("button2");
3034 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3036 gtk_widget_set_tooltip_text (button,
3037 "This is button 2. This is also a really long tooltip which probably "
3038 "won't fit on a single line and will therefore need to be wrapped. "
3039 "Hopefully the wrapping will work correctly.");
3041 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3042 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3044 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
3047 g_object_new (gtk_vbox_get_type (),
3048 "homogeneous", FALSE,
3055 g_object_new (gtk_button_get_type (),
3060 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3061 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
3063 frame = g_object_new (gtk_frame_get_type (),
3064 "label", "ToolTips Inspector",
3065 "label_xalign", (double) 0.5,
3071 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3073 separator = gtk_hseparator_new ();
3074 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3076 box2 = gtk_vbox_new (FALSE, 10);
3077 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3078 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3080 button = gtk_button_new_with_label ("close");
3081 g_signal_connect_swapped (button, "clicked",
3082 G_CALLBACK (gtk_widget_destroy),
3084 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3085 gtk_widget_set_can_default (button, TRUE);
3086 gtk_widget_grab_default (button);
3088 gtk_widget_set_tooltip_text (button, "Push this button to close window");
3091 if (!gtk_widget_get_visible (window))
3092 gtk_widget_show_all (window);
3094 gtk_widget_destroy (window);
3102 pack_image (GtkWidget *box,
3106 gtk_box_pack_start (GTK_BOX (box),
3107 gtk_label_new (text),
3110 gtk_box_pack_start (GTK_BOX (box),
3116 create_image (GtkWidget *widget)
3118 static GtkWidget *window = NULL;
3125 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3127 gtk_window_set_screen (GTK_WINDOW (window),
3128 gtk_widget_get_screen (widget));
3130 /* this is bogus for testing drawing when allocation < request,
3131 * don't copy into real code
3133 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3135 g_signal_connect (window, "destroy",
3136 G_CALLBACK (gtk_widget_destroyed),
3139 vbox = gtk_vbox_new (FALSE, 5);
3141 gtk_container_add (GTK_CONTAINER (window), vbox);
3143 pack_image (vbox, "Stock Warning Dialog",
3144 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3145 GTK_ICON_SIZE_DIALOG));
3147 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
3149 pack_image (vbox, "Pixbuf",
3150 gtk_image_new_from_pixbuf (pixbuf));
3152 g_object_unref (pixbuf);
3155 if (!gtk_widget_get_visible (window))
3156 gtk_widget_show_all (window);
3158 gtk_widget_destroy (window);
3166 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3169 GtkWidget *menuitem;
3178 menu = gtk_menu_new ();
3179 gtk_menu_set_screen (GTK_MENU (menu), screen);
3185 menuitem = gtk_tearoff_menu_item_new ();
3186 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3187 gtk_widget_show (menuitem);
3190 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3191 GTK_ICON_SIZE_MENU);
3192 gtk_widget_show (image);
3193 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3194 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3195 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3196 gtk_widget_show (menuitem);
3198 for (i = 0, j = 1; i < length; i++, j++)
3200 sprintf (buf, "item %2d - %d", depth, j);
3202 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3203 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3205 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3206 gtk_widget_show (menuitem);
3208 gtk_widget_set_sensitive (menuitem, FALSE);
3211 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3215 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3216 create_menu (screen, depth - 1, 5, TRUE));
3223 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3226 GtkWidget *menuitem;
3232 menu = gtk_menu_new ();
3233 gtk_menu_set_screen (GTK_MENU (menu), screen);
3238 menuitem = gtk_tearoff_menu_item_new ();
3239 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3240 gtk_widget_show (menuitem);
3244 menuitem = gtk_menu_item_new_with_label ("items");
3245 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3247 submenu = gtk_menu_new ();
3248 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3249 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3250 gtk_widget_show (menuitem);
3253 /* now fill the items submenu */
3254 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3255 GTK_ICON_SIZE_MENU);
3256 gtk_widget_show (image);
3257 menuitem = gtk_image_menu_item_new_with_label ("Image");
3258 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3259 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3260 gtk_widget_show (menuitem);
3262 menuitem = gtk_menu_item_new_with_label ("x");
3263 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3264 gtk_widget_show (menuitem);
3266 menuitem = gtk_menu_item_new_with_label ("x");
3267 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3268 gtk_widget_show (menuitem);
3270 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3271 GTK_ICON_SIZE_MENU);
3272 gtk_widget_show (image);
3273 menuitem = gtk_image_menu_item_new_with_label ("Image");
3274 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3275 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3276 gtk_widget_show (menuitem);
3278 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3279 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3280 gtk_widget_show (menuitem);
3282 menuitem = gtk_menu_item_new_with_label ("x");
3283 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3284 gtk_widget_show (menuitem);
3286 menuitem = gtk_menu_item_new_with_label ("x");
3287 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3288 gtk_widget_show (menuitem);
3290 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3291 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3292 gtk_widget_show (menuitem);
3294 menuitem = gtk_check_menu_item_new_with_label ("Check");
3295 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3296 gtk_widget_show (menuitem);
3298 menuitem = gtk_menu_item_new_with_label ("x");
3299 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3300 gtk_widget_show (menuitem);
3302 menuitem = gtk_menu_item_new_with_label ("x");
3303 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3304 gtk_widget_show (menuitem);
3306 menuitem = gtk_check_menu_item_new_with_label ("Check");
3307 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3308 gtk_widget_show (menuitem);
3310 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3311 gtk_widget_show (menuitem);
3312 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3314 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3315 gtk_widget_show (menuitem);
3316 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3318 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3319 gtk_widget_show (menuitem);
3320 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3322 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3323 gtk_widget_show (menuitem);
3324 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3326 /* end of items submenu */
3328 menuitem = gtk_menu_item_new_with_label ("spanning");
3329 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3331 submenu = gtk_menu_new ();
3332 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3333 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3334 gtk_widget_show (menuitem);
3337 /* now fill the spanning submenu */
3338 menuitem = gtk_menu_item_new_with_label ("a");
3339 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3340 gtk_widget_show (menuitem);
3342 menuitem = gtk_menu_item_new_with_label ("b");
3343 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3344 gtk_widget_show (menuitem);
3346 menuitem = gtk_menu_item_new_with_label ("c");
3347 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3348 gtk_widget_show (menuitem);
3350 menuitem = gtk_menu_item_new_with_label ("d");
3351 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3352 gtk_widget_show (menuitem);
3354 menuitem = gtk_menu_item_new_with_label ("e");
3355 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3356 gtk_widget_show (menuitem);
3357 /* end of spanning submenu */
3359 menuitem = gtk_menu_item_new_with_label ("left");
3360 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3361 submenu = gtk_menu_new ();
3362 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3363 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3364 gtk_widget_show (menuitem);
3366 menuitem = gtk_menu_item_new_with_label ("Empty");
3367 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3368 submenu = gtk_menu_new ();
3369 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3370 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3371 gtk_widget_show (menuitem);
3373 menuitem = gtk_menu_item_new_with_label ("right");
3374 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3375 submenu = gtk_menu_new ();
3376 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3377 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3378 gtk_widget_show (menuitem);
3380 menuitem = gtk_menu_item_new_with_label ("Empty");
3381 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3382 gtk_widget_show (menuitem);
3386 for (; j < rows; j++)
3387 for (i = 0; i < cols; i++)
3389 sprintf (buf, "(%d %d)", i, j);
3390 menuitem = gtk_menu_item_new_with_label (buf);
3391 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3392 gtk_widget_show (menuitem);
3395 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3396 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3397 gtk_widget_show (menuitem);
3398 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3399 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3400 gtk_widget_show (menuitem);
3401 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3402 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3403 gtk_widget_show (menuitem);
3404 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3405 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3406 gtk_widget_show (menuitem);
3412 create_menus (GtkWidget *widget)
3414 static GtkWidget *window = NULL;
3418 GtkWidget *optionmenu;
3419 GtkWidget *separator;
3425 GtkWidget *menuitem;
3426 GtkAccelGroup *accel_group;
3428 GdkScreen *screen = gtk_widget_get_screen (widget);
3430 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3432 gtk_window_set_screen (GTK_WINDOW (window), screen);
3434 g_signal_connect (window, "destroy",
3435 G_CALLBACK (gtk_widget_destroyed),
3437 g_signal_connect (window, "delete-event",
3438 G_CALLBACK (gtk_true),
3441 accel_group = gtk_accel_group_new ();
3442 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3444 gtk_window_set_title (GTK_WINDOW (window), "menus");
3445 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3448 box1 = gtk_vbox_new (FALSE, 0);
3449 gtk_container_add (GTK_CONTAINER (window), box1);
3450 gtk_widget_show (box1);
3452 menubar = gtk_menu_bar_new ();
3453 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3454 gtk_widget_show (menubar);
3456 menu = create_menu (screen, 2, 50, TRUE);
3458 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3459 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3460 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3461 gtk_widget_show (menuitem);
3463 menu = create_table_menu (screen, 2, 50, TRUE);
3465 menuitem = gtk_menu_item_new_with_label ("table");
3466 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3467 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3468 gtk_widget_show (menuitem);
3470 menuitem = gtk_menu_item_new_with_label ("foo");
3471 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3472 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3473 gtk_widget_show (menuitem);
3475 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3476 GTK_ICON_SIZE_MENU);
3477 gtk_widget_show (image);
3478 menuitem = gtk_image_menu_item_new_with_label ("Help");
3479 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3480 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3481 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3482 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3483 gtk_widget_show (menuitem);
3485 menubar = gtk_menu_bar_new ();
3486 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3487 gtk_widget_show (menubar);
3489 menu = create_menu (screen, 2, 10, TRUE);
3491 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3492 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3493 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3494 gtk_widget_show (menuitem);
3496 box2 = gtk_vbox_new (FALSE, 10);
3497 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3498 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3499 gtk_widget_show (box2);
3501 menu = create_menu (screen, 1, 5, FALSE);
3502 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3504 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3505 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3506 gtk_widget_show (menuitem);
3508 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3509 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3510 gtk_widget_show (menuitem);
3511 gtk_widget_add_accelerator (menuitem,
3517 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3518 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3519 gtk_widget_show (menuitem);
3520 gtk_widget_add_accelerator (menuitem,
3525 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3526 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3527 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3528 gtk_widget_show (menuitem);
3529 gtk_widget_add_accelerator (menuitem,
3535 gtk_widget_add_accelerator (menuitem,
3542 optionmenu = gtk_combo_box_new_text ();
3543 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3544 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3545 gtk_widget_show (optionmenu);
3547 separator = gtk_hseparator_new ();
3548 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3549 gtk_widget_show (separator);
3551 box2 = gtk_vbox_new (FALSE, 10);
3552 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3553 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3554 gtk_widget_show (box2);
3556 button = gtk_button_new_with_label ("close");
3557 g_signal_connect_swapped (button, "clicked",
3558 G_CALLBACK (gtk_widget_destroy),
3560 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3561 gtk_widget_set_can_default (button, TRUE);
3562 gtk_widget_grab_default (button);
3563 gtk_widget_show (button);
3566 if (!gtk_widget_get_visible (window))
3567 gtk_widget_show (window);
3569 gtk_widget_destroy (window);
3572 /* GdkPixbuf RGBA C-Source image dump */
3574 static const guint8 apple[] =
3576 /* Pixbuf magic (0x47646b50) */
3578 /* length: header (24) + pixel_data (2304) */
3580 /* pixdata_type (0x1010002) */
3582 /* rowstride (96) */
3589 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3590 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3591 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3592 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3593 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3594 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3595 "\0\0\0\0\0\0\0\0\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"
3596 "\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"
3597 "\0\0\0\0\0\0\0\0\0\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"
3598 "[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"
3599 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3600 "\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"
3601 "\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"
3602 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3603 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3604 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3605 "\0\0\0\0\0\0\0\0\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"
3606 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3607 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3608 "\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["
3609 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3610 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3611 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3612 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3613 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3614 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3615 "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"
3616 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3617 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3618 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3619 "\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"
3620 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3621 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3622 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3623 "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"
3624 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3625 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3626 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3627 "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"
3628 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3629 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3630 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3631 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3632 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3633 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3634 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3635 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3636 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3637 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3638 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3639 "\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>"
3640 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3641 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3642 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3643 "\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"
3644 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3645 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3646 "\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"
3647 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3648 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3649 "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"
3650 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3651 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3652 "\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"
3653 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3654 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3655 "\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"
3656 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3657 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3658 "\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"
3659 "\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"
3660 "\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"
3661 "\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"
3662 "\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"
3663 "\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"
3664 "\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"
3665 "\0\0\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"
3666 "\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"
3667 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3671 accel_button_new (GtkAccelGroup *accel_group,
3676 GdkModifierType modifiers;
3680 gtk_accelerator_parse (accel, &keyval, &modifiers);
3683 button = gtk_button_new ();
3684 gtk_widget_add_accelerator (button, "activate", accel_group,
3685 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3687 label = gtk_accel_label_new (text);
3688 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3689 gtk_widget_show (label);
3691 gtk_container_add (GTK_CONTAINER (button), label);
3697 create_key_lookup (GtkWidget *widget)
3699 static GtkWidget *window = NULL;
3700 gpointer window_ptr;
3704 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3706 GtkWidget *content_area;
3708 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3709 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3712 gtk_window_set_screen (GTK_WINDOW (window),
3713 gtk_widget_get_screen (widget));
3715 /* We have to expand it so the accel labels will draw their labels
3717 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3719 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3721 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3723 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3724 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3725 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3726 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3727 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3728 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3729 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3730 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3731 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3732 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3733 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3734 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3735 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3736 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3737 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3738 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3739 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3740 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3741 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3742 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3743 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3744 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3745 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3746 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3747 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3748 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3749 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3750 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3752 window_ptr = &window;
3753 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3754 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
3756 gtk_widget_show_all (window);
3759 gtk_widget_destroy (window);
3768 cmw_destroy_cb(GtkWidget *widget)
3770 /* This is needed to get out of gtk_main */
3777 cmw_color (GtkWidget *widget, GtkWidget *parent)
3780 GtkWidget *colorsel;
3781 GtkWidget *ok_button, *cancel_button;
3783 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3785 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3787 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3788 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3792 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3794 /* And mark it as a transient dialog */
3795 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3797 g_signal_connect (csd, "destroy",
3798 G_CALLBACK (cmw_destroy_cb), NULL);
3801 "ok-button", &ok_button,
3802 "cancel-button", &cancel_button,
3805 g_signal_connect_swapped (ok_button,
3806 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3807 g_signal_connect_swapped (cancel_button,
3808 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3810 /* wait until destroy calls gtk_main_quit */
3811 gtk_widget_show (csd);
3816 cmw_file (GtkWidget *widget, GtkWidget *parent)
3820 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3821 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3822 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3823 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3825 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3826 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3828 g_signal_connect (fs, "destroy",
3829 G_CALLBACK (cmw_destroy_cb), NULL);
3830 g_signal_connect_swapped (fs, "response",
3831 G_CALLBACK (gtk_widget_destroy), fs);
3833 /* wait until destroy calls gtk_main_quit */
3834 gtk_widget_show (fs);
3840 create_modal_window (GtkWidget *widget)
3842 GtkWidget *window = NULL;
3843 GtkWidget *box1,*box2;
3845 GtkWidget *btnColor,*btnFile,*btnClose;
3847 /* Create modal window (Here you can use any window descendent )*/
3848 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3849 gtk_window_set_screen (GTK_WINDOW (window),
3850 gtk_widget_get_screen (widget));
3852 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3854 /* Set window as modal */
3855 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3857 /* Create widgets */
3858 box1 = gtk_vbox_new (FALSE,5);
3859 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3860 box2 = gtk_vbox_new (TRUE,5);
3861 btnColor = gtk_button_new_with_label ("Color");
3862 btnFile = gtk_button_new_with_label ("File Selection");
3863 btnClose = gtk_button_new_with_label ("Close");
3866 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3867 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3870 gtk_container_add (GTK_CONTAINER (window), box1);
3871 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3872 gtk_container_add (GTK_CONTAINER (frame1), box2);
3873 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3874 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3875 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
3876 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3878 /* connect signals */
3879 g_signal_connect_swapped (btnClose, "clicked",
3880 G_CALLBACK (gtk_widget_destroy), window);
3882 g_signal_connect (window, "destroy",
3883 G_CALLBACK (cmw_destroy_cb), NULL);
3885 g_signal_connect (btnColor, "clicked",
3886 G_CALLBACK (cmw_color), window);
3887 g_signal_connect (btnFile, "clicked",
3888 G_CALLBACK (cmw_file), window);
3891 gtk_widget_show_all (window);
3893 /* wait until dialog get destroyed */
3902 make_message_dialog (GdkScreen *screen,
3904 GtkMessageType type,
3905 GtkButtonsType buttons,
3906 guint default_response)
3910 gtk_widget_destroy (*dialog);
3915 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3916 "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.)");
3918 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3920 g_signal_connect_swapped (*dialog,
3922 G_CALLBACK (gtk_widget_destroy),
3925 g_signal_connect (*dialog,
3927 G_CALLBACK (gtk_widget_destroyed),
3930 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3932 gtk_widget_show (*dialog);
3936 create_message_dialog (GtkWidget *widget)
3938 static GtkWidget *info = NULL;
3939 static GtkWidget *warning = NULL;
3940 static GtkWidget *error = NULL;
3941 static GtkWidget *question = NULL;
3942 GdkScreen *screen = gtk_widget_get_screen (widget);
3944 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3945 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3946 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3947 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3954 static GtkWidget *sw_parent = NULL;
3955 static GtkWidget *sw_float_parent;
3956 static guint sw_destroyed_handler = 0;
3959 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3961 gtk_widget_reparent (scrollwin, sw_parent);
3963 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3964 sw_float_parent = NULL;
3966 sw_destroyed_handler = 0;
3972 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3974 gtk_widget_destroy (sw_float_parent);
3976 sw_float_parent = NULL;
3978 sw_destroyed_handler = 0;
3982 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3986 gtk_widget_reparent (scrollwin, sw_parent);
3987 gtk_widget_destroy (sw_float_parent);
3989 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3990 sw_float_parent = NULL;
3992 sw_destroyed_handler = 0;
3996 sw_parent = gtk_widget_get_parent (scrollwin);
3997 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3998 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3999 gtk_widget_get_screen (widget));
4001 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4003 gtk_widget_reparent (scrollwin, sw_float_parent);
4004 gtk_widget_show (sw_float_parent);
4006 sw_destroyed_handler =
4007 g_signal_connect (sw_parent, "destroy",
4008 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4009 g_signal_connect (sw_float_parent, "delete_event",
4010 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4015 create_scrolled_windows (GtkWidget *widget)
4017 static GtkWidget *window;
4018 GtkWidget *content_area, *action_area;
4019 GtkWidget *scrolled_window;
4027 window = gtk_dialog_new ();
4029 gtk_window_set_screen (GTK_WINDOW (window),
4030 gtk_widget_get_screen (widget));
4032 g_signal_connect (window, "destroy",
4033 G_CALLBACK (gtk_widget_destroyed),
4036 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4037 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
4039 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4040 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4042 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4043 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4044 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4045 GTK_POLICY_AUTOMATIC,
4046 GTK_POLICY_AUTOMATIC);
4047 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
4048 gtk_widget_show (scrolled_window);
4050 table = gtk_table_new (20, 20, FALSE);
4051 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4052 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4053 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4054 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4055 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4056 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4057 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4058 gtk_widget_show (table);
4060 for (i = 0; i < 20; i++)
4061 for (j = 0; j < 20; j++)
4063 sprintf (buffer, "button (%d,%d)\n", i, j);
4064 button = gtk_toggle_button_new_with_label (buffer);
4065 gtk_table_attach_defaults (GTK_TABLE (table), button,
4067 gtk_widget_show (button);
4071 button = gtk_button_new_with_label ("Close");
4072 g_signal_connect_swapped (button, "clicked",
4073 G_CALLBACK (gtk_widget_destroy),
4075 gtk_widget_set_can_default (button, TRUE);
4076 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4077 gtk_widget_grab_default (button);
4078 gtk_widget_show (button);
4080 button = gtk_button_new_with_label ("Reparent Out");
4081 g_signal_connect (button, "clicked",
4082 G_CALLBACK (scrolled_windows_remove),
4084 gtk_widget_set_can_default (button, TRUE);
4085 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4086 gtk_widget_grab_default (button);
4087 gtk_widget_show (button);
4089 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4092 if (!gtk_widget_get_visible (window))
4093 gtk_widget_show (window);
4095 gtk_widget_destroy (window);
4103 entry_toggle_frame (GtkWidget *checkbutton,
4106 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4107 GTK_TOGGLE_BUTTON(checkbutton)->active);
4111 entry_toggle_sensitive (GtkWidget *checkbutton,
4114 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4118 entry_progress_timeout (gpointer data)
4120 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
4122 gtk_entry_progress_pulse (GTK_ENTRY (data));
4128 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
4131 if (fraction > 1.0001)
4134 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
4141 entry_remove_timeout (gpointer data)
4143 g_source_remove (GPOINTER_TO_UINT (data));
4147 entry_toggle_progress (GtkWidget *checkbutton,
4150 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
4152 guint timeout = gdk_threads_add_timeout (100,
4153 entry_progress_timeout,
4155 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
4156 GUINT_TO_POINTER (timeout),
4157 entry_remove_timeout);
4161 g_object_set_data (G_OBJECT (entry), "timeout-id",
4162 GUINT_TO_POINTER (0));
4164 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
4169 entry_toggle_pulse (GtkWidget *checkbutton,
4172 g_object_set_data (G_OBJECT (entry), "progress-pulse",
4173 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
4177 props_clicked (GtkWidget *button,
4180 GtkWidget *window = create_prop_editor (object, 0);
4182 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
4186 create_entry (GtkWidget *widget)
4188 static GtkWidget *window = NULL;
4192 GtkWidget *has_frame_check;
4193 GtkWidget *sensitive_check;
4194 GtkWidget *progress_check;
4197 GtkWidget *cb_entry;
4199 GtkWidget *separator;
4203 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4204 gtk_window_set_screen (GTK_WINDOW (window),
4205 gtk_widget_get_screen (widget));
4207 g_signal_connect (window, "destroy",
4208 G_CALLBACK (gtk_widget_destroyed),
4211 gtk_window_set_title (GTK_WINDOW (window), "entry");
4212 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4215 box1 = gtk_vbox_new (FALSE, 0);
4216 gtk_container_add (GTK_CONTAINER (window), box1);
4219 box2 = gtk_vbox_new (FALSE, 10);
4220 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4221 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4223 hbox = gtk_hbox_new (FALSE, 5);
4224 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4226 entry = gtk_entry_new ();
4227 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");
4228 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4229 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4231 button = gtk_button_new_with_mnemonic ("_Props");
4232 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4233 g_signal_connect (button, "clicked",
4234 G_CALLBACK (props_clicked),
4237 cb = GTK_COMBO_BOX (gtk_combo_box_entry_new_text ());
4238 gtk_combo_box_append_text (cb, "item0");
4239 gtk_combo_box_append_text (cb, "item0");
4240 gtk_combo_box_append_text (cb, "item1 item1");
4241 gtk_combo_box_append_text (cb, "item2 item2 item2");
4242 gtk_combo_box_append_text (cb, "item3 item3 item3 item3");
4243 gtk_combo_box_append_text (cb, "item4 item4 item4 item4 item4");
4244 gtk_combo_box_append_text (cb, "item5 item5 item5 item5 item5 item5");
4245 gtk_combo_box_append_text (cb, "item6 item6 item6 item6 item6");
4246 gtk_combo_box_append_text (cb, "item7 item7 item7 item7");
4247 gtk_combo_box_append_text (cb, "item8 item8 item8");
4248 gtk_combo_box_append_text (cb, "item9 item9");
4250 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4251 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4252 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4253 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4255 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4256 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4257 g_signal_connect (sensitive_check, "toggled",
4258 G_CALLBACK (entry_toggle_sensitive), entry);
4259 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4261 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4262 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4263 g_signal_connect (has_frame_check, "toggled",
4264 G_CALLBACK (entry_toggle_frame), entry);
4265 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4267 progress_check = gtk_check_button_new_with_label("Show Progress");
4268 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4269 g_signal_connect (progress_check, "toggled",
4270 G_CALLBACK (entry_toggle_progress), entry);
4272 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4273 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4274 g_signal_connect (progress_check, "toggled",
4275 G_CALLBACK (entry_toggle_pulse), entry);
4277 separator = gtk_hseparator_new ();
4278 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4280 box2 = gtk_vbox_new (FALSE, 10);
4281 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4282 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4284 button = gtk_button_new_with_label ("close");
4285 g_signal_connect_swapped (button, "clicked",
4286 G_CALLBACK (gtk_widget_destroy),
4288 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4289 gtk_widget_set_can_default (button, TRUE);
4290 gtk_widget_grab_default (button);
4293 if (!gtk_widget_get_visible (window))
4294 gtk_widget_show_all (window);
4296 gtk_widget_destroy (window);
4300 create_expander (GtkWidget *widget)
4303 GtkWidget *expander;
4305 static GtkWidget *window = NULL;
4309 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4310 gtk_window_set_screen (GTK_WINDOW (window),
4311 gtk_widget_get_screen (widget));
4313 g_signal_connect (window, "destroy",
4314 G_CALLBACK (gtk_widget_destroyed),
4317 gtk_window_set_title (GTK_WINDOW (window), "expander");
4318 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4320 box1 = gtk_vbox_new (FALSE, 0);
4321 gtk_container_add (GTK_CONTAINER (window), box1);
4323 expander = gtk_expander_new ("The Hidden");
4325 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4327 hidden = gtk_label_new ("Revealed!");
4329 gtk_container_add (GTK_CONTAINER (expander), hidden);
4332 if (!gtk_widget_get_visible (window))
4333 gtk_widget_show_all (window);
4335 gtk_widget_destroy (window);
4343 event_box_label_pressed (GtkWidget *widget,
4344 GdkEventButton *event,
4347 g_print ("clicked on event box\n");
4351 event_box_button_clicked (GtkWidget *widget,
4355 g_print ("pushed button\n");
4359 event_box_toggle_visible_window (GtkWidget *checkbutton,
4360 GtkEventBox *event_box)
4362 gtk_event_box_set_visible_window (event_box,
4363 GTK_TOGGLE_BUTTON(checkbutton)->active);
4367 event_box_toggle_above_child (GtkWidget *checkbutton,
4368 GtkEventBox *event_box)
4370 gtk_event_box_set_above_child (event_box,
4371 GTK_TOGGLE_BUTTON(checkbutton)->active);
4375 create_event_box (GtkWidget *widget)
4377 static GtkWidget *window = NULL;
4383 GtkWidget *separator;
4384 GtkWidget *event_box;
4386 GtkWidget *visible_window_check;
4387 GtkWidget *above_child_check;
4396 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4397 gtk_window_set_screen (GTK_WINDOW (window),
4398 gtk_widget_get_screen (widget));
4400 g_signal_connect (window, "destroy",
4401 G_CALLBACK (gtk_widget_destroyed),
4404 gtk_window_set_title (GTK_WINDOW (window), "event box");
4405 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4407 box1 = gtk_vbox_new (FALSE, 0);
4408 gtk_container_add (GTK_CONTAINER (window), box1);
4409 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4411 hbox = gtk_hbox_new (FALSE, 0);
4412 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4414 event_box = gtk_event_box_new ();
4415 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4417 vbox = gtk_vbox_new (FALSE, 0);
4418 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4419 g_signal_connect (event_box, "button_press_event",
4420 G_CALLBACK (event_box_label_pressed),
4423 label = gtk_label_new ("Click on this label");
4424 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4426 button = gtk_button_new_with_label ("button in eventbox");
4427 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4428 g_signal_connect (button, "clicked",
4429 G_CALLBACK (event_box_button_clicked),
4433 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4434 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4435 g_signal_connect (visible_window_check, "toggled",
4436 G_CALLBACK (event_box_toggle_visible_window), event_box);
4437 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4439 above_child_check = gtk_check_button_new_with_label("Above Child");
4440 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4441 g_signal_connect (above_child_check, "toggled",
4442 G_CALLBACK (event_box_toggle_above_child), event_box);
4443 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4445 separator = gtk_hseparator_new ();
4446 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4448 box2 = gtk_vbox_new (FALSE, 10);
4449 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4450 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4452 button = gtk_button_new_with_label ("close");
4453 g_signal_connect_swapped (button, "clicked",
4454 G_CALLBACK (gtk_widget_destroy),
4456 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4457 gtk_widget_set_can_default (button, TRUE);
4458 gtk_widget_grab_default (button);
4461 if (!gtk_widget_get_visible (window))
4462 gtk_widget_show_all (window);
4464 gtk_widget_destroy (window);
4472 #define SIZE_GROUP_INITIAL_SIZE 50
4475 size_group_hsize_changed (GtkSpinButton *spin_button,
4478 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4479 gtk_spin_button_get_value_as_int (spin_button),
4484 size_group_vsize_changed (GtkSpinButton *spin_button,
4487 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4489 gtk_spin_button_get_value_as_int (spin_button));
4493 create_size_group_window (GdkScreen *screen,
4494 GtkSizeGroup *master_size_group)
4496 GtkWidget *content_area;
4499 GtkWidget *main_button;
4501 GtkWidget *spin_button;
4503 GtkSizeGroup *hgroup1;
4504 GtkSizeGroup *hgroup2;
4505 GtkSizeGroup *vgroup1;
4506 GtkSizeGroup *vgroup2;
4508 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4514 gtk_window_set_screen (GTK_WINDOW (window), screen);
4516 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4518 g_signal_connect (window, "response",
4519 G_CALLBACK (gtk_widget_destroy),
4522 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4524 table = gtk_table_new (2, 2, FALSE);
4525 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4527 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4528 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4529 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4530 gtk_widget_set_size_request (table, 250, 250);
4532 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4533 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4534 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4535 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4537 main_button = gtk_button_new_with_label ("X");
4539 gtk_table_attach (GTK_TABLE (table), main_button,
4541 GTK_EXPAND, GTK_EXPAND,
4543 gtk_size_group_add_widget (master_size_group, main_button);
4544 gtk_size_group_add_widget (hgroup1, main_button);
4545 gtk_size_group_add_widget (vgroup1, main_button);
4546 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4547 SIZE_GROUP_INITIAL_SIZE,
4548 SIZE_GROUP_INITIAL_SIZE);
4550 button = gtk_button_new ();
4551 gtk_table_attach (GTK_TABLE (table), button,
4553 GTK_EXPAND, GTK_EXPAND,
4555 gtk_size_group_add_widget (vgroup1, button);
4556 gtk_size_group_add_widget (vgroup2, button);
4558 button = gtk_button_new ();
4559 gtk_table_attach (GTK_TABLE (table), button,
4561 GTK_EXPAND, GTK_EXPAND,
4563 gtk_size_group_add_widget (hgroup1, button);
4564 gtk_size_group_add_widget (hgroup2, button);
4566 button = gtk_button_new ();
4567 gtk_table_attach (GTK_TABLE (table), button,
4569 GTK_EXPAND, GTK_EXPAND,
4571 gtk_size_group_add_widget (hgroup2, button);
4572 gtk_size_group_add_widget (vgroup2, button);
4574 g_object_unref (hgroup1);
4575 g_object_unref (hgroup2);
4576 g_object_unref (vgroup1);
4577 g_object_unref (vgroup2);
4579 hbox = gtk_hbox_new (FALSE, 5);
4580 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4582 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4583 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4584 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4585 g_signal_connect (spin_button, "value_changed",
4586 G_CALLBACK (size_group_hsize_changed), main_button);
4588 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4589 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4590 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4591 g_signal_connect (spin_button, "value_changed",
4592 G_CALLBACK (size_group_vsize_changed), main_button);
4598 create_size_groups (GtkWidget *widget)
4600 static GtkWidget *window1 = NULL;
4601 static GtkWidget *window2 = NULL;
4602 static GtkSizeGroup *master_size_group;
4604 if (!master_size_group)
4605 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4609 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4612 g_signal_connect (window1, "destroy",
4613 G_CALLBACK (gtk_widget_destroyed),
4619 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4622 g_signal_connect (window2, "destroy",
4623 G_CALLBACK (gtk_widget_destroyed),
4627 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4629 gtk_widget_destroy (window1);
4630 gtk_widget_destroy (window2);
4634 if (!gtk_widget_get_visible (window1))
4635 gtk_widget_show_all (window1);
4636 if (!gtk_widget_get_visible (window2))
4637 gtk_widget_show_all (window2);
4645 static GtkWidget *spinner1;
4648 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4650 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
4654 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4656 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
4660 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4662 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4663 gtk_spin_button_get_value_as_int (spin));
4667 get_value (GtkWidget *widget, gpointer data)
4671 GtkSpinButton *spin;
4673 spin = GTK_SPIN_BUTTON (spinner1);
4674 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4675 if (GPOINTER_TO_INT (data) == 1)
4676 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4678 sprintf (buf, "%0.*f",
4679 gtk_spin_button_get_digits (spin),
4680 gtk_spin_button_get_value (spin));
4682 gtk_label_set_text (label, buf);
4686 get_spin_value (GtkWidget *widget, gpointer data)
4690 GtkSpinButton *spin;
4692 spin = GTK_SPIN_BUTTON (widget);
4693 label = GTK_LABEL (data);
4695 buffer = g_strdup_printf ("%0.*f",
4696 gtk_spin_button_get_digits (spin),
4697 gtk_spin_button_get_value (spin));
4698 gtk_label_set_text (label, buffer);
4704 spin_button_time_output_func (GtkSpinButton *spin_button)
4706 GtkAdjustment *adjustment;
4707 static gchar buf[6];
4711 adjustment = gtk_spin_button_get_adjustment (spin_button);
4712 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4713 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4714 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4715 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4716 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4721 spin_button_month_input_func (GtkSpinButton *spin_button,
4725 static gchar *month[12] = { "January", "February", "March", "April",
4726 "May", "June", "July", "August",
4727 "September", "October", "November", "December" };
4729 gboolean found = FALSE;
4731 for (i = 1; i <= 12; i++)
4733 tmp1 = g_ascii_strup (month[i - 1], -1);
4734 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4735 if (strstr (tmp1, tmp2) == tmp1)
4745 return GTK_INPUT_ERROR;
4747 *new_val = (gdouble) i;
4752 spin_button_month_output_func (GtkSpinButton *spin_button)
4754 GtkAdjustment *adjustment;
4757 static gchar *month[12] = { "January", "February", "March", "April",
4758 "May", "June", "July", "August", "September",
4759 "October", "November", "December" };
4761 adjustment = gtk_spin_button_get_adjustment (spin_button);
4762 value = gtk_adjustment_get_value (adjustment);
4763 for (i = 1; i <= 12; i++)
4764 if (fabs (value - (double)i) < 1e-5)
4766 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4767 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4773 spin_button_hex_input_func (GtkSpinButton *spin_button,
4780 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4781 res = strtol(buf, &err, 16);
4784 return GTK_INPUT_ERROR;
4790 spin_button_hex_output_func (GtkSpinButton *spin_button)
4792 GtkAdjustment *adjustment;
4793 static gchar buf[7];
4796 adjustment = gtk_spin_button_get_adjustment (spin_button);
4797 val = (gint) gtk_adjustment_get_value (adjustment);
4798 if (fabs (val) < 1e-5)
4799 sprintf (buf, "0x00");
4801 sprintf (buf, "0x%.2X", val);
4802 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4803 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4808 create_spins (GtkWidget *widget)
4810 static GtkWidget *window = NULL;
4813 GtkWidget *main_vbox;
4816 GtkWidget *spinner2;
4820 GtkWidget *val_label;
4825 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4826 gtk_window_set_screen (GTK_WINDOW (window),
4827 gtk_widget_get_screen (widget));
4829 g_signal_connect (window, "destroy",
4830 G_CALLBACK (gtk_widget_destroyed),
4833 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4835 main_vbox = gtk_vbox_new (FALSE, 5);
4836 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4837 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4839 frame = gtk_frame_new ("Not accelerated");
4840 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4842 vbox = gtk_vbox_new (FALSE, 0);
4843 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4844 gtk_container_add (GTK_CONTAINER (frame), vbox);
4846 /* Time, month, hex spinners */
4848 hbox = gtk_hbox_new (FALSE, 0);
4849 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4851 vbox2 = gtk_vbox_new (FALSE, 0);
4852 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4854 label = gtk_label_new ("Time :");
4855 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4856 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4858 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4859 spinner = gtk_spin_button_new (adj, 0, 0);
4860 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4861 g_signal_connect (spinner,
4863 G_CALLBACK (spin_button_time_output_func),
4865 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4866 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4867 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4869 vbox2 = gtk_vbox_new (FALSE, 0);
4870 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4872 label = gtk_label_new ("Month :");
4873 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4874 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4876 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4878 spinner = gtk_spin_button_new (adj, 0, 0);
4879 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4880 GTK_UPDATE_IF_VALID);
4881 g_signal_connect (spinner,
4883 G_CALLBACK (spin_button_month_input_func),
4885 g_signal_connect (spinner,
4887 G_CALLBACK (spin_button_month_output_func),
4889 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4890 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4891 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4893 vbox2 = gtk_vbox_new (FALSE, 0);
4894 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4896 label = gtk_label_new ("Hex :");
4897 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4898 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4900 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4901 spinner = gtk_spin_button_new (adj, 0, 0);
4902 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4903 g_signal_connect (spinner,
4905 G_CALLBACK (spin_button_hex_input_func),
4907 g_signal_connect (spinner,
4909 G_CALLBACK (spin_button_hex_output_func),
4911 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4912 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4913 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4915 frame = gtk_frame_new ("Accelerated");
4916 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4918 vbox = gtk_vbox_new (FALSE, 0);
4919 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4920 gtk_container_add (GTK_CONTAINER (frame), vbox);
4922 hbox = gtk_hbox_new (FALSE, 0);
4923 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4925 vbox2 = gtk_vbox_new (FALSE, 0);
4926 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4928 label = gtk_label_new ("Value :");
4929 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4930 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4932 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
4934 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
4935 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4936 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4938 vbox2 = gtk_vbox_new (FALSE, 0);
4939 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4941 label = gtk_label_new ("Digits :");
4942 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4943 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4945 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4946 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
4947 g_signal_connect (adj, "value_changed",
4948 G_CALLBACK (change_digits),
4950 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4952 hbox = gtk_hbox_new (FALSE, 0);
4953 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4955 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4956 g_signal_connect (button, "clicked",
4957 G_CALLBACK (toggle_snap),
4959 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4960 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4962 button = gtk_check_button_new_with_label ("Numeric only input mode");
4963 g_signal_connect (button, "clicked",
4964 G_CALLBACK (toggle_numeric),
4966 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4967 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4969 val_label = gtk_label_new ("");
4971 hbox = gtk_hbox_new (FALSE, 0);
4972 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4974 button = gtk_button_new_with_label ("Value as Int");
4975 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4976 g_signal_connect (button, "clicked",
4977 G_CALLBACK (get_value),
4978 GINT_TO_POINTER (1));
4979 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4981 button = gtk_button_new_with_label ("Value as Float");
4982 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4983 g_signal_connect (button, "clicked",
4984 G_CALLBACK (get_value),
4985 GINT_TO_POINTER (2));
4986 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4988 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4989 gtk_label_set_text (GTK_LABEL (val_label), "0");
4991 frame = gtk_frame_new ("Using Convenience Constructor");
4992 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4994 hbox = gtk_hbox_new (FALSE, 0);
4995 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4996 gtk_container_add (GTK_CONTAINER (frame), hbox);
4998 val_label = gtk_label_new ("0.0");
5000 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5001 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5002 g_signal_connect (spinner, "value_changed",
5003 G_CALLBACK (get_spin_value), val_label);
5004 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5005 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5007 hbox = gtk_hbox_new (FALSE, 0);
5008 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5010 button = gtk_button_new_with_label ("Close");
5011 g_signal_connect_swapped (button, "clicked",
5012 G_CALLBACK (gtk_widget_destroy),
5014 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5017 if (!gtk_widget_get_visible (window))
5018 gtk_widget_show_all (window);
5020 gtk_widget_destroy (window);
5029 cursor_expose_event (GtkWidget *widget,
5033 GtkAllocation allocation;
5034 GtkDrawingArea *darea;
5035 GdkDrawable *drawable;
5040 g_return_val_if_fail (widget != NULL, TRUE);
5041 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5043 darea = GTK_DRAWING_AREA (widget);
5044 drawable = gtk_widget_get_window (widget);
5046 gtk_widget_get_allocation (widget, &allocation);
5047 max_width = allocation.width;
5048 max_height = allocation.height;
5050 cr = gdk_cairo_create (drawable);
5052 cairo_set_source_rgb (cr, 1, 1, 1);
5053 cairo_rectangle (cr, 0, 0, max_width, max_height / 2);
5056 cairo_set_source_rgb (cr, 0, 0, 0);
5057 cairo_rectangle (cr, 0, max_height / 2, max_width, max_height / 2);
5060 gdk_cairo_set_source_color (cr, >k_widget_get_style (widget)->bg[GTK_STATE_NORMAL]);
5061 cairo_rectangle (cr, max_width / 3, max_height / 3, max_width / 3, max_height / 3);
5070 set_cursor (GtkWidget *spinner,
5079 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5082 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5084 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
5085 vals = class->values;
5087 while (vals && vals->value != c)
5090 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5092 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5094 g_type_class_unref (class);
5096 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5097 gdk_window_set_cursor (gtk_widget_get_window (widget),
5099 gdk_cursor_unref (cursor);
5103 cursor_event (GtkWidget *widget,
5105 GtkSpinButton *spinner)
5107 if ((event->type == GDK_BUTTON_PRESS) &&
5108 ((event->button.button == 1) ||
5109 (event->button.button == 3)))
5111 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5112 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5119 #ifdef GDK_WINDOWING_X11
5120 #include "x11/gdkx.h"
5123 change_cursor_theme (GtkWidget *widget,
5130 children = gtk_container_get_children (GTK_CONTAINER (data));
5132 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
5133 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
5135 g_list_free (children);
5137 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
5144 create_cursors (GtkWidget *widget)
5146 static GtkWidget *window = NULL;
5149 GtkWidget *main_vbox;
5162 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5163 gtk_window_set_screen (GTK_WINDOW (window),
5164 gtk_widget_get_screen (widget));
5166 g_signal_connect (window, "destroy",
5167 G_CALLBACK (gtk_widget_destroyed),
5170 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5172 main_vbox = gtk_vbox_new (FALSE, 5);
5173 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5174 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5177 g_object_new (gtk_vbox_get_type (),
5178 "GtkBox::homogeneous", FALSE,
5179 "GtkBox::spacing", 5,
5180 "GtkContainer::border_width", 10,
5181 "GtkWidget::parent", main_vbox,
5182 "GtkWidget::visible", TRUE,
5185 #ifdef GDK_WINDOWING_X11
5186 hbox = gtk_hbox_new (FALSE, 0);
5187 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5188 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5190 label = gtk_label_new ("Cursor Theme : ");
5191 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5192 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5194 entry = gtk_entry_new ();
5195 gtk_entry_set_text (GTK_ENTRY (entry), "default");
5196 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
5198 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
5199 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
5200 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5202 g_signal_connect (entry, "changed",
5203 G_CALLBACK (change_cursor_theme), hbox);
5204 g_signal_connect (size, "changed",
5205 G_CALLBACK (change_cursor_theme), hbox);
5208 hbox = gtk_hbox_new (FALSE, 0);
5209 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5210 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5212 label = gtk_label_new ("Cursor Value : ");
5213 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5214 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5216 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5220 spinner = gtk_spin_button_new (adj, 0, 0);
5221 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5224 g_object_new (gtk_frame_get_type (),
5225 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5226 "GtkFrame::label_xalign", 0.5,
5227 "GtkFrame::label", "Cursor Area",
5228 "GtkContainer::border_width", 10,
5229 "GtkWidget::parent", vbox,
5230 "GtkWidget::visible", TRUE,
5233 darea = gtk_drawing_area_new ();
5234 gtk_widget_set_size_request (darea, 80, 80);
5235 gtk_container_add (GTK_CONTAINER (frame), darea);
5236 g_signal_connect (darea,
5238 G_CALLBACK (cursor_expose_event),
5240 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5241 g_signal_connect (darea,
5242 "button_press_event",
5243 G_CALLBACK (cursor_event),
5245 gtk_widget_show (darea);
5247 g_signal_connect (spinner, "changed",
5248 G_CALLBACK (set_cursor),
5251 label = g_object_new (GTK_TYPE_LABEL,
5256 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5259 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5262 g_object_new (gtk_hseparator_get_type (),
5263 "GtkWidget::visible", TRUE,
5265 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5267 hbox = gtk_hbox_new (FALSE, 0);
5268 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5269 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5271 button = gtk_button_new_with_label ("Close");
5272 g_signal_connect_swapped (button, "clicked",
5273 G_CALLBACK (gtk_widget_destroy),
5275 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5277 gtk_widget_show_all (window);
5279 set_cursor (spinner, darea);
5282 gtk_widget_destroy (window);
5290 color_selection_ok (GtkWidget *w,
5291 GtkColorSelectionDialog *cs)
5293 GtkWidget *colorsel;
5296 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5298 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5299 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5303 color_selection_changed (GtkWidget *w,
5304 GtkColorSelectionDialog *cs)
5306 GtkWidget *colorsel;
5309 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5310 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5311 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5316 opacity_toggled_cb (GtkWidget *w,
5317 GtkColorSelectionDialog *cs)
5319 GtkColorSelection *colorsel;
5321 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5322 gtk_color_selection_set_has_opacity_control (colorsel,
5323 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5327 palette_toggled_cb (GtkWidget *w,
5328 GtkColorSelectionDialog *cs)
5330 GtkColorSelection *colorsel;
5332 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5333 gtk_color_selection_set_has_palette (colorsel,
5334 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5339 create_color_selection (GtkWidget *widget)
5341 static GtkWidget *window = NULL;
5350 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5351 gtk_window_set_screen (GTK_WINDOW (window),
5352 gtk_widget_get_screen (widget));
5354 g_signal_connect (window, "destroy",
5355 G_CALLBACK (gtk_widget_destroyed),
5358 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5359 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5361 hbox = gtk_hbox_new (FALSE, 8);
5362 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5363 gtk_container_add (GTK_CONTAINER (window), hbox);
5365 label = gtk_label_new ("Pick a color");
5366 gtk_container_add (GTK_CONTAINER (hbox), label);
5368 picker = gtk_color_button_new ();
5369 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5370 gtk_container_add (GTK_CONTAINER (hbox), picker);
5372 button = gtk_button_new_with_mnemonic ("_Props");
5373 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5374 g_signal_connect (button, "clicked",
5375 G_CALLBACK (props_clicked),
5379 if (!gtk_widget_get_visible (window))
5380 gtk_widget_show_all (window);
5382 gtk_widget_destroy (window);
5386 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5388 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5389 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5391 gtk_widget_set_default_direction (new_direction);
5395 orientable_toggle_orientation (GtkOrientable *orientable)
5397 GtkOrientation orientation;
5399 orientation = gtk_orientable_get_orientation (orientable);
5400 gtk_orientable_set_orientation (orientable,
5401 orientation == GTK_ORIENTATION_HORIZONTAL ?
5402 GTK_ORIENTATION_VERTICAL :
5403 GTK_ORIENTATION_HORIZONTAL);
5405 if (GTK_IS_CONTAINER (orientable))
5410 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5412 for (child = children; child; child = child->next)
5414 if (GTK_IS_ORIENTABLE (child->data))
5415 orientable_toggle_orientation (child->data);
5418 g_list_free (children);
5423 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5425 GtkWidget *content_area;
5426 GtkWidget *toplevel;
5428 toplevel = gtk_widget_get_toplevel (widget);
5429 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5430 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5434 set_direction_recurse (GtkWidget *widget,
5437 GtkTextDirection *dir = data;
5439 gtk_widget_set_direction (widget, *dir);
5440 if (GTK_IS_CONTAINER (widget))
5441 gtk_container_foreach (GTK_CONTAINER (widget),
5442 set_direction_recurse,
5447 create_forward_back (const char *title,
5448 GtkTextDirection text_dir)
5450 GtkWidget *frame = gtk_frame_new (title);
5451 GtkWidget *bbox = gtk_hbutton_box_new ();
5452 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5453 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5455 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5457 gtk_container_add (GTK_CONTAINER (frame), bbox);
5458 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5459 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5461 set_direction_recurse (frame, &text_dir);
5467 create_flipping (GtkWidget *widget)
5469 static GtkWidget *window = NULL;
5470 GtkWidget *check_button, *button;
5471 GtkWidget *action_area, *content_area;
5475 window = gtk_dialog_new ();
5477 gtk_window_set_screen (GTK_WINDOW (window),
5478 gtk_widget_get_screen (widget));
5480 g_signal_connect (window, "destroy",
5481 G_CALLBACK (gtk_widget_destroyed),
5484 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5485 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5487 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5489 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5490 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5491 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5493 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5494 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5496 g_signal_connect (check_button, "toggled",
5497 G_CALLBACK (flipping_toggled_cb), NULL);
5499 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5500 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5501 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5503 g_signal_connect (check_button, "toggled",
5504 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5506 gtk_box_pack_start (GTK_BOX (content_area),
5507 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5510 gtk_box_pack_start (GTK_BOX (content_area),
5511 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5514 gtk_box_pack_start (GTK_BOX (content_area),
5515 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5518 button = gtk_button_new_with_label ("Close");
5519 g_signal_connect_swapped (button, "clicked",
5520 G_CALLBACK (gtk_widget_destroy), window);
5521 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5524 if (!gtk_widget_get_visible (window))
5525 gtk_widget_show_all (window);
5527 gtk_widget_destroy (window);
5535 make_focus_table (GList **list)
5540 table = gtk_table_new (5, 5, FALSE);
5553 widget = gtk_entry_new ();
5555 widget = gtk_button_new_with_label ("Foo");
5557 *list = g_list_prepend (*list, widget);
5559 gtk_table_attach (GTK_TABLE (table),
5563 GTK_EXPAND | GTK_FILL,
5564 GTK_EXPAND | GTK_FILL,
5573 *list = g_list_reverse (*list);
5579 create_focus (GtkWidget *widget)
5581 static GtkWidget *window = NULL;
5585 GtkWidget *content_area;
5590 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5596 gtk_window_set_screen (GTK_WINDOW (window),
5597 gtk_widget_get_screen (widget));
5599 g_signal_connect (window, "destroy",
5600 G_CALLBACK (gtk_widget_destroyed),
5603 g_signal_connect (window, "response",
5604 G_CALLBACK (gtk_widget_destroy),
5607 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5609 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5611 frame = gtk_frame_new ("Weird tab focus chain");
5613 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5615 table = make_focus_table (&list);
5617 gtk_container_add (GTK_CONTAINER (frame), table);
5619 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5624 frame = gtk_frame_new ("Default tab focus chain");
5626 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5629 table = make_focus_table (&list);
5633 gtk_container_add (GTK_CONTAINER (frame), table);
5636 if (!gtk_widget_get_visible (window))
5637 gtk_widget_show_all (window);
5639 gtk_widget_destroy (window);
5647 font_selection_ok (GtkWidget *w,
5648 GtkFontSelectionDialog *fs)
5650 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5652 g_print ("%s\n", s);
5654 gtk_widget_destroy (GTK_WIDGET (fs));
5658 create_font_selection (GtkWidget *widget)
5660 static GtkWidget *window = NULL;
5668 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5669 gtk_window_set_screen (GTK_WINDOW (window),
5670 gtk_widget_get_screen (widget));
5672 g_signal_connect (window, "destroy",
5673 G_CALLBACK (gtk_widget_destroyed),
5676 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5677 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5679 hbox = gtk_hbox_new (FALSE, 8);
5680 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5681 gtk_container_add (GTK_CONTAINER (window), hbox);
5683 label = gtk_label_new ("Pick a font");
5684 gtk_container_add (GTK_CONTAINER (hbox), label);
5686 picker = gtk_font_button_new ();
5687 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5688 gtk_container_add (GTK_CONTAINER (hbox), picker);
5691 if (!gtk_widget_get_visible (window))
5692 gtk_widget_show_all (window);
5694 gtk_widget_destroy (window);
5701 static GtkWidget *dialog_window = NULL;
5704 label_toggle (GtkWidget *widget,
5709 *label = gtk_label_new ("Dialog Test");
5710 g_signal_connect (*label,
5712 G_CALLBACK (gtk_widget_destroyed),
5714 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
5715 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5716 *label, TRUE, TRUE, 0);
5717 gtk_widget_show (*label);
5720 gtk_widget_destroy (*label);
5724 create_dialog (GtkWidget *widget)
5726 static GtkWidget *label;
5727 GtkWidget *action_area;
5732 /* This is a terrible example; it's much simpler to create
5733 * dialogs than this. Don't use testgtk for example code,
5737 dialog_window = gtk_dialog_new ();
5738 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5739 gtk_widget_get_screen (widget));
5741 g_signal_connect (dialog_window, "destroy",
5742 G_CALLBACK (gtk_widget_destroyed),
5745 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5747 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5748 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5750 button = gtk_button_new_with_label ("OK");
5751 gtk_widget_set_can_default (button, TRUE);
5752 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5753 gtk_widget_grab_default (button);
5754 gtk_widget_show (button);
5756 button = gtk_button_new_with_label ("Toggle");
5757 g_signal_connect (button, "clicked",
5758 G_CALLBACK (label_toggle),
5760 gtk_widget_set_can_default (button, TRUE);
5761 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5762 gtk_widget_show (button);
5767 if (!gtk_widget_get_visible (dialog_window))
5768 gtk_widget_show (dialog_window);
5770 gtk_widget_destroy (dialog_window);
5773 /* Display & Screen test
5780 GtkWidget *radio_dpy;
5781 GtkWidget *toplevel;
5782 GtkWidget *dialog_window;
5783 } ScreenDisplaySelection;
5786 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5788 const gchar *display_name;
5789 GdkDisplay *display = gtk_widget_get_display (widget);
5791 GdkScreen *new_screen = NULL;
5792 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5794 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5796 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5797 display = gdk_display_open (display_name);
5801 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5802 GTK_DIALOG_DESTROY_WITH_PARENT,
5805 "The display :\n%s\ncannot be opened",
5807 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5808 gtk_widget_show (dialog);
5809 g_signal_connect (dialog, "response",
5810 G_CALLBACK (gtk_widget_destroy),
5815 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5818 gboolean found = FALSE;
5819 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5822 gtk_tree_model_get (model, &iter, 0, &name, -1);
5823 found = !g_ascii_strcasecmp (display_name, name);
5830 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
5831 new_screen = gdk_display_get_default_screen (display);
5836 gint number_of_screens = gdk_display_get_n_screens (display);
5837 gint screen_num = gdk_screen_get_number (current_screen);
5838 if ((screen_num +1) < number_of_screens)
5839 new_screen = gdk_display_get_screen (display, screen_num + 1);
5841 new_screen = gdk_display_get_screen (display, 0);
5846 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5847 gtk_widget_destroy (data->dialog_window);
5852 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5854 gtk_widget_destroy (data);
5858 create_display_screen (GtkWidget *widget)
5860 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5861 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5863 ScreenDisplaySelection *scr_dpy_data;
5864 GdkScreen *screen = gtk_widget_get_screen (widget);
5865 GdkDisplay *display = gdk_screen_get_display (screen);
5867 window = g_object_new (gtk_window_get_type (),
5870 "type", GTK_WINDOW_TOPLEVEL,
5872 "Screen or Display selection",
5873 "border_width", 10, NULL);
5874 g_signal_connect (window, "destroy",
5875 G_CALLBACK (gtk_widget_destroy), NULL);
5877 vbox = gtk_vbox_new (FALSE, 3);
5878 gtk_container_add (GTK_CONTAINER (window), vbox);
5880 frame = gtk_frame_new ("Select screen or display");
5881 gtk_container_add (GTK_CONTAINER (vbox), frame);
5883 table = gtk_table_new (2, 2, TRUE);
5884 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5885 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5887 gtk_container_add (GTK_CONTAINER (frame), table);
5889 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5890 if (gdk_display_get_n_screens(display) > 1)
5891 radio_scr = gtk_radio_button_new_with_label
5892 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5895 radio_scr = gtk_radio_button_new_with_label
5896 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5897 "only one screen on the current display");
5898 gtk_widget_set_sensitive (radio_scr, FALSE);
5900 combo_dpy = gtk_combo_box_new_text ();
5901 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
5902 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5903 "<hostname>:<X Server Num>.<Screen Num>");
5905 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5906 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5907 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5909 bbox = gtk_hbutton_box_new ();
5910 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5911 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5913 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5915 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5916 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5918 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5920 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5921 scr_dpy_data->radio_dpy = radio_dpy;
5922 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5923 scr_dpy_data->dialog_window = window;
5925 g_signal_connect (cancelb, "clicked",
5926 G_CALLBACK (screen_display_destroy_diag), window);
5927 g_signal_connect (applyb, "clicked",
5928 G_CALLBACK (screen_display_check), scr_dpy_data);
5929 gtk_widget_show_all (window);
5934 static gboolean event_watcher_enter_id = 0;
5935 static gboolean event_watcher_leave_id = 0;
5938 event_watcher (GSignalInvocationHint *ihint,
5939 guint n_param_values,
5940 const GValue *param_values,
5943 g_print ("Watch: \"%s\" emitted for %s\n",
5944 g_signal_name (ihint->signal_id),
5945 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5951 event_watcher_down (void)
5953 if (event_watcher_enter_id)
5957 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5958 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5959 event_watcher_enter_id = 0;
5960 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5961 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5962 event_watcher_leave_id = 0;
5967 event_watcher_toggle (void)
5969 if (event_watcher_enter_id)
5970 event_watcher_down ();
5975 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5976 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5977 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5978 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5983 create_event_watcher (GtkWidget *widget)
5985 GtkWidget *action_area, *content_area;
5990 dialog_window = gtk_dialog_new ();
5991 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5992 gtk_widget_get_screen (widget));
5994 g_signal_connect (dialog_window, "destroy",
5995 G_CALLBACK (gtk_widget_destroyed),
5997 g_signal_connect (dialog_window, "destroy",
5998 G_CALLBACK (event_watcher_down),
6001 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
6002 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
6004 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6005 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6006 gtk_widget_set_size_request (dialog_window, 200, 110);
6008 button = gtk_toggle_button_new_with_label ("Activate Watch");
6009 g_signal_connect (button, "clicked",
6010 G_CALLBACK (event_watcher_toggle),
6012 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6013 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
6014 gtk_widget_show (button);
6016 button = gtk_button_new_with_label ("Close");
6017 g_signal_connect_swapped (button, "clicked",
6018 G_CALLBACK (gtk_widget_destroy),
6020 gtk_widget_set_can_default (button, TRUE);
6021 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6022 gtk_widget_grab_default (button);
6023 gtk_widget_show (button);
6026 if (!gtk_widget_get_visible (dialog_window))
6027 gtk_widget_show (dialog_window);
6029 gtk_widget_destroy (dialog_window);
6037 reformat_value (GtkScale *scale,
6040 return g_strdup_printf ("-->%0.*g<--",
6041 gtk_scale_get_digits (scale), value);
6045 create_range_controls (GtkWidget *widget)
6047 static GtkWidget *window = NULL;
6051 GtkWidget *scrollbar;
6053 GtkWidget *separator;
6054 GtkObject *adjustment;
6059 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6061 gtk_window_set_screen (GTK_WINDOW (window),
6062 gtk_widget_get_screen (widget));
6064 g_signal_connect (window, "destroy",
6065 G_CALLBACK (gtk_widget_destroyed),
6068 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6069 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6072 box1 = gtk_vbox_new (FALSE, 0);
6073 gtk_container_add (GTK_CONTAINER (window), box1);
6074 gtk_widget_show (box1);
6077 box2 = gtk_vbox_new (FALSE, 10);
6078 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6079 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6080 gtk_widget_show (box2);
6083 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6085 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6086 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6087 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6088 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6089 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6090 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6091 gtk_widget_show (scale);
6093 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6094 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6095 GTK_UPDATE_CONTINUOUS);
6096 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6097 gtk_widget_show (scrollbar);
6099 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6100 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6101 g_signal_connect (scale,
6103 G_CALLBACK (reformat_value),
6105 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6106 gtk_widget_show (scale);
6108 hbox = gtk_hbox_new (FALSE, 0);
6110 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6111 gtk_widget_set_size_request (scale, -1, 200);
6112 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6113 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6114 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6115 gtk_widget_show (scale);
6117 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6118 gtk_widget_set_size_request (scale, -1, 200);
6119 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6120 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6121 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6122 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6123 gtk_widget_show (scale);
6125 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6126 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6127 g_signal_connect (scale,
6129 G_CALLBACK (reformat_value),
6131 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6132 gtk_widget_show (scale);
6135 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6136 gtk_widget_show (hbox);
6138 separator = gtk_hseparator_new ();
6139 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6140 gtk_widget_show (separator);
6143 box2 = gtk_vbox_new (FALSE, 10);
6144 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6145 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6146 gtk_widget_show (box2);
6149 button = gtk_button_new_with_label ("close");
6150 g_signal_connect_swapped (button, "clicked",
6151 G_CALLBACK (gtk_widget_destroy),
6153 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6154 gtk_widget_set_can_default (button, TRUE);
6155 gtk_widget_grab_default (button);
6156 gtk_widget_show (button);
6159 if (!gtk_widget_get_visible (window))
6160 gtk_widget_show (window);
6162 gtk_widget_destroy (window);
6170 create_rulers (GtkWidget *widget)
6172 static GtkWidget *window = NULL;
6178 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6180 gtk_window_set_screen (GTK_WINDOW (window),
6181 gtk_widget_get_screen (widget));
6183 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
6185 g_signal_connect (window, "destroy",
6186 G_CALLBACK (gtk_widget_destroyed),
6189 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6190 gtk_widget_set_size_request (window, 300, 300);
6191 gtk_widget_set_events (window,
6192 GDK_POINTER_MOTION_MASK
6193 | GDK_POINTER_MOTION_HINT_MASK);
6194 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6196 table = gtk_table_new (2, 2, FALSE);
6197 gtk_container_add (GTK_CONTAINER (window), table);
6198 gtk_widget_show (table);
6200 ruler = gtk_hruler_new ();
6201 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6202 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6204 g_signal_connect_swapped (window,
6205 "motion_notify_event",
6206 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6209 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6210 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6211 gtk_widget_show (ruler);
6214 ruler = gtk_vruler_new ();
6215 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6217 g_signal_connect_swapped (window,
6218 "motion_notify_event",
6219 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6222 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6223 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6224 gtk_widget_show (ruler);
6227 if (!gtk_widget_get_visible (window))
6228 gtk_widget_show (window);
6230 gtk_widget_destroy (window);
6237 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6238 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6239 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6240 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6241 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6242 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6243 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6244 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6247 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6253 static const char * book_open_xpm[] = {
6276 static const char * book_closed_xpm[] = {
6301 GdkPixbuf *book_open;
6302 GdkPixbuf *book_closed;
6303 GtkWidget *sample_notebook;
6306 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6308 GtkWidget *page_widget;
6311 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6313 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6314 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6316 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6317 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6321 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6323 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6324 gint old_page_num = gtk_notebook_get_current_page (notebook);
6326 if (page_num == old_page_num)
6329 set_page_image (notebook, page_num, book_open);
6331 if (old_page_num != -1)
6332 set_page_image (notebook, old_page_num, book_closed);
6336 tab_fill (GtkToggleButton *button, GtkWidget *child)
6338 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6339 "tab-fill", gtk_toggle_button_get_active (button),
6344 tab_expand (GtkToggleButton *button, GtkWidget *child)
6346 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6347 "tab-expand", gtk_toggle_button_get_active (button),
6352 create_pages (GtkNotebook *notebook, gint start, gint end)
6354 GtkWidget *child = NULL;
6359 GtkWidget *label_box;
6360 GtkWidget *menu_box;
6364 char accel_buffer[32];
6366 for (i = start; i <= end; i++)
6368 sprintf (buffer, "Page %d", i);
6369 sprintf (accel_buffer, "Page _%d", i);
6371 child = gtk_frame_new (buffer);
6372 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6374 vbox = gtk_vbox_new (TRUE,0);
6375 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6376 gtk_container_add (GTK_CONTAINER (child), vbox);
6378 hbox = gtk_hbox_new (TRUE,0);
6379 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6381 button = gtk_check_button_new_with_label ("Fill Tab");
6382 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6383 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6384 g_signal_connect (button, "toggled",
6385 G_CALLBACK (tab_fill), child);
6387 button = gtk_check_button_new_with_label ("Expand Tab");
6388 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6389 g_signal_connect (button, "toggled",
6390 G_CALLBACK (tab_expand), child);
6392 button = gtk_button_new_with_label ("Hide Page");
6393 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6394 g_signal_connect_swapped (button, "clicked",
6395 G_CALLBACK (gtk_widget_hide),
6398 gtk_widget_show_all (child);
6400 label_box = gtk_hbox_new (FALSE, 0);
6401 pixwid = gtk_image_new_from_pixbuf (book_closed);
6402 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6404 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6405 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6406 label = gtk_label_new_with_mnemonic (accel_buffer);
6407 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6408 gtk_widget_show_all (label_box);
6411 menu_box = gtk_hbox_new (FALSE, 0);
6412 pixwid = gtk_image_new_from_pixbuf (book_closed);
6413 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6415 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6416 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6417 label = gtk_label_new (buffer);
6418 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6419 gtk_widget_show_all (menu_box);
6421 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6426 rotate_notebook (GtkButton *button,
6427 GtkNotebook *notebook)
6429 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6433 show_all_pages (GtkButton *button,
6434 GtkNotebook *notebook)
6436 gtk_container_foreach (GTK_CONTAINER (notebook),
6437 (GtkCallback) gtk_widget_show, NULL);
6441 notebook_type_changed (GtkWidget *optionmenu,
6444 GtkNotebook *notebook;
6454 notebook = GTK_NOTEBOOK (data);
6456 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6461 /* standard notebook */
6462 gtk_notebook_set_show_tabs (notebook, TRUE);
6463 gtk_notebook_set_show_border (notebook, TRUE);
6464 gtk_notebook_set_scrollable (notebook, FALSE);
6468 /* notabs notebook */
6469 gtk_notebook_set_show_tabs (notebook, FALSE);
6470 gtk_notebook_set_show_border (notebook, TRUE);
6475 gtk_notebook_set_show_tabs (notebook, FALSE);
6476 gtk_notebook_set_show_border (notebook, FALSE);
6481 gtk_notebook_set_show_tabs (notebook, TRUE);
6482 gtk_notebook_set_show_border (notebook, TRUE);
6483 gtk_notebook_set_scrollable (notebook, TRUE);
6484 if (gtk_notebook_get_n_pages (notebook) == 5)
6485 create_pages (notebook, 6, 15);
6491 if (gtk_notebook_get_n_pages (notebook) == 15)
6492 for (i = 0; i < 10; i++)
6493 gtk_notebook_remove_page (notebook, 5);
6497 notebook_popup (GtkToggleButton *button,
6498 GtkNotebook *notebook)
6501 gtk_notebook_popup_enable (notebook);
6503 gtk_notebook_popup_disable (notebook);
6507 create_notebook (GtkWidget *widget)
6509 static GtkWidget *window = NULL;
6513 GtkWidget *separator;
6517 static gchar *items[] =
6527 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6528 gtk_window_set_screen (GTK_WINDOW (window),
6529 gtk_widget_get_screen (widget));
6531 g_signal_connect (window, "destroy",
6532 G_CALLBACK (gtk_widget_destroyed),
6535 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6536 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6538 box1 = gtk_vbox_new (FALSE, 0);
6539 gtk_container_add (GTK_CONTAINER (window), box1);
6541 sample_notebook = gtk_notebook_new ();
6542 g_signal_connect (sample_notebook, "switch_page",
6543 G_CALLBACK (page_switch), NULL);
6544 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6545 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6546 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6548 gtk_widget_realize (sample_notebook);
6551 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6554 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6556 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6558 separator = gtk_hseparator_new ();
6559 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6561 box2 = gtk_hbox_new (FALSE, 5);
6562 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6563 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6565 button = gtk_check_button_new_with_label ("popup menu");
6566 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6567 g_signal_connect (button, "clicked",
6568 G_CALLBACK (notebook_popup),
6571 box2 = gtk_hbox_new (FALSE, 5);
6572 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6573 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6575 label = gtk_label_new ("Notebook Style :");
6576 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6578 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6579 notebook_type_changed,
6581 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6583 button = gtk_button_new_with_label ("Show all Pages");
6584 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6585 g_signal_connect (button, "clicked",
6586 G_CALLBACK (show_all_pages), sample_notebook);
6588 box2 = gtk_hbox_new (TRUE, 10);
6589 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6590 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6592 button = gtk_button_new_with_label ("prev");
6593 g_signal_connect_swapped (button, "clicked",
6594 G_CALLBACK (gtk_notebook_prev_page),
6596 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6598 button = gtk_button_new_with_label ("next");
6599 g_signal_connect_swapped (button, "clicked",
6600 G_CALLBACK (gtk_notebook_next_page),
6602 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6604 button = gtk_button_new_with_label ("rotate");
6605 g_signal_connect (button, "clicked",
6606 G_CALLBACK (rotate_notebook), sample_notebook);
6607 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6609 separator = gtk_hseparator_new ();
6610 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6612 button = gtk_button_new_with_label ("close");
6613 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6614 g_signal_connect_swapped (button, "clicked",
6615 G_CALLBACK (gtk_widget_destroy),
6617 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6618 gtk_widget_set_can_default (button, TRUE);
6619 gtk_widget_grab_default (button);
6622 if (!gtk_widget_get_visible (window))
6623 gtk_widget_show_all (window);
6625 gtk_widget_destroy (window);
6633 toggle_resize (GtkWidget *widget, GtkWidget *child)
6635 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6636 GValue value = { 0, };
6637 g_value_init (&value, G_TYPE_BOOLEAN);
6638 gtk_container_child_get_property (container, child, "resize", &value);
6639 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6640 gtk_container_child_set_property (container, child, "resize", &value);
6644 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6646 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6647 GValue value = { 0, };
6648 g_value_init (&value, G_TYPE_BOOLEAN);
6649 gtk_container_child_get_property (container, child, "shrink", &value);
6650 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6651 gtk_container_child_set_property (container, child, "shrink", &value);
6655 paned_props_clicked (GtkWidget *button,
6658 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6660 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6664 create_pane_options (GtkPaned *paned,
6665 const gchar *frame_label,
6666 const gchar *label1,
6667 const gchar *label2)
6669 GtkWidget *child1, *child2;
6674 GtkWidget *check_button;
6676 child1 = gtk_paned_get_child1 (paned);
6677 child2 = gtk_paned_get_child2 (paned);
6679 frame = gtk_frame_new (frame_label);
6680 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6682 table = gtk_table_new (4, 2, 4);
6683 gtk_container_add (GTK_CONTAINER (frame), table);
6685 label = gtk_label_new (label1);
6686 gtk_table_attach_defaults (GTK_TABLE (table), label,
6689 check_button = gtk_check_button_new_with_label ("Resize");
6690 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6692 g_signal_connect (check_button, "toggled",
6693 G_CALLBACK (toggle_resize),
6696 check_button = gtk_check_button_new_with_label ("Shrink");
6697 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6699 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6701 g_signal_connect (check_button, "toggled",
6702 G_CALLBACK (toggle_shrink),
6705 label = gtk_label_new (label2);
6706 gtk_table_attach_defaults (GTK_TABLE (table), label,
6709 check_button = gtk_check_button_new_with_label ("Resize");
6710 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6712 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6714 g_signal_connect (check_button, "toggled",
6715 G_CALLBACK (toggle_resize),
6718 check_button = gtk_check_button_new_with_label ("Shrink");
6719 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6721 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6723 g_signal_connect (check_button, "toggled",
6724 G_CALLBACK (toggle_shrink),
6727 button = gtk_button_new_with_mnemonic ("_Properties");
6728 gtk_table_attach_defaults (GTK_TABLE (table), button,
6730 g_signal_connect (button, "clicked",
6731 G_CALLBACK (paned_props_clicked),
6738 create_panes (GtkWidget *widget)
6740 static GtkWidget *window = NULL;
6749 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6751 gtk_window_set_screen (GTK_WINDOW (window),
6752 gtk_widget_get_screen (widget));
6754 g_signal_connect (window, "destroy",
6755 G_CALLBACK (gtk_widget_destroyed),
6758 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6759 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6761 vbox = gtk_vbox_new (FALSE, 0);
6762 gtk_container_add (GTK_CONTAINER (window), vbox);
6764 vpaned = gtk_vpaned_new ();
6765 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6766 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6768 hpaned = gtk_hpaned_new ();
6769 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6771 frame = gtk_frame_new (NULL);
6772 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6773 gtk_widget_set_size_request (frame, 60, 60);
6774 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6776 button = gtk_button_new_with_label ("Hi there");
6777 gtk_container_add (GTK_CONTAINER(frame), button);
6779 frame = gtk_frame_new (NULL);
6780 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6781 gtk_widget_set_size_request (frame, 80, 60);
6782 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6784 frame = gtk_frame_new (NULL);
6785 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6786 gtk_widget_set_size_request (frame, 60, 80);
6787 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6789 /* Now create toggle buttons to control sizing */
6791 gtk_box_pack_start (GTK_BOX (vbox),
6792 create_pane_options (GTK_PANED (hpaned),
6798 gtk_box_pack_start (GTK_BOX (vbox),
6799 create_pane_options (GTK_PANED (vpaned),
6805 gtk_widget_show_all (vbox);
6808 if (!gtk_widget_get_visible (window))
6809 gtk_widget_show (window);
6811 gtk_widget_destroy (window);
6815 * Paned keyboard navigation
6819 paned_keyboard_window1 (GtkWidget *widget)
6842 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6843 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6844 gtk_window_set_screen (GTK_WINDOW (window1),
6845 gtk_widget_get_screen (widget));
6847 hpaned1 = gtk_hpaned_new ();
6848 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6850 frame1 = gtk_frame_new (NULL);
6851 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6852 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6854 vbox1 = gtk_vbox_new (FALSE, 0);
6855 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6857 button7 = gtk_button_new_with_label ("button7");
6858 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6860 button8 = gtk_button_new_with_label ("button8");
6861 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6863 button9 = gtk_button_new_with_label ("button9");
6864 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6866 vpaned1 = gtk_vpaned_new ();
6867 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6869 frame2 = gtk_frame_new (NULL);
6870 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6871 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6873 frame5 = gtk_frame_new (NULL);
6874 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6876 hbox1 = gtk_hbox_new (FALSE, 0);
6877 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6879 button5 = gtk_button_new_with_label ("button5");
6880 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6882 button6 = gtk_button_new_with_label ("button6");
6883 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6885 frame3 = gtk_frame_new (NULL);
6886 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6887 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6889 frame4 = gtk_frame_new ("Buttons");
6890 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6891 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6893 table1 = gtk_table_new (2, 2, FALSE);
6894 gtk_container_add (GTK_CONTAINER (frame4), table1);
6895 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6897 button1 = gtk_button_new_with_label ("button1");
6898 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6899 (GtkAttachOptions) (GTK_FILL),
6900 (GtkAttachOptions) (0), 0, 0);
6902 button2 = gtk_button_new_with_label ("button2");
6903 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6904 (GtkAttachOptions) (GTK_FILL),
6905 (GtkAttachOptions) (0), 0, 0);
6907 button3 = gtk_button_new_with_label ("button3");
6908 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6909 (GtkAttachOptions) (GTK_FILL),
6910 (GtkAttachOptions) (0), 0, 0);
6912 button4 = gtk_button_new_with_label ("button4");
6913 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6914 (GtkAttachOptions) (GTK_FILL),
6915 (GtkAttachOptions) (0), 0, 0);
6921 paned_keyboard_window2 (GtkWidget *widget)
6926 GtkWidget *button13;
6930 GtkWidget *button12;
6932 GtkWidget *button11;
6933 GtkWidget *button10;
6935 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6936 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6938 gtk_window_set_screen (GTK_WINDOW (window2),
6939 gtk_widget_get_screen (widget));
6941 hpaned2 = gtk_hpaned_new ();
6942 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6944 frame6 = gtk_frame_new (NULL);
6945 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6946 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6948 button13 = gtk_button_new_with_label ("button13");
6949 gtk_container_add (GTK_CONTAINER (frame6), button13);
6951 hbox2 = gtk_hbox_new (FALSE, 0);
6952 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6954 vpaned2 = gtk_vpaned_new ();
6955 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6957 frame7 = gtk_frame_new (NULL);
6958 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6959 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6961 button12 = gtk_button_new_with_label ("button12");
6962 gtk_container_add (GTK_CONTAINER (frame7), button12);
6964 frame8 = gtk_frame_new (NULL);
6965 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6966 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6968 button11 = gtk_button_new_with_label ("button11");
6969 gtk_container_add (GTK_CONTAINER (frame8), button11);
6971 button10 = gtk_button_new_with_label ("button10");
6972 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6978 paned_keyboard_window3 (GtkWidget *widget)
6985 GtkWidget *button14;
6988 GtkWidget *button15;
6991 GtkWidget *button16;
6993 GtkWidget *button17;
6995 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6996 g_object_set_data (G_OBJECT (window3), "window3", window3);
6997 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6999 gtk_window_set_screen (GTK_WINDOW (window3),
7000 gtk_widget_get_screen (widget));
7003 vbox2 = gtk_vbox_new (FALSE, 0);
7004 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7006 label1 = gtk_label_new ("Three panes nested inside each other");
7007 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7009 hpaned3 = gtk_hpaned_new ();
7010 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7012 frame9 = gtk_frame_new (NULL);
7013 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7014 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7016 button14 = gtk_button_new_with_label ("button14");
7017 gtk_container_add (GTK_CONTAINER (frame9), button14);
7019 hpaned4 = gtk_hpaned_new ();
7020 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7022 frame10 = gtk_frame_new (NULL);
7023 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7024 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7026 button15 = gtk_button_new_with_label ("button15");
7027 gtk_container_add (GTK_CONTAINER (frame10), button15);
7029 hpaned5 = gtk_hpaned_new ();
7030 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7032 frame11 = gtk_frame_new (NULL);
7033 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7034 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7036 button16 = gtk_button_new_with_label ("button16");
7037 gtk_container_add (GTK_CONTAINER (frame11), button16);
7039 frame12 = gtk_frame_new (NULL);
7040 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7041 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7043 button17 = gtk_button_new_with_label ("button17");
7044 gtk_container_add (GTK_CONTAINER (frame12), button17);
7050 paned_keyboard_window4 (GtkWidget *widget)
7057 GtkWidget *button19;
7058 GtkWidget *button18;
7061 GtkWidget *button21;
7062 GtkWidget *button20;
7064 GtkWidget *button23;
7065 GtkWidget *button22;
7067 GtkWidget *button25;
7068 GtkWidget *button24;
7070 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7071 g_object_set_data (G_OBJECT (window4), "window4", window4);
7072 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7074 gtk_window_set_screen (GTK_WINDOW (window4),
7075 gtk_widget_get_screen (widget));
7077 vbox3 = gtk_vbox_new (FALSE, 0);
7078 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7080 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7081 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7082 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7084 hpaned6 = gtk_hpaned_new ();
7085 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7087 vpaned3 = gtk_vpaned_new ();
7088 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7090 button19 = gtk_button_new_with_label ("button19");
7091 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7093 button18 = gtk_button_new_with_label ("button18");
7094 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7096 hbox3 = gtk_hbox_new (FALSE, 0);
7097 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7099 vpaned4 = gtk_vpaned_new ();
7100 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7102 button21 = gtk_button_new_with_label ("button21");
7103 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7105 button20 = gtk_button_new_with_label ("button20");
7106 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7108 vpaned5 = gtk_vpaned_new ();
7109 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7111 button23 = gtk_button_new_with_label ("button23");
7112 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7114 button22 = gtk_button_new_with_label ("button22");
7115 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7117 vpaned6 = gtk_vpaned_new ();
7118 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7120 button25 = gtk_button_new_with_label ("button25");
7121 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7123 button24 = gtk_button_new_with_label ("button24");
7124 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7130 create_paned_keyboard_navigation (GtkWidget *widget)
7132 static GtkWidget *window1 = NULL;
7133 static GtkWidget *window2 = NULL;
7134 static GtkWidget *window3 = NULL;
7135 static GtkWidget *window4 = NULL;
7138 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7140 gtk_widget_destroy (window1);
7141 gtk_widget_destroy (window2);
7142 gtk_widget_destroy (window3);
7143 gtk_widget_destroy (window4);
7148 window1 = paned_keyboard_window1 (widget);
7149 g_signal_connect (window1, "destroy",
7150 G_CALLBACK (gtk_widget_destroyed),
7156 window2 = paned_keyboard_window2 (widget);
7157 g_signal_connect (window2, "destroy",
7158 G_CALLBACK (gtk_widget_destroyed),
7164 window3 = paned_keyboard_window3 (widget);
7165 g_signal_connect (window3, "destroy",
7166 G_CALLBACK (gtk_widget_destroyed),
7172 window4 = paned_keyboard_window4 (widget);
7173 g_signal_connect (window4, "destroy",
7174 G_CALLBACK (gtk_widget_destroyed),
7178 if (gtk_widget_get_visible (window1))
7179 gtk_widget_destroy (GTK_WIDGET (window1));
7181 gtk_widget_show_all (GTK_WIDGET (window1));
7183 if (gtk_widget_get_visible (window2))
7184 gtk_widget_destroy (GTK_WIDGET (window2));
7186 gtk_widget_show_all (GTK_WIDGET (window2));
7188 if (gtk_widget_get_visible (window3))
7189 gtk_widget_destroy (GTK_WIDGET (window3));
7191 gtk_widget_show_all (GTK_WIDGET (window3));
7193 if (gtk_widget_get_visible (window4))
7194 gtk_widget_destroy (GTK_WIDGET (window4));
7196 gtk_widget_show_all (GTK_WIDGET (window4));
7204 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7207 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7211 /* ignore double and triple click */
7212 if (event->type != GDK_BUTTON_PRESS)
7215 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7216 p->x = (int) event->x;
7217 p->y = (int) event->y;
7219 gtk_grab_add (widget);
7220 gdk_pointer_grab (gtk_widget_get_window (widget), TRUE,
7221 GDK_BUTTON_RELEASE_MASK |
7222 GDK_BUTTON_MOTION_MASK |
7223 GDK_POINTER_MOTION_HINT_MASK,
7228 shape_released (GtkWidget *widget)
7230 gtk_grab_remove (widget);
7231 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7236 shape_motion (GtkWidget *widget,
7237 GdkEventMotion *event)
7241 GdkModifierType mask;
7243 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7246 * Can't use event->x / event->y here
7247 * because I need absolute coordinates.
7249 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7250 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7254 shape_create_icon (GdkScreen *screen,
7265 CursorOffset* icon_pos;
7270 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7272 window = gtk_window_new (window_type);
7273 gtk_window_set_screen (GTK_WINDOW (window), screen);
7275 fixed = gtk_fixed_new ();
7276 gtk_widget_set_size_request (fixed, 100, 100);
7277 gtk_container_add (GTK_CONTAINER (window), fixed);
7278 gtk_widget_show (fixed);
7280 gtk_widget_set_events (window,
7281 gtk_widget_get_events (window) |
7282 GDK_BUTTON_MOTION_MASK |
7283 GDK_POINTER_MOTION_HINT_MASK |
7284 GDK_BUTTON_PRESS_MASK);
7286 gtk_widget_realize (window);
7288 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7289 g_assert (pixbuf); /* FIXME: error handling */
7291 gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf,
7292 gtk_widget_get_colormap (window),
7297 image = gtk_image_new_from_pixbuf (pixbuf);
7298 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7299 gtk_widget_show (image);
7301 gtk_widget_shape_combine_mask (window, mask, px, py);
7303 g_object_unref (mask);
7304 g_object_unref (pixbuf);
7306 g_signal_connect (window, "button_press_event",
7307 G_CALLBACK (shape_pressed), NULL);
7308 g_signal_connect (window, "button_release_event",
7309 G_CALLBACK (shape_released), NULL);
7310 g_signal_connect (window, "motion_notify_event",
7311 G_CALLBACK (shape_motion), NULL);
7313 icon_pos = g_new (CursorOffset, 1);
7314 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7316 gtk_window_move (GTK_WINDOW (window), x, y);
7317 gtk_widget_show (window);
7323 create_shapes (GtkWidget *widget)
7325 /* Variables used by the Drag/Drop and Shape Window demos */
7326 static GtkWidget *modeller = NULL;
7327 static GtkWidget *sheets = NULL;
7328 static GtkWidget *rings = NULL;
7329 static GtkWidget *with_region = NULL;
7330 GdkScreen *screen = gtk_widget_get_screen (widget);
7332 if (!(file_exists ("Modeller.xpm") &&
7333 file_exists ("FilesQueue.xpm") &&
7334 file_exists ("3DRings.xpm")))
7340 modeller = shape_create_icon (screen, "Modeller.xpm",
7341 440, 140, 0,0, GTK_WINDOW_POPUP);
7343 g_signal_connect (modeller, "destroy",
7344 G_CALLBACK (gtk_widget_destroyed),
7348 gtk_widget_destroy (modeller);
7352 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7353 580, 170, 0,0, GTK_WINDOW_POPUP);
7355 g_signal_connect (sheets, "destroy",
7356 G_CALLBACK (gtk_widget_destroyed),
7361 gtk_widget_destroy (sheets);
7365 rings = shape_create_icon (screen, "3DRings.xpm",
7366 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7368 g_signal_connect (rings, "destroy",
7369 G_CALLBACK (gtk_widget_destroyed),
7373 gtk_widget_destroy (rings);
7377 cairo_region_t *region;
7380 with_region = shape_create_icon (screen, "3DRings.xpm",
7381 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7383 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7385 g_signal_connect (with_region, "destroy",
7386 G_CALLBACK (gtk_widget_destroyed),
7389 /* reset shape from mask to a region */
7392 region = cairo_region_create ();
7404 cairo_region_union_rectangle (region, &rect);
7412 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7417 gtk_widget_destroy (with_region);
7425 create_wmhints (GtkWidget *widget)
7427 static GtkWidget *window = NULL;
7429 GtkWidget *separator;
7433 GdkWindow *gdk_window;
7439 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7441 gtk_window_set_screen (GTK_WINDOW (window),
7442 gtk_widget_get_screen (widget));
7444 g_signal_connect (window, "destroy",
7445 G_CALLBACK (gtk_widget_destroyed),
7448 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7449 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7451 gtk_widget_realize (window);
7453 gdk_window = gtk_widget_get_window (window);
7455 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7456 list = g_list_prepend (NULL, pixbuf);
7458 gdk_window_set_icon_list (gdk_window, list);
7461 g_object_unref (pixbuf);
7463 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7465 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7466 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7468 box1 = gtk_vbox_new (FALSE, 0);
7469 gtk_container_add (GTK_CONTAINER (window), box1);
7470 gtk_widget_show (box1);
7472 label = gtk_label_new ("Try iconizing me!");
7473 gtk_widget_set_size_request (label, 150, 50);
7474 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7475 gtk_widget_show (label);
7478 separator = gtk_hseparator_new ();
7479 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7480 gtk_widget_show (separator);
7483 box2 = gtk_vbox_new (FALSE, 10);
7484 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7485 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7486 gtk_widget_show (box2);
7489 button = gtk_button_new_with_label ("close");
7491 g_signal_connect_swapped (button, "clicked",
7492 G_CALLBACK (gtk_widget_destroy),
7495 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7496 gtk_widget_set_can_default (button, TRUE);
7497 gtk_widget_grab_default (button);
7498 gtk_widget_show (button);
7501 if (!gtk_widget_get_visible (window))
7502 gtk_widget_show (window);
7504 gtk_widget_destroy (window);
7509 * Window state tracking
7513 window_state_callback (GtkWidget *widget,
7514 GdkEventWindowState *event,
7517 GtkWidget *label = data;
7520 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7521 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7522 "withdrawn" : "not withdrawn", ", ",
7523 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7524 "iconified" : "not iconified", ", ",
7525 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7526 "sticky" : "not sticky", ", ",
7527 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7528 "maximized" : "not maximized", ", ",
7529 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7530 "fullscreen" : "not fullscreen",
7531 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7532 "above" : "not above", ", ",
7533 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7534 "below" : "not below", ", ",
7537 gtk_label_set_text (GTK_LABEL (label), msg);
7545 tracking_label (GtkWidget *window)
7551 hbox = gtk_hbox_new (FALSE, 5);
7553 g_signal_connect_object (hbox,
7555 G_CALLBACK (gtk_widget_destroy),
7559 label = gtk_label_new ("<no window state events received>");
7560 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7561 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7563 g_signal_connect (window,
7564 "window_state_event",
7565 G_CALLBACK (window_state_callback),
7568 button = gtk_button_new_with_label ("Deiconify");
7569 g_signal_connect_object (button,
7571 G_CALLBACK (gtk_window_deiconify),
7574 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7576 button = gtk_button_new_with_label ("Iconify");
7577 g_signal_connect_object (button,
7579 G_CALLBACK (gtk_window_iconify),
7582 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7584 button = gtk_button_new_with_label ("Fullscreen");
7585 g_signal_connect_object (button,
7587 G_CALLBACK (gtk_window_fullscreen),
7590 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7592 button = gtk_button_new_with_label ("Unfullscreen");
7593 g_signal_connect_object (button,
7595 G_CALLBACK (gtk_window_unfullscreen),
7598 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7600 button = gtk_button_new_with_label ("Present");
7601 g_signal_connect_object (button,
7603 G_CALLBACK (gtk_window_present),
7606 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7608 button = gtk_button_new_with_label ("Show");
7609 g_signal_connect_object (button,
7611 G_CALLBACK (gtk_widget_show),
7614 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7616 gtk_widget_show_all (hbox);
7622 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7624 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7626 gtk_window_set_keep_above (GTK_WINDOW (data),
7627 gtk_toggle_button_get_active (togglebutton));
7629 if (gtk_toggle_button_get_active (togglebutton))
7630 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7634 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7636 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7638 gtk_window_set_keep_below (GTK_WINDOW (data),
7639 gtk_toggle_button_get_active (togglebutton));
7641 if (gtk_toggle_button_get_active (togglebutton))
7642 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7647 get_state_controls (GtkWidget *window)
7651 GtkWidget *button_above;
7652 GtkWidget *button_below;
7654 vbox = gtk_vbox_new (FALSE, 0);
7656 button = gtk_button_new_with_label ("Stick");
7657 g_signal_connect_object (button,
7659 G_CALLBACK (gtk_window_stick),
7662 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7664 button = gtk_button_new_with_label ("Unstick");
7665 g_signal_connect_object (button,
7667 G_CALLBACK (gtk_window_unstick),
7670 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7672 button = gtk_button_new_with_label ("Maximize");
7673 g_signal_connect_object (button,
7675 G_CALLBACK (gtk_window_maximize),
7678 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7680 button = gtk_button_new_with_label ("Unmaximize");
7681 g_signal_connect_object (button,
7683 G_CALLBACK (gtk_window_unmaximize),
7686 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7688 button = gtk_button_new_with_label ("Iconify");
7689 g_signal_connect_object (button,
7691 G_CALLBACK (gtk_window_iconify),
7694 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7696 button = gtk_button_new_with_label ("Fullscreen");
7697 g_signal_connect_object (button,
7699 G_CALLBACK (gtk_window_fullscreen),
7702 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7704 button = gtk_button_new_with_label ("Unfullscreen");
7705 g_signal_connect_object (button,
7707 G_CALLBACK (gtk_window_unfullscreen),
7710 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7712 button_above = gtk_toggle_button_new_with_label ("Keep above");
7713 g_signal_connect (button_above,
7715 G_CALLBACK (keep_window_above),
7717 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7719 button_below = gtk_toggle_button_new_with_label ("Keep below");
7720 g_signal_connect (button_below,
7722 G_CALLBACK (keep_window_below),
7724 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7726 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7727 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7729 button = gtk_button_new_with_label ("Hide (withdraw)");
7730 g_signal_connect_object (button,
7732 G_CALLBACK (gtk_widget_hide),
7735 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7737 gtk_widget_show_all (vbox);
7743 create_window_states (GtkWidget *widget)
7745 static GtkWidget *window = NULL;
7748 GtkWidget *iconified;
7750 GtkWidget *controls;
7754 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7755 gtk_window_set_screen (GTK_WINDOW (window),
7756 gtk_widget_get_screen (widget));
7758 g_signal_connect (window, "destroy",
7759 G_CALLBACK (gtk_widget_destroyed),
7762 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7764 box1 = gtk_vbox_new (FALSE, 0);
7765 gtk_container_add (GTK_CONTAINER (window), box1);
7767 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7769 gtk_window_set_screen (GTK_WINDOW (iconified),
7770 gtk_widget_get_screen (widget));
7772 g_signal_connect_object (iconified, "destroy",
7773 G_CALLBACK (gtk_widget_destroy),
7776 gtk_window_iconify (GTK_WINDOW (iconified));
7777 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7778 controls = get_state_controls (iconified);
7779 gtk_container_add (GTK_CONTAINER (iconified), controls);
7781 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7783 gtk_window_set_screen (GTK_WINDOW (normal),
7784 gtk_widget_get_screen (widget));
7786 g_signal_connect_object (normal, "destroy",
7787 G_CALLBACK (gtk_widget_destroy),
7791 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7792 controls = get_state_controls (normal);
7793 gtk_container_add (GTK_CONTAINER (normal), controls);
7795 label = tracking_label (iconified);
7796 gtk_container_add (GTK_CONTAINER (box1), label);
7798 label = tracking_label (normal);
7799 gtk_container_add (GTK_CONTAINER (box1), label);
7801 gtk_widget_show_all (iconified);
7802 gtk_widget_show_all (normal);
7803 gtk_widget_show_all (box1);
7806 if (!gtk_widget_get_visible (window))
7807 gtk_widget_show (window);
7809 gtk_widget_destroy (window);
7817 configure_event_callback (GtkWidget *widget,
7818 GdkEventConfigure *event,
7821 GtkWidget *label = data;
7825 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7827 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7829 event->x, event->y, event->width, event->height,
7832 gtk_label_set_text (GTK_LABEL (label), msg);
7840 get_ints (GtkWidget *window,
7847 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7848 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7850 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7851 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7855 set_size_callback (GtkWidget *widget,
7860 get_ints (data, &w, &h);
7862 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7866 unset_default_size_callback (GtkWidget *widget,
7869 gtk_window_set_default_size (g_object_get_data (data, "target"),
7874 set_default_size_callback (GtkWidget *widget,
7879 get_ints (data, &w, &h);
7881 gtk_window_set_default_size (g_object_get_data (data, "target"),
7886 unset_size_request_callback (GtkWidget *widget,
7889 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7894 set_size_request_callback (GtkWidget *widget,
7899 get_ints (data, &w, &h);
7901 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7906 set_location_callback (GtkWidget *widget,
7911 get_ints (data, &x, &y);
7913 gtk_window_move (g_object_get_data (data, "target"), x, y);
7917 move_to_position_callback (GtkWidget *widget,
7923 window = g_object_get_data (data, "target");
7925 gtk_window_get_position (window, &x, &y);
7927 gtk_window_move (window, x, y);
7931 set_geometry_callback (GtkWidget *entry,
7937 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7939 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7941 if (!gtk_window_parse_geometry (target, text))
7942 g_print ("Bad geometry string '%s'\n", text);
7948 resizable_callback (GtkWidget *widget,
7951 g_object_set (g_object_get_data (data, "target"),
7952 "resizable", GTK_TOGGLE_BUTTON (widget)->active,
7957 gravity_selected (GtkWidget *widget,
7960 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7961 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7965 pos_selected (GtkWidget *widget,
7968 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7969 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7973 move_gravity_window_to_current_position (GtkWidget *widget,
7979 window = GTK_WINDOW (data);
7981 gtk_window_get_position (window, &x, &y);
7983 gtk_window_move (window, x, y);
7987 get_screen_corner (GtkWindow *window,
7992 GdkScreen * screen = gtk_window_get_screen (window);
7994 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7996 switch (gtk_window_get_gravity (window))
7998 case GDK_GRAVITY_SOUTH_EAST:
7999 *x = gdk_screen_get_width (screen) - w;
8000 *y = gdk_screen_get_height (screen) - h;
8003 case GDK_GRAVITY_NORTH_EAST:
8004 *x = gdk_screen_get_width (screen) - w;
8008 case GDK_GRAVITY_SOUTH_WEST:
8010 *y = gdk_screen_get_height (screen) - h;
8013 case GDK_GRAVITY_NORTH_WEST:
8018 case GDK_GRAVITY_SOUTH:
8019 *x = (gdk_screen_get_width (screen) - w) / 2;
8020 *y = gdk_screen_get_height (screen) - h;
8023 case GDK_GRAVITY_NORTH:
8024 *x = (gdk_screen_get_width (screen) - w) / 2;
8028 case GDK_GRAVITY_WEST:
8030 *y = (gdk_screen_get_height (screen) - h) / 2;
8033 case GDK_GRAVITY_EAST:
8034 *x = gdk_screen_get_width (screen) - w;
8035 *y = (gdk_screen_get_height (screen) - h) / 2;
8038 case GDK_GRAVITY_CENTER:
8039 *x = (gdk_screen_get_width (screen) - w) / 2;
8040 *y = (gdk_screen_get_height (screen) - h) / 2;
8043 case GDK_GRAVITY_STATIC:
8044 /* pick some random numbers */
8050 g_assert_not_reached ();
8056 move_gravity_window_to_starting_position (GtkWidget *widget,
8062 window = GTK_WINDOW (data);
8064 get_screen_corner (window,
8067 gtk_window_move (window, x, y);
8071 make_gravity_window (GtkWidget *destroy_with,
8080 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8082 gtk_window_set_screen (GTK_WINDOW (window),
8083 gtk_widget_get_screen (destroy_with));
8085 vbox = gtk_vbox_new (FALSE, 0);
8086 gtk_widget_show (vbox);
8088 gtk_container_add (GTK_CONTAINER (window), vbox);
8089 gtk_window_set_title (GTK_WINDOW (window), title);
8090 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8092 g_signal_connect_object (destroy_with,
8094 G_CALLBACK (gtk_widget_destroy),
8099 button = gtk_button_new_with_mnemonic ("_Move to current position");
8101 g_signal_connect (button, "clicked",
8102 G_CALLBACK (move_gravity_window_to_current_position),
8105 gtk_container_add (GTK_CONTAINER (vbox), button);
8106 gtk_widget_show (button);
8108 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8110 g_signal_connect (button, "clicked",
8111 G_CALLBACK (move_gravity_window_to_starting_position),
8114 gtk_container_add (GTK_CONTAINER (vbox), button);
8115 gtk_widget_show (button);
8117 /* Pretend this is the result of --geometry.
8118 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8119 * and in that case you probably should just use gtk_window_parse_geometry().
8120 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8121 * you are parsing --geometry or equivalent.
8123 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8127 gtk_window_set_default_size (GTK_WINDOW (window),
8130 get_screen_corner (GTK_WINDOW (window), &x, &y);
8132 gtk_window_move (GTK_WINDOW (window),
8139 do_gravity_test (GtkWidget *widget,
8142 GtkWidget *destroy_with = data;
8145 /* We put a window at each gravity point on the screen. */
8146 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8148 gtk_widget_show (window);
8150 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8152 gtk_widget_show (window);
8154 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8156 gtk_widget_show (window);
8158 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8160 gtk_widget_show (window);
8162 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8164 gtk_widget_show (window);
8166 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8168 gtk_widget_show (window);
8171 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8173 gtk_widget_show (window);
8176 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8178 gtk_widget_show (window);
8180 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8182 gtk_widget_show (window);
8184 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8186 gtk_widget_show (window);
8190 window_controls (GtkWidget *window)
8192 GtkWidget *control_window;
8202 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8204 gtk_window_set_screen (GTK_WINDOW (control_window),
8205 gtk_widget_get_screen (window));
8207 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8209 g_object_set_data (G_OBJECT (control_window),
8213 g_signal_connect_object (control_window,
8215 G_CALLBACK (gtk_widget_destroy),
8219 vbox = gtk_vbox_new (FALSE, 5);
8221 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8223 label = gtk_label_new ("<no configure events>");
8224 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8226 g_signal_connect (window,
8228 G_CALLBACK (configure_event_callback),
8231 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8233 spin = gtk_spin_button_new (adj, 0, 0);
8235 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8237 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8239 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8241 spin = gtk_spin_button_new (adj, 0, 0);
8243 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8245 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8247 entry = gtk_entry_new ();
8248 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8250 g_signal_connect (entry, "changed",
8251 G_CALLBACK (set_geometry_callback),
8254 button = gtk_button_new_with_label ("Show gravity test windows");
8255 g_signal_connect_swapped (button,
8257 G_CALLBACK (do_gravity_test),
8259 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8261 button = gtk_button_new_with_label ("Reshow with initial size");
8262 g_signal_connect_object (button,
8264 G_CALLBACK (gtk_window_reshow_with_initial_size),
8267 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8269 button = gtk_button_new_with_label ("Queue resize");
8270 g_signal_connect_object (button,
8272 G_CALLBACK (gtk_widget_queue_resize),
8275 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8277 button = gtk_button_new_with_label ("Resize");
8278 g_signal_connect (button,
8280 G_CALLBACK (set_size_callback),
8282 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8284 button = gtk_button_new_with_label ("Set default size");
8285 g_signal_connect (button,
8287 G_CALLBACK (set_default_size_callback),
8289 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8291 button = gtk_button_new_with_label ("Unset default size");
8292 g_signal_connect (button,
8294 G_CALLBACK (unset_default_size_callback),
8296 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8298 button = gtk_button_new_with_label ("Set size request");
8299 g_signal_connect (button,
8301 G_CALLBACK (set_size_request_callback),
8303 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8305 button = gtk_button_new_with_label ("Unset size request");
8306 g_signal_connect (button,
8308 G_CALLBACK (unset_size_request_callback),
8310 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8312 button = gtk_button_new_with_label ("Move");
8313 g_signal_connect (button,
8315 G_CALLBACK (set_location_callback),
8317 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8319 button = gtk_button_new_with_label ("Move to current position");
8320 g_signal_connect (button,
8322 G_CALLBACK (move_to_position_callback),
8324 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8326 button = gtk_check_button_new_with_label ("Allow resize");
8327 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8328 g_signal_connect (button,
8330 G_CALLBACK (resizable_callback),
8332 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8334 button = gtk_button_new_with_mnemonic ("_Show");
8335 g_signal_connect_object (button,
8337 G_CALLBACK (gtk_widget_show),
8340 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8342 button = gtk_button_new_with_mnemonic ("_Hide");
8343 g_signal_connect_object (button,
8345 G_CALLBACK (gtk_widget_hide),
8348 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8350 om = gtk_combo_box_new_text ();
8354 static gchar *names[] = {
8355 "GDK_GRAVITY_NORTH_WEST",
8356 "GDK_GRAVITY_NORTH",
8357 "GDK_GRAVITY_NORTH_EAST",
8359 "GDK_GRAVITY_CENTER",
8361 "GDK_GRAVITY_SOUTH_WEST",
8362 "GDK_GRAVITY_SOUTH",
8363 "GDK_GRAVITY_SOUTH_EAST",
8364 "GDK_GRAVITY_STATIC",
8368 g_assert (names[i]);
8369 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8374 g_signal_connect (om,
8376 G_CALLBACK (gravity_selected),
8379 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8382 om = gtk_combo_box_new_text ();
8386 static gchar *names[] = {
8388 "GTK_WIN_POS_CENTER",
8389 "GTK_WIN_POS_MOUSE",
8390 "GTK_WIN_POS_CENTER_ALWAYS",
8391 "GTK_WIN_POS_CENTER_ON_PARENT",
8395 g_assert (names[i]);
8396 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8401 g_signal_connect (om,
8403 G_CALLBACK (pos_selected),
8406 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8408 gtk_widget_show_all (vbox);
8410 return control_window;
8414 create_window_sizing (GtkWidget *widget)
8416 static GtkWidget *window = NULL;
8417 static GtkWidget *target_window = NULL;
8423 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8424 gtk_window_set_screen (GTK_WINDOW (target_window),
8425 gtk_widget_get_screen (widget));
8426 label = gtk_label_new (NULL);
8427 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");
8428 gtk_container_add (GTK_CONTAINER (target_window), label);
8429 gtk_widget_show (label);
8431 g_signal_connect (target_window, "destroy",
8432 G_CALLBACK (gtk_widget_destroyed),
8435 window = window_controls (target_window);
8437 g_signal_connect (window, "destroy",
8438 G_CALLBACK (gtk_widget_destroyed),
8441 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8444 /* don't show target window by default, we want to allow testing
8445 * of behavior on first show.
8448 if (!gtk_widget_get_visible (window))
8449 gtk_widget_show (window);
8451 gtk_widget_destroy (window);
8458 typedef struct _ProgressData {
8461 GtkWidget *block_spin;
8462 GtkWidget *x_align_spin;
8463 GtkWidget *y_align_spin;
8464 GtkWidget *step_spin;
8465 GtkWidget *act_blocks_spin;
8476 progress_timeout (gpointer data)
8478 ProgressData *pdata = data;
8482 if (pdata->activity)
8484 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8486 text = g_strdup_printf ("%s", "???");
8490 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8493 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8495 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8498 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8505 destroy_progress (GtkWidget *widget,
8506 ProgressData **pdata)
8508 g_source_remove ((*pdata)->timer);
8509 (*pdata)->timer = 0;
8510 (*pdata)->window = NULL;
8516 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8518 ProgressData *pdata;
8521 pdata = (ProgressData *) data;
8523 if (!gtk_widget_get_mapped (widget))
8526 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8528 if (i == 0 || i == 1)
8529 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8531 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8533 if (i == 1 || i == 2)
8534 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8536 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8540 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8544 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8545 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8549 progressbar_toggle_ellipsize (GtkWidget *widget,
8552 ProgressData *pdata = data;
8553 if (gtk_widget_is_drawable (widget))
8555 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8556 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8561 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8563 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8567 entry_changed (GtkWidget *widget, ProgressData *pdata)
8569 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8570 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8574 create_progress_bar (GtkWidget *widget)
8576 GtkWidget *action_area, *content_area;
8586 static ProgressData *pdata = NULL;
8588 static gchar *items1[] =
8596 static char *ellipsize_items[] = {
8597 "None", // PANGO_ELLIPSIZE_NONE,
8598 "Start", // PANGO_ELLIPSIZE_START,
8599 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8600 "End", // PANGO_ELLIPSIZE_END
8604 pdata = g_new0 (ProgressData, 1);
8608 pdata->window = gtk_dialog_new ();
8610 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8611 gtk_widget_get_screen (widget));
8613 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8615 g_signal_connect (pdata->window, "destroy",
8616 G_CALLBACK (destroy_progress),
8620 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8621 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8623 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8624 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8626 vbox = gtk_vbox_new (FALSE, 5);
8627 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8628 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8630 frame = gtk_frame_new ("Progress");
8631 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8633 vbox2 = gtk_vbox_new (FALSE, 5);
8634 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8636 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8637 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8639 pdata->pbar = gtk_progress_bar_new ();
8640 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8641 PANGO_ELLIPSIZE_MIDDLE);
8643 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8644 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8646 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8647 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8649 hbox = gtk_hbox_new (FALSE, 5);
8650 gtk_container_add (GTK_CONTAINER (align), hbox);
8651 label = gtk_label_new ("Label updated by user :");
8652 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8653 pdata->label = gtk_label_new ("");
8654 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8656 frame = gtk_frame_new ("Options");
8657 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8659 vbox2 = gtk_vbox_new (FALSE, 5);
8660 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8662 tab = gtk_table_new (7, 2, FALSE);
8663 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8665 label = gtk_label_new ("Orientation :");
8666 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8667 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8669 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8671 pdata->omenu1 = build_option_menu (items1, 4, 0,
8672 progressbar_toggle_orientation,
8674 hbox = gtk_hbox_new (FALSE, 0);
8675 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8676 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8678 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8680 check = gtk_check_button_new_with_label ("Show text");
8681 g_signal_connect (check, "clicked",
8682 G_CALLBACK (toggle_show_text),
8684 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
8685 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8688 hbox = gtk_hbox_new (FALSE, 0);
8689 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
8690 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8693 label = gtk_label_new ("Text: ");
8694 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8696 pdata->entry = gtk_entry_new ();
8697 g_signal_connect (pdata->entry, "changed",
8698 G_CALLBACK (entry_changed),
8700 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8701 gtk_widget_set_size_request (pdata->entry, 100, -1);
8703 label = gtk_label_new ("Ellipsize text :");
8704 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8705 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8707 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8708 pdata->elmenu = build_option_menu (ellipsize_items,
8709 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8710 2, // PANGO_ELLIPSIZE_MIDDLE
8711 progressbar_toggle_ellipsize,
8713 hbox = gtk_hbox_new (FALSE, 0);
8714 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8715 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8717 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8719 check = gtk_check_button_new_with_label ("Activity mode");
8720 g_signal_connect (check, "clicked",
8721 G_CALLBACK (toggle_activity_mode), pdata);
8722 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8723 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8726 button = gtk_button_new_with_label ("close");
8727 g_signal_connect_swapped (button, "clicked",
8728 G_CALLBACK (gtk_widget_destroy),
8730 gtk_widget_set_can_default (button, TRUE);
8731 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8732 gtk_widget_grab_default (button);
8735 if (!gtk_widget_get_visible (pdata->window))
8736 gtk_widget_show_all (pdata->window);
8738 gtk_widget_destroy (pdata->window);
8750 GtkWidget *res_widget;
8754 find_widget (GtkWidget *widget, FindWidgetData *data)
8756 GtkAllocation new_allocation;
8760 gtk_widget_get_allocation (widget, &new_allocation);
8762 if (data->found || !gtk_widget_get_mapped (widget))
8765 /* Note that in the following code, we only count the
8766 * position as being inside a WINDOW widget if it is inside
8767 * widget->window; points that are outside of widget->window
8768 * but within the allocation are not counted. This is consistent
8769 * with the way we highlight drag targets.
8771 if (gtk_widget_get_has_window (widget))
8773 new_allocation.x = 0;
8774 new_allocation.y = 0;
8777 if (gtk_widget_get_parent (widget) && !data->first)
8779 GdkWindow *window = gtk_widget_get_window (widget);
8780 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8782 gint tx, ty, twidth, theight;
8783 gdk_drawable_get_size (window, &twidth, &theight);
8785 if (new_allocation.x < 0)
8787 new_allocation.width += new_allocation.x;
8788 new_allocation.x = 0;
8790 if (new_allocation.y < 0)
8792 new_allocation.height += new_allocation.y;
8793 new_allocation.y = 0;
8795 if (new_allocation.x + new_allocation.width > twidth)
8796 new_allocation.width = twidth - new_allocation.x;
8797 if (new_allocation.y + new_allocation.height > theight)
8798 new_allocation.height = theight - new_allocation.y;
8800 gdk_window_get_position (window, &tx, &ty);
8801 new_allocation.x += tx;
8803 new_allocation.y += ty;
8806 window = gdk_window_get_parent (window);
8810 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8811 (data->x < new_allocation.x + new_allocation.width) &&
8812 (data->y < new_allocation.y + new_allocation.height))
8814 /* First, check if the drag is in a valid drop site in
8815 * one of our children
8817 if (GTK_IS_CONTAINER (widget))
8819 FindWidgetData new_data = *data;
8821 new_data.x -= x_offset;
8822 new_data.y -= y_offset;
8823 new_data.found = FALSE;
8824 new_data.first = FALSE;
8826 gtk_container_forall (GTK_CONTAINER (widget),
8827 (GtkCallback)find_widget,
8830 data->found = new_data.found;
8832 data->res_widget = new_data.res_widget;
8835 /* If not, and this widget is registered as a drop site, check to
8836 * emit "drag_motion" to check if we are actually in
8842 data->res_widget = widget;
8848 find_widget_at_pointer (GdkDisplay *display)
8850 GtkWidget *widget = NULL;
8851 GdkWindow *pointer_window;
8853 FindWidgetData data;
8855 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
8859 gpointer widget_ptr;
8861 gdk_window_get_user_data (pointer_window, &widget_ptr);
8862 widget = widget_ptr;
8867 gdk_window_get_pointer (gtk_widget_get_window (widget),
8875 find_widget (widget, &data);
8877 return data.res_widget;
8883 struct PropertiesData {
8891 destroy_properties (GtkWidget *widget,
8892 struct PropertiesData *data)
8896 *data->window = NULL;
8897 data->window = NULL;
8902 gdk_cursor_unref (data->cursor);
8903 data->cursor = NULL;
8908 g_signal_handler_disconnect (widget, data->handler);
8916 property_query_event (GtkWidget *widget,
8918 struct PropertiesData *data)
8920 GtkWidget *res_widget = NULL;
8922 if (!data->in_query)
8925 if (event->type == GDK_BUTTON_RELEASE)
8927 gtk_grab_remove (widget);
8928 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8931 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8934 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8935 gtk_widget_get_screen (widget));
8936 create_prop_editor (G_OBJECT (res_widget), 0);
8939 data->in_query = FALSE;
8946 query_properties (GtkButton *button,
8947 struct PropertiesData *data)
8949 GtkWidget *widget = GTK_WIDGET (button);
8952 g_signal_connect (button, "event",
8953 G_CALLBACK (property_query_event), data);
8957 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8960 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
8962 GDK_BUTTON_RELEASE_MASK,
8967 gtk_grab_add (widget);
8969 data->in_query = TRUE;
8973 create_properties (GtkWidget *widget)
8975 static GtkWidget *window = NULL;
8979 struct PropertiesData *data;
8981 data = g_new (struct PropertiesData, 1);
8982 data->window = &window;
8983 data->in_query = FALSE;
8984 data->cursor = NULL;
8989 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8991 gtk_window_set_screen (GTK_WINDOW (window),
8992 gtk_widget_get_screen (widget));
8994 data->handler = g_signal_connect (window, "destroy",
8995 G_CALLBACK (destroy_properties),
8998 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8999 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9001 vbox = gtk_vbox_new (FALSE, 1);
9002 gtk_container_add (GTK_CONTAINER (window), vbox);
9004 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9005 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9007 button = gtk_button_new_with_label ("Query properties");
9008 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9009 g_signal_connect (button, "clicked",
9010 G_CALLBACK (query_properties),
9014 if (!gtk_widget_get_visible (window))
9015 gtk_widget_show_all (window);
9017 gtk_widget_destroy (window);
9021 struct SnapshotData {
9022 GtkWidget *toplevel_button;
9026 gboolean is_toplevel;
9031 destroy_snapshot_data (GtkWidget *widget,
9032 struct SnapshotData *data)
9035 *data->window = NULL;
9039 gdk_cursor_unref (data->cursor);
9040 data->cursor = NULL;
9045 g_signal_handler_disconnect (widget, data->handler);
9053 snapshot_widget_event (GtkWidget *widget,
9055 struct SnapshotData *data)
9057 GtkWidget *res_widget = NULL;
9059 if (!data->in_query)
9062 if (event->type == GDK_BUTTON_RELEASE)
9064 gtk_grab_remove (widget);
9065 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9068 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9069 if (data->is_toplevel && res_widget)
9070 res_widget = gtk_widget_get_toplevel (res_widget);
9074 GtkWidget *window, *image;
9076 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9077 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9078 gtk_widget_realize (window);
9079 if (gdk_drawable_get_depth (gtk_widget_get_window (window)) != gdk_drawable_get_depth (pixmap))
9081 /* this branch is needed to convert ARGB -> RGB */
9084 gdk_drawable_get_size (pixmap, &width, &height);
9085 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9086 gtk_widget_get_colormap (res_widget),
9090 image = gtk_image_new_from_pixbuf (pixbuf);
9091 g_object_unref (pixbuf);
9094 image = gtk_image_new_from_pixmap (pixmap, NULL);
9095 gtk_container_add (GTK_CONTAINER (window), image);
9096 g_object_unref (pixmap);
9097 gtk_widget_show_all (window);
9100 data->in_query = FALSE;
9107 snapshot_widget (GtkButton *button,
9108 struct SnapshotData *data)
9110 GtkWidget *widget = GTK_WIDGET (button);
9113 g_signal_connect (button, "event",
9114 G_CALLBACK (snapshot_widget_event), data);
9116 data->is_toplevel = widget == data->toplevel_button;
9119 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
9122 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
9124 GDK_BUTTON_RELEASE_MASK,
9129 gtk_grab_add (widget);
9131 data->in_query = TRUE;
9135 create_snapshot (GtkWidget *widget)
9137 static GtkWidget *window = NULL;
9140 struct SnapshotData *data;
9142 data = g_new (struct SnapshotData, 1);
9143 data->window = &window;
9144 data->in_query = FALSE;
9145 data->cursor = NULL;
9150 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9152 gtk_window_set_screen (GTK_WINDOW (window),
9153 gtk_widget_get_screen (widget));
9155 data->handler = g_signal_connect (window, "destroy",
9156 G_CALLBACK (destroy_snapshot_data),
9159 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9160 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9162 vbox = gtk_vbox_new (FALSE, 1);
9163 gtk_container_add (GTK_CONTAINER (window), vbox);
9165 button = gtk_button_new_with_label ("Snapshot widget");
9166 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9167 g_signal_connect (button, "clicked",
9168 G_CALLBACK (snapshot_widget),
9171 button = gtk_button_new_with_label ("Snapshot toplevel");
9172 data->toplevel_button = button;
9173 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9174 g_signal_connect (button, "clicked",
9175 G_CALLBACK (snapshot_widget),
9179 if (!gtk_widget_get_visible (window))
9180 gtk_widget_show_all (window);
9182 gtk_widget_destroy (window);
9191 selection_test_received (GtkWidget *tree_view,
9192 GtkSelectionData *data)
9194 GtkTreeModel *model;
9195 GtkListStore *store;
9199 if (data->length < 0)
9201 g_print ("Selection retrieval failed\n");
9204 if (data->type != GDK_SELECTION_TYPE_ATOM)
9206 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9210 /* Clear out any current list items */
9212 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9213 store = GTK_LIST_STORE (model);
9214 gtk_list_store_clear (store);
9216 /* Add new items to list */
9218 atoms = (GdkAtom *)data->data;
9220 l = data->length / sizeof (GdkAtom);
9221 for (i = 0; i < l; i++)
9226 name = gdk_atom_name (atoms[i]);
9229 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9233 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9240 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9242 static GdkAtom targets_atom = GDK_NONE;
9244 if (targets_atom == GDK_NONE)
9245 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9247 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9252 create_selection_test (GtkWidget *widget)
9254 static GtkWidget *window = NULL;
9255 GtkWidget *action_area, *content_area;
9258 GtkWidget *scrolled_win;
9259 GtkListStore* store;
9260 GtkWidget *tree_view;
9261 GtkTreeViewColumn *column;
9262 GtkCellRenderer *renderer;
9267 window = gtk_dialog_new ();
9269 gtk_window_set_screen (GTK_WINDOW (window),
9270 gtk_widget_get_screen (widget));
9272 g_signal_connect (window, "destroy",
9273 G_CALLBACK (gtk_widget_destroyed),
9276 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9277 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9279 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9280 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9282 /* Create the list */
9284 vbox = gtk_vbox_new (FALSE, 5);
9285 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9286 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9288 label = gtk_label_new ("Gets available targets for current selection");
9289 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9291 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9292 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9293 GTK_POLICY_AUTOMATIC,
9294 GTK_POLICY_AUTOMATIC);
9295 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9296 gtk_widget_set_size_request (scrolled_win, 100, 200);
9298 store = gtk_list_store_new (1, G_TYPE_STRING);
9299 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9300 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9302 renderer = gtk_cell_renderer_text_new ();
9303 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9305 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9307 g_signal_connect (tree_view, "selection_received",
9308 G_CALLBACK (selection_test_received), NULL);
9310 /* .. And create some buttons */
9311 button = gtk_button_new_with_label ("Get Targets");
9312 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9314 g_signal_connect (button, "clicked",
9315 G_CALLBACK (selection_test_get_targets), tree_view);
9317 button = gtk_button_new_with_label ("Quit");
9318 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9320 g_signal_connect_swapped (button, "clicked",
9321 G_CALLBACK (gtk_widget_destroy),
9325 if (!gtk_widget_get_visible (window))
9326 gtk_widget_show_all (window);
9328 gtk_widget_destroy (window);
9335 static int scroll_test_pos = 0.0;
9338 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9343 gint imin, imax, jmin, jmax;
9346 imin = (event->area.x) / 10;
9347 imax = (event->area.x + event->area.width + 9) / 10;
9349 jmin = ((int)adj->value + event->area.y) / 10;
9350 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9352 window = gtk_widget_get_window (widget);
9354 gdk_window_clear_area (window,
9355 event->area.x, event->area.y,
9356 event->area.width, event->area.height);
9358 cr = gdk_cairo_create (window);
9360 for (i=imin; i<imax; i++)
9361 for (j=jmin; j<jmax; j++)
9363 cairo_rectangle (cr, 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9373 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9376 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9377 -adj->page_increment / 2:
9378 adj->page_increment / 2);
9379 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9380 gtk_adjustment_set_value (adj, new_value);
9386 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9389 GtkAllocation allocation;
9391 gtk_widget_get_allocation (widget, &allocation);
9392 adj->page_increment = 0.9 * allocation.height;
9393 adj->page_size = allocation.height;
9395 g_signal_emit_by_name (adj, "changed");
9399 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9404 dy = scroll_test_pos - (int)adj->value;
9405 scroll_test_pos = adj->value;
9407 if (!gtk_widget_is_drawable (widget))
9410 window = gtk_widget_get_window (widget);
9411 gdk_window_scroll (window, 0, dy);
9412 gdk_window_process_updates (window, FALSE);
9417 create_scroll_test (GtkWidget *widget)
9419 static GtkWidget *window = NULL;
9420 GtkWidget *action_area, *content_area;
9422 GtkWidget *drawing_area;
9423 GtkWidget *scrollbar;
9426 GdkGeometry geometry;
9427 GdkWindowHints geometry_mask;
9431 window = gtk_dialog_new ();
9433 gtk_window_set_screen (GTK_WINDOW (window),
9434 gtk_widget_get_screen (widget));
9436 g_signal_connect (window, "destroy",
9437 G_CALLBACK (gtk_widget_destroyed),
9440 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9441 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9443 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9444 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9446 hbox = gtk_hbox_new (FALSE, 0);
9447 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9448 gtk_widget_show (hbox);
9450 drawing_area = gtk_drawing_area_new ();
9451 gtk_widget_set_size_request (drawing_area, 200, 200);
9452 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9453 gtk_widget_show (drawing_area);
9455 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9457 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9458 scroll_test_pos = 0.0;
9460 scrollbar = gtk_vscrollbar_new (adj);
9461 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9462 gtk_widget_show (scrollbar);
9464 g_signal_connect (drawing_area, "expose_event",
9465 G_CALLBACK (scroll_test_expose), adj);
9466 g_signal_connect (drawing_area, "configure_event",
9467 G_CALLBACK (scroll_test_configure), adj);
9468 g_signal_connect (drawing_area, "scroll_event",
9469 G_CALLBACK (scroll_test_scroll), adj);
9471 g_signal_connect (adj, "value_changed",
9472 G_CALLBACK (scroll_test_adjustment_changed),
9475 /* .. And create some buttons */
9477 button = gtk_button_new_with_label ("Quit");
9478 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9480 g_signal_connect_swapped (button, "clicked",
9481 G_CALLBACK (gtk_widget_destroy),
9483 gtk_widget_show (button);
9485 /* Set up gridded geometry */
9487 geometry_mask = GDK_HINT_MIN_SIZE |
9488 GDK_HINT_BASE_SIZE |
9489 GDK_HINT_RESIZE_INC;
9491 geometry.min_width = 20;
9492 geometry.min_height = 20;
9493 geometry.base_width = 0;
9494 geometry.base_height = 0;
9495 geometry.width_inc = 10;
9496 geometry.height_inc = 10;
9498 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9499 drawing_area, &geometry, geometry_mask);
9502 if (!gtk_widget_get_visible (window))
9503 gtk_widget_show (window);
9505 gtk_widget_destroy (window);
9512 static int timer = 0;
9515 timeout_test (GtkWidget *label)
9517 static int count = 0;
9518 static char buffer[32];
9520 sprintf (buffer, "count: %d", ++count);
9521 gtk_label_set_text (GTK_LABEL (label), buffer);
9527 start_timeout_test (GtkWidget *widget,
9532 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9537 stop_timeout_test (GtkWidget *widget,
9542 g_source_remove (timer);
9548 destroy_timeout_test (GtkWidget *widget,
9551 stop_timeout_test (NULL, NULL);
9557 create_timeout_test (GtkWidget *widget)
9559 static GtkWidget *window = NULL;
9560 GtkWidget *action_area, *content_area;
9566 window = gtk_dialog_new ();
9568 gtk_window_set_screen (GTK_WINDOW (window),
9569 gtk_widget_get_screen (widget));
9571 g_signal_connect (window, "destroy",
9572 G_CALLBACK (destroy_timeout_test),
9575 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9576 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9578 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9579 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9581 label = gtk_label_new ("count: 0");
9582 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9583 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9584 gtk_widget_show (label);
9586 button = gtk_button_new_with_label ("close");
9587 g_signal_connect_swapped (button, "clicked",
9588 G_CALLBACK (gtk_widget_destroy),
9590 gtk_widget_set_can_default (button, TRUE);
9591 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9592 gtk_widget_grab_default (button);
9593 gtk_widget_show (button);
9595 button = gtk_button_new_with_label ("start");
9596 g_signal_connect (button, "clicked",
9597 G_CALLBACK(start_timeout_test),
9599 gtk_widget_set_can_default (button, TRUE);
9600 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9601 gtk_widget_show (button);
9603 button = gtk_button_new_with_label ("stop");
9604 g_signal_connect (button, "clicked",
9605 G_CALLBACK (stop_timeout_test),
9607 gtk_widget_set_can_default (button, TRUE);
9608 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9609 gtk_widget_show (button);
9612 if (!gtk_widget_get_visible (window))
9613 gtk_widget_show (window);
9615 gtk_widget_destroy (window);
9622 static int idle_id = 0;
9625 idle_test (GtkWidget *label)
9627 static int count = 0;
9628 static char buffer[32];
9630 sprintf (buffer, "count: %d", ++count);
9631 gtk_label_set_text (GTK_LABEL (label), buffer);
9637 start_idle_test (GtkWidget *widget,
9642 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9647 stop_idle_test (GtkWidget *widget,
9652 g_source_remove (idle_id);
9658 destroy_idle_test (GtkWidget *widget,
9661 stop_idle_test (NULL, NULL);
9667 toggle_idle_container (GObject *button,
9668 GtkContainer *container)
9670 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9674 create_idle_test (GtkWidget *widget)
9676 static GtkWidget *window = NULL;
9679 GtkWidget *container;
9683 GtkWidget *action_area, *content_area;
9688 window = gtk_dialog_new ();
9690 gtk_window_set_screen (GTK_WINDOW (window),
9691 gtk_widget_get_screen (widget));
9693 g_signal_connect (window, "destroy",
9694 G_CALLBACK (destroy_idle_test),
9697 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9698 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9700 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9701 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9703 label = gtk_label_new ("count: 0");
9704 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9705 gtk_widget_show (label);
9708 g_object_new (GTK_TYPE_HBOX,
9710 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9711 * "GtkWidget::visible", TRUE,
9716 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9719 g_object_new (GTK_TYPE_FRAME,
9721 "label", "Label Container",
9723 "parent", content_area,
9726 g_object_new (GTK_TYPE_VBOX,
9731 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9732 "label", "Resize-Parent",
9733 "user_data", (void*)GTK_RESIZE_PARENT,
9737 "signal::clicked", toggle_idle_container, container,
9739 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9740 "label", "Resize-Queue",
9741 "user_data", (void*)GTK_RESIZE_QUEUE,
9746 g_object_connect (button,
9747 "signal::clicked", toggle_idle_container, container,
9749 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9750 "label", "Resize-Immediate",
9751 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9753 g_object_connect (button2,
9754 "signal::clicked", toggle_idle_container, container,
9756 g_object_set (button2,
9762 button = gtk_button_new_with_label ("close");
9763 g_signal_connect_swapped (button, "clicked",
9764 G_CALLBACK (gtk_widget_destroy),
9766 gtk_widget_set_can_default (button, TRUE);
9767 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9768 gtk_widget_grab_default (button);
9769 gtk_widget_show (button);
9771 button = gtk_button_new_with_label ("start");
9772 g_signal_connect (button, "clicked",
9773 G_CALLBACK (start_idle_test),
9775 gtk_widget_set_can_default (button, TRUE);
9776 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9777 gtk_widget_show (button);
9779 button = gtk_button_new_with_label ("stop");
9780 g_signal_connect (button, "clicked",
9781 G_CALLBACK (stop_idle_test),
9783 gtk_widget_set_can_default (button, TRUE);
9784 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9785 gtk_widget_show (button);
9788 if (!gtk_widget_get_visible (window))
9789 gtk_widget_show (window);
9791 gtk_widget_destroy (window);
9799 reload_all_rc_files (void)
9801 static GdkAtom atom_rcfiles = GDK_NONE;
9803 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
9807 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
9809 for(i = 0; i < 5; i++)
9810 send_event->client.data.l[i] = 0;
9811 send_event->client.data_format = 32;
9812 send_event->client.message_type = atom_rcfiles;
9813 gdk_event_send_clientmessage_toall (send_event);
9815 gdk_event_free (send_event);
9819 create_rc_file (GtkWidget *widget)
9821 static GtkWidget *window = NULL;
9822 GtkWidget *action_area, *content_area;
9830 window = gtk_dialog_new ();
9832 gtk_window_set_screen (GTK_WINDOW (window),
9833 gtk_widget_get_screen (widget));
9835 g_signal_connect (window, "destroy",
9836 G_CALLBACK (gtk_widget_destroyed),
9839 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9840 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9842 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9843 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9845 vbox = gtk_vbox_new (FALSE, 0);
9846 gtk_container_add (GTK_CONTAINER (frame), vbox);
9848 label = gtk_label_new ("This label should be red");
9849 gtk_widget_set_name (label, "testgtk-red-label");
9850 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9852 label = gtk_label_new ("This label should be green");
9853 gtk_widget_set_name (label, "testgtk-green-label");
9854 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9856 label = gtk_label_new ("This label should be blue");
9857 gtk_widget_set_name (label, "testgtk-blue-label");
9858 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9860 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9861 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9863 button = gtk_button_new_with_label ("Reload");
9864 g_signal_connect (button, "clicked",
9865 G_CALLBACK (gtk_rc_reparse_all), NULL);
9866 gtk_widget_set_can_default (button, TRUE);
9867 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9868 gtk_widget_grab_default (button);
9870 button = gtk_button_new_with_label ("Reload All");
9871 g_signal_connect (button, "clicked",
9872 G_CALLBACK (reload_all_rc_files), NULL);
9873 gtk_widget_set_can_default (button, TRUE);
9874 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9876 button = gtk_button_new_with_label ("Close");
9877 g_signal_connect_swapped (button, "clicked",
9878 G_CALLBACK (gtk_widget_destroy),
9880 gtk_widget_set_can_default (button, TRUE);
9881 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9884 if (!gtk_widget_get_visible (window))
9885 gtk_widget_show_all (window);
9887 gtk_widget_destroy (window);
9891 * Test of recursive mainloop
9895 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9902 create_mainloop (GtkWidget *widget)
9904 static GtkWidget *window = NULL;
9905 GtkWidget *action_area, *content_area;
9911 window = gtk_dialog_new ();
9913 gtk_window_set_screen (GTK_WINDOW (window),
9914 gtk_widget_get_screen (widget));
9916 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9918 g_signal_connect (window, "destroy",
9919 G_CALLBACK (mainloop_destroyed),
9922 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9923 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9925 label = gtk_label_new ("In recursive main loop...");
9926 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9928 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9929 gtk_widget_show (label);
9931 button = gtk_button_new_with_label ("Leave");
9932 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9934 g_signal_connect_swapped (button, "clicked",
9935 G_CALLBACK (gtk_widget_destroy),
9938 gtk_widget_set_can_default (button, TRUE);
9939 gtk_widget_grab_default (button);
9941 gtk_widget_show (button);
9944 if (!gtk_widget_get_visible (window))
9946 gtk_widget_show (window);
9948 g_print ("create_mainloop: start\n");
9950 g_print ("create_mainloop: done\n");
9953 gtk_widget_destroy (window);
9957 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
9960 GdkWindow *bin_window;
9964 gint imin, imax, jmin, jmax;
9966 layout = GTK_LAYOUT (widget);
9967 bin_window = gtk_layout_get_bin_window (layout);
9969 if (event->window != bin_window)
9972 imin = (event->area.x) / 10;
9973 imax = (event->area.x + event->area.width + 9) / 10;
9975 jmin = (event->area.y) / 10;
9976 jmax = (event->area.y + event->area.height + 9) / 10;
9978 cr = gdk_cairo_create (bin_window);
9980 for (i=imin; i<imax; i++)
9981 for (j=jmin; j<jmax; j++)
9983 cairo_rectangle (cr,
9994 void create_layout (GtkWidget *widget)
9996 GtkAdjustment *hadjustment, *vadjustment;
9998 static GtkWidget *window = NULL;
9999 GtkWidget *layout_widget;
10000 GtkWidget *scrolledwindow;
10009 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10010 gtk_window_set_screen (GTK_WINDOW (window),
10011 gtk_widget_get_screen (widget));
10013 g_signal_connect (window, "destroy",
10014 G_CALLBACK (gtk_widget_destroyed),
10017 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10018 gtk_widget_set_size_request (window, 200, 200);
10020 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10021 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10023 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10024 GTK_CORNER_TOP_RIGHT);
10026 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10028 layout_widget = gtk_layout_new (NULL, NULL);
10029 layout = GTK_LAYOUT (layout_widget);
10030 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
10032 /* We set step sizes here since GtkLayout does not set
10035 hadjustment = gtk_layout_get_hadjustment (layout);
10036 vadjustment = gtk_layout_get_vadjustment (layout);
10037 gtk_adjustment_set_step_increment (hadjustment, 10.0);
10038 gtk_adjustment_set_step_increment (vadjustment, 10.0);
10039 gtk_layout_set_hadjustment (layout, hadjustment);
10040 gtk_layout_set_vadjustment (layout, vadjustment);
10042 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
10043 g_signal_connect (layout, "expose_event",
10044 G_CALLBACK (layout_expose_handler), NULL);
10046 gtk_layout_set_size (layout, 1600, 128000);
10048 for (i=0 ; i < 16 ; i++)
10049 for (j=0 ; j < 16 ; j++)
10051 sprintf(buf, "Button %d, %d", i, j);
10053 button = gtk_button_new_with_label (buf);
10055 button = gtk_label_new (buf);
10057 gtk_layout_put (layout, button, j*100, i*100);
10060 for (i=16; i < 1280; i++)
10062 sprintf(buf, "Button %d, %d", i, 0);
10064 button = gtk_button_new_with_label (buf);
10066 button = gtk_label_new (buf);
10068 gtk_layout_put (layout, button, 0, i*100);
10072 if (!gtk_widget_get_visible (window))
10073 gtk_widget_show_all (window);
10075 gtk_widget_destroy (window);
10079 create_styles (GtkWidget *widget)
10081 static GtkWidget *window = NULL;
10082 GtkWidget *content_area, *action_area;
10087 static GdkColor red = { 0, 0xffff, 0, 0 };
10088 static GdkColor green = { 0, 0, 0xffff, 0 };
10089 static GdkColor blue = { 0, 0, 0, 0xffff };
10090 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10091 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10092 PangoFontDescription *font_desc;
10094 GtkRcStyle *rc_style;
10098 window = gtk_dialog_new ();
10099 gtk_window_set_screen (GTK_WINDOW (window),
10100 gtk_widget_get_screen (widget));
10102 g_signal_connect (window, "destroy",
10103 G_CALLBACK (gtk_widget_destroyed),
10106 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10107 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10109 button = gtk_button_new_with_label ("Close");
10110 g_signal_connect_swapped (button, "clicked",
10111 G_CALLBACK (gtk_widget_destroy),
10113 gtk_widget_set_can_default (button, TRUE);
10114 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10115 gtk_widget_show (button);
10117 vbox = gtk_vbox_new (FALSE, 5);
10118 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10119 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
10121 label = gtk_label_new ("Font:");
10122 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10123 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10125 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10127 button = gtk_button_new_with_label ("Some Text");
10128 gtk_widget_modify_font (gtk_bin_get_child (GTK_BIN (button)),
10130 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10132 label = gtk_label_new ("Foreground:");
10133 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10134 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10136 button = gtk_button_new_with_label ("Some Text");
10137 gtk_widget_modify_fg (gtk_bin_get_child (GTK_BIN (button)),
10138 GTK_STATE_NORMAL, &red);
10139 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10141 label = gtk_label_new ("Background:");
10142 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10143 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10145 button = gtk_button_new_with_label ("Some Text");
10146 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10147 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10149 label = gtk_label_new ("Text:");
10150 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10151 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10153 entry = gtk_entry_new ();
10154 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10155 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10156 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10158 label = gtk_label_new ("Base:");
10159 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10160 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10162 entry = gtk_entry_new ();
10163 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10164 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10165 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10167 label = gtk_label_new ("Cursor:");
10168 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10169 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10171 entry = gtk_entry_new ();
10172 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10173 gtk_widget_modify_cursor (entry, &red, &red);
10174 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10176 label = gtk_label_new ("Multiple:");
10177 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10178 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10180 button = gtk_button_new_with_label ("Some Text");
10182 rc_style = gtk_rc_style_new ();
10184 rc_style->font_desc = pango_font_description_copy (font_desc);
10185 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10186 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10187 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10188 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10189 rc_style->bg[GTK_STATE_NORMAL] = blue;
10190 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10191 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10192 rc_style->fg[GTK_STATE_ACTIVE] = red;
10193 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10194 rc_style->xthickness = 5;
10195 rc_style->ythickness = 5;
10197 gtk_widget_modify_style (button, rc_style);
10198 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
10200 g_object_unref (rc_style);
10202 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10205 if (!gtk_widget_get_visible (window))
10206 gtk_widget_show_all (window);
10208 gtk_widget_destroy (window);
10212 * Main Window and Exit
10216 do_exit (GtkWidget *widget, GtkWidget *window)
10218 gtk_widget_destroy (window);
10224 void (*func) (GtkWidget *widget);
10225 gboolean do_not_benchmark;
10228 { "alpha window", create_alpha_window },
10229 { "big windows", create_big_windows },
10230 { "button box", create_button_box },
10231 { "buttons", create_buttons },
10232 { "check buttons", create_check_buttons },
10233 { "color selection", create_color_selection },
10234 { "composited window", create_composited_window },
10235 { "cursors", create_cursors },
10236 { "dialog", create_dialog },
10237 { "display & screen", create_display_screen, TRUE },
10238 { "entry", create_entry },
10239 { "event box", create_event_box },
10240 { "event watcher", create_event_watcher },
10241 { "expander", create_expander },
10242 { "flipping", create_flipping },
10243 { "focus", create_focus },
10244 { "font selection", create_font_selection },
10245 { "gridded geometry", create_gridded_geometry },
10246 { "handle box", create_handle_box },
10247 { "image", create_image },
10248 { "key lookup", create_key_lookup },
10249 { "labels", create_labels },
10250 { "layout", create_layout },
10251 { "menus", create_menus },
10252 { "message dialog", create_message_dialog },
10253 { "modal window", create_modal_window, TRUE },
10254 { "notebook", create_notebook },
10255 { "panes", create_panes },
10256 { "paned keyboard", create_paned_keyboard_navigation },
10257 { "pixbuf", create_pixbuf },
10258 { "progress bar", create_progress_bar },
10259 { "properties", create_properties },
10260 { "radio buttons", create_radio_buttons },
10261 { "range controls", create_range_controls },
10262 { "rc file", create_rc_file },
10263 { "reparent", create_reparent },
10264 { "resize grips", create_resize_grips },
10265 { "rotated label", create_rotated_label },
10266 { "rotated text", create_rotated_text },
10267 { "rulers", create_rulers },
10268 { "saved position", create_saved_position },
10269 { "scrolled windows", create_scrolled_windows },
10270 { "shapes", create_shapes },
10271 { "size groups", create_size_groups },
10272 { "snapshot", create_snapshot },
10273 { "spinbutton", create_spins },
10274 { "statusbar", create_statusbar },
10275 { "styles", create_styles },
10276 { "test idle", create_idle_test },
10277 { "test mainloop", create_mainloop, TRUE },
10278 { "test scrolling", create_scroll_test },
10279 { "test selection", create_selection_test },
10280 { "test timeout", create_timeout_test },
10281 { "toggle buttons", create_toggle_buttons },
10282 { "toolbar", create_toolbar },
10283 { "tooltips", create_tooltips },
10284 { "WM hints", create_wmhints },
10285 { "window sizing", create_window_sizing },
10286 { "window states", create_window_states }
10288 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10291 create_main_window (void)
10296 GtkWidget *scrolled_window;
10300 GtkWidget *separator;
10301 GdkGeometry geometry;
10304 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10305 gtk_widget_set_name (window, "main window");
10306 gtk_window_move (GTK_WINDOW (window), 50, 20);
10307 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10309 geometry.min_width = -1;
10310 geometry.min_height = -1;
10311 geometry.max_width = -1;
10312 geometry.max_height = G_MAXSHORT;
10313 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10315 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10317 g_signal_connect (window, "destroy",
10318 G_CALLBACK (gtk_main_quit),
10320 g_signal_connect (window, "delete-event",
10321 G_CALLBACK (gtk_false),
10324 box1 = gtk_vbox_new (FALSE, 0);
10325 gtk_container_add (GTK_CONTAINER (window), box1);
10327 if (gtk_micro_version > 0)
10330 gtk_get_major_version (),
10331 gtk_get_minor_version (),
10332 gtk_get_micro_version ());
10336 gtk_get_major_version (),
10337 gtk_get_minor_version ());
10339 label = gtk_label_new (buffer);
10340 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10341 gtk_widget_set_name (label, "testgtk-version-label");
10343 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10344 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10345 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10347 GTK_POLICY_AUTOMATIC);
10348 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10350 box2 = gtk_vbox_new (FALSE, 0);
10351 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10352 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10353 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10354 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10355 gtk_widget_show (box2);
10357 for (i = 0; i < nbuttons; i++)
10359 button = gtk_button_new_with_label (buttons[i].label);
10360 if (buttons[i].func)
10361 g_signal_connect (button,
10363 G_CALLBACK(buttons[i].func),
10366 gtk_widget_set_sensitive (button, FALSE);
10367 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10370 separator = gtk_hseparator_new ();
10371 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10373 box2 = gtk_vbox_new (FALSE, 10);
10374 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10375 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10377 button = gtk_button_new_with_mnemonic ("_Close");
10378 g_signal_connect (button, "clicked",
10379 G_CALLBACK (do_exit),
10381 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10382 gtk_widget_set_can_default (button, TRUE);
10383 gtk_widget_grab_default (button);
10385 gtk_widget_show_all (window);
10391 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10392 G_FILE_TEST_EXISTS))
10394 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10395 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10400 pad (const char *str, int to)
10402 static char buf[256];
10403 int len = strlen (str);
10406 for (i = 0; i < to; i++)
10411 memcpy (buf, str, len);
10417 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10419 fn (widget); /* on */
10420 while (g_main_context_iteration (NULL, FALSE));
10421 fn (widget); /* off */
10422 while (g_main_context_iteration (NULL, FALSE));
10426 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10432 static gboolean printed_headers = FALSE;
10434 if (!printed_headers) {
10435 g_print ("Test Iters First Other\n");
10436 g_print ("-------------------- ----- ---------- ----------\n");
10437 printed_headers = TRUE;
10440 g_get_current_time (&tv0);
10441 bench_iteration (widget, fn);
10442 g_get_current_time (&tv1);
10444 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10445 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10447 g_get_current_time (&tv0);
10448 for (n = 0; n < num - 1; n++)
10449 bench_iteration (widget, fn);
10450 g_get_current_time (&tv1);
10451 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10452 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10454 g_print ("%s %5d ", pad (name, 20), num);
10456 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10458 g_print ("%10.1f\n", dt_first);
10462 do_bench (char* what, int num)
10466 void (* fn) (GtkWidget *widget);
10468 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10470 if (g_ascii_strcasecmp (what, "ALL") == 0)
10472 for (i = 0; i < nbuttons; i++)
10474 if (!buttons[i].do_not_benchmark)
10475 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10482 for (i = 0; i < nbuttons; i++)
10484 if (strcmp (buttons[i].label, what) == 0)
10486 fn = buttons[i].func;
10492 g_print ("Can't bench: \"%s\" not found.\n", what);
10494 do_real_bench (widget, fn, buttons[i].label, num);
10501 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10506 main (int argc, char *argv[])
10508 GtkBindingSet *binding_set;
10510 gboolean done_benchmarks = FALSE;
10512 srand (time (NULL));
10516 /* Check to see if we are being run from the correct
10519 if (file_exists ("testgtkrc"))
10520 gtk_rc_add_default_file ("testgtkrc");
10521 else if (file_exists ("tests/testgtkrc"))
10522 gtk_rc_add_default_file ("tests/testgtkrc");
10524 g_warning ("Couldn't find file \"testgtkrc\".");
10526 g_set_application_name ("GTK+ Test Program");
10528 gtk_init (&argc, &argv);
10530 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10539 for (i = 1; i < argc; i++)
10541 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10548 nextarg = strchr (argv[i], '=');
10559 count = strchr (nextarg, ':');
10562 what = g_strndup (nextarg, count - nextarg);
10564 num = atoi (count);
10569 what = g_strdup (nextarg);
10571 do_bench (what, num ? num : 1);
10572 done_benchmarks = TRUE;
10577 if (done_benchmarks)
10582 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10583 gtk_binding_entry_add_signal (binding_set,
10584 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10587 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10589 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
10593 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
10594 " fg[NORMAL] = \"#ff0000\"\n"
10595 " font = \"Sans 18\"\n"
10597 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
10599 create_main_window ();
10605 while (g_main_context_pending (NULL))
10606 g_main_context_iteration (NULL, FALSE);
10609 while (g_main_context_pending (NULL))
10610 g_main_context_iteration (NULL, FALSE);