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;
7266 cairo_surface_t *mask;
7267 cairo_region_t *mask_region;
7272 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7274 window = gtk_window_new (window_type);
7275 gtk_window_set_screen (GTK_WINDOW (window), screen);
7277 fixed = gtk_fixed_new ();
7278 gtk_widget_set_size_request (fixed, 100, 100);
7279 gtk_container_add (GTK_CONTAINER (window), fixed);
7280 gtk_widget_show (fixed);
7282 gtk_widget_set_events (window,
7283 gtk_widget_get_events (window) |
7284 GDK_BUTTON_MOTION_MASK |
7285 GDK_POINTER_MOTION_HINT_MASK |
7286 GDK_BUTTON_PRESS_MASK);
7288 gtk_widget_realize (window);
7290 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7291 g_assert (pixbuf); /* FIXME: error handling */
7293 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
7294 gdk_pixbuf_get_width (pixbuf),
7295 gdk_pixbuf_get_height (pixbuf));
7296 cr = cairo_create (mask);
7297 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
7301 mask_region = gdk_cairo_region_create_from_surface (mask);
7303 cairo_region_translate (mask_region, px, py);
7305 image = gtk_image_new_from_pixbuf (pixbuf);
7306 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7307 gtk_widget_show (image);
7309 gtk_widget_shape_combine_region (window, mask_region);
7311 cairo_region_destroy (mask_region);
7312 cairo_surface_destroy (mask);
7313 g_object_unref (pixbuf);
7315 g_signal_connect (window, "button_press_event",
7316 G_CALLBACK (shape_pressed), NULL);
7317 g_signal_connect (window, "button_release_event",
7318 G_CALLBACK (shape_released), NULL);
7319 g_signal_connect (window, "motion_notify_event",
7320 G_CALLBACK (shape_motion), NULL);
7322 icon_pos = g_new (CursorOffset, 1);
7323 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7325 gtk_window_move (GTK_WINDOW (window), x, y);
7326 gtk_widget_show (window);
7332 create_shapes (GtkWidget *widget)
7334 /* Variables used by the Drag/Drop and Shape Window demos */
7335 static GtkWidget *modeller = NULL;
7336 static GtkWidget *sheets = NULL;
7337 static GtkWidget *rings = NULL;
7338 static GtkWidget *with_region = NULL;
7339 GdkScreen *screen = gtk_widget_get_screen (widget);
7341 if (!(file_exists ("Modeller.xpm") &&
7342 file_exists ("FilesQueue.xpm") &&
7343 file_exists ("3DRings.xpm")))
7349 modeller = shape_create_icon (screen, "Modeller.xpm",
7350 440, 140, 0,0, GTK_WINDOW_POPUP);
7352 g_signal_connect (modeller, "destroy",
7353 G_CALLBACK (gtk_widget_destroyed),
7357 gtk_widget_destroy (modeller);
7361 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7362 580, 170, 0,0, GTK_WINDOW_POPUP);
7364 g_signal_connect (sheets, "destroy",
7365 G_CALLBACK (gtk_widget_destroyed),
7370 gtk_widget_destroy (sheets);
7374 rings = shape_create_icon (screen, "3DRings.xpm",
7375 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7377 g_signal_connect (rings, "destroy",
7378 G_CALLBACK (gtk_widget_destroyed),
7382 gtk_widget_destroy (rings);
7386 cairo_region_t *region;
7389 with_region = shape_create_icon (screen, "3DRings.xpm",
7390 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7392 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7394 g_signal_connect (with_region, "destroy",
7395 G_CALLBACK (gtk_widget_destroyed),
7398 /* reset shape from mask to a region */
7401 region = cairo_region_create ();
7413 cairo_region_union_rectangle (region, &rect);
7421 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7426 gtk_widget_destroy (with_region);
7434 create_wmhints (GtkWidget *widget)
7436 static GtkWidget *window = NULL;
7438 GtkWidget *separator;
7442 GdkWindow *gdk_window;
7448 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7450 gtk_window_set_screen (GTK_WINDOW (window),
7451 gtk_widget_get_screen (widget));
7453 g_signal_connect (window, "destroy",
7454 G_CALLBACK (gtk_widget_destroyed),
7457 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7458 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7460 gtk_widget_realize (window);
7462 gdk_window = gtk_widget_get_window (window);
7464 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7465 list = g_list_prepend (NULL, pixbuf);
7467 gdk_window_set_icon_list (gdk_window, list);
7470 g_object_unref (pixbuf);
7472 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7474 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7475 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7477 box1 = gtk_vbox_new (FALSE, 0);
7478 gtk_container_add (GTK_CONTAINER (window), box1);
7479 gtk_widget_show (box1);
7481 label = gtk_label_new ("Try iconizing me!");
7482 gtk_widget_set_size_request (label, 150, 50);
7483 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7484 gtk_widget_show (label);
7487 separator = gtk_hseparator_new ();
7488 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7489 gtk_widget_show (separator);
7492 box2 = gtk_vbox_new (FALSE, 10);
7493 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7494 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7495 gtk_widget_show (box2);
7498 button = gtk_button_new_with_label ("close");
7500 g_signal_connect_swapped (button, "clicked",
7501 G_CALLBACK (gtk_widget_destroy),
7504 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7505 gtk_widget_set_can_default (button, TRUE);
7506 gtk_widget_grab_default (button);
7507 gtk_widget_show (button);
7510 if (!gtk_widget_get_visible (window))
7511 gtk_widget_show (window);
7513 gtk_widget_destroy (window);
7518 * Window state tracking
7522 window_state_callback (GtkWidget *widget,
7523 GdkEventWindowState *event,
7526 GtkWidget *label = data;
7529 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7530 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7531 "withdrawn" : "not withdrawn", ", ",
7532 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7533 "iconified" : "not iconified", ", ",
7534 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7535 "sticky" : "not sticky", ", ",
7536 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7537 "maximized" : "not maximized", ", ",
7538 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7539 "fullscreen" : "not fullscreen",
7540 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7541 "above" : "not above", ", ",
7542 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7543 "below" : "not below", ", ",
7546 gtk_label_set_text (GTK_LABEL (label), msg);
7554 tracking_label (GtkWidget *window)
7560 hbox = gtk_hbox_new (FALSE, 5);
7562 g_signal_connect_object (hbox,
7564 G_CALLBACK (gtk_widget_destroy),
7568 label = gtk_label_new ("<no window state events received>");
7569 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7570 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7572 g_signal_connect (window,
7573 "window_state_event",
7574 G_CALLBACK (window_state_callback),
7577 button = gtk_button_new_with_label ("Deiconify");
7578 g_signal_connect_object (button,
7580 G_CALLBACK (gtk_window_deiconify),
7583 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7585 button = gtk_button_new_with_label ("Iconify");
7586 g_signal_connect_object (button,
7588 G_CALLBACK (gtk_window_iconify),
7591 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7593 button = gtk_button_new_with_label ("Fullscreen");
7594 g_signal_connect_object (button,
7596 G_CALLBACK (gtk_window_fullscreen),
7599 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7601 button = gtk_button_new_with_label ("Unfullscreen");
7602 g_signal_connect_object (button,
7604 G_CALLBACK (gtk_window_unfullscreen),
7607 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7609 button = gtk_button_new_with_label ("Present");
7610 g_signal_connect_object (button,
7612 G_CALLBACK (gtk_window_present),
7615 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7617 button = gtk_button_new_with_label ("Show");
7618 g_signal_connect_object (button,
7620 G_CALLBACK (gtk_widget_show),
7623 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7625 gtk_widget_show_all (hbox);
7631 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7633 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7635 gtk_window_set_keep_above (GTK_WINDOW (data),
7636 gtk_toggle_button_get_active (togglebutton));
7638 if (gtk_toggle_button_get_active (togglebutton))
7639 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7643 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7645 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7647 gtk_window_set_keep_below (GTK_WINDOW (data),
7648 gtk_toggle_button_get_active (togglebutton));
7650 if (gtk_toggle_button_get_active (togglebutton))
7651 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7656 get_state_controls (GtkWidget *window)
7660 GtkWidget *button_above;
7661 GtkWidget *button_below;
7663 vbox = gtk_vbox_new (FALSE, 0);
7665 button = gtk_button_new_with_label ("Stick");
7666 g_signal_connect_object (button,
7668 G_CALLBACK (gtk_window_stick),
7671 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7673 button = gtk_button_new_with_label ("Unstick");
7674 g_signal_connect_object (button,
7676 G_CALLBACK (gtk_window_unstick),
7679 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7681 button = gtk_button_new_with_label ("Maximize");
7682 g_signal_connect_object (button,
7684 G_CALLBACK (gtk_window_maximize),
7687 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7689 button = gtk_button_new_with_label ("Unmaximize");
7690 g_signal_connect_object (button,
7692 G_CALLBACK (gtk_window_unmaximize),
7695 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7697 button = gtk_button_new_with_label ("Iconify");
7698 g_signal_connect_object (button,
7700 G_CALLBACK (gtk_window_iconify),
7703 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7705 button = gtk_button_new_with_label ("Fullscreen");
7706 g_signal_connect_object (button,
7708 G_CALLBACK (gtk_window_fullscreen),
7711 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7713 button = gtk_button_new_with_label ("Unfullscreen");
7714 g_signal_connect_object (button,
7716 G_CALLBACK (gtk_window_unfullscreen),
7719 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7721 button_above = gtk_toggle_button_new_with_label ("Keep above");
7722 g_signal_connect (button_above,
7724 G_CALLBACK (keep_window_above),
7726 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7728 button_below = gtk_toggle_button_new_with_label ("Keep below");
7729 g_signal_connect (button_below,
7731 G_CALLBACK (keep_window_below),
7733 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7735 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7736 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7738 button = gtk_button_new_with_label ("Hide (withdraw)");
7739 g_signal_connect_object (button,
7741 G_CALLBACK (gtk_widget_hide),
7744 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7746 gtk_widget_show_all (vbox);
7752 create_window_states (GtkWidget *widget)
7754 static GtkWidget *window = NULL;
7757 GtkWidget *iconified;
7759 GtkWidget *controls;
7763 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7764 gtk_window_set_screen (GTK_WINDOW (window),
7765 gtk_widget_get_screen (widget));
7767 g_signal_connect (window, "destroy",
7768 G_CALLBACK (gtk_widget_destroyed),
7771 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7773 box1 = gtk_vbox_new (FALSE, 0);
7774 gtk_container_add (GTK_CONTAINER (window), box1);
7776 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7778 gtk_window_set_screen (GTK_WINDOW (iconified),
7779 gtk_widget_get_screen (widget));
7781 g_signal_connect_object (iconified, "destroy",
7782 G_CALLBACK (gtk_widget_destroy),
7785 gtk_window_iconify (GTK_WINDOW (iconified));
7786 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7787 controls = get_state_controls (iconified);
7788 gtk_container_add (GTK_CONTAINER (iconified), controls);
7790 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7792 gtk_window_set_screen (GTK_WINDOW (normal),
7793 gtk_widget_get_screen (widget));
7795 g_signal_connect_object (normal, "destroy",
7796 G_CALLBACK (gtk_widget_destroy),
7800 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7801 controls = get_state_controls (normal);
7802 gtk_container_add (GTK_CONTAINER (normal), controls);
7804 label = tracking_label (iconified);
7805 gtk_container_add (GTK_CONTAINER (box1), label);
7807 label = tracking_label (normal);
7808 gtk_container_add (GTK_CONTAINER (box1), label);
7810 gtk_widget_show_all (iconified);
7811 gtk_widget_show_all (normal);
7812 gtk_widget_show_all (box1);
7815 if (!gtk_widget_get_visible (window))
7816 gtk_widget_show (window);
7818 gtk_widget_destroy (window);
7826 configure_event_callback (GtkWidget *widget,
7827 GdkEventConfigure *event,
7830 GtkWidget *label = data;
7834 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7836 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7838 event->x, event->y, event->width, event->height,
7841 gtk_label_set_text (GTK_LABEL (label), msg);
7849 get_ints (GtkWidget *window,
7856 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7857 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7859 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7860 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7864 set_size_callback (GtkWidget *widget,
7869 get_ints (data, &w, &h);
7871 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7875 unset_default_size_callback (GtkWidget *widget,
7878 gtk_window_set_default_size (g_object_get_data (data, "target"),
7883 set_default_size_callback (GtkWidget *widget,
7888 get_ints (data, &w, &h);
7890 gtk_window_set_default_size (g_object_get_data (data, "target"),
7895 unset_size_request_callback (GtkWidget *widget,
7898 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7903 set_size_request_callback (GtkWidget *widget,
7908 get_ints (data, &w, &h);
7910 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7915 set_location_callback (GtkWidget *widget,
7920 get_ints (data, &x, &y);
7922 gtk_window_move (g_object_get_data (data, "target"), x, y);
7926 move_to_position_callback (GtkWidget *widget,
7932 window = g_object_get_data (data, "target");
7934 gtk_window_get_position (window, &x, &y);
7936 gtk_window_move (window, x, y);
7940 set_geometry_callback (GtkWidget *entry,
7946 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7948 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7950 if (!gtk_window_parse_geometry (target, text))
7951 g_print ("Bad geometry string '%s'\n", text);
7957 resizable_callback (GtkWidget *widget,
7960 g_object_set (g_object_get_data (data, "target"),
7961 "resizable", GTK_TOGGLE_BUTTON (widget)->active,
7966 gravity_selected (GtkWidget *widget,
7969 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7970 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7974 pos_selected (GtkWidget *widget,
7977 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7978 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7982 move_gravity_window_to_current_position (GtkWidget *widget,
7988 window = GTK_WINDOW (data);
7990 gtk_window_get_position (window, &x, &y);
7992 gtk_window_move (window, x, y);
7996 get_screen_corner (GtkWindow *window,
8001 GdkScreen * screen = gtk_window_get_screen (window);
8003 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
8005 switch (gtk_window_get_gravity (window))
8007 case GDK_GRAVITY_SOUTH_EAST:
8008 *x = gdk_screen_get_width (screen) - w;
8009 *y = gdk_screen_get_height (screen) - h;
8012 case GDK_GRAVITY_NORTH_EAST:
8013 *x = gdk_screen_get_width (screen) - w;
8017 case GDK_GRAVITY_SOUTH_WEST:
8019 *y = gdk_screen_get_height (screen) - h;
8022 case GDK_GRAVITY_NORTH_WEST:
8027 case GDK_GRAVITY_SOUTH:
8028 *x = (gdk_screen_get_width (screen) - w) / 2;
8029 *y = gdk_screen_get_height (screen) - h;
8032 case GDK_GRAVITY_NORTH:
8033 *x = (gdk_screen_get_width (screen) - w) / 2;
8037 case GDK_GRAVITY_WEST:
8039 *y = (gdk_screen_get_height (screen) - h) / 2;
8042 case GDK_GRAVITY_EAST:
8043 *x = gdk_screen_get_width (screen) - w;
8044 *y = (gdk_screen_get_height (screen) - h) / 2;
8047 case GDK_GRAVITY_CENTER:
8048 *x = (gdk_screen_get_width (screen) - w) / 2;
8049 *y = (gdk_screen_get_height (screen) - h) / 2;
8052 case GDK_GRAVITY_STATIC:
8053 /* pick some random numbers */
8059 g_assert_not_reached ();
8065 move_gravity_window_to_starting_position (GtkWidget *widget,
8071 window = GTK_WINDOW (data);
8073 get_screen_corner (window,
8076 gtk_window_move (window, x, y);
8080 make_gravity_window (GtkWidget *destroy_with,
8089 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8091 gtk_window_set_screen (GTK_WINDOW (window),
8092 gtk_widget_get_screen (destroy_with));
8094 vbox = gtk_vbox_new (FALSE, 0);
8095 gtk_widget_show (vbox);
8097 gtk_container_add (GTK_CONTAINER (window), vbox);
8098 gtk_window_set_title (GTK_WINDOW (window), title);
8099 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8101 g_signal_connect_object (destroy_with,
8103 G_CALLBACK (gtk_widget_destroy),
8108 button = gtk_button_new_with_mnemonic ("_Move to current position");
8110 g_signal_connect (button, "clicked",
8111 G_CALLBACK (move_gravity_window_to_current_position),
8114 gtk_container_add (GTK_CONTAINER (vbox), button);
8115 gtk_widget_show (button);
8117 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8119 g_signal_connect (button, "clicked",
8120 G_CALLBACK (move_gravity_window_to_starting_position),
8123 gtk_container_add (GTK_CONTAINER (vbox), button);
8124 gtk_widget_show (button);
8126 /* Pretend this is the result of --geometry.
8127 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8128 * and in that case you probably should just use gtk_window_parse_geometry().
8129 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8130 * you are parsing --geometry or equivalent.
8132 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8136 gtk_window_set_default_size (GTK_WINDOW (window),
8139 get_screen_corner (GTK_WINDOW (window), &x, &y);
8141 gtk_window_move (GTK_WINDOW (window),
8148 do_gravity_test (GtkWidget *widget,
8151 GtkWidget *destroy_with = data;
8154 /* We put a window at each gravity point on the screen. */
8155 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8157 gtk_widget_show (window);
8159 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8161 gtk_widget_show (window);
8163 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8165 gtk_widget_show (window);
8167 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8169 gtk_widget_show (window);
8171 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8173 gtk_widget_show (window);
8175 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8177 gtk_widget_show (window);
8180 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8182 gtk_widget_show (window);
8185 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8187 gtk_widget_show (window);
8189 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8191 gtk_widget_show (window);
8193 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8195 gtk_widget_show (window);
8199 window_controls (GtkWidget *window)
8201 GtkWidget *control_window;
8211 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8213 gtk_window_set_screen (GTK_WINDOW (control_window),
8214 gtk_widget_get_screen (window));
8216 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8218 g_object_set_data (G_OBJECT (control_window),
8222 g_signal_connect_object (control_window,
8224 G_CALLBACK (gtk_widget_destroy),
8228 vbox = gtk_vbox_new (FALSE, 5);
8230 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8232 label = gtk_label_new ("<no configure events>");
8233 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8235 g_signal_connect (window,
8237 G_CALLBACK (configure_event_callback),
8240 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8242 spin = gtk_spin_button_new (adj, 0, 0);
8244 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8246 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8248 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8250 spin = gtk_spin_button_new (adj, 0, 0);
8252 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8254 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8256 entry = gtk_entry_new ();
8257 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8259 g_signal_connect (entry, "changed",
8260 G_CALLBACK (set_geometry_callback),
8263 button = gtk_button_new_with_label ("Show gravity test windows");
8264 g_signal_connect_swapped (button,
8266 G_CALLBACK (do_gravity_test),
8268 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8270 button = gtk_button_new_with_label ("Reshow with initial size");
8271 g_signal_connect_object (button,
8273 G_CALLBACK (gtk_window_reshow_with_initial_size),
8276 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8278 button = gtk_button_new_with_label ("Queue resize");
8279 g_signal_connect_object (button,
8281 G_CALLBACK (gtk_widget_queue_resize),
8284 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8286 button = gtk_button_new_with_label ("Resize");
8287 g_signal_connect (button,
8289 G_CALLBACK (set_size_callback),
8291 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8293 button = gtk_button_new_with_label ("Set default size");
8294 g_signal_connect (button,
8296 G_CALLBACK (set_default_size_callback),
8298 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8300 button = gtk_button_new_with_label ("Unset default size");
8301 g_signal_connect (button,
8303 G_CALLBACK (unset_default_size_callback),
8305 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8307 button = gtk_button_new_with_label ("Set size request");
8308 g_signal_connect (button,
8310 G_CALLBACK (set_size_request_callback),
8312 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8314 button = gtk_button_new_with_label ("Unset size request");
8315 g_signal_connect (button,
8317 G_CALLBACK (unset_size_request_callback),
8319 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8321 button = gtk_button_new_with_label ("Move");
8322 g_signal_connect (button,
8324 G_CALLBACK (set_location_callback),
8326 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8328 button = gtk_button_new_with_label ("Move to current position");
8329 g_signal_connect (button,
8331 G_CALLBACK (move_to_position_callback),
8333 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8335 button = gtk_check_button_new_with_label ("Allow resize");
8336 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8337 g_signal_connect (button,
8339 G_CALLBACK (resizable_callback),
8341 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8343 button = gtk_button_new_with_mnemonic ("_Show");
8344 g_signal_connect_object (button,
8346 G_CALLBACK (gtk_widget_show),
8349 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8351 button = gtk_button_new_with_mnemonic ("_Hide");
8352 g_signal_connect_object (button,
8354 G_CALLBACK (gtk_widget_hide),
8357 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8359 om = gtk_combo_box_new_text ();
8363 static gchar *names[] = {
8364 "GDK_GRAVITY_NORTH_WEST",
8365 "GDK_GRAVITY_NORTH",
8366 "GDK_GRAVITY_NORTH_EAST",
8368 "GDK_GRAVITY_CENTER",
8370 "GDK_GRAVITY_SOUTH_WEST",
8371 "GDK_GRAVITY_SOUTH",
8372 "GDK_GRAVITY_SOUTH_EAST",
8373 "GDK_GRAVITY_STATIC",
8377 g_assert (names[i]);
8378 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8383 g_signal_connect (om,
8385 G_CALLBACK (gravity_selected),
8388 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8391 om = gtk_combo_box_new_text ();
8395 static gchar *names[] = {
8397 "GTK_WIN_POS_CENTER",
8398 "GTK_WIN_POS_MOUSE",
8399 "GTK_WIN_POS_CENTER_ALWAYS",
8400 "GTK_WIN_POS_CENTER_ON_PARENT",
8404 g_assert (names[i]);
8405 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8410 g_signal_connect (om,
8412 G_CALLBACK (pos_selected),
8415 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8417 gtk_widget_show_all (vbox);
8419 return control_window;
8423 create_window_sizing (GtkWidget *widget)
8425 static GtkWidget *window = NULL;
8426 static GtkWidget *target_window = NULL;
8432 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8433 gtk_window_set_screen (GTK_WINDOW (target_window),
8434 gtk_widget_get_screen (widget));
8435 label = gtk_label_new (NULL);
8436 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");
8437 gtk_container_add (GTK_CONTAINER (target_window), label);
8438 gtk_widget_show (label);
8440 g_signal_connect (target_window, "destroy",
8441 G_CALLBACK (gtk_widget_destroyed),
8444 window = window_controls (target_window);
8446 g_signal_connect (window, "destroy",
8447 G_CALLBACK (gtk_widget_destroyed),
8450 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8453 /* don't show target window by default, we want to allow testing
8454 * of behavior on first show.
8457 if (!gtk_widget_get_visible (window))
8458 gtk_widget_show (window);
8460 gtk_widget_destroy (window);
8467 typedef struct _ProgressData {
8470 GtkWidget *block_spin;
8471 GtkWidget *x_align_spin;
8472 GtkWidget *y_align_spin;
8473 GtkWidget *step_spin;
8474 GtkWidget *act_blocks_spin;
8485 progress_timeout (gpointer data)
8487 ProgressData *pdata = data;
8491 if (pdata->activity)
8493 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8495 text = g_strdup_printf ("%s", "???");
8499 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8502 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8504 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8507 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8514 destroy_progress (GtkWidget *widget,
8515 ProgressData **pdata)
8517 g_source_remove ((*pdata)->timer);
8518 (*pdata)->timer = 0;
8519 (*pdata)->window = NULL;
8525 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8527 ProgressData *pdata;
8530 pdata = (ProgressData *) data;
8532 if (!gtk_widget_get_mapped (widget))
8535 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8537 if (i == 0 || i == 1)
8538 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8540 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8542 if (i == 1 || i == 2)
8543 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8545 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8549 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8553 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8554 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8558 progressbar_toggle_ellipsize (GtkWidget *widget,
8561 ProgressData *pdata = data;
8562 if (gtk_widget_is_drawable (widget))
8564 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8565 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8570 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8572 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8576 entry_changed (GtkWidget *widget, ProgressData *pdata)
8578 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8579 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8583 create_progress_bar (GtkWidget *widget)
8585 GtkWidget *action_area, *content_area;
8595 static ProgressData *pdata = NULL;
8597 static gchar *items1[] =
8605 static char *ellipsize_items[] = {
8606 "None", // PANGO_ELLIPSIZE_NONE,
8607 "Start", // PANGO_ELLIPSIZE_START,
8608 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8609 "End", // PANGO_ELLIPSIZE_END
8613 pdata = g_new0 (ProgressData, 1);
8617 pdata->window = gtk_dialog_new ();
8619 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8620 gtk_widget_get_screen (widget));
8622 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8624 g_signal_connect (pdata->window, "destroy",
8625 G_CALLBACK (destroy_progress),
8629 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8630 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8632 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8633 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8635 vbox = gtk_vbox_new (FALSE, 5);
8636 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8637 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8639 frame = gtk_frame_new ("Progress");
8640 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8642 vbox2 = gtk_vbox_new (FALSE, 5);
8643 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8645 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8646 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8648 pdata->pbar = gtk_progress_bar_new ();
8649 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8650 PANGO_ELLIPSIZE_MIDDLE);
8652 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8653 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8655 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8656 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8658 hbox = gtk_hbox_new (FALSE, 5);
8659 gtk_container_add (GTK_CONTAINER (align), hbox);
8660 label = gtk_label_new ("Label updated by user :");
8661 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8662 pdata->label = gtk_label_new ("");
8663 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8665 frame = gtk_frame_new ("Options");
8666 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8668 vbox2 = gtk_vbox_new (FALSE, 5);
8669 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8671 tab = gtk_table_new (7, 2, FALSE);
8672 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8674 label = gtk_label_new ("Orientation :");
8675 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8676 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8678 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8680 pdata->omenu1 = build_option_menu (items1, 4, 0,
8681 progressbar_toggle_orientation,
8683 hbox = gtk_hbox_new (FALSE, 0);
8684 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8685 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8687 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8689 check = gtk_check_button_new_with_label ("Show text");
8690 g_signal_connect (check, "clicked",
8691 G_CALLBACK (toggle_show_text),
8693 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
8694 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8697 hbox = gtk_hbox_new (FALSE, 0);
8698 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
8699 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8702 label = gtk_label_new ("Text: ");
8703 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8705 pdata->entry = gtk_entry_new ();
8706 g_signal_connect (pdata->entry, "changed",
8707 G_CALLBACK (entry_changed),
8709 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8710 gtk_widget_set_size_request (pdata->entry, 100, -1);
8712 label = gtk_label_new ("Ellipsize text :");
8713 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8714 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8716 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8717 pdata->elmenu = build_option_menu (ellipsize_items,
8718 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8719 2, // PANGO_ELLIPSIZE_MIDDLE
8720 progressbar_toggle_ellipsize,
8722 hbox = gtk_hbox_new (FALSE, 0);
8723 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8724 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8726 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8728 check = gtk_check_button_new_with_label ("Activity mode");
8729 g_signal_connect (check, "clicked",
8730 G_CALLBACK (toggle_activity_mode), pdata);
8731 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8732 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8735 button = gtk_button_new_with_label ("close");
8736 g_signal_connect_swapped (button, "clicked",
8737 G_CALLBACK (gtk_widget_destroy),
8739 gtk_widget_set_can_default (button, TRUE);
8740 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8741 gtk_widget_grab_default (button);
8744 if (!gtk_widget_get_visible (pdata->window))
8745 gtk_widget_show_all (pdata->window);
8747 gtk_widget_destroy (pdata->window);
8759 GtkWidget *res_widget;
8763 find_widget (GtkWidget *widget, FindWidgetData *data)
8765 GtkAllocation new_allocation;
8769 gtk_widget_get_allocation (widget, &new_allocation);
8771 if (data->found || !gtk_widget_get_mapped (widget))
8774 /* Note that in the following code, we only count the
8775 * position as being inside a WINDOW widget if it is inside
8776 * widget->window; points that are outside of widget->window
8777 * but within the allocation are not counted. This is consistent
8778 * with the way we highlight drag targets.
8780 if (gtk_widget_get_has_window (widget))
8782 new_allocation.x = 0;
8783 new_allocation.y = 0;
8786 if (gtk_widget_get_parent (widget) && !data->first)
8788 GdkWindow *window = gtk_widget_get_window (widget);
8789 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8791 gint tx, ty, twidth, theight;
8792 gdk_drawable_get_size (window, &twidth, &theight);
8794 if (new_allocation.x < 0)
8796 new_allocation.width += new_allocation.x;
8797 new_allocation.x = 0;
8799 if (new_allocation.y < 0)
8801 new_allocation.height += new_allocation.y;
8802 new_allocation.y = 0;
8804 if (new_allocation.x + new_allocation.width > twidth)
8805 new_allocation.width = twidth - new_allocation.x;
8806 if (new_allocation.y + new_allocation.height > theight)
8807 new_allocation.height = theight - new_allocation.y;
8809 gdk_window_get_position (window, &tx, &ty);
8810 new_allocation.x += tx;
8812 new_allocation.y += ty;
8815 window = gdk_window_get_parent (window);
8819 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8820 (data->x < new_allocation.x + new_allocation.width) &&
8821 (data->y < new_allocation.y + new_allocation.height))
8823 /* First, check if the drag is in a valid drop site in
8824 * one of our children
8826 if (GTK_IS_CONTAINER (widget))
8828 FindWidgetData new_data = *data;
8830 new_data.x -= x_offset;
8831 new_data.y -= y_offset;
8832 new_data.found = FALSE;
8833 new_data.first = FALSE;
8835 gtk_container_forall (GTK_CONTAINER (widget),
8836 (GtkCallback)find_widget,
8839 data->found = new_data.found;
8841 data->res_widget = new_data.res_widget;
8844 /* If not, and this widget is registered as a drop site, check to
8845 * emit "drag_motion" to check if we are actually in
8851 data->res_widget = widget;
8857 find_widget_at_pointer (GdkDisplay *display)
8859 GtkWidget *widget = NULL;
8860 GdkWindow *pointer_window;
8862 FindWidgetData data;
8864 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
8868 gpointer widget_ptr;
8870 gdk_window_get_user_data (pointer_window, &widget_ptr);
8871 widget = widget_ptr;
8876 gdk_window_get_pointer (gtk_widget_get_window (widget),
8884 find_widget (widget, &data);
8886 return data.res_widget;
8892 struct PropertiesData {
8900 destroy_properties (GtkWidget *widget,
8901 struct PropertiesData *data)
8905 *data->window = NULL;
8906 data->window = NULL;
8911 gdk_cursor_unref (data->cursor);
8912 data->cursor = NULL;
8917 g_signal_handler_disconnect (widget, data->handler);
8925 property_query_event (GtkWidget *widget,
8927 struct PropertiesData *data)
8929 GtkWidget *res_widget = NULL;
8931 if (!data->in_query)
8934 if (event->type == GDK_BUTTON_RELEASE)
8936 gtk_grab_remove (widget);
8937 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8940 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8943 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8944 gtk_widget_get_screen (widget));
8945 create_prop_editor (G_OBJECT (res_widget), 0);
8948 data->in_query = FALSE;
8955 query_properties (GtkButton *button,
8956 struct PropertiesData *data)
8958 GtkWidget *widget = GTK_WIDGET (button);
8961 g_signal_connect (button, "event",
8962 G_CALLBACK (property_query_event), data);
8966 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8969 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
8971 GDK_BUTTON_RELEASE_MASK,
8976 gtk_grab_add (widget);
8978 data->in_query = TRUE;
8982 create_properties (GtkWidget *widget)
8984 static GtkWidget *window = NULL;
8988 struct PropertiesData *data;
8990 data = g_new (struct PropertiesData, 1);
8991 data->window = &window;
8992 data->in_query = FALSE;
8993 data->cursor = NULL;
8998 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9000 gtk_window_set_screen (GTK_WINDOW (window),
9001 gtk_widget_get_screen (widget));
9003 data->handler = g_signal_connect (window, "destroy",
9004 G_CALLBACK (destroy_properties),
9007 gtk_window_set_title (GTK_WINDOW (window), "test properties");
9008 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9010 vbox = gtk_vbox_new (FALSE, 1);
9011 gtk_container_add (GTK_CONTAINER (window), vbox);
9013 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9014 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9016 button = gtk_button_new_with_label ("Query properties");
9017 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9018 g_signal_connect (button, "clicked",
9019 G_CALLBACK (query_properties),
9023 if (!gtk_widget_get_visible (window))
9024 gtk_widget_show_all (window);
9026 gtk_widget_destroy (window);
9035 selection_test_received (GtkWidget *tree_view,
9036 GtkSelectionData *data)
9038 GtkTreeModel *model;
9039 GtkListStore *store;
9043 if (data->length < 0)
9045 g_print ("Selection retrieval failed\n");
9048 if (data->type != GDK_SELECTION_TYPE_ATOM)
9050 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9054 /* Clear out any current list items */
9056 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9057 store = GTK_LIST_STORE (model);
9058 gtk_list_store_clear (store);
9060 /* Add new items to list */
9062 atoms = (GdkAtom *)data->data;
9064 l = data->length / sizeof (GdkAtom);
9065 for (i = 0; i < l; i++)
9070 name = gdk_atom_name (atoms[i]);
9073 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9077 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9084 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9086 static GdkAtom targets_atom = GDK_NONE;
9088 if (targets_atom == GDK_NONE)
9089 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9091 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9096 create_selection_test (GtkWidget *widget)
9098 static GtkWidget *window = NULL;
9099 GtkWidget *action_area, *content_area;
9102 GtkWidget *scrolled_win;
9103 GtkListStore* store;
9104 GtkWidget *tree_view;
9105 GtkTreeViewColumn *column;
9106 GtkCellRenderer *renderer;
9111 window = gtk_dialog_new ();
9113 gtk_window_set_screen (GTK_WINDOW (window),
9114 gtk_widget_get_screen (widget));
9116 g_signal_connect (window, "destroy",
9117 G_CALLBACK (gtk_widget_destroyed),
9120 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9121 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9123 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9124 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9126 /* Create the list */
9128 vbox = gtk_vbox_new (FALSE, 5);
9129 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9130 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9132 label = gtk_label_new ("Gets available targets for current selection");
9133 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9135 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9136 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9137 GTK_POLICY_AUTOMATIC,
9138 GTK_POLICY_AUTOMATIC);
9139 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9140 gtk_widget_set_size_request (scrolled_win, 100, 200);
9142 store = gtk_list_store_new (1, G_TYPE_STRING);
9143 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9144 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9146 renderer = gtk_cell_renderer_text_new ();
9147 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9149 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9151 g_signal_connect (tree_view, "selection_received",
9152 G_CALLBACK (selection_test_received), NULL);
9154 /* .. And create some buttons */
9155 button = gtk_button_new_with_label ("Get Targets");
9156 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9158 g_signal_connect (button, "clicked",
9159 G_CALLBACK (selection_test_get_targets), tree_view);
9161 button = gtk_button_new_with_label ("Quit");
9162 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9164 g_signal_connect_swapped (button, "clicked",
9165 G_CALLBACK (gtk_widget_destroy),
9169 if (!gtk_widget_get_visible (window))
9170 gtk_widget_show_all (window);
9172 gtk_widget_destroy (window);
9179 static int scroll_test_pos = 0.0;
9182 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9187 gint imin, imax, jmin, jmax;
9190 imin = (event->area.x) / 10;
9191 imax = (event->area.x + event->area.width + 9) / 10;
9193 jmin = ((int)adj->value + event->area.y) / 10;
9194 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9196 window = gtk_widget_get_window (widget);
9198 gdk_window_clear_area (window,
9199 event->area.x, event->area.y,
9200 event->area.width, event->area.height);
9202 cr = gdk_cairo_create (window);
9204 for (i=imin; i<imax; i++)
9205 for (j=jmin; j<jmax; j++)
9207 cairo_rectangle (cr, 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9217 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9220 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9221 -adj->page_increment / 2:
9222 adj->page_increment / 2);
9223 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9224 gtk_adjustment_set_value (adj, new_value);
9230 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9233 GtkAllocation allocation;
9235 gtk_widget_get_allocation (widget, &allocation);
9236 adj->page_increment = 0.9 * allocation.height;
9237 adj->page_size = allocation.height;
9239 g_signal_emit_by_name (adj, "changed");
9243 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9248 dy = scroll_test_pos - (int)adj->value;
9249 scroll_test_pos = adj->value;
9251 if (!gtk_widget_is_drawable (widget))
9254 window = gtk_widget_get_window (widget);
9255 gdk_window_scroll (window, 0, dy);
9256 gdk_window_process_updates (window, FALSE);
9261 create_scroll_test (GtkWidget *widget)
9263 static GtkWidget *window = NULL;
9264 GtkWidget *action_area, *content_area;
9266 GtkWidget *drawing_area;
9267 GtkWidget *scrollbar;
9270 GdkGeometry geometry;
9271 GdkWindowHints geometry_mask;
9275 window = gtk_dialog_new ();
9277 gtk_window_set_screen (GTK_WINDOW (window),
9278 gtk_widget_get_screen (widget));
9280 g_signal_connect (window, "destroy",
9281 G_CALLBACK (gtk_widget_destroyed),
9284 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9285 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9287 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9288 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9290 hbox = gtk_hbox_new (FALSE, 0);
9291 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9292 gtk_widget_show (hbox);
9294 drawing_area = gtk_drawing_area_new ();
9295 gtk_widget_set_size_request (drawing_area, 200, 200);
9296 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9297 gtk_widget_show (drawing_area);
9299 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9301 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9302 scroll_test_pos = 0.0;
9304 scrollbar = gtk_vscrollbar_new (adj);
9305 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9306 gtk_widget_show (scrollbar);
9308 g_signal_connect (drawing_area, "expose_event",
9309 G_CALLBACK (scroll_test_expose), adj);
9310 g_signal_connect (drawing_area, "configure_event",
9311 G_CALLBACK (scroll_test_configure), adj);
9312 g_signal_connect (drawing_area, "scroll_event",
9313 G_CALLBACK (scroll_test_scroll), adj);
9315 g_signal_connect (adj, "value_changed",
9316 G_CALLBACK (scroll_test_adjustment_changed),
9319 /* .. And create some buttons */
9321 button = gtk_button_new_with_label ("Quit");
9322 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9324 g_signal_connect_swapped (button, "clicked",
9325 G_CALLBACK (gtk_widget_destroy),
9327 gtk_widget_show (button);
9329 /* Set up gridded geometry */
9331 geometry_mask = GDK_HINT_MIN_SIZE |
9332 GDK_HINT_BASE_SIZE |
9333 GDK_HINT_RESIZE_INC;
9335 geometry.min_width = 20;
9336 geometry.min_height = 20;
9337 geometry.base_width = 0;
9338 geometry.base_height = 0;
9339 geometry.width_inc = 10;
9340 geometry.height_inc = 10;
9342 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9343 drawing_area, &geometry, geometry_mask);
9346 if (!gtk_widget_get_visible (window))
9347 gtk_widget_show (window);
9349 gtk_widget_destroy (window);
9356 static int timer = 0;
9359 timeout_test (GtkWidget *label)
9361 static int count = 0;
9362 static char buffer[32];
9364 sprintf (buffer, "count: %d", ++count);
9365 gtk_label_set_text (GTK_LABEL (label), buffer);
9371 start_timeout_test (GtkWidget *widget,
9376 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9381 stop_timeout_test (GtkWidget *widget,
9386 g_source_remove (timer);
9392 destroy_timeout_test (GtkWidget *widget,
9395 stop_timeout_test (NULL, NULL);
9401 create_timeout_test (GtkWidget *widget)
9403 static GtkWidget *window = NULL;
9404 GtkWidget *action_area, *content_area;
9410 window = gtk_dialog_new ();
9412 gtk_window_set_screen (GTK_WINDOW (window),
9413 gtk_widget_get_screen (widget));
9415 g_signal_connect (window, "destroy",
9416 G_CALLBACK (destroy_timeout_test),
9419 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9420 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9422 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9423 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9425 label = gtk_label_new ("count: 0");
9426 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9427 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9428 gtk_widget_show (label);
9430 button = gtk_button_new_with_label ("close");
9431 g_signal_connect_swapped (button, "clicked",
9432 G_CALLBACK (gtk_widget_destroy),
9434 gtk_widget_set_can_default (button, TRUE);
9435 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9436 gtk_widget_grab_default (button);
9437 gtk_widget_show (button);
9439 button = gtk_button_new_with_label ("start");
9440 g_signal_connect (button, "clicked",
9441 G_CALLBACK(start_timeout_test),
9443 gtk_widget_set_can_default (button, TRUE);
9444 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9445 gtk_widget_show (button);
9447 button = gtk_button_new_with_label ("stop");
9448 g_signal_connect (button, "clicked",
9449 G_CALLBACK (stop_timeout_test),
9451 gtk_widget_set_can_default (button, TRUE);
9452 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9453 gtk_widget_show (button);
9456 if (!gtk_widget_get_visible (window))
9457 gtk_widget_show (window);
9459 gtk_widget_destroy (window);
9466 static int idle_id = 0;
9469 idle_test (GtkWidget *label)
9471 static int count = 0;
9472 static char buffer[32];
9474 sprintf (buffer, "count: %d", ++count);
9475 gtk_label_set_text (GTK_LABEL (label), buffer);
9481 start_idle_test (GtkWidget *widget,
9486 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9491 stop_idle_test (GtkWidget *widget,
9496 g_source_remove (idle_id);
9502 destroy_idle_test (GtkWidget *widget,
9505 stop_idle_test (NULL, NULL);
9511 toggle_idle_container (GObject *button,
9512 GtkContainer *container)
9514 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9518 create_idle_test (GtkWidget *widget)
9520 static GtkWidget *window = NULL;
9523 GtkWidget *container;
9527 GtkWidget *action_area, *content_area;
9532 window = gtk_dialog_new ();
9534 gtk_window_set_screen (GTK_WINDOW (window),
9535 gtk_widget_get_screen (widget));
9537 g_signal_connect (window, "destroy",
9538 G_CALLBACK (destroy_idle_test),
9541 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9542 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9544 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9545 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9547 label = gtk_label_new ("count: 0");
9548 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9549 gtk_widget_show (label);
9552 g_object_new (GTK_TYPE_HBOX,
9554 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9555 * "GtkWidget::visible", TRUE,
9560 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9563 g_object_new (GTK_TYPE_FRAME,
9565 "label", "Label Container",
9567 "parent", content_area,
9570 g_object_new (GTK_TYPE_VBOX,
9575 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9576 "label", "Resize-Parent",
9577 "user_data", (void*)GTK_RESIZE_PARENT,
9581 "signal::clicked", toggle_idle_container, container,
9583 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9584 "label", "Resize-Queue",
9585 "user_data", (void*)GTK_RESIZE_QUEUE,
9590 g_object_connect (button,
9591 "signal::clicked", toggle_idle_container, container,
9593 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9594 "label", "Resize-Immediate",
9595 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9597 g_object_connect (button2,
9598 "signal::clicked", toggle_idle_container, container,
9600 g_object_set (button2,
9606 button = gtk_button_new_with_label ("close");
9607 g_signal_connect_swapped (button, "clicked",
9608 G_CALLBACK (gtk_widget_destroy),
9610 gtk_widget_set_can_default (button, TRUE);
9611 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9612 gtk_widget_grab_default (button);
9613 gtk_widget_show (button);
9615 button = gtk_button_new_with_label ("start");
9616 g_signal_connect (button, "clicked",
9617 G_CALLBACK (start_idle_test),
9619 gtk_widget_set_can_default (button, TRUE);
9620 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9621 gtk_widget_show (button);
9623 button = gtk_button_new_with_label ("stop");
9624 g_signal_connect (button, "clicked",
9625 G_CALLBACK (stop_idle_test),
9627 gtk_widget_set_can_default (button, TRUE);
9628 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9629 gtk_widget_show (button);
9632 if (!gtk_widget_get_visible (window))
9633 gtk_widget_show (window);
9635 gtk_widget_destroy (window);
9643 reload_all_rc_files (void)
9645 static GdkAtom atom_rcfiles = GDK_NONE;
9647 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
9651 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
9653 for(i = 0; i < 5; i++)
9654 send_event->client.data.l[i] = 0;
9655 send_event->client.data_format = 32;
9656 send_event->client.message_type = atom_rcfiles;
9657 gdk_event_send_clientmessage_toall (send_event);
9659 gdk_event_free (send_event);
9663 create_rc_file (GtkWidget *widget)
9665 static GtkWidget *window = NULL;
9666 GtkWidget *action_area, *content_area;
9674 window = gtk_dialog_new ();
9676 gtk_window_set_screen (GTK_WINDOW (window),
9677 gtk_widget_get_screen (widget));
9679 g_signal_connect (window, "destroy",
9680 G_CALLBACK (gtk_widget_destroyed),
9683 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9684 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9686 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9687 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9689 vbox = gtk_vbox_new (FALSE, 0);
9690 gtk_container_add (GTK_CONTAINER (frame), vbox);
9692 label = gtk_label_new ("This label should be red");
9693 gtk_widget_set_name (label, "testgtk-red-label");
9694 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9696 label = gtk_label_new ("This label should be green");
9697 gtk_widget_set_name (label, "testgtk-green-label");
9698 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9700 label = gtk_label_new ("This label should be blue");
9701 gtk_widget_set_name (label, "testgtk-blue-label");
9702 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9704 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9705 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9707 button = gtk_button_new_with_label ("Reload");
9708 g_signal_connect (button, "clicked",
9709 G_CALLBACK (gtk_rc_reparse_all), NULL);
9710 gtk_widget_set_can_default (button, TRUE);
9711 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9712 gtk_widget_grab_default (button);
9714 button = gtk_button_new_with_label ("Reload All");
9715 g_signal_connect (button, "clicked",
9716 G_CALLBACK (reload_all_rc_files), NULL);
9717 gtk_widget_set_can_default (button, TRUE);
9718 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9720 button = gtk_button_new_with_label ("Close");
9721 g_signal_connect_swapped (button, "clicked",
9722 G_CALLBACK (gtk_widget_destroy),
9724 gtk_widget_set_can_default (button, TRUE);
9725 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9728 if (!gtk_widget_get_visible (window))
9729 gtk_widget_show_all (window);
9731 gtk_widget_destroy (window);
9735 * Test of recursive mainloop
9739 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9746 create_mainloop (GtkWidget *widget)
9748 static GtkWidget *window = NULL;
9749 GtkWidget *action_area, *content_area;
9755 window = gtk_dialog_new ();
9757 gtk_window_set_screen (GTK_WINDOW (window),
9758 gtk_widget_get_screen (widget));
9760 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9762 g_signal_connect (window, "destroy",
9763 G_CALLBACK (mainloop_destroyed),
9766 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9767 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9769 label = gtk_label_new ("In recursive main loop...");
9770 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9772 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9773 gtk_widget_show (label);
9775 button = gtk_button_new_with_label ("Leave");
9776 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9778 g_signal_connect_swapped (button, "clicked",
9779 G_CALLBACK (gtk_widget_destroy),
9782 gtk_widget_set_can_default (button, TRUE);
9783 gtk_widget_grab_default (button);
9785 gtk_widget_show (button);
9788 if (!gtk_widget_get_visible (window))
9790 gtk_widget_show (window);
9792 g_print ("create_mainloop: start\n");
9794 g_print ("create_mainloop: done\n");
9797 gtk_widget_destroy (window);
9801 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
9804 GdkWindow *bin_window;
9808 gint imin, imax, jmin, jmax;
9810 layout = GTK_LAYOUT (widget);
9811 bin_window = gtk_layout_get_bin_window (layout);
9813 if (event->window != bin_window)
9816 imin = (event->area.x) / 10;
9817 imax = (event->area.x + event->area.width + 9) / 10;
9819 jmin = (event->area.y) / 10;
9820 jmax = (event->area.y + event->area.height + 9) / 10;
9822 cr = gdk_cairo_create (bin_window);
9824 for (i=imin; i<imax; i++)
9825 for (j=jmin; j<jmax; j++)
9827 cairo_rectangle (cr,
9838 void create_layout (GtkWidget *widget)
9840 GtkAdjustment *hadjustment, *vadjustment;
9842 static GtkWidget *window = NULL;
9843 GtkWidget *layout_widget;
9844 GtkWidget *scrolledwindow;
9853 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9854 gtk_window_set_screen (GTK_WINDOW (window),
9855 gtk_widget_get_screen (widget));
9857 g_signal_connect (window, "destroy",
9858 G_CALLBACK (gtk_widget_destroyed),
9861 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9862 gtk_widget_set_size_request (window, 200, 200);
9864 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9865 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9867 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9868 GTK_CORNER_TOP_RIGHT);
9870 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9872 layout_widget = gtk_layout_new (NULL, NULL);
9873 layout = GTK_LAYOUT (layout_widget);
9874 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9876 /* We set step sizes here since GtkLayout does not set
9879 hadjustment = gtk_layout_get_hadjustment (layout);
9880 vadjustment = gtk_layout_get_vadjustment (layout);
9881 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9882 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9883 gtk_layout_set_hadjustment (layout, hadjustment);
9884 gtk_layout_set_vadjustment (layout, vadjustment);
9886 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9887 g_signal_connect (layout, "expose_event",
9888 G_CALLBACK (layout_expose_handler), NULL);
9890 gtk_layout_set_size (layout, 1600, 128000);
9892 for (i=0 ; i < 16 ; i++)
9893 for (j=0 ; j < 16 ; j++)
9895 sprintf(buf, "Button %d, %d", i, j);
9897 button = gtk_button_new_with_label (buf);
9899 button = gtk_label_new (buf);
9901 gtk_layout_put (layout, button, j*100, i*100);
9904 for (i=16; i < 1280; i++)
9906 sprintf(buf, "Button %d, %d", i, 0);
9908 button = gtk_button_new_with_label (buf);
9910 button = gtk_label_new (buf);
9912 gtk_layout_put (layout, button, 0, i*100);
9916 if (!gtk_widget_get_visible (window))
9917 gtk_widget_show_all (window);
9919 gtk_widget_destroy (window);
9923 create_styles (GtkWidget *widget)
9925 static GtkWidget *window = NULL;
9926 GtkWidget *content_area, *action_area;
9931 static GdkColor red = { 0, 0xffff, 0, 0 };
9932 static GdkColor green = { 0, 0, 0xffff, 0 };
9933 static GdkColor blue = { 0, 0, 0, 0xffff };
9934 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
9935 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
9936 PangoFontDescription *font_desc;
9938 GtkRcStyle *rc_style;
9942 window = gtk_dialog_new ();
9943 gtk_window_set_screen (GTK_WINDOW (window),
9944 gtk_widget_get_screen (widget));
9946 g_signal_connect (window, "destroy",
9947 G_CALLBACK (gtk_widget_destroyed),
9950 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9951 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9953 button = gtk_button_new_with_label ("Close");
9954 g_signal_connect_swapped (button, "clicked",
9955 G_CALLBACK (gtk_widget_destroy),
9957 gtk_widget_set_can_default (button, TRUE);
9958 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9959 gtk_widget_show (button);
9961 vbox = gtk_vbox_new (FALSE, 5);
9962 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9963 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9965 label = gtk_label_new ("Font:");
9966 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9967 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9969 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9971 button = gtk_button_new_with_label ("Some Text");
9972 gtk_widget_modify_font (gtk_bin_get_child (GTK_BIN (button)),
9974 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9976 label = gtk_label_new ("Foreground:");
9977 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9978 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9980 button = gtk_button_new_with_label ("Some Text");
9981 gtk_widget_modify_fg (gtk_bin_get_child (GTK_BIN (button)),
9982 GTK_STATE_NORMAL, &red);
9983 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9985 label = gtk_label_new ("Background:");
9986 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9987 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9989 button = gtk_button_new_with_label ("Some Text");
9990 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
9991 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9993 label = gtk_label_new ("Text:");
9994 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9995 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9997 entry = gtk_entry_new ();
9998 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9999 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10000 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10002 label = gtk_label_new ("Base:");
10003 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10004 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10006 entry = gtk_entry_new ();
10007 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10008 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10009 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10011 label = gtk_label_new ("Cursor:");
10012 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10013 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10015 entry = gtk_entry_new ();
10016 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10017 gtk_widget_modify_cursor (entry, &red, &red);
10018 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10020 label = gtk_label_new ("Multiple:");
10021 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10022 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10024 button = gtk_button_new_with_label ("Some Text");
10026 rc_style = gtk_rc_style_new ();
10028 rc_style->font_desc = pango_font_description_copy (font_desc);
10029 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10030 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10031 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10032 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10033 rc_style->bg[GTK_STATE_NORMAL] = blue;
10034 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10035 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10036 rc_style->fg[GTK_STATE_ACTIVE] = red;
10037 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10038 rc_style->xthickness = 5;
10039 rc_style->ythickness = 5;
10041 gtk_widget_modify_style (button, rc_style);
10042 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
10044 g_object_unref (rc_style);
10046 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10049 if (!gtk_widget_get_visible (window))
10050 gtk_widget_show_all (window);
10052 gtk_widget_destroy (window);
10056 * Main Window and Exit
10060 do_exit (GtkWidget *widget, GtkWidget *window)
10062 gtk_widget_destroy (window);
10068 void (*func) (GtkWidget *widget);
10069 gboolean do_not_benchmark;
10072 { "alpha window", create_alpha_window },
10073 { "big windows", create_big_windows },
10074 { "button box", create_button_box },
10075 { "buttons", create_buttons },
10076 { "check buttons", create_check_buttons },
10077 { "color selection", create_color_selection },
10078 { "composited window", create_composited_window },
10079 { "cursors", create_cursors },
10080 { "dialog", create_dialog },
10081 { "display & screen", create_display_screen, TRUE },
10082 { "entry", create_entry },
10083 { "event box", create_event_box },
10084 { "event watcher", create_event_watcher },
10085 { "expander", create_expander },
10086 { "flipping", create_flipping },
10087 { "focus", create_focus },
10088 { "font selection", create_font_selection },
10089 { "gridded geometry", create_gridded_geometry },
10090 { "handle box", create_handle_box },
10091 { "image", create_image },
10092 { "key lookup", create_key_lookup },
10093 { "labels", create_labels },
10094 { "layout", create_layout },
10095 { "menus", create_menus },
10096 { "message dialog", create_message_dialog },
10097 { "modal window", create_modal_window, TRUE },
10098 { "notebook", create_notebook },
10099 { "panes", create_panes },
10100 { "paned keyboard", create_paned_keyboard_navigation },
10101 { "pixbuf", create_pixbuf },
10102 { "progress bar", create_progress_bar },
10103 { "properties", create_properties },
10104 { "radio buttons", create_radio_buttons },
10105 { "range controls", create_range_controls },
10106 { "rc file", create_rc_file },
10107 { "reparent", create_reparent },
10108 { "resize grips", create_resize_grips },
10109 { "rotated label", create_rotated_label },
10110 { "rotated text", create_rotated_text },
10111 { "rulers", create_rulers },
10112 { "saved position", create_saved_position },
10113 { "scrolled windows", create_scrolled_windows },
10114 { "shapes", create_shapes },
10115 { "size groups", create_size_groups },
10116 { "spinbutton", create_spins },
10117 { "statusbar", create_statusbar },
10118 { "styles", create_styles },
10119 { "test idle", create_idle_test },
10120 { "test mainloop", create_mainloop, TRUE },
10121 { "test scrolling", create_scroll_test },
10122 { "test selection", create_selection_test },
10123 { "test timeout", create_timeout_test },
10124 { "toggle buttons", create_toggle_buttons },
10125 { "toolbar", create_toolbar },
10126 { "tooltips", create_tooltips },
10127 { "WM hints", create_wmhints },
10128 { "window sizing", create_window_sizing },
10129 { "window states", create_window_states }
10131 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10134 create_main_window (void)
10139 GtkWidget *scrolled_window;
10143 GtkWidget *separator;
10144 GdkGeometry geometry;
10147 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10148 gtk_widget_set_name (window, "main window");
10149 gtk_window_move (GTK_WINDOW (window), 50, 20);
10150 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10152 geometry.min_width = -1;
10153 geometry.min_height = -1;
10154 geometry.max_width = -1;
10155 geometry.max_height = G_MAXSHORT;
10156 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10158 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10160 g_signal_connect (window, "destroy",
10161 G_CALLBACK (gtk_main_quit),
10163 g_signal_connect (window, "delete-event",
10164 G_CALLBACK (gtk_false),
10167 box1 = gtk_vbox_new (FALSE, 0);
10168 gtk_container_add (GTK_CONTAINER (window), box1);
10170 if (gtk_micro_version > 0)
10173 gtk_get_major_version (),
10174 gtk_get_minor_version (),
10175 gtk_get_micro_version ());
10179 gtk_get_major_version (),
10180 gtk_get_minor_version ());
10182 label = gtk_label_new (buffer);
10183 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10184 gtk_widget_set_name (label, "testgtk-version-label");
10186 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10187 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10188 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10190 GTK_POLICY_AUTOMATIC);
10191 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10193 box2 = gtk_vbox_new (FALSE, 0);
10194 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10195 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10196 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10197 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10198 gtk_widget_show (box2);
10200 for (i = 0; i < nbuttons; i++)
10202 button = gtk_button_new_with_label (buttons[i].label);
10203 if (buttons[i].func)
10204 g_signal_connect (button,
10206 G_CALLBACK(buttons[i].func),
10209 gtk_widget_set_sensitive (button, FALSE);
10210 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10213 separator = gtk_hseparator_new ();
10214 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10216 box2 = gtk_vbox_new (FALSE, 10);
10217 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10218 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10220 button = gtk_button_new_with_mnemonic ("_Close");
10221 g_signal_connect (button, "clicked",
10222 G_CALLBACK (do_exit),
10224 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10225 gtk_widget_set_can_default (button, TRUE);
10226 gtk_widget_grab_default (button);
10228 gtk_widget_show_all (window);
10234 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10235 G_FILE_TEST_EXISTS))
10237 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10238 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10243 pad (const char *str, int to)
10245 static char buf[256];
10246 int len = strlen (str);
10249 for (i = 0; i < to; i++)
10254 memcpy (buf, str, len);
10260 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10262 fn (widget); /* on */
10263 while (g_main_context_iteration (NULL, FALSE));
10264 fn (widget); /* off */
10265 while (g_main_context_iteration (NULL, FALSE));
10269 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10275 static gboolean printed_headers = FALSE;
10277 if (!printed_headers) {
10278 g_print ("Test Iters First Other\n");
10279 g_print ("-------------------- ----- ---------- ----------\n");
10280 printed_headers = TRUE;
10283 g_get_current_time (&tv0);
10284 bench_iteration (widget, fn);
10285 g_get_current_time (&tv1);
10287 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10288 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10290 g_get_current_time (&tv0);
10291 for (n = 0; n < num - 1; n++)
10292 bench_iteration (widget, fn);
10293 g_get_current_time (&tv1);
10294 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10295 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10297 g_print ("%s %5d ", pad (name, 20), num);
10299 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10301 g_print ("%10.1f\n", dt_first);
10305 do_bench (char* what, int num)
10309 void (* fn) (GtkWidget *widget);
10311 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10313 if (g_ascii_strcasecmp (what, "ALL") == 0)
10315 for (i = 0; i < nbuttons; i++)
10317 if (!buttons[i].do_not_benchmark)
10318 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10325 for (i = 0; i < nbuttons; i++)
10327 if (strcmp (buttons[i].label, what) == 0)
10329 fn = buttons[i].func;
10335 g_print ("Can't bench: \"%s\" not found.\n", what);
10337 do_real_bench (widget, fn, buttons[i].label, num);
10344 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10349 main (int argc, char *argv[])
10351 GtkBindingSet *binding_set;
10353 gboolean done_benchmarks = FALSE;
10355 srand (time (NULL));
10359 /* Check to see if we are being run from the correct
10362 if (file_exists ("testgtkrc"))
10363 gtk_rc_add_default_file ("testgtkrc");
10364 else if (file_exists ("tests/testgtkrc"))
10365 gtk_rc_add_default_file ("tests/testgtkrc");
10367 g_warning ("Couldn't find file \"testgtkrc\".");
10369 g_set_application_name ("GTK+ Test Program");
10371 gtk_init (&argc, &argv);
10373 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10382 for (i = 1; i < argc; i++)
10384 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10391 nextarg = strchr (argv[i], '=');
10402 count = strchr (nextarg, ':');
10405 what = g_strndup (nextarg, count - nextarg);
10407 num = atoi (count);
10412 what = g_strdup (nextarg);
10414 do_bench (what, num ? num : 1);
10415 done_benchmarks = TRUE;
10420 if (done_benchmarks)
10425 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10426 gtk_binding_entry_add_signal (binding_set,
10427 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10430 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10432 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
10436 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
10437 " fg[NORMAL] = \"#ff0000\"\n"
10438 " font = \"Sans 18\"\n"
10440 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
10442 create_main_window ();
10448 while (g_main_context_pending (NULL))
10449 g_main_context_iteration (NULL, FALSE);
10452 while (g_main_context_pending (NULL))
10453 g_main_context_iteration (NULL, FALSE);