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"
52 #include "circles.xbm"
56 file_exists (const char *filename)
60 return stat (filename, &statbuf) == 0;
64 shape_create_icon (GdkScreen *screen,
73 build_option_menu (gchar *items[],
76 void (*func) (GtkWidget *widget, gpointer data),
79 /* macro, structure and variables used by tree window demos */
80 #define DEFAULT_NUMBER_OF_ITEM 3
81 #define DEFAULT_RECURSION_LEVEL 3
84 GSList* selection_mode_group;
85 GtkWidget* single_button;
86 GtkWidget* browse_button;
87 GtkWidget* multiple_button;
88 GtkWidget* draw_line_button;
89 GtkWidget* view_line_button;
90 GtkWidget* no_root_item_button;
91 GtkWidget* nb_item_spinner;
92 GtkWidget* recursion_spinner;
93 } sTreeSampleSelection;
95 typedef struct sTreeButtons {
97 GtkWidget* add_button;
98 GtkWidget* remove_button;
99 GtkWidget* subtree_button;
101 /* end of tree section */
104 build_option_menu (gchar *items[],
107 void (*func)(GtkWidget *widget, gpointer data),
113 omenu = gtk_combo_box_new_text ();
114 g_signal_connect (omenu, "changed",
115 G_CALLBACK (func), data);
117 for (i = 0; i < num_items; i++)
118 gtk_combo_box_append_text (GTK_COMBO_BOX (omenu), items[i]);
120 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
126 * Windows with an alpha channel
131 on_alpha_window_expose (GtkWidget *widget,
132 GdkEventExpose *expose)
134 GtkAllocation allocation;
136 cairo_pattern_t *pattern;
139 cr = gdk_cairo_create (gtk_widget_get_window (widget));
141 gtk_widget_get_allocation (widget, &allocation);
143 radius = MIN (allocation.width, allocation.height) / 2;
144 pattern = cairo_pattern_create_radial (allocation.width / 2,
145 allocation.height / 2,
147 allocation.width / 2,
148 allocation.height / 2,
151 if (gdk_screen_get_rgba_colormap (gtk_widget_get_screen (widget)) &&
152 gtk_widget_is_composited (widget))
153 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
155 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
157 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
160 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
161 1.0, 0.75, 0.0, 1.0); /* solid orange */
162 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
163 1.0, 0.75, 0.0, 0.0); /* transparent orange */
165 cairo_set_source (cr, pattern);
166 cairo_pattern_destroy (pattern);
168 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
177 build_alpha_widgets (void)
180 GtkWidget *radio_button;
185 table = gtk_table_new (1, 1, FALSE);
187 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
188 gtk_table_attach (GTK_TABLE (table),
191 GTK_EXPAND | GTK_FILL, 0,
194 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
195 gtk_table_attach (GTK_TABLE (table),
198 GTK_EXPAND | GTK_FILL, 0,
201 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
202 gtk_table_attach (GTK_TABLE (table),
205 GTK_EXPAND | GTK_FILL, 0,
208 gtk_table_attach (GTK_TABLE (table),
209 gtk_check_button_new_with_label ("Sedentary"),
211 GTK_EXPAND | GTK_FILL, 0,
213 gtk_table_attach (GTK_TABLE (table),
214 gtk_check_button_new_with_label ("Nocturnal"),
216 GTK_EXPAND | GTK_FILL, 0,
218 gtk_table_attach (GTK_TABLE (table),
219 gtk_check_button_new_with_label ("Compulsive"),
221 GTK_EXPAND | GTK_FILL, 0,
224 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
225 gtk_table_attach (GTK_TABLE (table),
228 GTK_EXPAND | GTK_FILL, 0,
231 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
232 gtk_table_attach (GTK_TABLE (table),
235 GTK_EXPAND | GTK_FILL, 0,
238 hbox = gtk_hbox_new (FALSE, 0);
239 label = gtk_label_new (NULL);
240 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
241 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
242 entry = gtk_entry_new ();
243 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
244 gtk_table_attach (GTK_TABLE (table),
247 GTK_EXPAND | GTK_FILL, 0,
254 on_alpha_screen_changed (GtkWidget *widget,
255 GdkScreen *old_screen,
258 GdkScreen *screen = gtk_widget_get_screen (widget);
259 GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
263 colormap = gdk_screen_get_default_colormap (screen);
264 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
268 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
271 gtk_widget_set_colormap (widget, colormap);
275 on_composited_changed (GtkWidget *window,
278 gboolean is_composited = gtk_widget_is_composited (window);
281 gtk_label_set_text (label, "Composited");
283 gtk_label_set_text (label, "Not composited");
287 create_alpha_window (GtkWidget *widget)
289 static GtkWidget *window;
293 GtkWidget *content_area;
297 window = gtk_dialog_new_with_buttons ("Alpha Window",
298 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
302 gtk_widget_set_app_paintable (window, TRUE);
303 g_signal_connect (window, "expose-event",
304 G_CALLBACK (on_alpha_window_expose), NULL);
306 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
308 vbox = gtk_vbox_new (FALSE, 8);
309 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
310 gtk_box_pack_start (GTK_BOX (content_area), vbox,
313 label = gtk_label_new (NULL);
314 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
315 on_alpha_screen_changed (window, NULL, label);
316 g_signal_connect (window, "screen-changed",
317 G_CALLBACK (on_alpha_screen_changed), label);
319 label = gtk_label_new (NULL);
320 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
321 on_composited_changed (window, GTK_LABEL (label));
322 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
324 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
326 g_signal_connect (window, "destroy",
327 G_CALLBACK (gtk_widget_destroyed),
330 g_signal_connect (window, "response",
331 G_CALLBACK (gtk_widget_destroy),
335 if (!gtk_widget_get_visible (window))
336 gtk_widget_show_all (window);
338 gtk_widget_destroy (window);
342 * Composited non-toplevel window
345 /* The expose event handler for the event box.
347 * This function simply draws a transparency onto a widget on the area
348 * for which it receives expose events. This is intended to give the
349 * event box a "transparent" background.
351 * In order for this to work properly, the widget must have an RGBA
352 * colourmap. The widget should also be set as app-paintable since it
353 * doesn't make sense for GTK to draw a background if we are drawing it
354 * (and because GTK might actually replace our transparency with its
355 * default background colour).
358 transparent_expose (GtkWidget *widget,
359 GdkEventExpose *event)
363 cr = gdk_cairo_create (gtk_widget_get_window (widget));
364 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
365 gdk_cairo_region (cr, event->region);
372 /* The expose event handler for the window.
374 * This function performs the actual compositing of the event box onto
375 * the already-existing background of the window at 50% normal opacity.
377 * In this case we do not want app-paintable to be set on the widget
378 * since we want it to draw its own (red) background. Because of this,
379 * however, we must ensure that we use g_signal_register_after so that
380 * this handler is called after the red has been drawn. If it was
381 * called before then GTK would just blindly paint over our work.
384 window_expose_event (GtkWidget *widget,
385 GdkEventExpose *event)
387 GtkAllocation allocation;
388 cairo_region_t *region;
392 /* get our child (in this case, the event box) */
393 child = gtk_bin_get_child (GTK_BIN (widget));
395 /* create a cairo context to draw to the window */
396 cr = gdk_cairo_create (gtk_widget_get_window (widget));
398 gtk_widget_get_allocation (child, &allocation);
400 /* the source data is the (composited) event box */
401 gdk_cairo_set_source_pixmap (cr, gtk_widget_get_window (child),
405 /* draw no more than our expose event intersects our child */
406 region = cairo_region_create_rectangle (&allocation);
407 cairo_region_intersect (region, event->region);
408 gdk_cairo_region (cr, region);
411 /* composite, with a 50% opacity */
412 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
413 cairo_paint_with_alpha (cr, 0.5);
422 create_composited_window (GtkWidget *widget)
424 static GtkWidget *window;
428 GtkWidget *event, *button;
433 /* make the widgets */
434 button = gtk_button_new_with_label ("A Button");
435 event = gtk_event_box_new ();
436 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
438 g_signal_connect (window, "destroy",
439 G_CALLBACK (gtk_widget_destroyed),
442 /* put a red background on the window */
443 gdk_color_parse ("red", &red);
444 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
446 /* set the colourmap for the event box.
447 * must be done before the event box is realised.
449 screen = gtk_widget_get_screen (event);
450 rgba = gdk_screen_get_rgba_colormap (screen);
451 gtk_widget_set_colormap (event, rgba);
453 /* set our event box to have a fully-transparent background
454 * drawn on it. currently there is no way to simply tell gtk
455 * that "transparency" is the background colour for a widget.
457 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
458 g_signal_connect (event, "expose-event",
459 G_CALLBACK (transparent_expose), NULL);
461 /* put them inside one another */
462 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
463 gtk_container_add (GTK_CONTAINER (window), event);
464 gtk_container_add (GTK_CONTAINER (event), button);
466 /* realise and show everything */
467 gtk_widget_realize (button);
469 /* set the event box GdkWindow to be composited.
470 * obviously must be performed after event box is realised.
472 gdk_window_set_composited (gtk_widget_get_window (event),
475 /* set up the compositing handler.
476 * note that we do _after so that the normal (red) background is drawn
477 * by gtk before our compositing occurs.
479 g_signal_connect_after (window, "expose-event",
480 G_CALLBACK (window_expose_event), NULL);
483 if (!gtk_widget_get_visible (window))
484 gtk_widget_show_all (window);
486 gtk_widget_destroy (window);
490 * Big windows and guffaw scrolling
494 pattern_expose (GtkWidget *widget,
495 GdkEventExpose *event,
499 GdkWindow *window = event->window;
501 color = g_object_get_data (G_OBJECT (window), "pattern-color");
504 cairo_t *cr = gdk_cairo_create (window);
506 gdk_cairo_set_source_color (cr, color);
507 gdk_cairo_rectangle (cr, &event->area);
517 pattern_set_bg (GtkWidget *widget,
521 static const GdkColor colors[] = {
522 { 0, 0x4444, 0x4444, 0xffff },
523 { 0, 0x8888, 0x8888, 0xffff },
524 { 0, 0xaaaa, 0xaaaa, 0xffff }
527 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
528 gdk_window_set_user_data (child, widget);
532 create_pattern (GtkWidget *widget,
543 while (2 * h <= height)
548 while (2 * w <= width)
550 if ((i + j) % 2 == 0)
555 GdkWindowAttr attributes;
557 attributes.window_type = GDK_WINDOW_CHILD;
560 attributes.width = w;
561 attributes.height = h;
562 attributes.wclass = GDK_INPUT_OUTPUT;
563 attributes.event_mask = GDK_EXPOSURE_MASK;
564 attributes.visual = gtk_widget_get_visual (widget);
565 attributes.colormap = gtk_widget_get_colormap (widget);
567 child = gdk_window_new (parent, &attributes,
568 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
570 pattern_set_bg (widget, child, level);
573 create_pattern (widget, child, level + 1, w, h);
575 gdk_window_show (child);
585 #define PATTERN_SIZE (1 << 18)
588 pattern_hadj_changed (GtkAdjustment *adj,
591 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
592 gint new_value = adj->value;
594 if (gtk_widget_get_realized (darea))
596 gdk_window_scroll (gtk_widget_get_window (darea),
597 *old_value - new_value, 0);
598 *old_value = new_value;
603 pattern_vadj_changed (GtkAdjustment *adj,
606 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
607 gint new_value = adj->value;
609 if (gtk_widget_get_realized (darea))
611 gdk_window_scroll (gtk_widget_get_window (darea),
612 0, *old_value - new_value);
613 *old_value = new_value;
618 pattern_realize (GtkWidget *widget,
623 window = gtk_widget_get_window (widget);
624 pattern_set_bg (widget, window, 0);
625 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
629 create_big_windows (GtkWidget *widget)
631 static GtkWidget *window = NULL;
632 GtkWidget *content_area;
633 GtkWidget *darea, *table, *scrollbar;
637 static gint current_x;
638 static gint current_y;
645 window = gtk_dialog_new_with_buttons ("Big Windows",
651 gtk_window_set_screen (GTK_WINDOW (window),
652 gtk_widget_get_screen (widget));
654 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
656 g_signal_connect (window, "destroy",
657 G_CALLBACK (gtk_widget_destroyed),
660 g_signal_connect (window, "response",
661 G_CALLBACK (gtk_widget_destroy),
664 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
666 table = gtk_table_new (2, 2, FALSE);
667 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
669 darea = gtk_drawing_area_new ();
671 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
672 g_signal_connect (hadj, "value_changed",
673 G_CALLBACK (pattern_hadj_changed), darea);
674 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
676 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
677 g_signal_connect (vadj, "value_changed",
678 G_CALLBACK (pattern_vadj_changed), darea);
679 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
681 g_signal_connect (darea, "realize",
682 G_CALLBACK (pattern_realize),
684 g_signal_connect (darea, "expose_event",
685 G_CALLBACK (pattern_expose),
688 eventbox = gtk_event_box_new ();
689 gtk_table_attach (GTK_TABLE (table), eventbox,
691 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
694 gtk_container_add (GTK_CONTAINER (eventbox), darea);
696 scrollbar = gtk_hscrollbar_new (hadj);
697 gtk_table_attach (GTK_TABLE (table), scrollbar,
699 GTK_FILL | GTK_EXPAND, GTK_FILL,
702 scrollbar = gtk_vscrollbar_new (vadj);
703 gtk_table_attach (GTK_TABLE (table), scrollbar,
705 GTK_FILL, GTK_EXPAND | GTK_FILL,
710 if (!gtk_widget_get_visible (window))
711 gtk_widget_show_all (window);
713 gtk_widget_hide (window);
721 button_window (GtkWidget *widget,
724 if (!gtk_widget_get_visible (button))
725 gtk_widget_show (button);
727 gtk_widget_hide (button);
731 create_buttons (GtkWidget *widget)
733 static GtkWidget *window = NULL;
737 GtkWidget *button[10];
738 GtkWidget *separator;
742 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
743 gtk_window_set_screen (GTK_WINDOW (window),
744 gtk_widget_get_screen (widget));
746 g_signal_connect (window, "destroy",
747 G_CALLBACK (gtk_widget_destroyed),
750 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
751 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
753 box1 = gtk_vbox_new (FALSE, 0);
754 gtk_container_add (GTK_CONTAINER (window), box1);
756 table = gtk_table_new (3, 3, FALSE);
757 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
758 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
759 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
760 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
762 button[0] = gtk_button_new_with_label ("button1");
763 button[1] = gtk_button_new_with_mnemonic ("_button2");
764 button[2] = gtk_button_new_with_mnemonic ("_button3");
765 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
766 button[4] = gtk_button_new_with_label ("button5");
767 button[5] = gtk_button_new_with_label ("button6");
768 button[6] = gtk_button_new_with_label ("button7");
769 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
770 button[8] = gtk_button_new_with_label ("button9");
772 g_signal_connect (button[0], "clicked",
773 G_CALLBACK (button_window),
776 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
777 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
779 g_signal_connect (button[1], "clicked",
780 G_CALLBACK (button_window),
783 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
784 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
786 g_signal_connect (button[2], "clicked",
787 G_CALLBACK (button_window),
789 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
790 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
792 g_signal_connect (button[3], "clicked",
793 G_CALLBACK (button_window),
795 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
796 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
798 g_signal_connect (button[4], "clicked",
799 G_CALLBACK (button_window),
801 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
802 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
804 g_signal_connect (button[5], "clicked",
805 G_CALLBACK (button_window),
807 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
808 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
810 g_signal_connect (button[6], "clicked",
811 G_CALLBACK (button_window),
813 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
814 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
816 g_signal_connect (button[7], "clicked",
817 G_CALLBACK (button_window),
819 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
820 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
822 g_signal_connect (button[8], "clicked",
823 G_CALLBACK (button_window),
825 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
826 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
828 separator = gtk_hseparator_new ();
829 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
831 box2 = gtk_vbox_new (FALSE, 10);
832 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
833 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
835 button[9] = gtk_button_new_with_label ("close");
836 g_signal_connect_swapped (button[9], "clicked",
837 G_CALLBACK (gtk_widget_destroy),
839 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
840 gtk_widget_set_can_default (button[9], TRUE);
841 gtk_widget_grab_default (button[9]);
844 if (!gtk_widget_get_visible (window))
845 gtk_widget_show_all (window);
847 gtk_widget_destroy (window);
855 create_toggle_buttons (GtkWidget *widget)
857 static GtkWidget *window = NULL;
861 GtkWidget *separator;
865 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
866 gtk_window_set_screen (GTK_WINDOW (window),
867 gtk_widget_get_screen (widget));
869 g_signal_connect (window, "destroy",
870 G_CALLBACK (gtk_widget_destroyed),
873 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
874 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
876 box1 = gtk_vbox_new (FALSE, 0);
877 gtk_container_add (GTK_CONTAINER (window), box1);
879 box2 = gtk_vbox_new (FALSE, 10);
880 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
881 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
883 button = gtk_toggle_button_new_with_label ("button1");
884 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
886 button = gtk_toggle_button_new_with_label ("button2");
887 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
889 button = gtk_toggle_button_new_with_label ("button3");
890 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
892 button = gtk_toggle_button_new_with_label ("inconsistent");
893 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
894 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
896 separator = gtk_hseparator_new ();
897 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
899 box2 = gtk_vbox_new (FALSE, 10);
900 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
901 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
903 button = gtk_button_new_with_label ("close");
904 g_signal_connect_swapped (button, "clicked",
905 G_CALLBACK (gtk_widget_destroy),
907 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
908 gtk_widget_set_can_default (button, TRUE);
909 gtk_widget_grab_default (button);
912 if (!gtk_widget_get_visible (window))
913 gtk_widget_show_all (window);
915 gtk_widget_destroy (window);
919 create_widget_grid (GType widget_type)
922 GtkWidget *group_widget = NULL;
925 table = gtk_table_new (FALSE, 3, 3);
927 for (i = 0; i < 5; i++)
929 for (j = 0; j < 5; j++)
934 if (i == 0 && j == 0)
940 tmp = g_strdup_printf ("%d", j);
941 widget = gtk_label_new (tmp);
946 tmp = g_strdup_printf ("%c", 'A' + i - 1);
947 widget = gtk_label_new (tmp);
952 widget = g_object_new (widget_type, NULL);
954 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
957 group_widget = widget;
959 g_object_set (widget, "group", group_widget, NULL);
964 gtk_table_attach (GTK_TABLE (table), widget,
979 create_check_buttons (GtkWidget *widget)
981 static GtkWidget *window = NULL;
985 GtkWidget *separator;
990 window = gtk_dialog_new_with_buttons ("Check Buttons",
996 gtk_window_set_screen (GTK_WINDOW (window),
997 gtk_widget_get_screen (widget));
999 g_signal_connect (window, "destroy",
1000 G_CALLBACK (gtk_widget_destroyed),
1002 g_signal_connect (window, "response",
1003 G_CALLBACK (gtk_widget_destroy),
1006 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1008 box2 = gtk_vbox_new (FALSE, 10);
1009 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1010 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1012 button = gtk_check_button_new_with_mnemonic ("_button1");
1013 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1015 button = gtk_check_button_new_with_label ("button2");
1016 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1018 button = gtk_check_button_new_with_label ("button3");
1019 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1021 button = gtk_check_button_new_with_label ("inconsistent");
1022 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1023 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1025 separator = gtk_hseparator_new ();
1026 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1028 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
1029 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1030 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1033 if (!gtk_widget_get_visible (window))
1034 gtk_widget_show_all (window);
1036 gtk_widget_destroy (window);
1044 create_radio_buttons (GtkWidget *widget)
1046 static GtkWidget *window = NULL;
1050 GtkWidget *separator;
1055 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1061 gtk_window_set_screen (GTK_WINDOW (window),
1062 gtk_widget_get_screen (widget));
1064 g_signal_connect (window, "destroy",
1065 G_CALLBACK (gtk_widget_destroyed),
1067 g_signal_connect (window, "response",
1068 G_CALLBACK (gtk_widget_destroy),
1071 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1073 box2 = gtk_vbox_new (FALSE, 10);
1074 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1075 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1077 button = gtk_radio_button_new_with_label (NULL, "button1");
1078 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1080 button = gtk_radio_button_new_with_label (
1081 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1083 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1084 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1086 button = gtk_radio_button_new_with_label (
1087 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1089 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1091 button = gtk_radio_button_new_with_label (
1092 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1094 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1095 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1097 separator = gtk_hseparator_new ();
1098 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1100 box2 = gtk_vbox_new (FALSE, 10);
1101 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1102 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1104 button = gtk_radio_button_new_with_label (NULL, "button4");
1105 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1106 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1108 button = gtk_radio_button_new_with_label (
1109 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1111 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1112 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1113 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1115 button = gtk_radio_button_new_with_label (
1116 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1118 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1119 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1121 separator = gtk_hseparator_new ();
1122 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1124 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1125 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1126 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1129 if (!gtk_widget_get_visible (window))
1130 gtk_widget_show_all (window);
1132 gtk_widget_destroy (window);
1140 create_bbox (gint horizontal,
1151 frame = gtk_frame_new (title);
1154 bbox = gtk_hbutton_box_new ();
1156 bbox = gtk_vbutton_box_new ();
1158 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1159 gtk_container_add (GTK_CONTAINER (frame), bbox);
1161 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1162 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1164 button = gtk_button_new_with_label ("OK");
1165 gtk_container_add (GTK_CONTAINER (bbox), button);
1167 button = gtk_button_new_with_label ("Cancel");
1168 gtk_container_add (GTK_CONTAINER (bbox), button);
1170 button = gtk_button_new_with_label ("Help");
1171 gtk_container_add (GTK_CONTAINER (bbox), button);
1177 create_button_box (GtkWidget *widget)
1179 static GtkWidget* window = NULL;
1180 GtkWidget *main_vbox;
1183 GtkWidget *frame_horz;
1184 GtkWidget *frame_vert;
1188 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1189 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1190 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1192 g_signal_connect (window, "destroy",
1193 G_CALLBACK (gtk_widget_destroyed),
1196 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1198 main_vbox = gtk_vbox_new (FALSE, 0);
1199 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1201 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1202 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1204 vbox = gtk_vbox_new (FALSE, 0);
1205 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1206 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1208 gtk_box_pack_start (GTK_BOX (vbox),
1209 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1212 gtk_box_pack_start (GTK_BOX (vbox),
1213 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1216 gtk_box_pack_start (GTK_BOX (vbox),
1217 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1220 gtk_box_pack_start (GTK_BOX (vbox),
1221 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1224 gtk_box_pack_start (GTK_BOX (vbox),
1225 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1228 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1229 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1231 hbox = gtk_hbox_new (FALSE, 0);
1232 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1233 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1235 gtk_box_pack_start (GTK_BOX (hbox),
1236 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1239 gtk_box_pack_start (GTK_BOX (hbox),
1240 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1243 gtk_box_pack_start (GTK_BOX (hbox),
1244 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1247 gtk_box_pack_start (GTK_BOX (hbox),
1248 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1251 gtk_box_pack_start (GTK_BOX (hbox),
1252 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1256 if (!gtk_widget_get_visible (window))
1257 gtk_widget_show_all (window);
1259 gtk_widget_destroy (window);
1267 new_pixbuf (char *filename,
1269 GdkColor *background)
1274 if (strcmp (filename, "test.xpm") == 0)
1277 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1280 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1282 widget = gtk_image_new_from_pixbuf (pixbuf);
1284 g_object_unref (pixbuf);
1291 set_toolbar_small_stock (GtkWidget *widget,
1294 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1298 set_toolbar_large_stock (GtkWidget *widget,
1301 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1305 set_toolbar_horizontal (GtkWidget *widget,
1308 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1312 set_toolbar_vertical (GtkWidget *widget,
1315 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1319 set_toolbar_icons (GtkWidget *widget,
1322 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1326 set_toolbar_text (GtkWidget *widget,
1329 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1333 set_toolbar_both (GtkWidget *widget,
1336 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1340 set_toolbar_both_horiz (GtkWidget *widget,
1343 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1347 set_toolbar_enable (GtkWidget *widget,
1350 GtkSettings *settings = gtk_widget_get_settings (widget);
1351 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1355 set_toolbar_disable (GtkWidget *widget,
1358 GtkSettings *settings = gtk_widget_get_settings (widget);
1359 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1362 static GtkActionEntry create_toolbar_items[] = {
1363 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1364 G_CALLBACK (set_toolbar_small_stock) },
1365 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1366 G_CALLBACK (set_toolbar_large_stock) },
1367 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1368 G_CALLBACK (set_toolbar_horizontal) },
1369 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1370 G_CALLBACK (set_toolbar_vertical) },
1372 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1373 G_CALLBACK (set_toolbar_icons) },
1374 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1375 G_CALLBACK (set_toolbar_text) },
1376 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1377 G_CALLBACK (set_toolbar_both) },
1378 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1379 G_CALLBACK (set_toolbar_both_horiz) },
1381 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1385 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1386 G_CALLBACK (set_toolbar_enable) },
1387 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1388 G_CALLBACK (set_toolbar_disable) },
1390 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1392 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1395 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1397 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1402 create_toolbar (GtkWidget *widget)
1404 static GtkWidget *window = NULL;
1411 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1412 gtk_window_set_screen (GTK_WINDOW (window),
1413 gtk_widget_get_screen (widget));
1415 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1417 g_signal_connect (window, "destroy",
1418 G_CALLBACK (gtk_widget_destroyed),
1421 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1422 gtk_widget_realize (window);
1424 toolbar = gtk_toolbar_new ();
1425 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1427 GtkToolItem *toolitem;
1429 if (create_toolbar_items[i].tooltip == NULL)
1430 toolitem = gtk_separator_tool_item_new ();
1431 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1435 toolitem = gtk_tool_item_new ();
1436 entry = gtk_entry_new ();
1437 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1439 else if (create_toolbar_items[i].stock_id)
1440 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1445 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window),
1446 >k_widget_get_style (window)->bg[GTK_STATE_NORMAL]);
1447 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1449 if (create_toolbar_items[i].callback)
1450 g_signal_connect (toolitem, "clicked",
1451 create_toolbar_items[i].callback, toolbar);
1452 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1453 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1456 gtk_container_add (GTK_CONTAINER (window), toolbar);
1458 gtk_widget_set_size_request (toolbar, 200, -1);
1461 if (!gtk_widget_get_visible (window))
1462 gtk_widget_show_all (window);
1464 gtk_widget_destroy (window);
1467 static GtkActionEntry make_toolbar_items[] = {
1468 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1469 G_CALLBACK (set_toolbar_horizontal) },
1470 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1471 G_CALLBACK (set_toolbar_vertical) },
1473 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1474 G_CALLBACK (set_toolbar_icons) },
1475 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1476 G_CALLBACK (set_toolbar_text) },
1477 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1478 G_CALLBACK (set_toolbar_both) },
1480 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1482 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1485 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1486 G_CALLBACK (set_toolbar_enable) },
1487 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1488 G_CALLBACK (set_toolbar_disable) },
1490 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1492 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1497 make_toolbar (GtkWidget *window)
1502 if (!gtk_widget_get_realized (window))
1503 gtk_widget_realize (window);
1505 toolbar = gtk_toolbar_new ();
1506 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1509 GtkToolItem *toolitem;
1511 if (make_toolbar_items[i].label == NULL)
1513 toolitem = gtk_separator_tool_item_new ();
1516 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window),
1517 >k_widget_get_style (window)->bg[GTK_STATE_NORMAL]);
1518 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1519 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1520 if (make_toolbar_items[i].callback != NULL)
1521 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1522 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1532 static guint statusbar_counter = 1;
1535 statusbar_push (GtkWidget *button,
1536 GtkStatusbar *statusbar)
1540 sprintf (text, "something %d", statusbar_counter++);
1542 gtk_statusbar_push (statusbar, 1, text);
1546 statusbar_push_long (GtkWidget *button,
1547 GtkStatusbar *statusbar)
1551 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\").");
1553 gtk_statusbar_push (statusbar, 1, text);
1557 statusbar_pop (GtkWidget *button,
1558 GtkStatusbar *statusbar)
1560 gtk_statusbar_pop (statusbar, 1);
1564 statusbar_steal (GtkWidget *button,
1565 GtkStatusbar *statusbar)
1567 gtk_statusbar_remove (statusbar, 1, 4);
1571 statusbar_popped (GtkStatusbar *statusbar,
1576 statusbar_counter = 1;
1580 statusbar_contexts (GtkStatusbar *statusbar)
1584 string = "any context";
1585 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1587 gtk_statusbar_get_context_id (statusbar, string));
1589 string = "idle messages";
1590 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1592 gtk_statusbar_get_context_id (statusbar, string));
1594 string = "some text";
1595 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1597 gtk_statusbar_get_context_id (statusbar, string));
1599 string = "hit the mouse";
1600 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1602 gtk_statusbar_get_context_id (statusbar, string));
1604 string = "hit the mouse2";
1605 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1607 gtk_statusbar_get_context_id (statusbar, string));
1611 create_statusbar (GtkWidget *widget)
1613 static GtkWidget *window = NULL;
1617 GtkWidget *separator;
1618 GtkWidget *statusbar;
1622 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1623 gtk_window_set_screen (GTK_WINDOW (window),
1624 gtk_widget_get_screen (widget));
1626 g_signal_connect (window, "destroy",
1627 G_CALLBACK (gtk_widget_destroyed),
1630 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1631 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1633 box1 = gtk_vbox_new (FALSE, 0);
1634 gtk_container_add (GTK_CONTAINER (window), box1);
1636 box2 = gtk_vbox_new (FALSE, 10);
1637 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1638 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1640 statusbar = gtk_statusbar_new ();
1641 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1642 g_signal_connect (statusbar,
1644 G_CALLBACK (statusbar_popped),
1647 button = g_object_new (gtk_button_get_type (),
1648 "label", "push something",
1652 g_object_connect (button,
1653 "signal::clicked", statusbar_push, statusbar,
1656 button = g_object_connect (g_object_new (gtk_button_get_type (),
1661 "signal_after::clicked", statusbar_pop, statusbar,
1664 button = g_object_connect (g_object_new (gtk_button_get_type (),
1665 "label", "steal #4",
1669 "signal_after::clicked", statusbar_steal, statusbar,
1672 button = g_object_connect (g_object_new (gtk_button_get_type (),
1673 "label", "test contexts",
1677 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1680 button = g_object_connect (g_object_new (gtk_button_get_type (),
1681 "label", "push something long",
1685 "signal_after::clicked", statusbar_push_long, statusbar,
1688 separator = gtk_hseparator_new ();
1689 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1691 box2 = gtk_vbox_new (FALSE, 10);
1692 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1693 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1695 button = gtk_button_new_with_label ("close");
1696 g_signal_connect_swapped (button, "clicked",
1697 G_CALLBACK (gtk_widget_destroy),
1699 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1700 gtk_widget_set_can_default (button, TRUE);
1701 gtk_widget_grab_default (button);
1704 if (!gtk_widget_get_visible (window))
1705 gtk_widget_show_all (window);
1707 gtk_widget_destroy (window);
1713 #define GRID_SIZE 20
1714 #define DEFAULT_GEOMETRY "10x10"
1717 gridded_geometry_expose (GtkWidget *widget,
1718 GdkEventExpose *event)
1720 GtkAllocation allocation;
1726 gtk_widget_get_allocation (widget, &allocation);
1727 style = gtk_widget_get_style (widget);
1728 state = gtk_widget_get_state (widget);
1730 cr = gdk_cairo_create (gtk_widget_get_window (widget));
1732 cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
1733 gdk_cairo_set_source_color (cr, &style->base[state]);
1736 for (i = 0 ; i * GRID_SIZE < allocation.width; i++)
1737 for (j = 0 ; j * GRID_SIZE < allocation.height; j++)
1739 if ((i + j) % 2 == 0)
1740 cairo_rectangle (cr, i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1743 gdk_cairo_set_source_color (cr, &style->text[state]);
1752 gridded_geometry_subresponse (GtkDialog *dialog,
1754 gchar *geometry_string)
1756 if (response_id == GTK_RESPONSE_NONE)
1758 gtk_widget_destroy (GTK_WIDGET (dialog));
1762 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1764 g_print ("Can't parse geometry string %s\n", geometry_string);
1765 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1771 gridded_geometry_response (GtkDialog *dialog,
1775 if (response_id == GTK_RESPONSE_NONE)
1777 gtk_widget_destroy (GTK_WIDGET (dialog));
1781 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1782 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1783 GtkWidget *content_area;
1785 GtkWidget *drawing_area;
1787 GdkGeometry geometry;
1789 window = gtk_dialog_new_with_buttons (title,
1792 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1795 gtk_window_set_screen (GTK_WINDOW (window),
1796 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1798 g_signal_connect (window, "response",
1799 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1801 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1803 box = gtk_vbox_new (FALSE, 0);
1804 gtk_box_pack_start (GTK_BOX (content_area), box, TRUE, TRUE, 0);
1806 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1808 drawing_area = gtk_drawing_area_new ();
1809 g_signal_connect (drawing_area, "expose_event",
1810 G_CALLBACK (gridded_geometry_expose), NULL);
1811 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1813 /* Gross hack to work around bug 68668... if we set the size request
1814 * large enough, then the current
1816 * request_of_window - request_of_geometry_widget
1818 * method of getting the base size works more or less works.
1820 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1822 geometry.base_width = 0;
1823 geometry.base_height = 0;
1824 geometry.min_width = 2 * GRID_SIZE;
1825 geometry.min_height = 2 * GRID_SIZE;
1826 geometry.width_inc = GRID_SIZE;
1827 geometry.height_inc = GRID_SIZE;
1829 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1831 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1833 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1835 g_print ("Can't parse geometry string %s\n", geometry_string);
1836 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1839 gtk_widget_show_all (window);
1844 create_gridded_geometry (GtkWidget *widget)
1846 static GtkWidget *window = NULL;
1847 gpointer window_ptr;
1848 GtkWidget *content_area;
1854 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1857 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1860 gtk_window_set_screen (GTK_WINDOW (window),
1861 gtk_widget_get_screen (widget));
1863 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1865 label = gtk_label_new ("Geometry string:");
1866 gtk_box_pack_start (GTK_BOX (content_area), label, FALSE, FALSE, 0);
1868 entry = gtk_entry_new ();
1869 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1870 gtk_box_pack_start (GTK_BOX (content_area), entry, FALSE, FALSE, 0);
1872 g_signal_connect (window, "response",
1873 G_CALLBACK (gridded_geometry_response), entry);
1874 window_ptr = &window;
1875 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
1877 gtk_widget_show_all (window);
1880 gtk_widget_destroy (window);
1888 handle_box_child_signal (GtkHandleBox *hb,
1890 const gchar *action)
1892 printf ("%s: child <%s> %sed\n",
1893 g_type_name (G_OBJECT_TYPE (hb)),
1894 g_type_name (G_OBJECT_TYPE (child)),
1899 create_handle_box (GtkWidget *widget)
1901 static GtkWidget* window = NULL;
1902 GtkWidget *handle_box;
1903 GtkWidget *handle_box2;
1908 GtkWidget *separator;
1912 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1914 gtk_window_set_screen (GTK_WINDOW (window),
1915 gtk_widget_get_screen (widget));
1916 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1917 gtk_window_set_title (GTK_WINDOW (window),
1919 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1921 g_signal_connect (window, "destroy",
1922 G_CALLBACK (gtk_widget_destroyed),
1925 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1927 vbox = gtk_vbox_new (FALSE, 0);
1928 gtk_container_add (GTK_CONTAINER (window), vbox);
1929 gtk_widget_show (vbox);
1931 label = gtk_label_new ("Above");
1932 gtk_container_add (GTK_CONTAINER (vbox), label);
1933 gtk_widget_show (label);
1935 separator = gtk_hseparator_new ();
1936 gtk_container_add (GTK_CONTAINER (vbox), separator);
1937 gtk_widget_show (separator);
1939 hbox = gtk_hbox_new (FALSE, 10);
1940 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1941 gtk_widget_show (hbox);
1943 separator = gtk_hseparator_new ();
1944 gtk_container_add (GTK_CONTAINER (vbox), separator);
1945 gtk_widget_show (separator);
1947 label = gtk_label_new ("Below");
1948 gtk_container_add (GTK_CONTAINER (vbox), label);
1949 gtk_widget_show (label);
1951 handle_box = gtk_handle_box_new ();
1952 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1953 g_signal_connect (handle_box,
1955 G_CALLBACK (handle_box_child_signal),
1957 g_signal_connect (handle_box,
1959 G_CALLBACK (handle_box_child_signal),
1961 gtk_widget_show (handle_box);
1963 toolbar = make_toolbar (window);
1965 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1966 gtk_widget_show (toolbar);
1968 handle_box = gtk_handle_box_new ();
1969 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1970 g_signal_connect (handle_box,
1972 G_CALLBACK (handle_box_child_signal),
1974 g_signal_connect (handle_box,
1976 G_CALLBACK (handle_box_child_signal),
1978 gtk_widget_show (handle_box);
1980 handle_box2 = gtk_handle_box_new ();
1981 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1982 g_signal_connect (handle_box2,
1984 G_CALLBACK (handle_box_child_signal),
1986 g_signal_connect (handle_box2,
1988 G_CALLBACK (handle_box_child_signal),
1990 gtk_widget_show (handle_box2);
1992 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
1993 label = gtk_label_new ("Fooo!");
1994 gtk_container_add (GTK_CONTAINER (hbox), label);
1995 gtk_widget_show (label);
1996 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1999 if (!gtk_widget_get_visible (window))
2000 gtk_widget_show (window);
2002 gtk_widget_destroy (window);
2009 sensitivity_toggled (GtkWidget *toggle,
2012 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2016 create_sensitivity_control (GtkWidget *widget)
2020 button = gtk_toggle_button_new_with_label ("Sensitive");
2022 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2023 gtk_widget_is_sensitive (widget));
2025 g_signal_connect (button,
2027 G_CALLBACK (sensitivity_toggled),
2030 gtk_widget_show_all (button);
2036 set_selectable_recursive (GtkWidget *widget,
2039 if (GTK_IS_CONTAINER (widget))
2044 children = gtk_container_get_children (GTK_CONTAINER (widget));
2048 set_selectable_recursive (tmp->data, setting);
2052 g_list_free (children);
2054 else if (GTK_IS_LABEL (widget))
2056 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2061 selectable_toggled (GtkWidget *toggle,
2064 set_selectable_recursive (widget,
2065 GTK_TOGGLE_BUTTON (toggle)->active);
2069 create_selectable_control (GtkWidget *widget)
2073 button = gtk_toggle_button_new_with_label ("Selectable");
2075 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2078 g_signal_connect (button,
2080 G_CALLBACK (selectable_toggled),
2083 gtk_widget_show_all (button);
2089 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
2093 gtk_widget_destroy (dialog);
2095 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2096 "as hyperlinks, which can be clicked\n"
2097 "or activated via <a href=\"keynav\">keynav</a>.\n"
2098 "The links remain the same.";
2099 gtk_label_set_markup (label, text);
2103 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
2105 if (g_strcmp0 (uri, "keynav") == 0)
2109 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
2110 GTK_DIALOG_DESTROY_WITH_PARENT,
2113 "The term <i>keynav</i> is a shorthand for "
2114 "keyboard navigation and refers to the process of using a program "
2115 "(exclusively) via keyboard input.");
2117 gtk_window_present (GTK_WINDOW (dialog));
2119 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
2127 void create_labels (GtkWidget *widget)
2129 static GtkWidget *window = NULL;
2138 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2140 gtk_window_set_screen (GTK_WINDOW (window),
2141 gtk_widget_get_screen (widget));
2143 g_signal_connect (window, "destroy",
2144 G_CALLBACK (gtk_widget_destroyed),
2147 gtk_window_set_title (GTK_WINDOW (window), "Label");
2149 vbox = gtk_vbox_new (FALSE, 5);
2151 hbox = gtk_hbox_new (FALSE, 5);
2152 gtk_container_add (GTK_CONTAINER (window), vbox);
2154 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2156 button = create_sensitivity_control (hbox);
2158 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2160 button = create_selectable_control (hbox);
2162 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2164 vbox = gtk_vbox_new (FALSE, 5);
2166 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2167 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2169 frame = gtk_frame_new ("Normal Label");
2170 label = gtk_label_new ("This is a Normal label");
2171 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2172 gtk_container_add (GTK_CONTAINER (frame), label);
2173 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2175 frame = gtk_frame_new ("Multi-line Label");
2176 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2177 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
2178 gtk_container_add (GTK_CONTAINER (frame), label);
2179 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2181 frame = gtk_frame_new ("Left Justified Label");
2182 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2183 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
2184 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2185 gtk_container_add (GTK_CONTAINER (frame), label);
2186 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2188 frame = gtk_frame_new ("Right Justified Label");
2189 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2190 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2191 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2192 gtk_container_add (GTK_CONTAINER (frame), label);
2193 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2195 frame = gtk_frame_new ("Internationalized Label");
2196 label = gtk_label_new (NULL);
2197 gtk_label_set_markup (GTK_LABEL (label),
2198 "French (Fran\303\247ais) Bonjour, Salut\n"
2199 "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"
2200 "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"
2201 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2202 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2203 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2204 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2205 gtk_container_add (GTK_CONTAINER (frame), label);
2206 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2208 frame = gtk_frame_new ("Bidirection Label");
2209 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"
2210 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
2211 gtk_container_add (GTK_CONTAINER (frame), label);
2212 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2214 frame = gtk_frame_new ("Links in a label");
2215 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2216 "as hyperlinks, which can be clicked\n"
2217 "or activated via <a href=\"keynav\">keynav</a>");
2218 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
2219 gtk_container_add (GTK_CONTAINER (frame), label);
2220 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2221 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
2223 vbox = gtk_vbox_new (FALSE, 5);
2224 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2225 frame = gtk_frame_new ("Line wrapped label");
2226 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2227 "up the entire "/* big space to test spacing */\
2228 "width allocated to it, but automatically wraps the words to fit. "\
2229 "The time has come, for all good men, to come to the aid of their party. "\
2230 "The sixth sheik's six sheep's sick.\n"\
2231 " It supports multiple paragraphs correctly, and correctly adds "\
2232 "many extra spaces. ");
2234 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2235 gtk_container_add (GTK_CONTAINER (frame), label);
2236 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2238 frame = gtk_frame_new ("Filled, wrapped label");
2239 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2240 "up the entire width allocated to it. Here is a seneance to prove "\
2241 "my point. Here is another sentence. "\
2242 "Here comes the sun, do de do de do.\n"\
2243 " This is a new paragraph.\n"\
2244 " This is another newer, longer, better paragraph. It is coming to an end, "\
2246 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2247 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2248 gtk_container_add (GTK_CONTAINER (frame), label);
2249 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2251 frame = gtk_frame_new ("Underlined label");
2252 label = gtk_label_new ("This label is underlined!\n"
2253 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2254 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2255 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2256 gtk_container_add (GTK_CONTAINER (frame), label);
2257 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2259 frame = gtk_frame_new ("Markup label");
2260 label = gtk_label_new (NULL);
2262 /* There's also a gtk_label_set_markup() without accel if you
2263 * don't have an accelerator key
2265 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2266 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2267 "<b>markup</b> _such as "
2268 "<big><i>Big Italics</i></big>\n"
2269 "<tt>Monospace font</tt>\n"
2270 "<u>Underline!</u>\n"
2272 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2273 "and nothing on this line,\n"
2276 "or even on this one\n"
2277 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2278 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2279 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2281 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2283 gtk_container_add (GTK_CONTAINER (frame), label);
2284 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2287 if (!gtk_widget_get_visible (window))
2288 gtk_widget_show_all (window);
2290 gtk_widget_destroy (window);
2294 on_angle_scale_changed (GtkRange *range,
2297 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2301 create_rotated_label (GtkWidget *widget)
2303 static GtkWidget *window = NULL;
2304 GtkWidget *content_area;
2308 GtkWidget *scale_label;
2309 GtkWidget *scale_hbox;
2313 window = gtk_dialog_new_with_buttons ("Rotated Label",
2314 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2315 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2318 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2320 gtk_window_set_screen (GTK_WINDOW (window),
2321 gtk_widget_get_screen (widget));
2323 g_signal_connect (window, "response",
2324 G_CALLBACK (gtk_object_destroy), NULL);
2325 g_signal_connect (window, "destroy",
2326 G_CALLBACK (gtk_widget_destroyed), &window);
2328 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2330 vbox = gtk_vbox_new (FALSE, 5);
2331 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2332 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2334 label = gtk_label_new (NULL);
2335 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2336 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2338 scale_hbox = gtk_hbox_new (FALSE, 0);
2339 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2341 scale_label = gtk_label_new (NULL);
2342 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2343 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2345 hscale = gtk_hscale_new_with_range (0, 360, 5);
2346 g_signal_connect (hscale, "value-changed",
2347 G_CALLBACK (on_angle_scale_changed), label);
2349 gtk_range_set_value (GTK_RANGE (hscale), 45);
2350 gtk_widget_set_size_request (hscale, 200, -1);
2351 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2354 if (!gtk_widget_get_visible (window))
2355 gtk_widget_show_all (window);
2357 gtk_widget_destroy (window);
2360 #define DEFAULT_TEXT_RADIUS 200
2363 on_rotated_text_unrealize (GtkWidget *widget)
2365 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2369 on_rotated_text_expose (GtkWidget *widget,
2370 GdkEventExpose *event,
2371 GdkPixbuf *tile_pixbuf)
2373 GtkAllocation allocation;
2374 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2375 "had", "10,000", "men" };
2379 PangoLayout *layout;
2380 PangoContext *context;
2381 PangoFontDescription *desc;
2384 cr = gdk_cairo_create (event->window);
2388 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2389 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2392 cairo_set_source_rgb (cr, 0, 0, 0);
2394 gtk_widget_get_allocation (widget, &allocation);
2396 radius = MIN (allocation.width, allocation.height) / 2.;
2398 cairo_translate (cr,
2399 radius + (allocation.width - 2 * radius) / 2,
2400 radius + (allocation.height - 2 * radius) / 2);
2401 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2403 context = gtk_widget_get_pango_context (widget);
2404 layout = pango_layout_new (context);
2405 desc = pango_font_description_from_string ("Sans Bold 30");
2406 pango_layout_set_font_description (layout, desc);
2407 pango_font_description_free (desc);
2409 n_words = G_N_ELEMENTS (words);
2410 for (i = 0; i < n_words; i++)
2416 cairo_rotate (cr, 2 * G_PI * i / n_words);
2417 pango_cairo_update_layout (cr, layout);
2419 pango_layout_set_text (layout, words[i], -1);
2420 pango_layout_get_size (layout, &width, &height);
2422 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2423 pango_cairo_show_layout (cr, layout);
2428 g_object_unref (layout);
2435 create_rotated_text (GtkWidget *widget)
2437 static GtkWidget *window = NULL;
2441 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
2442 GtkRequisition requisition;
2443 GtkWidget *content_area;
2444 GtkWidget *drawing_area;
2445 GdkPixbuf *tile_pixbuf;
2447 window = gtk_dialog_new_with_buttons ("Rotated Text",
2448 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2449 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2452 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2454 gtk_window_set_screen (GTK_WINDOW (window),
2455 gtk_widget_get_screen (widget));
2457 g_signal_connect (window, "response",
2458 G_CALLBACK (gtk_object_destroy), NULL);
2459 g_signal_connect (window, "destroy",
2460 G_CALLBACK (gtk_widget_destroyed), &window);
2462 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2464 drawing_area = gtk_drawing_area_new ();
2465 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2466 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
2468 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2470 g_signal_connect (drawing_area, "expose-event",
2471 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
2472 g_signal_connect (drawing_area, "unrealize",
2473 G_CALLBACK (on_rotated_text_unrealize), NULL);
2475 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2477 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2478 gtk_widget_size_request (window, &requisition);
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);
5723 #define RESPONSE_TOGGLE_SEPARATOR 1
5726 print_response (GtkWidget *dialog,
5730 g_print ("response signal received (%d)\n", response_id);
5732 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
5734 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
5735 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
5740 create_dialog (GtkWidget *widget)
5742 static GtkWidget *label;
5743 GtkWidget *action_area;
5748 /* This is a terrible example; it's much simpler to create
5749 * dialogs than this. Don't use testgtk for example code,
5753 dialog_window = gtk_dialog_new ();
5754 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5755 gtk_widget_get_screen (widget));
5757 g_signal_connect (dialog_window,
5759 G_CALLBACK (print_response),
5762 g_signal_connect (dialog_window, "destroy",
5763 G_CALLBACK (gtk_widget_destroyed),
5766 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5768 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5769 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5771 button = gtk_button_new_with_label ("OK");
5772 gtk_widget_set_can_default (button, TRUE);
5773 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5774 gtk_widget_grab_default (button);
5775 gtk_widget_show (button);
5777 button = gtk_button_new_with_label ("Toggle");
5778 g_signal_connect (button, "clicked",
5779 G_CALLBACK (label_toggle),
5781 gtk_widget_set_can_default (button, TRUE);
5782 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5783 gtk_widget_show (button);
5787 button = gtk_button_new_with_label ("Separator");
5789 gtk_widget_set_can_default (button, TRUE);
5791 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
5793 RESPONSE_TOGGLE_SEPARATOR);
5794 gtk_widget_show (button);
5797 if (!gtk_widget_get_visible (dialog_window))
5798 gtk_widget_show (dialog_window);
5800 gtk_widget_destroy (dialog_window);
5803 /* Display & Screen test
5810 GtkWidget *radio_dpy;
5811 GtkWidget *toplevel;
5812 GtkWidget *dialog_window;
5813 } ScreenDisplaySelection;
5816 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5818 const gchar *display_name;
5819 GdkDisplay *display = gtk_widget_get_display (widget);
5821 GdkScreen *new_screen = NULL;
5822 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5824 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5826 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5827 display = gdk_display_open (display_name);
5831 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5832 GTK_DIALOG_DESTROY_WITH_PARENT,
5835 "The display :\n%s\ncannot be opened",
5837 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5838 gtk_widget_show (dialog);
5839 g_signal_connect (dialog, "response",
5840 G_CALLBACK (gtk_widget_destroy),
5845 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5848 gboolean found = FALSE;
5849 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5852 gtk_tree_model_get (model, &iter, 0, &name, -1);
5853 found = !g_ascii_strcasecmp (display_name, name);
5860 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
5861 new_screen = gdk_display_get_default_screen (display);
5866 gint number_of_screens = gdk_display_get_n_screens (display);
5867 gint screen_num = gdk_screen_get_number (current_screen);
5868 if ((screen_num +1) < number_of_screens)
5869 new_screen = gdk_display_get_screen (display, screen_num + 1);
5871 new_screen = gdk_display_get_screen (display, 0);
5876 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5877 gtk_widget_destroy (data->dialog_window);
5882 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5884 gtk_widget_destroy (data);
5888 create_display_screen (GtkWidget *widget)
5890 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5891 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5893 ScreenDisplaySelection *scr_dpy_data;
5894 GdkScreen *screen = gtk_widget_get_screen (widget);
5895 GdkDisplay *display = gdk_screen_get_display (screen);
5897 window = g_object_new (gtk_window_get_type (),
5900 "type", GTK_WINDOW_TOPLEVEL,
5902 "Screen or Display selection",
5903 "border_width", 10, NULL);
5904 g_signal_connect (window, "destroy",
5905 G_CALLBACK (gtk_widget_destroy), NULL);
5907 vbox = gtk_vbox_new (FALSE, 3);
5908 gtk_container_add (GTK_CONTAINER (window), vbox);
5910 frame = gtk_frame_new ("Select screen or display");
5911 gtk_container_add (GTK_CONTAINER (vbox), frame);
5913 table = gtk_table_new (2, 2, TRUE);
5914 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5915 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5917 gtk_container_add (GTK_CONTAINER (frame), table);
5919 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5920 if (gdk_display_get_n_screens(display) > 1)
5921 radio_scr = gtk_radio_button_new_with_label
5922 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5925 radio_scr = gtk_radio_button_new_with_label
5926 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5927 "only one screen on the current display");
5928 gtk_widget_set_sensitive (radio_scr, FALSE);
5930 combo_dpy = gtk_combo_box_new_text ();
5931 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
5932 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5933 "<hostname>:<X Server Num>.<Screen Num>");
5935 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5936 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5937 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5939 bbox = gtk_hbutton_box_new ();
5940 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5941 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5943 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5945 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5946 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5948 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5950 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5951 scr_dpy_data->radio_dpy = radio_dpy;
5952 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5953 scr_dpy_data->dialog_window = window;
5955 g_signal_connect (cancelb, "clicked",
5956 G_CALLBACK (screen_display_destroy_diag), window);
5957 g_signal_connect (applyb, "clicked",
5958 G_CALLBACK (screen_display_check), scr_dpy_data);
5959 gtk_widget_show_all (window);
5964 static gboolean event_watcher_enter_id = 0;
5965 static gboolean event_watcher_leave_id = 0;
5968 event_watcher (GSignalInvocationHint *ihint,
5969 guint n_param_values,
5970 const GValue *param_values,
5973 g_print ("Watch: \"%s\" emitted for %s\n",
5974 g_signal_name (ihint->signal_id),
5975 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5981 event_watcher_down (void)
5983 if (event_watcher_enter_id)
5987 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5988 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5989 event_watcher_enter_id = 0;
5990 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5991 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5992 event_watcher_leave_id = 0;
5997 event_watcher_toggle (void)
5999 if (event_watcher_enter_id)
6000 event_watcher_down ();
6005 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6006 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6007 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6008 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6013 create_event_watcher (GtkWidget *widget)
6015 GtkWidget *action_area, *content_area;
6020 dialog_window = gtk_dialog_new ();
6021 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6022 gtk_widget_get_screen (widget));
6024 g_signal_connect (dialog_window, "destroy",
6025 G_CALLBACK (gtk_widget_destroyed),
6027 g_signal_connect (dialog_window, "destroy",
6028 G_CALLBACK (event_watcher_down),
6031 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
6032 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
6034 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6035 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6036 gtk_widget_set_size_request (dialog_window, 200, 110);
6038 button = gtk_toggle_button_new_with_label ("Activate Watch");
6039 g_signal_connect (button, "clicked",
6040 G_CALLBACK (event_watcher_toggle),
6042 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6043 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
6044 gtk_widget_show (button);
6046 button = gtk_button_new_with_label ("Close");
6047 g_signal_connect_swapped (button, "clicked",
6048 G_CALLBACK (gtk_widget_destroy),
6050 gtk_widget_set_can_default (button, TRUE);
6051 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6052 gtk_widget_grab_default (button);
6053 gtk_widget_show (button);
6056 if (!gtk_widget_get_visible (dialog_window))
6057 gtk_widget_show (dialog_window);
6059 gtk_widget_destroy (dialog_window);
6067 reformat_value (GtkScale *scale,
6070 return g_strdup_printf ("-->%0.*g<--",
6071 gtk_scale_get_digits (scale), value);
6075 create_range_controls (GtkWidget *widget)
6077 static GtkWidget *window = NULL;
6081 GtkWidget *scrollbar;
6083 GtkWidget *separator;
6084 GtkObject *adjustment;
6089 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6091 gtk_window_set_screen (GTK_WINDOW (window),
6092 gtk_widget_get_screen (widget));
6094 g_signal_connect (window, "destroy",
6095 G_CALLBACK (gtk_widget_destroyed),
6098 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6099 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6102 box1 = gtk_vbox_new (FALSE, 0);
6103 gtk_container_add (GTK_CONTAINER (window), box1);
6104 gtk_widget_show (box1);
6107 box2 = gtk_vbox_new (FALSE, 10);
6108 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6109 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6110 gtk_widget_show (box2);
6113 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6115 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6116 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6117 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6118 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6119 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6120 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6121 gtk_widget_show (scale);
6123 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6124 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6125 GTK_UPDATE_CONTINUOUS);
6126 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6127 gtk_widget_show (scrollbar);
6129 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6130 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6131 g_signal_connect (scale,
6133 G_CALLBACK (reformat_value),
6135 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6136 gtk_widget_show (scale);
6138 hbox = gtk_hbox_new (FALSE, 0);
6140 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6141 gtk_widget_set_size_request (scale, -1, 200);
6142 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6143 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6144 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6145 gtk_widget_show (scale);
6147 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6148 gtk_widget_set_size_request (scale, -1, 200);
6149 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6150 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6151 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6152 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6153 gtk_widget_show (scale);
6155 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6156 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6157 g_signal_connect (scale,
6159 G_CALLBACK (reformat_value),
6161 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6162 gtk_widget_show (scale);
6165 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6166 gtk_widget_show (hbox);
6168 separator = gtk_hseparator_new ();
6169 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6170 gtk_widget_show (separator);
6173 box2 = gtk_vbox_new (FALSE, 10);
6174 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6175 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6176 gtk_widget_show (box2);
6179 button = gtk_button_new_with_label ("close");
6180 g_signal_connect_swapped (button, "clicked",
6181 G_CALLBACK (gtk_widget_destroy),
6183 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6184 gtk_widget_set_can_default (button, TRUE);
6185 gtk_widget_grab_default (button);
6186 gtk_widget_show (button);
6189 if (!gtk_widget_get_visible (window))
6190 gtk_widget_show (window);
6192 gtk_widget_destroy (window);
6200 create_rulers (GtkWidget *widget)
6202 static GtkWidget *window = NULL;
6208 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6210 gtk_window_set_screen (GTK_WINDOW (window),
6211 gtk_widget_get_screen (widget));
6213 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
6215 g_signal_connect (window, "destroy",
6216 G_CALLBACK (gtk_widget_destroyed),
6219 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6220 gtk_widget_set_size_request (window, 300, 300);
6221 gtk_widget_set_events (window,
6222 GDK_POINTER_MOTION_MASK
6223 | GDK_POINTER_MOTION_HINT_MASK);
6224 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6226 table = gtk_table_new (2, 2, FALSE);
6227 gtk_container_add (GTK_CONTAINER (window), table);
6228 gtk_widget_show (table);
6230 ruler = gtk_hruler_new ();
6231 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6232 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6234 g_signal_connect_swapped (window,
6235 "motion_notify_event",
6236 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6239 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6240 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6241 gtk_widget_show (ruler);
6244 ruler = gtk_vruler_new ();
6245 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6247 g_signal_connect_swapped (window,
6248 "motion_notify_event",
6249 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6252 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6253 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6254 gtk_widget_show (ruler);
6257 if (!gtk_widget_get_visible (window))
6258 gtk_widget_show (window);
6260 gtk_widget_destroy (window);
6267 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6268 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6269 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6270 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6271 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6272 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6273 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6274 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6277 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6283 static const char * book_open_xpm[] = {
6306 static const char * book_closed_xpm[] = {
6331 GdkPixbuf *book_open;
6332 GdkPixbuf *book_closed;
6333 GtkWidget *sample_notebook;
6336 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6338 GtkWidget *page_widget;
6341 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6343 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6344 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6346 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6347 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6351 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6353 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6354 gint old_page_num = gtk_notebook_get_current_page (notebook);
6356 if (page_num == old_page_num)
6359 set_page_image (notebook, page_num, book_open);
6361 if (old_page_num != -1)
6362 set_page_image (notebook, old_page_num, book_closed);
6366 tab_fill (GtkToggleButton *button, GtkWidget *child)
6368 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6369 "tab-fill", gtk_toggle_button_get_active (button),
6374 tab_expand (GtkToggleButton *button, GtkWidget *child)
6376 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6377 "tab-expand", gtk_toggle_button_get_active (button),
6382 create_pages (GtkNotebook *notebook, gint start, gint end)
6384 GtkWidget *child = NULL;
6389 GtkWidget *label_box;
6390 GtkWidget *menu_box;
6394 char accel_buffer[32];
6396 for (i = start; i <= end; i++)
6398 sprintf (buffer, "Page %d", i);
6399 sprintf (accel_buffer, "Page _%d", i);
6401 child = gtk_frame_new (buffer);
6402 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6404 vbox = gtk_vbox_new (TRUE,0);
6405 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6406 gtk_container_add (GTK_CONTAINER (child), vbox);
6408 hbox = gtk_hbox_new (TRUE,0);
6409 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6411 button = gtk_check_button_new_with_label ("Fill Tab");
6412 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6413 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6414 g_signal_connect (button, "toggled",
6415 G_CALLBACK (tab_fill), child);
6417 button = gtk_check_button_new_with_label ("Expand Tab");
6418 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6419 g_signal_connect (button, "toggled",
6420 G_CALLBACK (tab_expand), child);
6422 button = gtk_button_new_with_label ("Hide Page");
6423 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6424 g_signal_connect_swapped (button, "clicked",
6425 G_CALLBACK (gtk_widget_hide),
6428 gtk_widget_show_all (child);
6430 label_box = gtk_hbox_new (FALSE, 0);
6431 pixwid = gtk_image_new_from_pixbuf (book_closed);
6432 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6434 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6435 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6436 label = gtk_label_new_with_mnemonic (accel_buffer);
6437 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6438 gtk_widget_show_all (label_box);
6441 menu_box = gtk_hbox_new (FALSE, 0);
6442 pixwid = gtk_image_new_from_pixbuf (book_closed);
6443 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6445 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6446 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6447 label = gtk_label_new (buffer);
6448 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6449 gtk_widget_show_all (menu_box);
6451 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6456 rotate_notebook (GtkButton *button,
6457 GtkNotebook *notebook)
6459 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6463 show_all_pages (GtkButton *button,
6464 GtkNotebook *notebook)
6466 gtk_container_foreach (GTK_CONTAINER (notebook),
6467 (GtkCallback) gtk_widget_show, NULL);
6471 notebook_type_changed (GtkWidget *optionmenu,
6474 GtkNotebook *notebook;
6484 notebook = GTK_NOTEBOOK (data);
6486 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6491 /* standard notebook */
6492 gtk_notebook_set_show_tabs (notebook, TRUE);
6493 gtk_notebook_set_show_border (notebook, TRUE);
6494 gtk_notebook_set_scrollable (notebook, FALSE);
6498 /* notabs notebook */
6499 gtk_notebook_set_show_tabs (notebook, FALSE);
6500 gtk_notebook_set_show_border (notebook, TRUE);
6505 gtk_notebook_set_show_tabs (notebook, FALSE);
6506 gtk_notebook_set_show_border (notebook, FALSE);
6511 gtk_notebook_set_show_tabs (notebook, TRUE);
6512 gtk_notebook_set_show_border (notebook, TRUE);
6513 gtk_notebook_set_scrollable (notebook, TRUE);
6514 if (gtk_notebook_get_n_pages (notebook) == 5)
6515 create_pages (notebook, 6, 15);
6521 if (gtk_notebook_get_n_pages (notebook) == 15)
6522 for (i = 0; i < 10; i++)
6523 gtk_notebook_remove_page (notebook, 5);
6527 notebook_popup (GtkToggleButton *button,
6528 GtkNotebook *notebook)
6531 gtk_notebook_popup_enable (notebook);
6533 gtk_notebook_popup_disable (notebook);
6537 create_notebook (GtkWidget *widget)
6539 static GtkWidget *window = NULL;
6543 GtkWidget *separator;
6547 static gchar *items[] =
6557 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6558 gtk_window_set_screen (GTK_WINDOW (window),
6559 gtk_widget_get_screen (widget));
6561 g_signal_connect (window, "destroy",
6562 G_CALLBACK (gtk_widget_destroyed),
6565 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6566 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6568 box1 = gtk_vbox_new (FALSE, 0);
6569 gtk_container_add (GTK_CONTAINER (window), box1);
6571 sample_notebook = gtk_notebook_new ();
6572 g_signal_connect (sample_notebook, "switch_page",
6573 G_CALLBACK (page_switch), NULL);
6574 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6575 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6576 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6578 gtk_widget_realize (sample_notebook);
6581 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6584 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6586 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6588 separator = gtk_hseparator_new ();
6589 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6591 box2 = gtk_hbox_new (FALSE, 5);
6592 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6593 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6595 button = gtk_check_button_new_with_label ("popup menu");
6596 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6597 g_signal_connect (button, "clicked",
6598 G_CALLBACK (notebook_popup),
6601 box2 = gtk_hbox_new (FALSE, 5);
6602 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6603 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6605 label = gtk_label_new ("Notebook Style :");
6606 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6608 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6609 notebook_type_changed,
6611 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6613 button = gtk_button_new_with_label ("Show all Pages");
6614 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6615 g_signal_connect (button, "clicked",
6616 G_CALLBACK (show_all_pages), sample_notebook);
6618 box2 = gtk_hbox_new (TRUE, 10);
6619 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6620 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6622 button = gtk_button_new_with_label ("prev");
6623 g_signal_connect_swapped (button, "clicked",
6624 G_CALLBACK (gtk_notebook_prev_page),
6626 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6628 button = gtk_button_new_with_label ("next");
6629 g_signal_connect_swapped (button, "clicked",
6630 G_CALLBACK (gtk_notebook_next_page),
6632 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6634 button = gtk_button_new_with_label ("rotate");
6635 g_signal_connect (button, "clicked",
6636 G_CALLBACK (rotate_notebook), sample_notebook);
6637 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6639 separator = gtk_hseparator_new ();
6640 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6642 button = gtk_button_new_with_label ("close");
6643 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6644 g_signal_connect_swapped (button, "clicked",
6645 G_CALLBACK (gtk_widget_destroy),
6647 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6648 gtk_widget_set_can_default (button, TRUE);
6649 gtk_widget_grab_default (button);
6652 if (!gtk_widget_get_visible (window))
6653 gtk_widget_show_all (window);
6655 gtk_widget_destroy (window);
6663 toggle_resize (GtkWidget *widget, GtkWidget *child)
6665 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6666 GValue value = { 0, };
6667 g_value_init (&value, G_TYPE_BOOLEAN);
6668 gtk_container_child_get_property (container, child, "resize", &value);
6669 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6670 gtk_container_child_set_property (container, child, "resize", &value);
6674 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6676 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6677 GValue value = { 0, };
6678 g_value_init (&value, G_TYPE_BOOLEAN);
6679 gtk_container_child_get_property (container, child, "shrink", &value);
6680 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6681 gtk_container_child_set_property (container, child, "shrink", &value);
6685 paned_props_clicked (GtkWidget *button,
6688 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6690 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6694 create_pane_options (GtkPaned *paned,
6695 const gchar *frame_label,
6696 const gchar *label1,
6697 const gchar *label2)
6699 GtkWidget *child1, *child2;
6704 GtkWidget *check_button;
6706 child1 = gtk_paned_get_child1 (paned);
6707 child2 = gtk_paned_get_child2 (paned);
6709 frame = gtk_frame_new (frame_label);
6710 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6712 table = gtk_table_new (4, 2, 4);
6713 gtk_container_add (GTK_CONTAINER (frame), table);
6715 label = gtk_label_new (label1);
6716 gtk_table_attach_defaults (GTK_TABLE (table), label,
6719 check_button = gtk_check_button_new_with_label ("Resize");
6720 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6722 g_signal_connect (check_button, "toggled",
6723 G_CALLBACK (toggle_resize),
6726 check_button = gtk_check_button_new_with_label ("Shrink");
6727 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6729 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6731 g_signal_connect (check_button, "toggled",
6732 G_CALLBACK (toggle_shrink),
6735 label = gtk_label_new (label2);
6736 gtk_table_attach_defaults (GTK_TABLE (table), label,
6739 check_button = gtk_check_button_new_with_label ("Resize");
6740 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6742 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6744 g_signal_connect (check_button, "toggled",
6745 G_CALLBACK (toggle_resize),
6748 check_button = gtk_check_button_new_with_label ("Shrink");
6749 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6751 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6753 g_signal_connect (check_button, "toggled",
6754 G_CALLBACK (toggle_shrink),
6757 button = gtk_button_new_with_mnemonic ("_Properties");
6758 gtk_table_attach_defaults (GTK_TABLE (table), button,
6760 g_signal_connect (button, "clicked",
6761 G_CALLBACK (paned_props_clicked),
6768 create_panes (GtkWidget *widget)
6770 static GtkWidget *window = NULL;
6779 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6781 gtk_window_set_screen (GTK_WINDOW (window),
6782 gtk_widget_get_screen (widget));
6784 g_signal_connect (window, "destroy",
6785 G_CALLBACK (gtk_widget_destroyed),
6788 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6789 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6791 vbox = gtk_vbox_new (FALSE, 0);
6792 gtk_container_add (GTK_CONTAINER (window), vbox);
6794 vpaned = gtk_vpaned_new ();
6795 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6796 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6798 hpaned = gtk_hpaned_new ();
6799 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6801 frame = gtk_frame_new (NULL);
6802 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6803 gtk_widget_set_size_request (frame, 60, 60);
6804 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6806 button = gtk_button_new_with_label ("Hi there");
6807 gtk_container_add (GTK_CONTAINER(frame), button);
6809 frame = gtk_frame_new (NULL);
6810 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6811 gtk_widget_set_size_request (frame, 80, 60);
6812 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6814 frame = gtk_frame_new (NULL);
6815 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6816 gtk_widget_set_size_request (frame, 60, 80);
6817 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6819 /* Now create toggle buttons to control sizing */
6821 gtk_box_pack_start (GTK_BOX (vbox),
6822 create_pane_options (GTK_PANED (hpaned),
6828 gtk_box_pack_start (GTK_BOX (vbox),
6829 create_pane_options (GTK_PANED (vpaned),
6835 gtk_widget_show_all (vbox);
6838 if (!gtk_widget_get_visible (window))
6839 gtk_widget_show (window);
6841 gtk_widget_destroy (window);
6845 * Paned keyboard navigation
6849 paned_keyboard_window1 (GtkWidget *widget)
6872 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6873 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6874 gtk_window_set_screen (GTK_WINDOW (window1),
6875 gtk_widget_get_screen (widget));
6877 hpaned1 = gtk_hpaned_new ();
6878 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6880 frame1 = gtk_frame_new (NULL);
6881 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6882 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6884 vbox1 = gtk_vbox_new (FALSE, 0);
6885 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6887 button7 = gtk_button_new_with_label ("button7");
6888 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6890 button8 = gtk_button_new_with_label ("button8");
6891 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6893 button9 = gtk_button_new_with_label ("button9");
6894 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6896 vpaned1 = gtk_vpaned_new ();
6897 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6899 frame2 = gtk_frame_new (NULL);
6900 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6901 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6903 frame5 = gtk_frame_new (NULL);
6904 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6906 hbox1 = gtk_hbox_new (FALSE, 0);
6907 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6909 button5 = gtk_button_new_with_label ("button5");
6910 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6912 button6 = gtk_button_new_with_label ("button6");
6913 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6915 frame3 = gtk_frame_new (NULL);
6916 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6917 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6919 frame4 = gtk_frame_new ("Buttons");
6920 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6921 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6923 table1 = gtk_table_new (2, 2, FALSE);
6924 gtk_container_add (GTK_CONTAINER (frame4), table1);
6925 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6927 button1 = gtk_button_new_with_label ("button1");
6928 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6929 (GtkAttachOptions) (GTK_FILL),
6930 (GtkAttachOptions) (0), 0, 0);
6932 button2 = gtk_button_new_with_label ("button2");
6933 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6934 (GtkAttachOptions) (GTK_FILL),
6935 (GtkAttachOptions) (0), 0, 0);
6937 button3 = gtk_button_new_with_label ("button3");
6938 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6939 (GtkAttachOptions) (GTK_FILL),
6940 (GtkAttachOptions) (0), 0, 0);
6942 button4 = gtk_button_new_with_label ("button4");
6943 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6944 (GtkAttachOptions) (GTK_FILL),
6945 (GtkAttachOptions) (0), 0, 0);
6951 paned_keyboard_window2 (GtkWidget *widget)
6956 GtkWidget *button13;
6960 GtkWidget *button12;
6962 GtkWidget *button11;
6963 GtkWidget *button10;
6965 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6966 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6968 gtk_window_set_screen (GTK_WINDOW (window2),
6969 gtk_widget_get_screen (widget));
6971 hpaned2 = gtk_hpaned_new ();
6972 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6974 frame6 = gtk_frame_new (NULL);
6975 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6976 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6978 button13 = gtk_button_new_with_label ("button13");
6979 gtk_container_add (GTK_CONTAINER (frame6), button13);
6981 hbox2 = gtk_hbox_new (FALSE, 0);
6982 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6984 vpaned2 = gtk_vpaned_new ();
6985 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6987 frame7 = gtk_frame_new (NULL);
6988 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6989 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6991 button12 = gtk_button_new_with_label ("button12");
6992 gtk_container_add (GTK_CONTAINER (frame7), button12);
6994 frame8 = gtk_frame_new (NULL);
6995 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6996 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6998 button11 = gtk_button_new_with_label ("button11");
6999 gtk_container_add (GTK_CONTAINER (frame8), button11);
7001 button10 = gtk_button_new_with_label ("button10");
7002 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
7008 paned_keyboard_window3 (GtkWidget *widget)
7015 GtkWidget *button14;
7018 GtkWidget *button15;
7021 GtkWidget *button16;
7023 GtkWidget *button17;
7025 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7026 g_object_set_data (G_OBJECT (window3), "window3", window3);
7027 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
7029 gtk_window_set_screen (GTK_WINDOW (window3),
7030 gtk_widget_get_screen (widget));
7033 vbox2 = gtk_vbox_new (FALSE, 0);
7034 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7036 label1 = gtk_label_new ("Three panes nested inside each other");
7037 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7039 hpaned3 = gtk_hpaned_new ();
7040 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7042 frame9 = gtk_frame_new (NULL);
7043 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7044 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7046 button14 = gtk_button_new_with_label ("button14");
7047 gtk_container_add (GTK_CONTAINER (frame9), button14);
7049 hpaned4 = gtk_hpaned_new ();
7050 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7052 frame10 = gtk_frame_new (NULL);
7053 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7054 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7056 button15 = gtk_button_new_with_label ("button15");
7057 gtk_container_add (GTK_CONTAINER (frame10), button15);
7059 hpaned5 = gtk_hpaned_new ();
7060 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7062 frame11 = gtk_frame_new (NULL);
7063 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7064 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7066 button16 = gtk_button_new_with_label ("button16");
7067 gtk_container_add (GTK_CONTAINER (frame11), button16);
7069 frame12 = gtk_frame_new (NULL);
7070 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7071 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7073 button17 = gtk_button_new_with_label ("button17");
7074 gtk_container_add (GTK_CONTAINER (frame12), button17);
7080 paned_keyboard_window4 (GtkWidget *widget)
7087 GtkWidget *button19;
7088 GtkWidget *button18;
7091 GtkWidget *button21;
7092 GtkWidget *button20;
7094 GtkWidget *button23;
7095 GtkWidget *button22;
7097 GtkWidget *button25;
7098 GtkWidget *button24;
7100 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7101 g_object_set_data (G_OBJECT (window4), "window4", window4);
7102 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7104 gtk_window_set_screen (GTK_WINDOW (window4),
7105 gtk_widget_get_screen (widget));
7107 vbox3 = gtk_vbox_new (FALSE, 0);
7108 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7110 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7111 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7112 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7114 hpaned6 = gtk_hpaned_new ();
7115 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7117 vpaned3 = gtk_vpaned_new ();
7118 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7120 button19 = gtk_button_new_with_label ("button19");
7121 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7123 button18 = gtk_button_new_with_label ("button18");
7124 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7126 hbox3 = gtk_hbox_new (FALSE, 0);
7127 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7129 vpaned4 = gtk_vpaned_new ();
7130 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7132 button21 = gtk_button_new_with_label ("button21");
7133 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7135 button20 = gtk_button_new_with_label ("button20");
7136 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7138 vpaned5 = gtk_vpaned_new ();
7139 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7141 button23 = gtk_button_new_with_label ("button23");
7142 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7144 button22 = gtk_button_new_with_label ("button22");
7145 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7147 vpaned6 = gtk_vpaned_new ();
7148 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7150 button25 = gtk_button_new_with_label ("button25");
7151 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7153 button24 = gtk_button_new_with_label ("button24");
7154 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7160 create_paned_keyboard_navigation (GtkWidget *widget)
7162 static GtkWidget *window1 = NULL;
7163 static GtkWidget *window2 = NULL;
7164 static GtkWidget *window3 = NULL;
7165 static GtkWidget *window4 = NULL;
7168 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7170 gtk_widget_destroy (window1);
7171 gtk_widget_destroy (window2);
7172 gtk_widget_destroy (window3);
7173 gtk_widget_destroy (window4);
7178 window1 = paned_keyboard_window1 (widget);
7179 g_signal_connect (window1, "destroy",
7180 G_CALLBACK (gtk_widget_destroyed),
7186 window2 = paned_keyboard_window2 (widget);
7187 g_signal_connect (window2, "destroy",
7188 G_CALLBACK (gtk_widget_destroyed),
7194 window3 = paned_keyboard_window3 (widget);
7195 g_signal_connect (window3, "destroy",
7196 G_CALLBACK (gtk_widget_destroyed),
7202 window4 = paned_keyboard_window4 (widget);
7203 g_signal_connect (window4, "destroy",
7204 G_CALLBACK (gtk_widget_destroyed),
7208 if (gtk_widget_get_visible (window1))
7209 gtk_widget_destroy (GTK_WIDGET (window1));
7211 gtk_widget_show_all (GTK_WIDGET (window1));
7213 if (gtk_widget_get_visible (window2))
7214 gtk_widget_destroy (GTK_WIDGET (window2));
7216 gtk_widget_show_all (GTK_WIDGET (window2));
7218 if (gtk_widget_get_visible (window3))
7219 gtk_widget_destroy (GTK_WIDGET (window3));
7221 gtk_widget_show_all (GTK_WIDGET (window3));
7223 if (gtk_widget_get_visible (window4))
7224 gtk_widget_destroy (GTK_WIDGET (window4));
7226 gtk_widget_show_all (GTK_WIDGET (window4));
7234 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7237 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7241 /* ignore double and triple click */
7242 if (event->type != GDK_BUTTON_PRESS)
7245 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7246 p->x = (int) event->x;
7247 p->y = (int) event->y;
7249 gtk_grab_add (widget);
7250 gdk_pointer_grab (gtk_widget_get_window (widget), TRUE,
7251 GDK_BUTTON_RELEASE_MASK |
7252 GDK_BUTTON_MOTION_MASK |
7253 GDK_POINTER_MOTION_HINT_MASK,
7258 shape_released (GtkWidget *widget)
7260 gtk_grab_remove (widget);
7261 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7266 shape_motion (GtkWidget *widget,
7267 GdkEventMotion *event)
7271 GdkModifierType mask;
7273 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7276 * Can't use event->x / event->y here
7277 * because I need absolute coordinates.
7279 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7280 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7284 shape_create_icon (GdkScreen *screen,
7295 CursorOffset* icon_pos;
7300 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7302 window = gtk_window_new (window_type);
7303 gtk_window_set_screen (GTK_WINDOW (window), screen);
7305 fixed = gtk_fixed_new ();
7306 gtk_widget_set_size_request (fixed, 100, 100);
7307 gtk_container_add (GTK_CONTAINER (window), fixed);
7308 gtk_widget_show (fixed);
7310 gtk_widget_set_events (window,
7311 gtk_widget_get_events (window) |
7312 GDK_BUTTON_MOTION_MASK |
7313 GDK_POINTER_MOTION_HINT_MASK |
7314 GDK_BUTTON_PRESS_MASK);
7316 gtk_widget_realize (window);
7318 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7319 g_assert (pixbuf); /* FIXME: error handling */
7321 gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf,
7322 gtk_widget_get_colormap (window),
7327 image = gtk_image_new_from_pixbuf (pixbuf);
7328 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7329 gtk_widget_show (image);
7331 gtk_widget_shape_combine_mask (window, mask, px, py);
7333 g_object_unref (mask);
7334 g_object_unref (pixbuf);
7336 g_signal_connect (window, "button_press_event",
7337 G_CALLBACK (shape_pressed), NULL);
7338 g_signal_connect (window, "button_release_event",
7339 G_CALLBACK (shape_released), NULL);
7340 g_signal_connect (window, "motion_notify_event",
7341 G_CALLBACK (shape_motion), NULL);
7343 icon_pos = g_new (CursorOffset, 1);
7344 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7346 gtk_window_move (GTK_WINDOW (window), x, y);
7347 gtk_widget_show (window);
7353 create_shapes (GtkWidget *widget)
7355 /* Variables used by the Drag/Drop and Shape Window demos */
7356 static GtkWidget *modeller = NULL;
7357 static GtkWidget *sheets = NULL;
7358 static GtkWidget *rings = NULL;
7359 static GtkWidget *with_region = NULL;
7360 GdkScreen *screen = gtk_widget_get_screen (widget);
7362 if (!(file_exists ("Modeller.xpm") &&
7363 file_exists ("FilesQueue.xpm") &&
7364 file_exists ("3DRings.xpm")))
7370 modeller = shape_create_icon (screen, "Modeller.xpm",
7371 440, 140, 0,0, GTK_WINDOW_POPUP);
7373 g_signal_connect (modeller, "destroy",
7374 G_CALLBACK (gtk_widget_destroyed),
7378 gtk_widget_destroy (modeller);
7382 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7383 580, 170, 0,0, GTK_WINDOW_POPUP);
7385 g_signal_connect (sheets, "destroy",
7386 G_CALLBACK (gtk_widget_destroyed),
7391 gtk_widget_destroy (sheets);
7395 rings = shape_create_icon (screen, "3DRings.xpm",
7396 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7398 g_signal_connect (rings, "destroy",
7399 G_CALLBACK (gtk_widget_destroyed),
7403 gtk_widget_destroy (rings);
7407 cairo_region_t *region;
7410 with_region = shape_create_icon (screen, "3DRings.xpm",
7411 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7413 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7415 g_signal_connect (with_region, "destroy",
7416 G_CALLBACK (gtk_widget_destroyed),
7419 /* reset shape from mask to a region */
7422 region = cairo_region_create ();
7434 cairo_region_union_rectangle (region, &rect);
7442 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7447 gtk_widget_destroy (with_region);
7455 create_wmhints (GtkWidget *widget)
7457 static GtkWidget *window = NULL;
7459 GtkWidget *separator;
7464 GdkWindow *gdk_window;
7465 cairo_surface_t *image;
7470 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7472 gtk_window_set_screen (GTK_WINDOW (window),
7473 gtk_widget_get_screen (widget));
7475 g_signal_connect (window, "destroy",
7476 G_CALLBACK (gtk_widget_destroyed),
7479 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7480 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7482 gtk_widget_realize (window);
7484 gdk_window = gtk_widget_get_window (window);
7485 circles = gdk_pixmap_new (gdk_window, circles_width, circles_height, 1);
7486 cr = gdk_cairo_create (circles);
7487 image = cairo_image_surface_create_for_data (circles_bits, CAIRO_FORMAT_A1,
7488 circles_width, circles_height,
7490 cairo_set_source_surface (cr, image, 0, 0);
7491 cairo_surface_destroy (image);
7492 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
7496 gdk_window_set_icon (gdk_window, NULL,
7499 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7501 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7502 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7504 box1 = gtk_vbox_new (FALSE, 0);
7505 gtk_container_add (GTK_CONTAINER (window), box1);
7506 gtk_widget_show (box1);
7508 label = gtk_label_new ("Try iconizing me!");
7509 gtk_widget_set_size_request (label, 150, 50);
7510 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7511 gtk_widget_show (label);
7514 separator = gtk_hseparator_new ();
7515 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7516 gtk_widget_show (separator);
7519 box2 = gtk_vbox_new (FALSE, 10);
7520 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7521 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7522 gtk_widget_show (box2);
7525 button = gtk_button_new_with_label ("close");
7527 g_signal_connect_swapped (button, "clicked",
7528 G_CALLBACK (gtk_widget_destroy),
7531 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7532 gtk_widget_set_can_default (button, TRUE);
7533 gtk_widget_grab_default (button);
7534 gtk_widget_show (button);
7537 if (!gtk_widget_get_visible (window))
7538 gtk_widget_show (window);
7540 gtk_widget_destroy (window);
7545 * Window state tracking
7549 window_state_callback (GtkWidget *widget,
7550 GdkEventWindowState *event,
7553 GtkWidget *label = data;
7556 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7557 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7558 "withdrawn" : "not withdrawn", ", ",
7559 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7560 "iconified" : "not iconified", ", ",
7561 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7562 "sticky" : "not sticky", ", ",
7563 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7564 "maximized" : "not maximized", ", ",
7565 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7566 "fullscreen" : "not fullscreen",
7567 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7568 "above" : "not above", ", ",
7569 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7570 "below" : "not below", ", ",
7573 gtk_label_set_text (GTK_LABEL (label), msg);
7581 tracking_label (GtkWidget *window)
7587 hbox = gtk_hbox_new (FALSE, 5);
7589 g_signal_connect_object (hbox,
7591 G_CALLBACK (gtk_widget_destroy),
7595 label = gtk_label_new ("<no window state events received>");
7596 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7597 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7599 g_signal_connect (window,
7600 "window_state_event",
7601 G_CALLBACK (window_state_callback),
7604 button = gtk_button_new_with_label ("Deiconify");
7605 g_signal_connect_object (button,
7607 G_CALLBACK (gtk_window_deiconify),
7610 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7612 button = gtk_button_new_with_label ("Iconify");
7613 g_signal_connect_object (button,
7615 G_CALLBACK (gtk_window_iconify),
7618 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7620 button = gtk_button_new_with_label ("Fullscreen");
7621 g_signal_connect_object (button,
7623 G_CALLBACK (gtk_window_fullscreen),
7626 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7628 button = gtk_button_new_with_label ("Unfullscreen");
7629 g_signal_connect_object (button,
7631 G_CALLBACK (gtk_window_unfullscreen),
7634 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7636 button = gtk_button_new_with_label ("Present");
7637 g_signal_connect_object (button,
7639 G_CALLBACK (gtk_window_present),
7642 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7644 button = gtk_button_new_with_label ("Show");
7645 g_signal_connect_object (button,
7647 G_CALLBACK (gtk_widget_show),
7650 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7652 gtk_widget_show_all (hbox);
7658 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7660 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7662 gtk_window_set_keep_above (GTK_WINDOW (data),
7663 gtk_toggle_button_get_active (togglebutton));
7665 if (gtk_toggle_button_get_active (togglebutton))
7666 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7670 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7672 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7674 gtk_window_set_keep_below (GTK_WINDOW (data),
7675 gtk_toggle_button_get_active (togglebutton));
7677 if (gtk_toggle_button_get_active (togglebutton))
7678 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7683 get_state_controls (GtkWidget *window)
7687 GtkWidget *button_above;
7688 GtkWidget *button_below;
7690 vbox = gtk_vbox_new (FALSE, 0);
7692 button = gtk_button_new_with_label ("Stick");
7693 g_signal_connect_object (button,
7695 G_CALLBACK (gtk_window_stick),
7698 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7700 button = gtk_button_new_with_label ("Unstick");
7701 g_signal_connect_object (button,
7703 G_CALLBACK (gtk_window_unstick),
7706 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7708 button = gtk_button_new_with_label ("Maximize");
7709 g_signal_connect_object (button,
7711 G_CALLBACK (gtk_window_maximize),
7714 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7716 button = gtk_button_new_with_label ("Unmaximize");
7717 g_signal_connect_object (button,
7719 G_CALLBACK (gtk_window_unmaximize),
7722 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7724 button = gtk_button_new_with_label ("Iconify");
7725 g_signal_connect_object (button,
7727 G_CALLBACK (gtk_window_iconify),
7730 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7732 button = gtk_button_new_with_label ("Fullscreen");
7733 g_signal_connect_object (button,
7735 G_CALLBACK (gtk_window_fullscreen),
7738 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7740 button = gtk_button_new_with_label ("Unfullscreen");
7741 g_signal_connect_object (button,
7743 G_CALLBACK (gtk_window_unfullscreen),
7746 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7748 button_above = gtk_toggle_button_new_with_label ("Keep above");
7749 g_signal_connect (button_above,
7751 G_CALLBACK (keep_window_above),
7753 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7755 button_below = gtk_toggle_button_new_with_label ("Keep below");
7756 g_signal_connect (button_below,
7758 G_CALLBACK (keep_window_below),
7760 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7762 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7763 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7765 button = gtk_button_new_with_label ("Hide (withdraw)");
7766 g_signal_connect_object (button,
7768 G_CALLBACK (gtk_widget_hide),
7771 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7773 gtk_widget_show_all (vbox);
7779 create_window_states (GtkWidget *widget)
7781 static GtkWidget *window = NULL;
7784 GtkWidget *iconified;
7786 GtkWidget *controls;
7790 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7791 gtk_window_set_screen (GTK_WINDOW (window),
7792 gtk_widget_get_screen (widget));
7794 g_signal_connect (window, "destroy",
7795 G_CALLBACK (gtk_widget_destroyed),
7798 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7800 box1 = gtk_vbox_new (FALSE, 0);
7801 gtk_container_add (GTK_CONTAINER (window), box1);
7803 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7805 gtk_window_set_screen (GTK_WINDOW (iconified),
7806 gtk_widget_get_screen (widget));
7808 g_signal_connect_object (iconified, "destroy",
7809 G_CALLBACK (gtk_widget_destroy),
7812 gtk_window_iconify (GTK_WINDOW (iconified));
7813 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7814 controls = get_state_controls (iconified);
7815 gtk_container_add (GTK_CONTAINER (iconified), controls);
7817 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7819 gtk_window_set_screen (GTK_WINDOW (normal),
7820 gtk_widget_get_screen (widget));
7822 g_signal_connect_object (normal, "destroy",
7823 G_CALLBACK (gtk_widget_destroy),
7827 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7828 controls = get_state_controls (normal);
7829 gtk_container_add (GTK_CONTAINER (normal), controls);
7831 label = tracking_label (iconified);
7832 gtk_container_add (GTK_CONTAINER (box1), label);
7834 label = tracking_label (normal);
7835 gtk_container_add (GTK_CONTAINER (box1), label);
7837 gtk_widget_show_all (iconified);
7838 gtk_widget_show_all (normal);
7839 gtk_widget_show_all (box1);
7842 if (!gtk_widget_get_visible (window))
7843 gtk_widget_show (window);
7845 gtk_widget_destroy (window);
7853 configure_event_callback (GtkWidget *widget,
7854 GdkEventConfigure *event,
7857 GtkWidget *label = data;
7861 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7863 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7865 event->x, event->y, event->width, event->height,
7868 gtk_label_set_text (GTK_LABEL (label), msg);
7876 get_ints (GtkWidget *window,
7883 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7884 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7886 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7887 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7891 set_size_callback (GtkWidget *widget,
7896 get_ints (data, &w, &h);
7898 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7902 unset_default_size_callback (GtkWidget *widget,
7905 gtk_window_set_default_size (g_object_get_data (data, "target"),
7910 set_default_size_callback (GtkWidget *widget,
7915 get_ints (data, &w, &h);
7917 gtk_window_set_default_size (g_object_get_data (data, "target"),
7922 unset_size_request_callback (GtkWidget *widget,
7925 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7930 set_size_request_callback (GtkWidget *widget,
7935 get_ints (data, &w, &h);
7937 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7942 set_location_callback (GtkWidget *widget,
7947 get_ints (data, &x, &y);
7949 gtk_window_move (g_object_get_data (data, "target"), x, y);
7953 move_to_position_callback (GtkWidget *widget,
7959 window = g_object_get_data (data, "target");
7961 gtk_window_get_position (window, &x, &y);
7963 gtk_window_move (window, x, y);
7967 set_geometry_callback (GtkWidget *entry,
7973 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7975 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7977 if (!gtk_window_parse_geometry (target, text))
7978 g_print ("Bad geometry string '%s'\n", text);
7984 resizable_callback (GtkWidget *widget,
7987 g_object_set (g_object_get_data (data, "target"),
7988 "resizable", GTK_TOGGLE_BUTTON (widget)->active,
7993 gravity_selected (GtkWidget *widget,
7996 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7997 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
8001 pos_selected (GtkWidget *widget,
8004 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
8005 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
8009 move_gravity_window_to_current_position (GtkWidget *widget,
8015 window = GTK_WINDOW (data);
8017 gtk_window_get_position (window, &x, &y);
8019 gtk_window_move (window, x, y);
8023 get_screen_corner (GtkWindow *window,
8028 GdkScreen * screen = gtk_window_get_screen (window);
8030 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
8032 switch (gtk_window_get_gravity (window))
8034 case GDK_GRAVITY_SOUTH_EAST:
8035 *x = gdk_screen_get_width (screen) - w;
8036 *y = gdk_screen_get_height (screen) - h;
8039 case GDK_GRAVITY_NORTH_EAST:
8040 *x = gdk_screen_get_width (screen) - w;
8044 case GDK_GRAVITY_SOUTH_WEST:
8046 *y = gdk_screen_get_height (screen) - h;
8049 case GDK_GRAVITY_NORTH_WEST:
8054 case GDK_GRAVITY_SOUTH:
8055 *x = (gdk_screen_get_width (screen) - w) / 2;
8056 *y = gdk_screen_get_height (screen) - h;
8059 case GDK_GRAVITY_NORTH:
8060 *x = (gdk_screen_get_width (screen) - w) / 2;
8064 case GDK_GRAVITY_WEST:
8066 *y = (gdk_screen_get_height (screen) - h) / 2;
8069 case GDK_GRAVITY_EAST:
8070 *x = gdk_screen_get_width (screen) - w;
8071 *y = (gdk_screen_get_height (screen) - h) / 2;
8074 case GDK_GRAVITY_CENTER:
8075 *x = (gdk_screen_get_width (screen) - w) / 2;
8076 *y = (gdk_screen_get_height (screen) - h) / 2;
8079 case GDK_GRAVITY_STATIC:
8080 /* pick some random numbers */
8086 g_assert_not_reached ();
8092 move_gravity_window_to_starting_position (GtkWidget *widget,
8098 window = GTK_WINDOW (data);
8100 get_screen_corner (window,
8103 gtk_window_move (window, x, y);
8107 make_gravity_window (GtkWidget *destroy_with,
8116 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8118 gtk_window_set_screen (GTK_WINDOW (window),
8119 gtk_widget_get_screen (destroy_with));
8121 vbox = gtk_vbox_new (FALSE, 0);
8122 gtk_widget_show (vbox);
8124 gtk_container_add (GTK_CONTAINER (window), vbox);
8125 gtk_window_set_title (GTK_WINDOW (window), title);
8126 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8128 g_signal_connect_object (destroy_with,
8130 G_CALLBACK (gtk_widget_destroy),
8135 button = gtk_button_new_with_mnemonic ("_Move to current position");
8137 g_signal_connect (button, "clicked",
8138 G_CALLBACK (move_gravity_window_to_current_position),
8141 gtk_container_add (GTK_CONTAINER (vbox), button);
8142 gtk_widget_show (button);
8144 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8146 g_signal_connect (button, "clicked",
8147 G_CALLBACK (move_gravity_window_to_starting_position),
8150 gtk_container_add (GTK_CONTAINER (vbox), button);
8151 gtk_widget_show (button);
8153 /* Pretend this is the result of --geometry.
8154 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8155 * and in that case you probably should just use gtk_window_parse_geometry().
8156 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8157 * you are parsing --geometry or equivalent.
8159 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8163 gtk_window_set_default_size (GTK_WINDOW (window),
8166 get_screen_corner (GTK_WINDOW (window), &x, &y);
8168 gtk_window_move (GTK_WINDOW (window),
8175 do_gravity_test (GtkWidget *widget,
8178 GtkWidget *destroy_with = data;
8181 /* We put a window at each gravity point on the screen. */
8182 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8184 gtk_widget_show (window);
8186 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8188 gtk_widget_show (window);
8190 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8192 gtk_widget_show (window);
8194 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8196 gtk_widget_show (window);
8198 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8200 gtk_widget_show (window);
8202 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8204 gtk_widget_show (window);
8207 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8209 gtk_widget_show (window);
8212 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8214 gtk_widget_show (window);
8216 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8218 gtk_widget_show (window);
8220 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8222 gtk_widget_show (window);
8226 window_controls (GtkWidget *window)
8228 GtkWidget *control_window;
8238 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8240 gtk_window_set_screen (GTK_WINDOW (control_window),
8241 gtk_widget_get_screen (window));
8243 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8245 g_object_set_data (G_OBJECT (control_window),
8249 g_signal_connect_object (control_window,
8251 G_CALLBACK (gtk_widget_destroy),
8255 vbox = gtk_vbox_new (FALSE, 5);
8257 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8259 label = gtk_label_new ("<no configure events>");
8260 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8262 g_signal_connect (window,
8264 G_CALLBACK (configure_event_callback),
8267 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8269 spin = gtk_spin_button_new (adj, 0, 0);
8271 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8273 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8275 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8277 spin = gtk_spin_button_new (adj, 0, 0);
8279 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8281 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8283 entry = gtk_entry_new ();
8284 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8286 g_signal_connect (entry, "changed",
8287 G_CALLBACK (set_geometry_callback),
8290 button = gtk_button_new_with_label ("Show gravity test windows");
8291 g_signal_connect_swapped (button,
8293 G_CALLBACK (do_gravity_test),
8295 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8297 button = gtk_button_new_with_label ("Reshow with initial size");
8298 g_signal_connect_object (button,
8300 G_CALLBACK (gtk_window_reshow_with_initial_size),
8303 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8305 button = gtk_button_new_with_label ("Queue resize");
8306 g_signal_connect_object (button,
8308 G_CALLBACK (gtk_widget_queue_resize),
8311 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8313 button = gtk_button_new_with_label ("Resize");
8314 g_signal_connect (button,
8316 G_CALLBACK (set_size_callback),
8318 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8320 button = gtk_button_new_with_label ("Set default size");
8321 g_signal_connect (button,
8323 G_CALLBACK (set_default_size_callback),
8325 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8327 button = gtk_button_new_with_label ("Unset default size");
8328 g_signal_connect (button,
8330 G_CALLBACK (unset_default_size_callback),
8332 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8334 button = gtk_button_new_with_label ("Set size request");
8335 g_signal_connect (button,
8337 G_CALLBACK (set_size_request_callback),
8339 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8341 button = gtk_button_new_with_label ("Unset size request");
8342 g_signal_connect (button,
8344 G_CALLBACK (unset_size_request_callback),
8346 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8348 button = gtk_button_new_with_label ("Move");
8349 g_signal_connect (button,
8351 G_CALLBACK (set_location_callback),
8353 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8355 button = gtk_button_new_with_label ("Move to current position");
8356 g_signal_connect (button,
8358 G_CALLBACK (move_to_position_callback),
8360 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8362 button = gtk_check_button_new_with_label ("Allow resize");
8363 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8364 g_signal_connect (button,
8366 G_CALLBACK (resizable_callback),
8368 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8370 button = gtk_button_new_with_mnemonic ("_Show");
8371 g_signal_connect_object (button,
8373 G_CALLBACK (gtk_widget_show),
8376 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8378 button = gtk_button_new_with_mnemonic ("_Hide");
8379 g_signal_connect_object (button,
8381 G_CALLBACK (gtk_widget_hide),
8384 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8386 om = gtk_combo_box_new_text ();
8390 static gchar *names[] = {
8391 "GDK_GRAVITY_NORTH_WEST",
8392 "GDK_GRAVITY_NORTH",
8393 "GDK_GRAVITY_NORTH_EAST",
8395 "GDK_GRAVITY_CENTER",
8397 "GDK_GRAVITY_SOUTH_WEST",
8398 "GDK_GRAVITY_SOUTH",
8399 "GDK_GRAVITY_SOUTH_EAST",
8400 "GDK_GRAVITY_STATIC",
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 (gravity_selected),
8415 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8418 om = gtk_combo_box_new_text ();
8422 static gchar *names[] = {
8424 "GTK_WIN_POS_CENTER",
8425 "GTK_WIN_POS_MOUSE",
8426 "GTK_WIN_POS_CENTER_ALWAYS",
8427 "GTK_WIN_POS_CENTER_ON_PARENT",
8431 g_assert (names[i]);
8432 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8437 g_signal_connect (om,
8439 G_CALLBACK (pos_selected),
8442 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8444 gtk_widget_show_all (vbox);
8446 return control_window;
8450 create_window_sizing (GtkWidget *widget)
8452 static GtkWidget *window = NULL;
8453 static GtkWidget *target_window = NULL;
8459 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8460 gtk_window_set_screen (GTK_WINDOW (target_window),
8461 gtk_widget_get_screen (widget));
8462 label = gtk_label_new (NULL);
8463 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");
8464 gtk_container_add (GTK_CONTAINER (target_window), label);
8465 gtk_widget_show (label);
8467 g_signal_connect (target_window, "destroy",
8468 G_CALLBACK (gtk_widget_destroyed),
8471 window = window_controls (target_window);
8473 g_signal_connect (window, "destroy",
8474 G_CALLBACK (gtk_widget_destroyed),
8477 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8480 /* don't show target window by default, we want to allow testing
8481 * of behavior on first show.
8484 if (!gtk_widget_get_visible (window))
8485 gtk_widget_show (window);
8487 gtk_widget_destroy (window);
8494 typedef struct _ProgressData {
8497 GtkWidget *block_spin;
8498 GtkWidget *x_align_spin;
8499 GtkWidget *y_align_spin;
8500 GtkWidget *step_spin;
8501 GtkWidget *act_blocks_spin;
8512 progress_timeout (gpointer data)
8514 ProgressData *pdata = data;
8518 if (pdata->activity)
8520 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8522 text = g_strdup_printf ("%s", "???");
8526 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8529 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8531 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8534 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8541 destroy_progress (GtkWidget *widget,
8542 ProgressData **pdata)
8544 g_source_remove ((*pdata)->timer);
8545 (*pdata)->timer = 0;
8546 (*pdata)->window = NULL;
8552 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8554 ProgressData *pdata;
8557 pdata = (ProgressData *) data;
8559 if (!gtk_widget_get_mapped (widget))
8562 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8564 if (i == 0 || i == 1)
8565 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8567 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8569 if (i == 1 || i == 2)
8570 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8572 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8576 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8580 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8581 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8585 progressbar_toggle_ellipsize (GtkWidget *widget,
8588 ProgressData *pdata = data;
8589 if (gtk_widget_is_drawable (widget))
8591 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8592 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8597 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8599 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8603 entry_changed (GtkWidget *widget, ProgressData *pdata)
8605 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8606 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8610 create_progress_bar (GtkWidget *widget)
8612 GtkWidget *action_area, *content_area;
8622 static ProgressData *pdata = NULL;
8624 static gchar *items1[] =
8632 static char *ellipsize_items[] = {
8633 "None", // PANGO_ELLIPSIZE_NONE,
8634 "Start", // PANGO_ELLIPSIZE_START,
8635 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8636 "End", // PANGO_ELLIPSIZE_END
8640 pdata = g_new0 (ProgressData, 1);
8644 pdata->window = gtk_dialog_new ();
8646 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8647 gtk_widget_get_screen (widget));
8649 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8651 g_signal_connect (pdata->window, "destroy",
8652 G_CALLBACK (destroy_progress),
8656 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8657 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8659 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8660 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8662 vbox = gtk_vbox_new (FALSE, 5);
8663 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8664 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8666 frame = gtk_frame_new ("Progress");
8667 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8669 vbox2 = gtk_vbox_new (FALSE, 5);
8670 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8672 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8673 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8675 pdata->pbar = gtk_progress_bar_new ();
8676 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8677 PANGO_ELLIPSIZE_MIDDLE);
8679 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8680 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8682 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8683 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8685 hbox = gtk_hbox_new (FALSE, 5);
8686 gtk_container_add (GTK_CONTAINER (align), hbox);
8687 label = gtk_label_new ("Label updated by user :");
8688 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8689 pdata->label = gtk_label_new ("");
8690 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8692 frame = gtk_frame_new ("Options");
8693 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8695 vbox2 = gtk_vbox_new (FALSE, 5);
8696 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8698 tab = gtk_table_new (7, 2, FALSE);
8699 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8701 label = gtk_label_new ("Orientation :");
8702 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8703 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8705 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8707 pdata->omenu1 = build_option_menu (items1, 4, 0,
8708 progressbar_toggle_orientation,
8710 hbox = gtk_hbox_new (FALSE, 0);
8711 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8712 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8714 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8716 check = gtk_check_button_new_with_label ("Show text");
8717 g_signal_connect (check, "clicked",
8718 G_CALLBACK (toggle_show_text),
8720 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
8721 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8724 hbox = gtk_hbox_new (FALSE, 0);
8725 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
8726 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8729 label = gtk_label_new ("Text: ");
8730 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8732 pdata->entry = gtk_entry_new ();
8733 g_signal_connect (pdata->entry, "changed",
8734 G_CALLBACK (entry_changed),
8736 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8737 gtk_widget_set_size_request (pdata->entry, 100, -1);
8739 label = gtk_label_new ("Ellipsize text :");
8740 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8741 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8743 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8744 pdata->elmenu = build_option_menu (ellipsize_items,
8745 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8746 2, // PANGO_ELLIPSIZE_MIDDLE
8747 progressbar_toggle_ellipsize,
8749 hbox = gtk_hbox_new (FALSE, 0);
8750 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8751 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8753 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8755 check = gtk_check_button_new_with_label ("Activity mode");
8756 g_signal_connect (check, "clicked",
8757 G_CALLBACK (toggle_activity_mode), pdata);
8758 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8759 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8762 button = gtk_button_new_with_label ("close");
8763 g_signal_connect_swapped (button, "clicked",
8764 G_CALLBACK (gtk_widget_destroy),
8766 gtk_widget_set_can_default (button, TRUE);
8767 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8768 gtk_widget_grab_default (button);
8771 if (!gtk_widget_get_visible (pdata->window))
8772 gtk_widget_show_all (pdata->window);
8774 gtk_widget_destroy (pdata->window);
8786 GtkWidget *res_widget;
8790 find_widget (GtkWidget *widget, FindWidgetData *data)
8792 GtkAllocation new_allocation;
8796 gtk_widget_get_allocation (widget, &new_allocation);
8798 if (data->found || !gtk_widget_get_mapped (widget))
8801 /* Note that in the following code, we only count the
8802 * position as being inside a WINDOW widget if it is inside
8803 * widget->window; points that are outside of widget->window
8804 * but within the allocation are not counted. This is consistent
8805 * with the way we highlight drag targets.
8807 if (gtk_widget_get_has_window (widget))
8809 new_allocation.x = 0;
8810 new_allocation.y = 0;
8813 if (gtk_widget_get_parent (widget) && !data->first)
8815 GdkWindow *window = gtk_widget_get_window (widget);
8816 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8818 gint tx, ty, twidth, theight;
8819 gdk_drawable_get_size (window, &twidth, &theight);
8821 if (new_allocation.x < 0)
8823 new_allocation.width += new_allocation.x;
8824 new_allocation.x = 0;
8826 if (new_allocation.y < 0)
8828 new_allocation.height += new_allocation.y;
8829 new_allocation.y = 0;
8831 if (new_allocation.x + new_allocation.width > twidth)
8832 new_allocation.width = twidth - new_allocation.x;
8833 if (new_allocation.y + new_allocation.height > theight)
8834 new_allocation.height = theight - new_allocation.y;
8836 gdk_window_get_position (window, &tx, &ty);
8837 new_allocation.x += tx;
8839 new_allocation.y += ty;
8842 window = gdk_window_get_parent (window);
8846 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8847 (data->x < new_allocation.x + new_allocation.width) &&
8848 (data->y < new_allocation.y + new_allocation.height))
8850 /* First, check if the drag is in a valid drop site in
8851 * one of our children
8853 if (GTK_IS_CONTAINER (widget))
8855 FindWidgetData new_data = *data;
8857 new_data.x -= x_offset;
8858 new_data.y -= y_offset;
8859 new_data.found = FALSE;
8860 new_data.first = FALSE;
8862 gtk_container_forall (GTK_CONTAINER (widget),
8863 (GtkCallback)find_widget,
8866 data->found = new_data.found;
8868 data->res_widget = new_data.res_widget;
8871 /* If not, and this widget is registered as a drop site, check to
8872 * emit "drag_motion" to check if we are actually in
8878 data->res_widget = widget;
8884 find_widget_at_pointer (GdkDisplay *display)
8886 GtkWidget *widget = NULL;
8887 GdkWindow *pointer_window;
8889 FindWidgetData data;
8891 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
8895 gpointer widget_ptr;
8897 gdk_window_get_user_data (pointer_window, &widget_ptr);
8898 widget = widget_ptr;
8903 gdk_window_get_pointer (gtk_widget_get_window (widget),
8911 find_widget (widget, &data);
8913 return data.res_widget;
8919 struct PropertiesData {
8927 destroy_properties (GtkWidget *widget,
8928 struct PropertiesData *data)
8932 *data->window = NULL;
8933 data->window = NULL;
8938 gdk_cursor_unref (data->cursor);
8939 data->cursor = NULL;
8944 g_signal_handler_disconnect (widget, data->handler);
8952 property_query_event (GtkWidget *widget,
8954 struct PropertiesData *data)
8956 GtkWidget *res_widget = NULL;
8958 if (!data->in_query)
8961 if (event->type == GDK_BUTTON_RELEASE)
8963 gtk_grab_remove (widget);
8964 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8967 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8970 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8971 gtk_widget_get_screen (widget));
8972 create_prop_editor (G_OBJECT (res_widget), 0);
8975 data->in_query = FALSE;
8982 query_properties (GtkButton *button,
8983 struct PropertiesData *data)
8985 GtkWidget *widget = GTK_WIDGET (button);
8988 g_signal_connect (button, "event",
8989 G_CALLBACK (property_query_event), data);
8993 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8996 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
8998 GDK_BUTTON_RELEASE_MASK,
9003 gtk_grab_add (widget);
9005 data->in_query = TRUE;
9009 create_properties (GtkWidget *widget)
9011 static GtkWidget *window = NULL;
9015 struct PropertiesData *data;
9017 data = g_new (struct PropertiesData, 1);
9018 data->window = &window;
9019 data->in_query = FALSE;
9020 data->cursor = NULL;
9025 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9027 gtk_window_set_screen (GTK_WINDOW (window),
9028 gtk_widget_get_screen (widget));
9030 data->handler = g_signal_connect (window, "destroy",
9031 G_CALLBACK (destroy_properties),
9034 gtk_window_set_title (GTK_WINDOW (window), "test properties");
9035 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9037 vbox = gtk_vbox_new (FALSE, 1);
9038 gtk_container_add (GTK_CONTAINER (window), vbox);
9040 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9041 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9043 button = gtk_button_new_with_label ("Query properties");
9044 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9045 g_signal_connect (button, "clicked",
9046 G_CALLBACK (query_properties),
9050 if (!gtk_widget_get_visible (window))
9051 gtk_widget_show_all (window);
9053 gtk_widget_destroy (window);
9057 struct SnapshotData {
9058 GtkWidget *toplevel_button;
9062 gboolean is_toplevel;
9067 destroy_snapshot_data (GtkWidget *widget,
9068 struct SnapshotData *data)
9071 *data->window = NULL;
9075 gdk_cursor_unref (data->cursor);
9076 data->cursor = NULL;
9081 g_signal_handler_disconnect (widget, data->handler);
9089 snapshot_widget_event (GtkWidget *widget,
9091 struct SnapshotData *data)
9093 GtkWidget *res_widget = NULL;
9095 if (!data->in_query)
9098 if (event->type == GDK_BUTTON_RELEASE)
9100 gtk_grab_remove (widget);
9101 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9104 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9105 if (data->is_toplevel && res_widget)
9106 res_widget = gtk_widget_get_toplevel (res_widget);
9110 GtkWidget *window, *image;
9112 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9113 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9114 gtk_widget_realize (window);
9115 if (gdk_drawable_get_depth (gtk_widget_get_window (window)) != gdk_drawable_get_depth (pixmap))
9117 /* this branch is needed to convert ARGB -> RGB */
9120 gdk_drawable_get_size (pixmap, &width, &height);
9121 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9122 gtk_widget_get_colormap (res_widget),
9126 image = gtk_image_new_from_pixbuf (pixbuf);
9127 g_object_unref (pixbuf);
9130 image = gtk_image_new_from_pixmap (pixmap, NULL);
9131 gtk_container_add (GTK_CONTAINER (window), image);
9132 g_object_unref (pixmap);
9133 gtk_widget_show_all (window);
9136 data->in_query = FALSE;
9143 snapshot_widget (GtkButton *button,
9144 struct SnapshotData *data)
9146 GtkWidget *widget = GTK_WIDGET (button);
9149 g_signal_connect (button, "event",
9150 G_CALLBACK (snapshot_widget_event), data);
9152 data->is_toplevel = widget == data->toplevel_button;
9155 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
9158 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
9160 GDK_BUTTON_RELEASE_MASK,
9165 gtk_grab_add (widget);
9167 data->in_query = TRUE;
9171 create_snapshot (GtkWidget *widget)
9173 static GtkWidget *window = NULL;
9176 struct SnapshotData *data;
9178 data = g_new (struct SnapshotData, 1);
9179 data->window = &window;
9180 data->in_query = FALSE;
9181 data->cursor = NULL;
9186 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9188 gtk_window_set_screen (GTK_WINDOW (window),
9189 gtk_widget_get_screen (widget));
9191 data->handler = g_signal_connect (window, "destroy",
9192 G_CALLBACK (destroy_snapshot_data),
9195 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9196 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9198 vbox = gtk_vbox_new (FALSE, 1);
9199 gtk_container_add (GTK_CONTAINER (window), vbox);
9201 button = gtk_button_new_with_label ("Snapshot widget");
9202 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9203 g_signal_connect (button, "clicked",
9204 G_CALLBACK (snapshot_widget),
9207 button = gtk_button_new_with_label ("Snapshot toplevel");
9208 data->toplevel_button = button;
9209 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9210 g_signal_connect (button, "clicked",
9211 G_CALLBACK (snapshot_widget),
9215 if (!gtk_widget_get_visible (window))
9216 gtk_widget_show_all (window);
9218 gtk_widget_destroy (window);
9227 selection_test_received (GtkWidget *tree_view,
9228 GtkSelectionData *data)
9230 GtkTreeModel *model;
9231 GtkListStore *store;
9235 if (data->length < 0)
9237 g_print ("Selection retrieval failed\n");
9240 if (data->type != GDK_SELECTION_TYPE_ATOM)
9242 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9246 /* Clear out any current list items */
9248 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9249 store = GTK_LIST_STORE (model);
9250 gtk_list_store_clear (store);
9252 /* Add new items to list */
9254 atoms = (GdkAtom *)data->data;
9256 l = data->length / sizeof (GdkAtom);
9257 for (i = 0; i < l; i++)
9262 name = gdk_atom_name (atoms[i]);
9265 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9269 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9276 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9278 static GdkAtom targets_atom = GDK_NONE;
9280 if (targets_atom == GDK_NONE)
9281 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9283 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9288 create_selection_test (GtkWidget *widget)
9290 static GtkWidget *window = NULL;
9291 GtkWidget *action_area, *content_area;
9294 GtkWidget *scrolled_win;
9295 GtkListStore* store;
9296 GtkWidget *tree_view;
9297 GtkTreeViewColumn *column;
9298 GtkCellRenderer *renderer;
9303 window = gtk_dialog_new ();
9305 gtk_window_set_screen (GTK_WINDOW (window),
9306 gtk_widget_get_screen (widget));
9308 g_signal_connect (window, "destroy",
9309 G_CALLBACK (gtk_widget_destroyed),
9312 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9313 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9315 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9316 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9318 /* Create the list */
9320 vbox = gtk_vbox_new (FALSE, 5);
9321 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9322 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9324 label = gtk_label_new ("Gets available targets for current selection");
9325 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9327 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9328 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9329 GTK_POLICY_AUTOMATIC,
9330 GTK_POLICY_AUTOMATIC);
9331 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9332 gtk_widget_set_size_request (scrolled_win, 100, 200);
9334 store = gtk_list_store_new (1, G_TYPE_STRING);
9335 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9336 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9338 renderer = gtk_cell_renderer_text_new ();
9339 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9341 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9343 g_signal_connect (tree_view, "selection_received",
9344 G_CALLBACK (selection_test_received), NULL);
9346 /* .. And create some buttons */
9347 button = gtk_button_new_with_label ("Get Targets");
9348 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9350 g_signal_connect (button, "clicked",
9351 G_CALLBACK (selection_test_get_targets), tree_view);
9353 button = gtk_button_new_with_label ("Quit");
9354 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9356 g_signal_connect_swapped (button, "clicked",
9357 G_CALLBACK (gtk_widget_destroy),
9361 if (!gtk_widget_get_visible (window))
9362 gtk_widget_show_all (window);
9364 gtk_widget_destroy (window);
9371 static int scroll_test_pos = 0.0;
9374 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9379 gint imin, imax, jmin, jmax;
9382 imin = (event->area.x) / 10;
9383 imax = (event->area.x + event->area.width + 9) / 10;
9385 jmin = ((int)adj->value + event->area.y) / 10;
9386 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9388 window = gtk_widget_get_window (widget);
9390 gdk_window_clear_area (window,
9391 event->area.x, event->area.y,
9392 event->area.width, event->area.height);
9394 cr = gdk_cairo_create (window);
9396 for (i=imin; i<imax; i++)
9397 for (j=jmin; j<jmax; j++)
9399 cairo_rectangle (cr, 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9409 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9412 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9413 -adj->page_increment / 2:
9414 adj->page_increment / 2);
9415 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9416 gtk_adjustment_set_value (adj, new_value);
9422 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9425 GtkAllocation allocation;
9427 gtk_widget_get_allocation (widget, &allocation);
9428 adj->page_increment = 0.9 * allocation.height;
9429 adj->page_size = allocation.height;
9431 g_signal_emit_by_name (adj, "changed");
9435 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9440 dy = scroll_test_pos - (int)adj->value;
9441 scroll_test_pos = adj->value;
9443 if (!gtk_widget_is_drawable (widget))
9446 window = gtk_widget_get_window (widget);
9447 gdk_window_scroll (window, 0, dy);
9448 gdk_window_process_updates (window, FALSE);
9453 create_scroll_test (GtkWidget *widget)
9455 static GtkWidget *window = NULL;
9456 GtkWidget *action_area, *content_area;
9458 GtkWidget *drawing_area;
9459 GtkWidget *scrollbar;
9462 GdkGeometry geometry;
9463 GdkWindowHints geometry_mask;
9467 window = gtk_dialog_new ();
9469 gtk_window_set_screen (GTK_WINDOW (window),
9470 gtk_widget_get_screen (widget));
9472 g_signal_connect (window, "destroy",
9473 G_CALLBACK (gtk_widget_destroyed),
9476 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9477 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9479 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9480 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9482 hbox = gtk_hbox_new (FALSE, 0);
9483 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9484 gtk_widget_show (hbox);
9486 drawing_area = gtk_drawing_area_new ();
9487 gtk_widget_set_size_request (drawing_area, 200, 200);
9488 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9489 gtk_widget_show (drawing_area);
9491 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9493 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9494 scroll_test_pos = 0.0;
9496 scrollbar = gtk_vscrollbar_new (adj);
9497 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9498 gtk_widget_show (scrollbar);
9500 g_signal_connect (drawing_area, "expose_event",
9501 G_CALLBACK (scroll_test_expose), adj);
9502 g_signal_connect (drawing_area, "configure_event",
9503 G_CALLBACK (scroll_test_configure), adj);
9504 g_signal_connect (drawing_area, "scroll_event",
9505 G_CALLBACK (scroll_test_scroll), adj);
9507 g_signal_connect (adj, "value_changed",
9508 G_CALLBACK (scroll_test_adjustment_changed),
9511 /* .. And create some buttons */
9513 button = gtk_button_new_with_label ("Quit");
9514 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9516 g_signal_connect_swapped (button, "clicked",
9517 G_CALLBACK (gtk_widget_destroy),
9519 gtk_widget_show (button);
9521 /* Set up gridded geometry */
9523 geometry_mask = GDK_HINT_MIN_SIZE |
9524 GDK_HINT_BASE_SIZE |
9525 GDK_HINT_RESIZE_INC;
9527 geometry.min_width = 20;
9528 geometry.min_height = 20;
9529 geometry.base_width = 0;
9530 geometry.base_height = 0;
9531 geometry.width_inc = 10;
9532 geometry.height_inc = 10;
9534 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9535 drawing_area, &geometry, geometry_mask);
9538 if (!gtk_widget_get_visible (window))
9539 gtk_widget_show (window);
9541 gtk_widget_destroy (window);
9548 static int timer = 0;
9551 timeout_test (GtkWidget *label)
9553 static int count = 0;
9554 static char buffer[32];
9556 sprintf (buffer, "count: %d", ++count);
9557 gtk_label_set_text (GTK_LABEL (label), buffer);
9563 start_timeout_test (GtkWidget *widget,
9568 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9573 stop_timeout_test (GtkWidget *widget,
9578 g_source_remove (timer);
9584 destroy_timeout_test (GtkWidget *widget,
9587 stop_timeout_test (NULL, NULL);
9593 create_timeout_test (GtkWidget *widget)
9595 static GtkWidget *window = NULL;
9596 GtkWidget *action_area, *content_area;
9602 window = gtk_dialog_new ();
9604 gtk_window_set_screen (GTK_WINDOW (window),
9605 gtk_widget_get_screen (widget));
9607 g_signal_connect (window, "destroy",
9608 G_CALLBACK (destroy_timeout_test),
9611 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9612 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9614 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9615 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9617 label = gtk_label_new ("count: 0");
9618 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9619 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9620 gtk_widget_show (label);
9622 button = gtk_button_new_with_label ("close");
9623 g_signal_connect_swapped (button, "clicked",
9624 G_CALLBACK (gtk_widget_destroy),
9626 gtk_widget_set_can_default (button, TRUE);
9627 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9628 gtk_widget_grab_default (button);
9629 gtk_widget_show (button);
9631 button = gtk_button_new_with_label ("start");
9632 g_signal_connect (button, "clicked",
9633 G_CALLBACK(start_timeout_test),
9635 gtk_widget_set_can_default (button, TRUE);
9636 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9637 gtk_widget_show (button);
9639 button = gtk_button_new_with_label ("stop");
9640 g_signal_connect (button, "clicked",
9641 G_CALLBACK (stop_timeout_test),
9643 gtk_widget_set_can_default (button, TRUE);
9644 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9645 gtk_widget_show (button);
9648 if (!gtk_widget_get_visible (window))
9649 gtk_widget_show (window);
9651 gtk_widget_destroy (window);
9658 static int idle_id = 0;
9661 idle_test (GtkWidget *label)
9663 static int count = 0;
9664 static char buffer[32];
9666 sprintf (buffer, "count: %d", ++count);
9667 gtk_label_set_text (GTK_LABEL (label), buffer);
9673 start_idle_test (GtkWidget *widget,
9678 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9683 stop_idle_test (GtkWidget *widget,
9688 g_source_remove (idle_id);
9694 destroy_idle_test (GtkWidget *widget,
9697 stop_idle_test (NULL, NULL);
9703 toggle_idle_container (GObject *button,
9704 GtkContainer *container)
9706 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9710 create_idle_test (GtkWidget *widget)
9712 static GtkWidget *window = NULL;
9715 GtkWidget *container;
9719 GtkWidget *action_area, *content_area;
9724 window = gtk_dialog_new ();
9726 gtk_window_set_screen (GTK_WINDOW (window),
9727 gtk_widget_get_screen (widget));
9729 g_signal_connect (window, "destroy",
9730 G_CALLBACK (destroy_idle_test),
9733 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9734 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9736 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9737 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9739 label = gtk_label_new ("count: 0");
9740 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9741 gtk_widget_show (label);
9744 g_object_new (GTK_TYPE_HBOX,
9746 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9747 * "GtkWidget::visible", TRUE,
9752 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9755 g_object_new (GTK_TYPE_FRAME,
9757 "label", "Label Container",
9759 "parent", content_area,
9762 g_object_new (GTK_TYPE_VBOX,
9767 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9768 "label", "Resize-Parent",
9769 "user_data", (void*)GTK_RESIZE_PARENT,
9773 "signal::clicked", toggle_idle_container, container,
9775 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9776 "label", "Resize-Queue",
9777 "user_data", (void*)GTK_RESIZE_QUEUE,
9782 g_object_connect (button,
9783 "signal::clicked", toggle_idle_container, container,
9785 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9786 "label", "Resize-Immediate",
9787 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9789 g_object_connect (button2,
9790 "signal::clicked", toggle_idle_container, container,
9792 g_object_set (button2,
9798 button = gtk_button_new_with_label ("close");
9799 g_signal_connect_swapped (button, "clicked",
9800 G_CALLBACK (gtk_widget_destroy),
9802 gtk_widget_set_can_default (button, TRUE);
9803 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9804 gtk_widget_grab_default (button);
9805 gtk_widget_show (button);
9807 button = gtk_button_new_with_label ("start");
9808 g_signal_connect (button, "clicked",
9809 G_CALLBACK (start_idle_test),
9811 gtk_widget_set_can_default (button, TRUE);
9812 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9813 gtk_widget_show (button);
9815 button = gtk_button_new_with_label ("stop");
9816 g_signal_connect (button, "clicked",
9817 G_CALLBACK (stop_idle_test),
9819 gtk_widget_set_can_default (button, TRUE);
9820 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9821 gtk_widget_show (button);
9824 if (!gtk_widget_get_visible (window))
9825 gtk_widget_show (window);
9827 gtk_widget_destroy (window);
9835 reload_all_rc_files (void)
9837 static GdkAtom atom_rcfiles = GDK_NONE;
9839 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
9843 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
9845 for(i = 0; i < 5; i++)
9846 send_event->client.data.l[i] = 0;
9847 send_event->client.data_format = 32;
9848 send_event->client.message_type = atom_rcfiles;
9849 gdk_event_send_clientmessage_toall (send_event);
9851 gdk_event_free (send_event);
9855 create_rc_file (GtkWidget *widget)
9857 static GtkWidget *window = NULL;
9858 GtkWidget *action_area, *content_area;
9866 window = gtk_dialog_new ();
9868 gtk_window_set_screen (GTK_WINDOW (window),
9869 gtk_widget_get_screen (widget));
9871 g_signal_connect (window, "destroy",
9872 G_CALLBACK (gtk_widget_destroyed),
9875 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9876 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9878 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9879 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9881 vbox = gtk_vbox_new (FALSE, 0);
9882 gtk_container_add (GTK_CONTAINER (frame), vbox);
9884 label = gtk_label_new ("This label should be red");
9885 gtk_widget_set_name (label, "testgtk-red-label");
9886 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9888 label = gtk_label_new ("This label should be green");
9889 gtk_widget_set_name (label, "testgtk-green-label");
9890 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9892 label = gtk_label_new ("This label should be blue");
9893 gtk_widget_set_name (label, "testgtk-blue-label");
9894 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9896 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9897 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9899 button = gtk_button_new_with_label ("Reload");
9900 g_signal_connect (button, "clicked",
9901 G_CALLBACK (gtk_rc_reparse_all), NULL);
9902 gtk_widget_set_can_default (button, TRUE);
9903 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9904 gtk_widget_grab_default (button);
9906 button = gtk_button_new_with_label ("Reload All");
9907 g_signal_connect (button, "clicked",
9908 G_CALLBACK (reload_all_rc_files), NULL);
9909 gtk_widget_set_can_default (button, TRUE);
9910 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9912 button = gtk_button_new_with_label ("Close");
9913 g_signal_connect_swapped (button, "clicked",
9914 G_CALLBACK (gtk_widget_destroy),
9916 gtk_widget_set_can_default (button, TRUE);
9917 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9920 if (!gtk_widget_get_visible (window))
9921 gtk_widget_show_all (window);
9923 gtk_widget_destroy (window);
9927 * Test of recursive mainloop
9931 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9938 create_mainloop (GtkWidget *widget)
9940 static GtkWidget *window = NULL;
9941 GtkWidget *action_area, *content_area;
9947 window = gtk_dialog_new ();
9949 gtk_window_set_screen (GTK_WINDOW (window),
9950 gtk_widget_get_screen (widget));
9952 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9954 g_signal_connect (window, "destroy",
9955 G_CALLBACK (mainloop_destroyed),
9958 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9959 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9961 label = gtk_label_new ("In recursive main loop...");
9962 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9964 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9965 gtk_widget_show (label);
9967 button = gtk_button_new_with_label ("Leave");
9968 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9970 g_signal_connect_swapped (button, "clicked",
9971 G_CALLBACK (gtk_widget_destroy),
9974 gtk_widget_set_can_default (button, TRUE);
9975 gtk_widget_grab_default (button);
9977 gtk_widget_show (button);
9980 if (!gtk_widget_get_visible (window))
9982 gtk_widget_show (window);
9984 g_print ("create_mainloop: start\n");
9986 g_print ("create_mainloop: done\n");
9989 gtk_widget_destroy (window);
9993 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
9996 GdkWindow *bin_window;
10000 gint imin, imax, jmin, jmax;
10002 layout = GTK_LAYOUT (widget);
10003 bin_window = gtk_layout_get_bin_window (layout);
10005 if (event->window != bin_window)
10008 imin = (event->area.x) / 10;
10009 imax = (event->area.x + event->area.width + 9) / 10;
10011 jmin = (event->area.y) / 10;
10012 jmax = (event->area.y + event->area.height + 9) / 10;
10014 cr = gdk_cairo_create (bin_window);
10016 for (i=imin; i<imax; i++)
10017 for (j=jmin; j<jmax; j++)
10019 cairo_rectangle (cr,
10025 cairo_destroy (cr);
10030 void create_layout (GtkWidget *widget)
10032 GtkAdjustment *hadjustment, *vadjustment;
10034 static GtkWidget *window = NULL;
10035 GtkWidget *layout_widget;
10036 GtkWidget *scrolledwindow;
10045 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10046 gtk_window_set_screen (GTK_WINDOW (window),
10047 gtk_widget_get_screen (widget));
10049 g_signal_connect (window, "destroy",
10050 G_CALLBACK (gtk_widget_destroyed),
10053 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10054 gtk_widget_set_size_request (window, 200, 200);
10056 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10057 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10059 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10060 GTK_CORNER_TOP_RIGHT);
10062 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10064 layout_widget = gtk_layout_new (NULL, NULL);
10065 layout = GTK_LAYOUT (layout_widget);
10066 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
10068 /* We set step sizes here since GtkLayout does not set
10071 hadjustment = gtk_layout_get_hadjustment (layout);
10072 vadjustment = gtk_layout_get_vadjustment (layout);
10073 gtk_adjustment_set_step_increment (hadjustment, 10.0);
10074 gtk_adjustment_set_step_increment (vadjustment, 10.0);
10075 gtk_layout_set_hadjustment (layout, hadjustment);
10076 gtk_layout_set_vadjustment (layout, vadjustment);
10078 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
10079 g_signal_connect (layout, "expose_event",
10080 G_CALLBACK (layout_expose_handler), NULL);
10082 gtk_layout_set_size (layout, 1600, 128000);
10084 for (i=0 ; i < 16 ; i++)
10085 for (j=0 ; j < 16 ; j++)
10087 sprintf(buf, "Button %d, %d", i, j);
10089 button = gtk_button_new_with_label (buf);
10091 button = gtk_label_new (buf);
10093 gtk_layout_put (layout, button, j*100, i*100);
10096 for (i=16; i < 1280; i++)
10098 sprintf(buf, "Button %d, %d", i, 0);
10100 button = gtk_button_new_with_label (buf);
10102 button = gtk_label_new (buf);
10104 gtk_layout_put (layout, button, 0, i*100);
10108 if (!gtk_widget_get_visible (window))
10109 gtk_widget_show_all (window);
10111 gtk_widget_destroy (window);
10115 create_styles (GtkWidget *widget)
10117 static GtkWidget *window = NULL;
10118 GtkWidget *content_area, *action_area;
10123 static GdkColor red = { 0, 0xffff, 0, 0 };
10124 static GdkColor green = { 0, 0, 0xffff, 0 };
10125 static GdkColor blue = { 0, 0, 0, 0xffff };
10126 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10127 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10128 PangoFontDescription *font_desc;
10130 GtkRcStyle *rc_style;
10134 window = gtk_dialog_new ();
10135 gtk_window_set_screen (GTK_WINDOW (window),
10136 gtk_widget_get_screen (widget));
10138 g_signal_connect (window, "destroy",
10139 G_CALLBACK (gtk_widget_destroyed),
10142 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10143 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10145 button = gtk_button_new_with_label ("Close");
10146 g_signal_connect_swapped (button, "clicked",
10147 G_CALLBACK (gtk_widget_destroy),
10149 gtk_widget_set_can_default (button, TRUE);
10150 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10151 gtk_widget_show (button);
10153 vbox = gtk_vbox_new (FALSE, 5);
10154 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10155 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
10157 label = gtk_label_new ("Font:");
10158 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10159 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10161 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10163 button = gtk_button_new_with_label ("Some Text");
10164 gtk_widget_modify_font (gtk_bin_get_child (GTK_BIN (button)),
10166 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10168 label = gtk_label_new ("Foreground:");
10169 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10170 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10172 button = gtk_button_new_with_label ("Some Text");
10173 gtk_widget_modify_fg (gtk_bin_get_child (GTK_BIN (button)),
10174 GTK_STATE_NORMAL, &red);
10175 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10177 label = gtk_label_new ("Background:");
10178 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10179 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10181 button = gtk_button_new_with_label ("Some Text");
10182 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10183 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10185 label = gtk_label_new ("Text:");
10186 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10187 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10189 entry = gtk_entry_new ();
10190 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10191 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10192 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10194 label = gtk_label_new ("Base:");
10195 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10196 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10198 entry = gtk_entry_new ();
10199 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10200 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10201 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10203 label = gtk_label_new ("Cursor:");
10204 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10205 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10207 entry = gtk_entry_new ();
10208 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10209 gtk_widget_modify_cursor (entry, &red, &red);
10210 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10212 label = gtk_label_new ("Multiple:");
10213 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10214 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10216 button = gtk_button_new_with_label ("Some Text");
10218 rc_style = gtk_rc_style_new ();
10220 rc_style->font_desc = pango_font_description_copy (font_desc);
10221 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10222 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10223 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10224 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10225 rc_style->bg[GTK_STATE_NORMAL] = blue;
10226 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10227 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10228 rc_style->fg[GTK_STATE_ACTIVE] = red;
10229 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10230 rc_style->xthickness = 5;
10231 rc_style->ythickness = 5;
10233 gtk_widget_modify_style (button, rc_style);
10234 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
10236 g_object_unref (rc_style);
10238 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10241 if (!gtk_widget_get_visible (window))
10242 gtk_widget_show_all (window);
10244 gtk_widget_destroy (window);
10248 * Main Window and Exit
10252 do_exit (GtkWidget *widget, GtkWidget *window)
10254 gtk_widget_destroy (window);
10260 void (*func) (GtkWidget *widget);
10261 gboolean do_not_benchmark;
10264 { "alpha window", create_alpha_window },
10265 { "big windows", create_big_windows },
10266 { "button box", create_button_box },
10267 { "buttons", create_buttons },
10268 { "check buttons", create_check_buttons },
10269 { "color selection", create_color_selection },
10270 { "composited window", create_composited_window },
10271 { "cursors", create_cursors },
10272 { "dialog", create_dialog },
10273 { "display & screen", create_display_screen, TRUE },
10274 { "entry", create_entry },
10275 { "event box", create_event_box },
10276 { "event watcher", create_event_watcher },
10277 { "expander", create_expander },
10278 { "flipping", create_flipping },
10279 { "focus", create_focus },
10280 { "font selection", create_font_selection },
10281 { "gridded geometry", create_gridded_geometry },
10282 { "handle box", create_handle_box },
10283 { "image", create_image },
10284 { "key lookup", create_key_lookup },
10285 { "labels", create_labels },
10286 { "layout", create_layout },
10287 { "menus", create_menus },
10288 { "message dialog", create_message_dialog },
10289 { "modal window", create_modal_window, TRUE },
10290 { "notebook", create_notebook },
10291 { "panes", create_panes },
10292 { "paned keyboard", create_paned_keyboard_navigation },
10293 { "pixbuf", create_pixbuf },
10294 { "progress bar", create_progress_bar },
10295 { "properties", create_properties },
10296 { "radio buttons", create_radio_buttons },
10297 { "range controls", create_range_controls },
10298 { "rc file", create_rc_file },
10299 { "reparent", create_reparent },
10300 { "resize grips", create_resize_grips },
10301 { "rotated label", create_rotated_label },
10302 { "rotated text", create_rotated_text },
10303 { "rulers", create_rulers },
10304 { "saved position", create_saved_position },
10305 { "scrolled windows", create_scrolled_windows },
10306 { "shapes", create_shapes },
10307 { "size groups", create_size_groups },
10308 { "snapshot", create_snapshot },
10309 { "spinbutton", create_spins },
10310 { "statusbar", create_statusbar },
10311 { "styles", create_styles },
10312 { "test idle", create_idle_test },
10313 { "test mainloop", create_mainloop, TRUE },
10314 { "test scrolling", create_scroll_test },
10315 { "test selection", create_selection_test },
10316 { "test timeout", create_timeout_test },
10317 { "toggle buttons", create_toggle_buttons },
10318 { "toolbar", create_toolbar },
10319 { "tooltips", create_tooltips },
10320 { "WM hints", create_wmhints },
10321 { "window sizing", create_window_sizing },
10322 { "window states", create_window_states }
10324 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10327 create_main_window (void)
10332 GtkWidget *scrolled_window;
10336 GtkWidget *separator;
10337 GdkGeometry geometry;
10340 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10341 gtk_widget_set_name (window, "main window");
10342 gtk_window_move (GTK_WINDOW (window), 50, 20);
10343 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10345 geometry.min_width = -1;
10346 geometry.min_height = -1;
10347 geometry.max_width = -1;
10348 geometry.max_height = G_MAXSHORT;
10349 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10351 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10353 g_signal_connect (window, "destroy",
10354 G_CALLBACK (gtk_main_quit),
10356 g_signal_connect (window, "delete-event",
10357 G_CALLBACK (gtk_false),
10360 box1 = gtk_vbox_new (FALSE, 0);
10361 gtk_container_add (GTK_CONTAINER (window), box1);
10363 if (gtk_micro_version > 0)
10368 gtk_micro_version);
10373 gtk_minor_version);
10375 label = gtk_label_new (buffer);
10376 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10377 gtk_widget_set_name (label, "testgtk-version-label");
10379 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10380 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10381 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10383 GTK_POLICY_AUTOMATIC);
10384 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10386 box2 = gtk_vbox_new (FALSE, 0);
10387 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10388 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10389 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10390 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10391 gtk_widget_show (box2);
10393 for (i = 0; i < nbuttons; i++)
10395 button = gtk_button_new_with_label (buttons[i].label);
10396 if (buttons[i].func)
10397 g_signal_connect (button,
10399 G_CALLBACK(buttons[i].func),
10402 gtk_widget_set_sensitive (button, FALSE);
10403 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10406 separator = gtk_hseparator_new ();
10407 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10409 box2 = gtk_vbox_new (FALSE, 10);
10410 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10411 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10413 button = gtk_button_new_with_mnemonic ("_Close");
10414 g_signal_connect (button, "clicked",
10415 G_CALLBACK (do_exit),
10417 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10418 gtk_widget_set_can_default (button, TRUE);
10419 gtk_widget_grab_default (button);
10421 gtk_widget_show_all (window);
10427 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10428 G_FILE_TEST_EXISTS))
10430 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10431 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10436 pad (const char *str, int to)
10438 static char buf[256];
10439 int len = strlen (str);
10442 for (i = 0; i < to; i++)
10447 memcpy (buf, str, len);
10453 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10455 fn (widget); /* on */
10456 while (g_main_context_iteration (NULL, FALSE));
10457 fn (widget); /* off */
10458 while (g_main_context_iteration (NULL, FALSE));
10462 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10468 static gboolean printed_headers = FALSE;
10470 if (!printed_headers) {
10471 g_print ("Test Iters First Other\n");
10472 g_print ("-------------------- ----- ---------- ----------\n");
10473 printed_headers = TRUE;
10476 g_get_current_time (&tv0);
10477 bench_iteration (widget, fn);
10478 g_get_current_time (&tv1);
10480 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10481 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10483 g_get_current_time (&tv0);
10484 for (n = 0; n < num - 1; n++)
10485 bench_iteration (widget, fn);
10486 g_get_current_time (&tv1);
10487 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10488 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10490 g_print ("%s %5d ", pad (name, 20), num);
10492 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10494 g_print ("%10.1f\n", dt_first);
10498 do_bench (char* what, int num)
10502 void (* fn) (GtkWidget *widget);
10504 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10506 if (g_ascii_strcasecmp (what, "ALL") == 0)
10508 for (i = 0; i < nbuttons; i++)
10510 if (!buttons[i].do_not_benchmark)
10511 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10518 for (i = 0; i < nbuttons; i++)
10520 if (strcmp (buttons[i].label, what) == 0)
10522 fn = buttons[i].func;
10528 g_print ("Can't bench: \"%s\" not found.\n", what);
10530 do_real_bench (widget, fn, buttons[i].label, num);
10537 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10542 main (int argc, char *argv[])
10544 GtkBindingSet *binding_set;
10546 gboolean done_benchmarks = FALSE;
10548 srand (time (NULL));
10552 /* Check to see if we are being run from the correct
10555 if (file_exists ("testgtkrc"))
10556 gtk_rc_add_default_file ("testgtkrc");
10557 else if (file_exists ("tests/testgtkrc"))
10558 gtk_rc_add_default_file ("tests/testgtkrc");
10560 g_warning ("Couldn't find file \"testgtkrc\".");
10562 g_set_application_name ("GTK+ Test Program");
10564 gtk_init (&argc, &argv);
10566 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10575 for (i = 1; i < argc; i++)
10577 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10584 nextarg = strchr (argv[i], '=');
10595 count = strchr (nextarg, ':');
10598 what = g_strndup (nextarg, count - nextarg);
10600 num = atoi (count);
10605 what = g_strdup (nextarg);
10607 do_bench (what, num ? num : 1);
10608 done_benchmarks = TRUE;
10613 if (done_benchmarks)
10618 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10619 gtk_binding_entry_add_signal (binding_set,
10620 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10623 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10625 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
10629 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
10630 " fg[NORMAL] = \"#ff0000\"\n"
10631 " font = \"Sans 18\"\n"
10633 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
10635 create_main_window ();
10641 while (g_main_context_pending (NULL))
10642 g_main_context_iteration (NULL, FALSE);
10645 while (g_main_context_pending (NULL))
10646 g_main_context_iteration (NULL, FALSE);