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);
5724 create_dialog (GtkWidget *widget)
5726 static GtkWidget *label;
5727 GtkWidget *action_area;
5732 /* This is a terrible example; it's much simpler to create
5733 * dialogs than this. Don't use testgtk for example code,
5737 dialog_window = gtk_dialog_new ();
5738 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5739 gtk_widget_get_screen (widget));
5741 g_signal_connect (dialog_window, "destroy",
5742 G_CALLBACK (gtk_widget_destroyed),
5745 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5747 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5748 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5750 button = gtk_button_new_with_label ("OK");
5751 gtk_widget_set_can_default (button, TRUE);
5752 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5753 gtk_widget_grab_default (button);
5754 gtk_widget_show (button);
5756 button = gtk_button_new_with_label ("Toggle");
5757 g_signal_connect (button, "clicked",
5758 G_CALLBACK (label_toggle),
5760 gtk_widget_set_can_default (button, TRUE);
5761 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5762 gtk_widget_show (button);
5767 if (!gtk_widget_get_visible (dialog_window))
5768 gtk_widget_show (dialog_window);
5770 gtk_widget_destroy (dialog_window);
5773 /* Display & Screen test
5780 GtkWidget *radio_dpy;
5781 GtkWidget *toplevel;
5782 GtkWidget *dialog_window;
5783 } ScreenDisplaySelection;
5786 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5788 const gchar *display_name;
5789 GdkDisplay *display = gtk_widget_get_display (widget);
5791 GdkScreen *new_screen = NULL;
5792 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5794 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5796 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5797 display = gdk_display_open (display_name);
5801 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5802 GTK_DIALOG_DESTROY_WITH_PARENT,
5805 "The display :\n%s\ncannot be opened",
5807 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5808 gtk_widget_show (dialog);
5809 g_signal_connect (dialog, "response",
5810 G_CALLBACK (gtk_widget_destroy),
5815 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5818 gboolean found = FALSE;
5819 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5822 gtk_tree_model_get (model, &iter, 0, &name, -1);
5823 found = !g_ascii_strcasecmp (display_name, name);
5830 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
5831 new_screen = gdk_display_get_default_screen (display);
5836 gint number_of_screens = gdk_display_get_n_screens (display);
5837 gint screen_num = gdk_screen_get_number (current_screen);
5838 if ((screen_num +1) < number_of_screens)
5839 new_screen = gdk_display_get_screen (display, screen_num + 1);
5841 new_screen = gdk_display_get_screen (display, 0);
5846 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5847 gtk_widget_destroy (data->dialog_window);
5852 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5854 gtk_widget_destroy (data);
5858 create_display_screen (GtkWidget *widget)
5860 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5861 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5863 ScreenDisplaySelection *scr_dpy_data;
5864 GdkScreen *screen = gtk_widget_get_screen (widget);
5865 GdkDisplay *display = gdk_screen_get_display (screen);
5867 window = g_object_new (gtk_window_get_type (),
5870 "type", GTK_WINDOW_TOPLEVEL,
5872 "Screen or Display selection",
5873 "border_width", 10, NULL);
5874 g_signal_connect (window, "destroy",
5875 G_CALLBACK (gtk_widget_destroy), NULL);
5877 vbox = gtk_vbox_new (FALSE, 3);
5878 gtk_container_add (GTK_CONTAINER (window), vbox);
5880 frame = gtk_frame_new ("Select screen or display");
5881 gtk_container_add (GTK_CONTAINER (vbox), frame);
5883 table = gtk_table_new (2, 2, TRUE);
5884 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5885 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5887 gtk_container_add (GTK_CONTAINER (frame), table);
5889 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5890 if (gdk_display_get_n_screens(display) > 1)
5891 radio_scr = gtk_radio_button_new_with_label
5892 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5895 radio_scr = gtk_radio_button_new_with_label
5896 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5897 "only one screen on the current display");
5898 gtk_widget_set_sensitive (radio_scr, FALSE);
5900 combo_dpy = gtk_combo_box_new_text ();
5901 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
5902 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5903 "<hostname>:<X Server Num>.<Screen Num>");
5905 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5906 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5907 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5909 bbox = gtk_hbutton_box_new ();
5910 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5911 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5913 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5915 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5916 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5918 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5920 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5921 scr_dpy_data->radio_dpy = radio_dpy;
5922 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5923 scr_dpy_data->dialog_window = window;
5925 g_signal_connect (cancelb, "clicked",
5926 G_CALLBACK (screen_display_destroy_diag), window);
5927 g_signal_connect (applyb, "clicked",
5928 G_CALLBACK (screen_display_check), scr_dpy_data);
5929 gtk_widget_show_all (window);
5934 static gboolean event_watcher_enter_id = 0;
5935 static gboolean event_watcher_leave_id = 0;
5938 event_watcher (GSignalInvocationHint *ihint,
5939 guint n_param_values,
5940 const GValue *param_values,
5943 g_print ("Watch: \"%s\" emitted for %s\n",
5944 g_signal_name (ihint->signal_id),
5945 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5951 event_watcher_down (void)
5953 if (event_watcher_enter_id)
5957 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5958 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5959 event_watcher_enter_id = 0;
5960 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5961 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5962 event_watcher_leave_id = 0;
5967 event_watcher_toggle (void)
5969 if (event_watcher_enter_id)
5970 event_watcher_down ();
5975 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5976 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5977 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5978 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5983 create_event_watcher (GtkWidget *widget)
5985 GtkWidget *action_area, *content_area;
5990 dialog_window = gtk_dialog_new ();
5991 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5992 gtk_widget_get_screen (widget));
5994 g_signal_connect (dialog_window, "destroy",
5995 G_CALLBACK (gtk_widget_destroyed),
5997 g_signal_connect (dialog_window, "destroy",
5998 G_CALLBACK (event_watcher_down),
6001 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
6002 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
6004 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6005 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6006 gtk_widget_set_size_request (dialog_window, 200, 110);
6008 button = gtk_toggle_button_new_with_label ("Activate Watch");
6009 g_signal_connect (button, "clicked",
6010 G_CALLBACK (event_watcher_toggle),
6012 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6013 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
6014 gtk_widget_show (button);
6016 button = gtk_button_new_with_label ("Close");
6017 g_signal_connect_swapped (button, "clicked",
6018 G_CALLBACK (gtk_widget_destroy),
6020 gtk_widget_set_can_default (button, TRUE);
6021 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6022 gtk_widget_grab_default (button);
6023 gtk_widget_show (button);
6026 if (!gtk_widget_get_visible (dialog_window))
6027 gtk_widget_show (dialog_window);
6029 gtk_widget_destroy (dialog_window);
6037 reformat_value (GtkScale *scale,
6040 return g_strdup_printf ("-->%0.*g<--",
6041 gtk_scale_get_digits (scale), value);
6045 create_range_controls (GtkWidget *widget)
6047 static GtkWidget *window = NULL;
6051 GtkWidget *scrollbar;
6053 GtkWidget *separator;
6054 GtkObject *adjustment;
6059 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6061 gtk_window_set_screen (GTK_WINDOW (window),
6062 gtk_widget_get_screen (widget));
6064 g_signal_connect (window, "destroy",
6065 G_CALLBACK (gtk_widget_destroyed),
6068 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6069 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6072 box1 = gtk_vbox_new (FALSE, 0);
6073 gtk_container_add (GTK_CONTAINER (window), box1);
6074 gtk_widget_show (box1);
6077 box2 = gtk_vbox_new (FALSE, 10);
6078 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6079 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6080 gtk_widget_show (box2);
6083 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6085 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6086 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6087 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6088 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6089 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6090 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6091 gtk_widget_show (scale);
6093 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6094 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6095 GTK_UPDATE_CONTINUOUS);
6096 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6097 gtk_widget_show (scrollbar);
6099 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6100 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6101 g_signal_connect (scale,
6103 G_CALLBACK (reformat_value),
6105 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6106 gtk_widget_show (scale);
6108 hbox = gtk_hbox_new (FALSE, 0);
6110 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6111 gtk_widget_set_size_request (scale, -1, 200);
6112 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6113 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6114 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6115 gtk_widget_show (scale);
6117 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6118 gtk_widget_set_size_request (scale, -1, 200);
6119 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6120 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6121 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6122 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6123 gtk_widget_show (scale);
6125 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6126 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6127 g_signal_connect (scale,
6129 G_CALLBACK (reformat_value),
6131 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6132 gtk_widget_show (scale);
6135 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6136 gtk_widget_show (hbox);
6138 separator = gtk_hseparator_new ();
6139 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6140 gtk_widget_show (separator);
6143 box2 = gtk_vbox_new (FALSE, 10);
6144 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6145 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6146 gtk_widget_show (box2);
6149 button = gtk_button_new_with_label ("close");
6150 g_signal_connect_swapped (button, "clicked",
6151 G_CALLBACK (gtk_widget_destroy),
6153 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6154 gtk_widget_set_can_default (button, TRUE);
6155 gtk_widget_grab_default (button);
6156 gtk_widget_show (button);
6159 if (!gtk_widget_get_visible (window))
6160 gtk_widget_show (window);
6162 gtk_widget_destroy (window);
6170 create_rulers (GtkWidget *widget)
6172 static GtkWidget *window = NULL;
6178 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6180 gtk_window_set_screen (GTK_WINDOW (window),
6181 gtk_widget_get_screen (widget));
6183 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
6185 g_signal_connect (window, "destroy",
6186 G_CALLBACK (gtk_widget_destroyed),
6189 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6190 gtk_widget_set_size_request (window, 300, 300);
6191 gtk_widget_set_events (window,
6192 GDK_POINTER_MOTION_MASK
6193 | GDK_POINTER_MOTION_HINT_MASK);
6194 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6196 table = gtk_table_new (2, 2, FALSE);
6197 gtk_container_add (GTK_CONTAINER (window), table);
6198 gtk_widget_show (table);
6200 ruler = gtk_hruler_new ();
6201 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6202 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6204 g_signal_connect_swapped (window,
6205 "motion_notify_event",
6206 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6209 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6210 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6211 gtk_widget_show (ruler);
6214 ruler = gtk_vruler_new ();
6215 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6217 g_signal_connect_swapped (window,
6218 "motion_notify_event",
6219 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6222 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6223 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6224 gtk_widget_show (ruler);
6227 if (!gtk_widget_get_visible (window))
6228 gtk_widget_show (window);
6230 gtk_widget_destroy (window);
6237 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6238 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6239 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6240 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6241 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6242 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6243 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6244 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6247 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6253 static const char * book_open_xpm[] = {
6276 static const char * book_closed_xpm[] = {
6301 GdkPixbuf *book_open;
6302 GdkPixbuf *book_closed;
6303 GtkWidget *sample_notebook;
6306 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6308 GtkWidget *page_widget;
6311 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6313 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6314 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6316 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6317 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6321 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6323 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6324 gint old_page_num = gtk_notebook_get_current_page (notebook);
6326 if (page_num == old_page_num)
6329 set_page_image (notebook, page_num, book_open);
6331 if (old_page_num != -1)
6332 set_page_image (notebook, old_page_num, book_closed);
6336 tab_fill (GtkToggleButton *button, GtkWidget *child)
6338 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6339 "tab-fill", gtk_toggle_button_get_active (button),
6344 tab_expand (GtkToggleButton *button, GtkWidget *child)
6346 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6347 "tab-expand", gtk_toggle_button_get_active (button),
6352 create_pages (GtkNotebook *notebook, gint start, gint end)
6354 GtkWidget *child = NULL;
6359 GtkWidget *label_box;
6360 GtkWidget *menu_box;
6364 char accel_buffer[32];
6366 for (i = start; i <= end; i++)
6368 sprintf (buffer, "Page %d", i);
6369 sprintf (accel_buffer, "Page _%d", i);
6371 child = gtk_frame_new (buffer);
6372 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6374 vbox = gtk_vbox_new (TRUE,0);
6375 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6376 gtk_container_add (GTK_CONTAINER (child), vbox);
6378 hbox = gtk_hbox_new (TRUE,0);
6379 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6381 button = gtk_check_button_new_with_label ("Fill Tab");
6382 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6383 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6384 g_signal_connect (button, "toggled",
6385 G_CALLBACK (tab_fill), child);
6387 button = gtk_check_button_new_with_label ("Expand Tab");
6388 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6389 g_signal_connect (button, "toggled",
6390 G_CALLBACK (tab_expand), child);
6392 button = gtk_button_new_with_label ("Hide Page");
6393 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6394 g_signal_connect_swapped (button, "clicked",
6395 G_CALLBACK (gtk_widget_hide),
6398 gtk_widget_show_all (child);
6400 label_box = gtk_hbox_new (FALSE, 0);
6401 pixwid = gtk_image_new_from_pixbuf (book_closed);
6402 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6404 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6405 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6406 label = gtk_label_new_with_mnemonic (accel_buffer);
6407 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6408 gtk_widget_show_all (label_box);
6411 menu_box = gtk_hbox_new (FALSE, 0);
6412 pixwid = gtk_image_new_from_pixbuf (book_closed);
6413 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6415 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6416 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6417 label = gtk_label_new (buffer);
6418 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6419 gtk_widget_show_all (menu_box);
6421 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6426 rotate_notebook (GtkButton *button,
6427 GtkNotebook *notebook)
6429 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6433 show_all_pages (GtkButton *button,
6434 GtkNotebook *notebook)
6436 gtk_container_foreach (GTK_CONTAINER (notebook),
6437 (GtkCallback) gtk_widget_show, NULL);
6441 notebook_type_changed (GtkWidget *optionmenu,
6444 GtkNotebook *notebook;
6454 notebook = GTK_NOTEBOOK (data);
6456 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6461 /* standard notebook */
6462 gtk_notebook_set_show_tabs (notebook, TRUE);
6463 gtk_notebook_set_show_border (notebook, TRUE);
6464 gtk_notebook_set_scrollable (notebook, FALSE);
6468 /* notabs notebook */
6469 gtk_notebook_set_show_tabs (notebook, FALSE);
6470 gtk_notebook_set_show_border (notebook, TRUE);
6475 gtk_notebook_set_show_tabs (notebook, FALSE);
6476 gtk_notebook_set_show_border (notebook, FALSE);
6481 gtk_notebook_set_show_tabs (notebook, TRUE);
6482 gtk_notebook_set_show_border (notebook, TRUE);
6483 gtk_notebook_set_scrollable (notebook, TRUE);
6484 if (gtk_notebook_get_n_pages (notebook) == 5)
6485 create_pages (notebook, 6, 15);
6491 if (gtk_notebook_get_n_pages (notebook) == 15)
6492 for (i = 0; i < 10; i++)
6493 gtk_notebook_remove_page (notebook, 5);
6497 notebook_popup (GtkToggleButton *button,
6498 GtkNotebook *notebook)
6501 gtk_notebook_popup_enable (notebook);
6503 gtk_notebook_popup_disable (notebook);
6507 create_notebook (GtkWidget *widget)
6509 static GtkWidget *window = NULL;
6513 GtkWidget *separator;
6517 static gchar *items[] =
6527 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6528 gtk_window_set_screen (GTK_WINDOW (window),
6529 gtk_widget_get_screen (widget));
6531 g_signal_connect (window, "destroy",
6532 G_CALLBACK (gtk_widget_destroyed),
6535 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6536 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6538 box1 = gtk_vbox_new (FALSE, 0);
6539 gtk_container_add (GTK_CONTAINER (window), box1);
6541 sample_notebook = gtk_notebook_new ();
6542 g_signal_connect (sample_notebook, "switch_page",
6543 G_CALLBACK (page_switch), NULL);
6544 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6545 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6546 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6548 gtk_widget_realize (sample_notebook);
6551 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6554 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6556 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6558 separator = gtk_hseparator_new ();
6559 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6561 box2 = gtk_hbox_new (FALSE, 5);
6562 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6563 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6565 button = gtk_check_button_new_with_label ("popup menu");
6566 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6567 g_signal_connect (button, "clicked",
6568 G_CALLBACK (notebook_popup),
6571 box2 = gtk_hbox_new (FALSE, 5);
6572 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6573 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6575 label = gtk_label_new ("Notebook Style :");
6576 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6578 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6579 notebook_type_changed,
6581 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6583 button = gtk_button_new_with_label ("Show all Pages");
6584 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6585 g_signal_connect (button, "clicked",
6586 G_CALLBACK (show_all_pages), sample_notebook);
6588 box2 = gtk_hbox_new (TRUE, 10);
6589 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6590 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6592 button = gtk_button_new_with_label ("prev");
6593 g_signal_connect_swapped (button, "clicked",
6594 G_CALLBACK (gtk_notebook_prev_page),
6596 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6598 button = gtk_button_new_with_label ("next");
6599 g_signal_connect_swapped (button, "clicked",
6600 G_CALLBACK (gtk_notebook_next_page),
6602 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6604 button = gtk_button_new_with_label ("rotate");
6605 g_signal_connect (button, "clicked",
6606 G_CALLBACK (rotate_notebook), sample_notebook);
6607 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6609 separator = gtk_hseparator_new ();
6610 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6612 button = gtk_button_new_with_label ("close");
6613 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6614 g_signal_connect_swapped (button, "clicked",
6615 G_CALLBACK (gtk_widget_destroy),
6617 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6618 gtk_widget_set_can_default (button, TRUE);
6619 gtk_widget_grab_default (button);
6622 if (!gtk_widget_get_visible (window))
6623 gtk_widget_show_all (window);
6625 gtk_widget_destroy (window);
6633 toggle_resize (GtkWidget *widget, GtkWidget *child)
6635 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6636 GValue value = { 0, };
6637 g_value_init (&value, G_TYPE_BOOLEAN);
6638 gtk_container_child_get_property (container, child, "resize", &value);
6639 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6640 gtk_container_child_set_property (container, child, "resize", &value);
6644 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6646 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6647 GValue value = { 0, };
6648 g_value_init (&value, G_TYPE_BOOLEAN);
6649 gtk_container_child_get_property (container, child, "shrink", &value);
6650 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6651 gtk_container_child_set_property (container, child, "shrink", &value);
6655 paned_props_clicked (GtkWidget *button,
6658 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6660 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6664 create_pane_options (GtkPaned *paned,
6665 const gchar *frame_label,
6666 const gchar *label1,
6667 const gchar *label2)
6669 GtkWidget *child1, *child2;
6674 GtkWidget *check_button;
6676 child1 = gtk_paned_get_child1 (paned);
6677 child2 = gtk_paned_get_child2 (paned);
6679 frame = gtk_frame_new (frame_label);
6680 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6682 table = gtk_table_new (4, 2, 4);
6683 gtk_container_add (GTK_CONTAINER (frame), table);
6685 label = gtk_label_new (label1);
6686 gtk_table_attach_defaults (GTK_TABLE (table), label,
6689 check_button = gtk_check_button_new_with_label ("Resize");
6690 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6692 g_signal_connect (check_button, "toggled",
6693 G_CALLBACK (toggle_resize),
6696 check_button = gtk_check_button_new_with_label ("Shrink");
6697 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6699 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6701 g_signal_connect (check_button, "toggled",
6702 G_CALLBACK (toggle_shrink),
6705 label = gtk_label_new (label2);
6706 gtk_table_attach_defaults (GTK_TABLE (table), label,
6709 check_button = gtk_check_button_new_with_label ("Resize");
6710 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6712 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6714 g_signal_connect (check_button, "toggled",
6715 G_CALLBACK (toggle_resize),
6718 check_button = gtk_check_button_new_with_label ("Shrink");
6719 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6721 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6723 g_signal_connect (check_button, "toggled",
6724 G_CALLBACK (toggle_shrink),
6727 button = gtk_button_new_with_mnemonic ("_Properties");
6728 gtk_table_attach_defaults (GTK_TABLE (table), button,
6730 g_signal_connect (button, "clicked",
6731 G_CALLBACK (paned_props_clicked),
6738 create_panes (GtkWidget *widget)
6740 static GtkWidget *window = NULL;
6749 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6751 gtk_window_set_screen (GTK_WINDOW (window),
6752 gtk_widget_get_screen (widget));
6754 g_signal_connect (window, "destroy",
6755 G_CALLBACK (gtk_widget_destroyed),
6758 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6759 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6761 vbox = gtk_vbox_new (FALSE, 0);
6762 gtk_container_add (GTK_CONTAINER (window), vbox);
6764 vpaned = gtk_vpaned_new ();
6765 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6766 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6768 hpaned = gtk_hpaned_new ();
6769 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6771 frame = gtk_frame_new (NULL);
6772 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6773 gtk_widget_set_size_request (frame, 60, 60);
6774 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6776 button = gtk_button_new_with_label ("Hi there");
6777 gtk_container_add (GTK_CONTAINER(frame), button);
6779 frame = gtk_frame_new (NULL);
6780 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6781 gtk_widget_set_size_request (frame, 80, 60);
6782 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6784 frame = gtk_frame_new (NULL);
6785 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6786 gtk_widget_set_size_request (frame, 60, 80);
6787 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6789 /* Now create toggle buttons to control sizing */
6791 gtk_box_pack_start (GTK_BOX (vbox),
6792 create_pane_options (GTK_PANED (hpaned),
6798 gtk_box_pack_start (GTK_BOX (vbox),
6799 create_pane_options (GTK_PANED (vpaned),
6805 gtk_widget_show_all (vbox);
6808 if (!gtk_widget_get_visible (window))
6809 gtk_widget_show (window);
6811 gtk_widget_destroy (window);
6815 * Paned keyboard navigation
6819 paned_keyboard_window1 (GtkWidget *widget)
6842 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6843 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6844 gtk_window_set_screen (GTK_WINDOW (window1),
6845 gtk_widget_get_screen (widget));
6847 hpaned1 = gtk_hpaned_new ();
6848 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6850 frame1 = gtk_frame_new (NULL);
6851 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6852 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6854 vbox1 = gtk_vbox_new (FALSE, 0);
6855 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6857 button7 = gtk_button_new_with_label ("button7");
6858 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6860 button8 = gtk_button_new_with_label ("button8");
6861 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6863 button9 = gtk_button_new_with_label ("button9");
6864 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6866 vpaned1 = gtk_vpaned_new ();
6867 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6869 frame2 = gtk_frame_new (NULL);
6870 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6871 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6873 frame5 = gtk_frame_new (NULL);
6874 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6876 hbox1 = gtk_hbox_new (FALSE, 0);
6877 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6879 button5 = gtk_button_new_with_label ("button5");
6880 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6882 button6 = gtk_button_new_with_label ("button6");
6883 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6885 frame3 = gtk_frame_new (NULL);
6886 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6887 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6889 frame4 = gtk_frame_new ("Buttons");
6890 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6891 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6893 table1 = gtk_table_new (2, 2, FALSE);
6894 gtk_container_add (GTK_CONTAINER (frame4), table1);
6895 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6897 button1 = gtk_button_new_with_label ("button1");
6898 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6899 (GtkAttachOptions) (GTK_FILL),
6900 (GtkAttachOptions) (0), 0, 0);
6902 button2 = gtk_button_new_with_label ("button2");
6903 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6904 (GtkAttachOptions) (GTK_FILL),
6905 (GtkAttachOptions) (0), 0, 0);
6907 button3 = gtk_button_new_with_label ("button3");
6908 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6909 (GtkAttachOptions) (GTK_FILL),
6910 (GtkAttachOptions) (0), 0, 0);
6912 button4 = gtk_button_new_with_label ("button4");
6913 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6914 (GtkAttachOptions) (GTK_FILL),
6915 (GtkAttachOptions) (0), 0, 0);
6921 paned_keyboard_window2 (GtkWidget *widget)
6926 GtkWidget *button13;
6930 GtkWidget *button12;
6932 GtkWidget *button11;
6933 GtkWidget *button10;
6935 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6936 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6938 gtk_window_set_screen (GTK_WINDOW (window2),
6939 gtk_widget_get_screen (widget));
6941 hpaned2 = gtk_hpaned_new ();
6942 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6944 frame6 = gtk_frame_new (NULL);
6945 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6946 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6948 button13 = gtk_button_new_with_label ("button13");
6949 gtk_container_add (GTK_CONTAINER (frame6), button13);
6951 hbox2 = gtk_hbox_new (FALSE, 0);
6952 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6954 vpaned2 = gtk_vpaned_new ();
6955 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6957 frame7 = gtk_frame_new (NULL);
6958 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6959 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6961 button12 = gtk_button_new_with_label ("button12");
6962 gtk_container_add (GTK_CONTAINER (frame7), button12);
6964 frame8 = gtk_frame_new (NULL);
6965 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6966 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6968 button11 = gtk_button_new_with_label ("button11");
6969 gtk_container_add (GTK_CONTAINER (frame8), button11);
6971 button10 = gtk_button_new_with_label ("button10");
6972 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6978 paned_keyboard_window3 (GtkWidget *widget)
6985 GtkWidget *button14;
6988 GtkWidget *button15;
6991 GtkWidget *button16;
6993 GtkWidget *button17;
6995 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6996 g_object_set_data (G_OBJECT (window3), "window3", window3);
6997 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6999 gtk_window_set_screen (GTK_WINDOW (window3),
7000 gtk_widget_get_screen (widget));
7003 vbox2 = gtk_vbox_new (FALSE, 0);
7004 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7006 label1 = gtk_label_new ("Three panes nested inside each other");
7007 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7009 hpaned3 = gtk_hpaned_new ();
7010 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7012 frame9 = gtk_frame_new (NULL);
7013 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7014 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7016 button14 = gtk_button_new_with_label ("button14");
7017 gtk_container_add (GTK_CONTAINER (frame9), button14);
7019 hpaned4 = gtk_hpaned_new ();
7020 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7022 frame10 = gtk_frame_new (NULL);
7023 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7024 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7026 button15 = gtk_button_new_with_label ("button15");
7027 gtk_container_add (GTK_CONTAINER (frame10), button15);
7029 hpaned5 = gtk_hpaned_new ();
7030 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7032 frame11 = gtk_frame_new (NULL);
7033 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7034 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7036 button16 = gtk_button_new_with_label ("button16");
7037 gtk_container_add (GTK_CONTAINER (frame11), button16);
7039 frame12 = gtk_frame_new (NULL);
7040 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7041 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7043 button17 = gtk_button_new_with_label ("button17");
7044 gtk_container_add (GTK_CONTAINER (frame12), button17);
7050 paned_keyboard_window4 (GtkWidget *widget)
7057 GtkWidget *button19;
7058 GtkWidget *button18;
7061 GtkWidget *button21;
7062 GtkWidget *button20;
7064 GtkWidget *button23;
7065 GtkWidget *button22;
7067 GtkWidget *button25;
7068 GtkWidget *button24;
7070 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7071 g_object_set_data (G_OBJECT (window4), "window4", window4);
7072 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7074 gtk_window_set_screen (GTK_WINDOW (window4),
7075 gtk_widget_get_screen (widget));
7077 vbox3 = gtk_vbox_new (FALSE, 0);
7078 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7080 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7081 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7082 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7084 hpaned6 = gtk_hpaned_new ();
7085 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7087 vpaned3 = gtk_vpaned_new ();
7088 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7090 button19 = gtk_button_new_with_label ("button19");
7091 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7093 button18 = gtk_button_new_with_label ("button18");
7094 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7096 hbox3 = gtk_hbox_new (FALSE, 0);
7097 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7099 vpaned4 = gtk_vpaned_new ();
7100 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7102 button21 = gtk_button_new_with_label ("button21");
7103 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7105 button20 = gtk_button_new_with_label ("button20");
7106 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7108 vpaned5 = gtk_vpaned_new ();
7109 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7111 button23 = gtk_button_new_with_label ("button23");
7112 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7114 button22 = gtk_button_new_with_label ("button22");
7115 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7117 vpaned6 = gtk_vpaned_new ();
7118 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7120 button25 = gtk_button_new_with_label ("button25");
7121 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7123 button24 = gtk_button_new_with_label ("button24");
7124 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7130 create_paned_keyboard_navigation (GtkWidget *widget)
7132 static GtkWidget *window1 = NULL;
7133 static GtkWidget *window2 = NULL;
7134 static GtkWidget *window3 = NULL;
7135 static GtkWidget *window4 = NULL;
7138 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7140 gtk_widget_destroy (window1);
7141 gtk_widget_destroy (window2);
7142 gtk_widget_destroy (window3);
7143 gtk_widget_destroy (window4);
7148 window1 = paned_keyboard_window1 (widget);
7149 g_signal_connect (window1, "destroy",
7150 G_CALLBACK (gtk_widget_destroyed),
7156 window2 = paned_keyboard_window2 (widget);
7157 g_signal_connect (window2, "destroy",
7158 G_CALLBACK (gtk_widget_destroyed),
7164 window3 = paned_keyboard_window3 (widget);
7165 g_signal_connect (window3, "destroy",
7166 G_CALLBACK (gtk_widget_destroyed),
7172 window4 = paned_keyboard_window4 (widget);
7173 g_signal_connect (window4, "destroy",
7174 G_CALLBACK (gtk_widget_destroyed),
7178 if (gtk_widget_get_visible (window1))
7179 gtk_widget_destroy (GTK_WIDGET (window1));
7181 gtk_widget_show_all (GTK_WIDGET (window1));
7183 if (gtk_widget_get_visible (window2))
7184 gtk_widget_destroy (GTK_WIDGET (window2));
7186 gtk_widget_show_all (GTK_WIDGET (window2));
7188 if (gtk_widget_get_visible (window3))
7189 gtk_widget_destroy (GTK_WIDGET (window3));
7191 gtk_widget_show_all (GTK_WIDGET (window3));
7193 if (gtk_widget_get_visible (window4))
7194 gtk_widget_destroy (GTK_WIDGET (window4));
7196 gtk_widget_show_all (GTK_WIDGET (window4));
7204 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7207 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7211 /* ignore double and triple click */
7212 if (event->type != GDK_BUTTON_PRESS)
7215 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7216 p->x = (int) event->x;
7217 p->y = (int) event->y;
7219 gtk_grab_add (widget);
7220 gdk_pointer_grab (gtk_widget_get_window (widget), TRUE,
7221 GDK_BUTTON_RELEASE_MASK |
7222 GDK_BUTTON_MOTION_MASK |
7223 GDK_POINTER_MOTION_HINT_MASK,
7228 shape_released (GtkWidget *widget)
7230 gtk_grab_remove (widget);
7231 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7236 shape_motion (GtkWidget *widget,
7237 GdkEventMotion *event)
7241 GdkModifierType mask;
7243 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7246 * Can't use event->x / event->y here
7247 * because I need absolute coordinates.
7249 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7250 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7254 shape_create_icon (GdkScreen *screen,
7265 CursorOffset* icon_pos;
7270 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7272 window = gtk_window_new (window_type);
7273 gtk_window_set_screen (GTK_WINDOW (window), screen);
7275 fixed = gtk_fixed_new ();
7276 gtk_widget_set_size_request (fixed, 100, 100);
7277 gtk_container_add (GTK_CONTAINER (window), fixed);
7278 gtk_widget_show (fixed);
7280 gtk_widget_set_events (window,
7281 gtk_widget_get_events (window) |
7282 GDK_BUTTON_MOTION_MASK |
7283 GDK_POINTER_MOTION_HINT_MASK |
7284 GDK_BUTTON_PRESS_MASK);
7286 gtk_widget_realize (window);
7288 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7289 g_assert (pixbuf); /* FIXME: error handling */
7291 gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf,
7292 gtk_widget_get_colormap (window),
7297 image = gtk_image_new_from_pixbuf (pixbuf);
7298 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7299 gtk_widget_show (image);
7301 gtk_widget_shape_combine_mask (window, mask, px, py);
7303 g_object_unref (mask);
7304 g_object_unref (pixbuf);
7306 g_signal_connect (window, "button_press_event",
7307 G_CALLBACK (shape_pressed), NULL);
7308 g_signal_connect (window, "button_release_event",
7309 G_CALLBACK (shape_released), NULL);
7310 g_signal_connect (window, "motion_notify_event",
7311 G_CALLBACK (shape_motion), NULL);
7313 icon_pos = g_new (CursorOffset, 1);
7314 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7316 gtk_window_move (GTK_WINDOW (window), x, y);
7317 gtk_widget_show (window);
7323 create_shapes (GtkWidget *widget)
7325 /* Variables used by the Drag/Drop and Shape Window demos */
7326 static GtkWidget *modeller = NULL;
7327 static GtkWidget *sheets = NULL;
7328 static GtkWidget *rings = NULL;
7329 static GtkWidget *with_region = NULL;
7330 GdkScreen *screen = gtk_widget_get_screen (widget);
7332 if (!(file_exists ("Modeller.xpm") &&
7333 file_exists ("FilesQueue.xpm") &&
7334 file_exists ("3DRings.xpm")))
7340 modeller = shape_create_icon (screen, "Modeller.xpm",
7341 440, 140, 0,0, GTK_WINDOW_POPUP);
7343 g_signal_connect (modeller, "destroy",
7344 G_CALLBACK (gtk_widget_destroyed),
7348 gtk_widget_destroy (modeller);
7352 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7353 580, 170, 0,0, GTK_WINDOW_POPUP);
7355 g_signal_connect (sheets, "destroy",
7356 G_CALLBACK (gtk_widget_destroyed),
7361 gtk_widget_destroy (sheets);
7365 rings = shape_create_icon (screen, "3DRings.xpm",
7366 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7368 g_signal_connect (rings, "destroy",
7369 G_CALLBACK (gtk_widget_destroyed),
7373 gtk_widget_destroy (rings);
7377 cairo_region_t *region;
7380 with_region = shape_create_icon (screen, "3DRings.xpm",
7381 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7383 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7385 g_signal_connect (with_region, "destroy",
7386 G_CALLBACK (gtk_widget_destroyed),
7389 /* reset shape from mask to a region */
7392 region = cairo_region_create ();
7404 cairo_region_union_rectangle (region, &rect);
7412 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7417 gtk_widget_destroy (with_region);
7425 create_wmhints (GtkWidget *widget)
7427 static GtkWidget *window = NULL;
7429 GtkWidget *separator;
7434 GdkWindow *gdk_window;
7435 cairo_surface_t *image;
7440 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7442 gtk_window_set_screen (GTK_WINDOW (window),
7443 gtk_widget_get_screen (widget));
7445 g_signal_connect (window, "destroy",
7446 G_CALLBACK (gtk_widget_destroyed),
7449 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7450 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7452 gtk_widget_realize (window);
7454 gdk_window = gtk_widget_get_window (window);
7455 circles = gdk_pixmap_new (gdk_window, circles_width, circles_height, 1);
7456 cr = gdk_cairo_create (circles);
7457 image = cairo_image_surface_create_for_data (circles_bits, CAIRO_FORMAT_A1,
7458 circles_width, circles_height,
7460 cairo_set_source_surface (cr, image, 0, 0);
7461 cairo_surface_destroy (image);
7462 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
7466 gdk_window_set_icon (gdk_window, NULL,
7469 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7471 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7472 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7474 box1 = gtk_vbox_new (FALSE, 0);
7475 gtk_container_add (GTK_CONTAINER (window), box1);
7476 gtk_widget_show (box1);
7478 label = gtk_label_new ("Try iconizing me!");
7479 gtk_widget_set_size_request (label, 150, 50);
7480 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7481 gtk_widget_show (label);
7484 separator = gtk_hseparator_new ();
7485 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7486 gtk_widget_show (separator);
7489 box2 = gtk_vbox_new (FALSE, 10);
7490 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7491 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7492 gtk_widget_show (box2);
7495 button = gtk_button_new_with_label ("close");
7497 g_signal_connect_swapped (button, "clicked",
7498 G_CALLBACK (gtk_widget_destroy),
7501 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7502 gtk_widget_set_can_default (button, TRUE);
7503 gtk_widget_grab_default (button);
7504 gtk_widget_show (button);
7507 if (!gtk_widget_get_visible (window))
7508 gtk_widget_show (window);
7510 gtk_widget_destroy (window);
7515 * Window state tracking
7519 window_state_callback (GtkWidget *widget,
7520 GdkEventWindowState *event,
7523 GtkWidget *label = data;
7526 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7527 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7528 "withdrawn" : "not withdrawn", ", ",
7529 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7530 "iconified" : "not iconified", ", ",
7531 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7532 "sticky" : "not sticky", ", ",
7533 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7534 "maximized" : "not maximized", ", ",
7535 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7536 "fullscreen" : "not fullscreen",
7537 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7538 "above" : "not above", ", ",
7539 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7540 "below" : "not below", ", ",
7543 gtk_label_set_text (GTK_LABEL (label), msg);
7551 tracking_label (GtkWidget *window)
7557 hbox = gtk_hbox_new (FALSE, 5);
7559 g_signal_connect_object (hbox,
7561 G_CALLBACK (gtk_widget_destroy),
7565 label = gtk_label_new ("<no window state events received>");
7566 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7567 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7569 g_signal_connect (window,
7570 "window_state_event",
7571 G_CALLBACK (window_state_callback),
7574 button = gtk_button_new_with_label ("Deiconify");
7575 g_signal_connect_object (button,
7577 G_CALLBACK (gtk_window_deiconify),
7580 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7582 button = gtk_button_new_with_label ("Iconify");
7583 g_signal_connect_object (button,
7585 G_CALLBACK (gtk_window_iconify),
7588 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7590 button = gtk_button_new_with_label ("Fullscreen");
7591 g_signal_connect_object (button,
7593 G_CALLBACK (gtk_window_fullscreen),
7596 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7598 button = gtk_button_new_with_label ("Unfullscreen");
7599 g_signal_connect_object (button,
7601 G_CALLBACK (gtk_window_unfullscreen),
7604 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7606 button = gtk_button_new_with_label ("Present");
7607 g_signal_connect_object (button,
7609 G_CALLBACK (gtk_window_present),
7612 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7614 button = gtk_button_new_with_label ("Show");
7615 g_signal_connect_object (button,
7617 G_CALLBACK (gtk_widget_show),
7620 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7622 gtk_widget_show_all (hbox);
7628 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7630 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7632 gtk_window_set_keep_above (GTK_WINDOW (data),
7633 gtk_toggle_button_get_active (togglebutton));
7635 if (gtk_toggle_button_get_active (togglebutton))
7636 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7640 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7642 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7644 gtk_window_set_keep_below (GTK_WINDOW (data),
7645 gtk_toggle_button_get_active (togglebutton));
7647 if (gtk_toggle_button_get_active (togglebutton))
7648 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7653 get_state_controls (GtkWidget *window)
7657 GtkWidget *button_above;
7658 GtkWidget *button_below;
7660 vbox = gtk_vbox_new (FALSE, 0);
7662 button = gtk_button_new_with_label ("Stick");
7663 g_signal_connect_object (button,
7665 G_CALLBACK (gtk_window_stick),
7668 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7670 button = gtk_button_new_with_label ("Unstick");
7671 g_signal_connect_object (button,
7673 G_CALLBACK (gtk_window_unstick),
7676 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7678 button = gtk_button_new_with_label ("Maximize");
7679 g_signal_connect_object (button,
7681 G_CALLBACK (gtk_window_maximize),
7684 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7686 button = gtk_button_new_with_label ("Unmaximize");
7687 g_signal_connect_object (button,
7689 G_CALLBACK (gtk_window_unmaximize),
7692 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7694 button = gtk_button_new_with_label ("Iconify");
7695 g_signal_connect_object (button,
7697 G_CALLBACK (gtk_window_iconify),
7700 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7702 button = gtk_button_new_with_label ("Fullscreen");
7703 g_signal_connect_object (button,
7705 G_CALLBACK (gtk_window_fullscreen),
7708 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7710 button = gtk_button_new_with_label ("Unfullscreen");
7711 g_signal_connect_object (button,
7713 G_CALLBACK (gtk_window_unfullscreen),
7716 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7718 button_above = gtk_toggle_button_new_with_label ("Keep above");
7719 g_signal_connect (button_above,
7721 G_CALLBACK (keep_window_above),
7723 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7725 button_below = gtk_toggle_button_new_with_label ("Keep below");
7726 g_signal_connect (button_below,
7728 G_CALLBACK (keep_window_below),
7730 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7732 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7733 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7735 button = gtk_button_new_with_label ("Hide (withdraw)");
7736 g_signal_connect_object (button,
7738 G_CALLBACK (gtk_widget_hide),
7741 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7743 gtk_widget_show_all (vbox);
7749 create_window_states (GtkWidget *widget)
7751 static GtkWidget *window = NULL;
7754 GtkWidget *iconified;
7756 GtkWidget *controls;
7760 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7761 gtk_window_set_screen (GTK_WINDOW (window),
7762 gtk_widget_get_screen (widget));
7764 g_signal_connect (window, "destroy",
7765 G_CALLBACK (gtk_widget_destroyed),
7768 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7770 box1 = gtk_vbox_new (FALSE, 0);
7771 gtk_container_add (GTK_CONTAINER (window), box1);
7773 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7775 gtk_window_set_screen (GTK_WINDOW (iconified),
7776 gtk_widget_get_screen (widget));
7778 g_signal_connect_object (iconified, "destroy",
7779 G_CALLBACK (gtk_widget_destroy),
7782 gtk_window_iconify (GTK_WINDOW (iconified));
7783 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7784 controls = get_state_controls (iconified);
7785 gtk_container_add (GTK_CONTAINER (iconified), controls);
7787 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7789 gtk_window_set_screen (GTK_WINDOW (normal),
7790 gtk_widget_get_screen (widget));
7792 g_signal_connect_object (normal, "destroy",
7793 G_CALLBACK (gtk_widget_destroy),
7797 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7798 controls = get_state_controls (normal);
7799 gtk_container_add (GTK_CONTAINER (normal), controls);
7801 label = tracking_label (iconified);
7802 gtk_container_add (GTK_CONTAINER (box1), label);
7804 label = tracking_label (normal);
7805 gtk_container_add (GTK_CONTAINER (box1), label);
7807 gtk_widget_show_all (iconified);
7808 gtk_widget_show_all (normal);
7809 gtk_widget_show_all (box1);
7812 if (!gtk_widget_get_visible (window))
7813 gtk_widget_show (window);
7815 gtk_widget_destroy (window);
7823 configure_event_callback (GtkWidget *widget,
7824 GdkEventConfigure *event,
7827 GtkWidget *label = data;
7831 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7833 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7835 event->x, event->y, event->width, event->height,
7838 gtk_label_set_text (GTK_LABEL (label), msg);
7846 get_ints (GtkWidget *window,
7853 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7854 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7856 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7857 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7861 set_size_callback (GtkWidget *widget,
7866 get_ints (data, &w, &h);
7868 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7872 unset_default_size_callback (GtkWidget *widget,
7875 gtk_window_set_default_size (g_object_get_data (data, "target"),
7880 set_default_size_callback (GtkWidget *widget,
7885 get_ints (data, &w, &h);
7887 gtk_window_set_default_size (g_object_get_data (data, "target"),
7892 unset_size_request_callback (GtkWidget *widget,
7895 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7900 set_size_request_callback (GtkWidget *widget,
7905 get_ints (data, &w, &h);
7907 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7912 set_location_callback (GtkWidget *widget,
7917 get_ints (data, &x, &y);
7919 gtk_window_move (g_object_get_data (data, "target"), x, y);
7923 move_to_position_callback (GtkWidget *widget,
7929 window = g_object_get_data (data, "target");
7931 gtk_window_get_position (window, &x, &y);
7933 gtk_window_move (window, x, y);
7937 set_geometry_callback (GtkWidget *entry,
7943 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7945 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7947 if (!gtk_window_parse_geometry (target, text))
7948 g_print ("Bad geometry string '%s'\n", text);
7954 resizable_callback (GtkWidget *widget,
7957 g_object_set (g_object_get_data (data, "target"),
7958 "resizable", GTK_TOGGLE_BUTTON (widget)->active,
7963 gravity_selected (GtkWidget *widget,
7966 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7967 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7971 pos_selected (GtkWidget *widget,
7974 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7975 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7979 move_gravity_window_to_current_position (GtkWidget *widget,
7985 window = GTK_WINDOW (data);
7987 gtk_window_get_position (window, &x, &y);
7989 gtk_window_move (window, x, y);
7993 get_screen_corner (GtkWindow *window,
7998 GdkScreen * screen = gtk_window_get_screen (window);
8000 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
8002 switch (gtk_window_get_gravity (window))
8004 case GDK_GRAVITY_SOUTH_EAST:
8005 *x = gdk_screen_get_width (screen) - w;
8006 *y = gdk_screen_get_height (screen) - h;
8009 case GDK_GRAVITY_NORTH_EAST:
8010 *x = gdk_screen_get_width (screen) - w;
8014 case GDK_GRAVITY_SOUTH_WEST:
8016 *y = gdk_screen_get_height (screen) - h;
8019 case GDK_GRAVITY_NORTH_WEST:
8024 case GDK_GRAVITY_SOUTH:
8025 *x = (gdk_screen_get_width (screen) - w) / 2;
8026 *y = gdk_screen_get_height (screen) - h;
8029 case GDK_GRAVITY_NORTH:
8030 *x = (gdk_screen_get_width (screen) - w) / 2;
8034 case GDK_GRAVITY_WEST:
8036 *y = (gdk_screen_get_height (screen) - h) / 2;
8039 case GDK_GRAVITY_EAST:
8040 *x = gdk_screen_get_width (screen) - w;
8041 *y = (gdk_screen_get_height (screen) - h) / 2;
8044 case GDK_GRAVITY_CENTER:
8045 *x = (gdk_screen_get_width (screen) - w) / 2;
8046 *y = (gdk_screen_get_height (screen) - h) / 2;
8049 case GDK_GRAVITY_STATIC:
8050 /* pick some random numbers */
8056 g_assert_not_reached ();
8062 move_gravity_window_to_starting_position (GtkWidget *widget,
8068 window = GTK_WINDOW (data);
8070 get_screen_corner (window,
8073 gtk_window_move (window, x, y);
8077 make_gravity_window (GtkWidget *destroy_with,
8086 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8088 gtk_window_set_screen (GTK_WINDOW (window),
8089 gtk_widget_get_screen (destroy_with));
8091 vbox = gtk_vbox_new (FALSE, 0);
8092 gtk_widget_show (vbox);
8094 gtk_container_add (GTK_CONTAINER (window), vbox);
8095 gtk_window_set_title (GTK_WINDOW (window), title);
8096 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8098 g_signal_connect_object (destroy_with,
8100 G_CALLBACK (gtk_widget_destroy),
8105 button = gtk_button_new_with_mnemonic ("_Move to current position");
8107 g_signal_connect (button, "clicked",
8108 G_CALLBACK (move_gravity_window_to_current_position),
8111 gtk_container_add (GTK_CONTAINER (vbox), button);
8112 gtk_widget_show (button);
8114 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8116 g_signal_connect (button, "clicked",
8117 G_CALLBACK (move_gravity_window_to_starting_position),
8120 gtk_container_add (GTK_CONTAINER (vbox), button);
8121 gtk_widget_show (button);
8123 /* Pretend this is the result of --geometry.
8124 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8125 * and in that case you probably should just use gtk_window_parse_geometry().
8126 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8127 * you are parsing --geometry or equivalent.
8129 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8133 gtk_window_set_default_size (GTK_WINDOW (window),
8136 get_screen_corner (GTK_WINDOW (window), &x, &y);
8138 gtk_window_move (GTK_WINDOW (window),
8145 do_gravity_test (GtkWidget *widget,
8148 GtkWidget *destroy_with = data;
8151 /* We put a window at each gravity point on the screen. */
8152 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8154 gtk_widget_show (window);
8156 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8158 gtk_widget_show (window);
8160 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8162 gtk_widget_show (window);
8164 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8166 gtk_widget_show (window);
8168 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8170 gtk_widget_show (window);
8172 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8174 gtk_widget_show (window);
8177 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8179 gtk_widget_show (window);
8182 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8184 gtk_widget_show (window);
8186 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8188 gtk_widget_show (window);
8190 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8192 gtk_widget_show (window);
8196 window_controls (GtkWidget *window)
8198 GtkWidget *control_window;
8208 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8210 gtk_window_set_screen (GTK_WINDOW (control_window),
8211 gtk_widget_get_screen (window));
8213 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8215 g_object_set_data (G_OBJECT (control_window),
8219 g_signal_connect_object (control_window,
8221 G_CALLBACK (gtk_widget_destroy),
8225 vbox = gtk_vbox_new (FALSE, 5);
8227 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8229 label = gtk_label_new ("<no configure events>");
8230 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8232 g_signal_connect (window,
8234 G_CALLBACK (configure_event_callback),
8237 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8239 spin = gtk_spin_button_new (adj, 0, 0);
8241 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8243 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8245 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8247 spin = gtk_spin_button_new (adj, 0, 0);
8249 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8251 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8253 entry = gtk_entry_new ();
8254 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8256 g_signal_connect (entry, "changed",
8257 G_CALLBACK (set_geometry_callback),
8260 button = gtk_button_new_with_label ("Show gravity test windows");
8261 g_signal_connect_swapped (button,
8263 G_CALLBACK (do_gravity_test),
8265 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8267 button = gtk_button_new_with_label ("Reshow with initial size");
8268 g_signal_connect_object (button,
8270 G_CALLBACK (gtk_window_reshow_with_initial_size),
8273 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8275 button = gtk_button_new_with_label ("Queue resize");
8276 g_signal_connect_object (button,
8278 G_CALLBACK (gtk_widget_queue_resize),
8281 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8283 button = gtk_button_new_with_label ("Resize");
8284 g_signal_connect (button,
8286 G_CALLBACK (set_size_callback),
8288 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8290 button = gtk_button_new_with_label ("Set default size");
8291 g_signal_connect (button,
8293 G_CALLBACK (set_default_size_callback),
8295 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8297 button = gtk_button_new_with_label ("Unset default size");
8298 g_signal_connect (button,
8300 G_CALLBACK (unset_default_size_callback),
8302 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8304 button = gtk_button_new_with_label ("Set size request");
8305 g_signal_connect (button,
8307 G_CALLBACK (set_size_request_callback),
8309 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8311 button = gtk_button_new_with_label ("Unset size request");
8312 g_signal_connect (button,
8314 G_CALLBACK (unset_size_request_callback),
8316 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8318 button = gtk_button_new_with_label ("Move");
8319 g_signal_connect (button,
8321 G_CALLBACK (set_location_callback),
8323 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8325 button = gtk_button_new_with_label ("Move to current position");
8326 g_signal_connect (button,
8328 G_CALLBACK (move_to_position_callback),
8330 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8332 button = gtk_check_button_new_with_label ("Allow resize");
8333 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8334 g_signal_connect (button,
8336 G_CALLBACK (resizable_callback),
8338 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8340 button = gtk_button_new_with_mnemonic ("_Show");
8341 g_signal_connect_object (button,
8343 G_CALLBACK (gtk_widget_show),
8346 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8348 button = gtk_button_new_with_mnemonic ("_Hide");
8349 g_signal_connect_object (button,
8351 G_CALLBACK (gtk_widget_hide),
8354 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8356 om = gtk_combo_box_new_text ();
8360 static gchar *names[] = {
8361 "GDK_GRAVITY_NORTH_WEST",
8362 "GDK_GRAVITY_NORTH",
8363 "GDK_GRAVITY_NORTH_EAST",
8365 "GDK_GRAVITY_CENTER",
8367 "GDK_GRAVITY_SOUTH_WEST",
8368 "GDK_GRAVITY_SOUTH",
8369 "GDK_GRAVITY_SOUTH_EAST",
8370 "GDK_GRAVITY_STATIC",
8374 g_assert (names[i]);
8375 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8380 g_signal_connect (om,
8382 G_CALLBACK (gravity_selected),
8385 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8388 om = gtk_combo_box_new_text ();
8392 static gchar *names[] = {
8394 "GTK_WIN_POS_CENTER",
8395 "GTK_WIN_POS_MOUSE",
8396 "GTK_WIN_POS_CENTER_ALWAYS",
8397 "GTK_WIN_POS_CENTER_ON_PARENT",
8401 g_assert (names[i]);
8402 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8407 g_signal_connect (om,
8409 G_CALLBACK (pos_selected),
8412 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8414 gtk_widget_show_all (vbox);
8416 return control_window;
8420 create_window_sizing (GtkWidget *widget)
8422 static GtkWidget *window = NULL;
8423 static GtkWidget *target_window = NULL;
8429 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8430 gtk_window_set_screen (GTK_WINDOW (target_window),
8431 gtk_widget_get_screen (widget));
8432 label = gtk_label_new (NULL);
8433 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");
8434 gtk_container_add (GTK_CONTAINER (target_window), label);
8435 gtk_widget_show (label);
8437 g_signal_connect (target_window, "destroy",
8438 G_CALLBACK (gtk_widget_destroyed),
8441 window = window_controls (target_window);
8443 g_signal_connect (window, "destroy",
8444 G_CALLBACK (gtk_widget_destroyed),
8447 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8450 /* don't show target window by default, we want to allow testing
8451 * of behavior on first show.
8454 if (!gtk_widget_get_visible (window))
8455 gtk_widget_show (window);
8457 gtk_widget_destroy (window);
8464 typedef struct _ProgressData {
8467 GtkWidget *block_spin;
8468 GtkWidget *x_align_spin;
8469 GtkWidget *y_align_spin;
8470 GtkWidget *step_spin;
8471 GtkWidget *act_blocks_spin;
8482 progress_timeout (gpointer data)
8484 ProgressData *pdata = data;
8488 if (pdata->activity)
8490 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8492 text = g_strdup_printf ("%s", "???");
8496 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8499 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8501 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8504 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8511 destroy_progress (GtkWidget *widget,
8512 ProgressData **pdata)
8514 g_source_remove ((*pdata)->timer);
8515 (*pdata)->timer = 0;
8516 (*pdata)->window = NULL;
8522 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8524 ProgressData *pdata;
8527 pdata = (ProgressData *) data;
8529 if (!gtk_widget_get_mapped (widget))
8532 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8534 if (i == 0 || i == 1)
8535 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8537 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8539 if (i == 1 || i == 2)
8540 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8542 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8546 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8550 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8551 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8555 progressbar_toggle_ellipsize (GtkWidget *widget,
8558 ProgressData *pdata = data;
8559 if (gtk_widget_is_drawable (widget))
8561 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8562 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8567 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8569 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8573 entry_changed (GtkWidget *widget, ProgressData *pdata)
8575 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8576 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8580 create_progress_bar (GtkWidget *widget)
8582 GtkWidget *action_area, *content_area;
8592 static ProgressData *pdata = NULL;
8594 static gchar *items1[] =
8602 static char *ellipsize_items[] = {
8603 "None", // PANGO_ELLIPSIZE_NONE,
8604 "Start", // PANGO_ELLIPSIZE_START,
8605 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8606 "End", // PANGO_ELLIPSIZE_END
8610 pdata = g_new0 (ProgressData, 1);
8614 pdata->window = gtk_dialog_new ();
8616 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8617 gtk_widget_get_screen (widget));
8619 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8621 g_signal_connect (pdata->window, "destroy",
8622 G_CALLBACK (destroy_progress),
8626 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8627 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8629 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8630 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8632 vbox = gtk_vbox_new (FALSE, 5);
8633 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8634 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8636 frame = gtk_frame_new ("Progress");
8637 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8639 vbox2 = gtk_vbox_new (FALSE, 5);
8640 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8642 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8643 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8645 pdata->pbar = gtk_progress_bar_new ();
8646 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8647 PANGO_ELLIPSIZE_MIDDLE);
8649 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8650 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8652 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8653 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8655 hbox = gtk_hbox_new (FALSE, 5);
8656 gtk_container_add (GTK_CONTAINER (align), hbox);
8657 label = gtk_label_new ("Label updated by user :");
8658 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8659 pdata->label = gtk_label_new ("");
8660 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8662 frame = gtk_frame_new ("Options");
8663 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8665 vbox2 = gtk_vbox_new (FALSE, 5);
8666 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8668 tab = gtk_table_new (7, 2, FALSE);
8669 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8671 label = gtk_label_new ("Orientation :");
8672 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8673 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8675 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8677 pdata->omenu1 = build_option_menu (items1, 4, 0,
8678 progressbar_toggle_orientation,
8680 hbox = gtk_hbox_new (FALSE, 0);
8681 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8682 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8684 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8686 check = gtk_check_button_new_with_label ("Show text");
8687 g_signal_connect (check, "clicked",
8688 G_CALLBACK (toggle_show_text),
8690 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
8691 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8694 hbox = gtk_hbox_new (FALSE, 0);
8695 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
8696 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8699 label = gtk_label_new ("Text: ");
8700 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8702 pdata->entry = gtk_entry_new ();
8703 g_signal_connect (pdata->entry, "changed",
8704 G_CALLBACK (entry_changed),
8706 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8707 gtk_widget_set_size_request (pdata->entry, 100, -1);
8709 label = gtk_label_new ("Ellipsize text :");
8710 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8711 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8713 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8714 pdata->elmenu = build_option_menu (ellipsize_items,
8715 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8716 2, // PANGO_ELLIPSIZE_MIDDLE
8717 progressbar_toggle_ellipsize,
8719 hbox = gtk_hbox_new (FALSE, 0);
8720 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8721 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8723 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8725 check = gtk_check_button_new_with_label ("Activity mode");
8726 g_signal_connect (check, "clicked",
8727 G_CALLBACK (toggle_activity_mode), pdata);
8728 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8729 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8732 button = gtk_button_new_with_label ("close");
8733 g_signal_connect_swapped (button, "clicked",
8734 G_CALLBACK (gtk_widget_destroy),
8736 gtk_widget_set_can_default (button, TRUE);
8737 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8738 gtk_widget_grab_default (button);
8741 if (!gtk_widget_get_visible (pdata->window))
8742 gtk_widget_show_all (pdata->window);
8744 gtk_widget_destroy (pdata->window);
8756 GtkWidget *res_widget;
8760 find_widget (GtkWidget *widget, FindWidgetData *data)
8762 GtkAllocation new_allocation;
8766 gtk_widget_get_allocation (widget, &new_allocation);
8768 if (data->found || !gtk_widget_get_mapped (widget))
8771 /* Note that in the following code, we only count the
8772 * position as being inside a WINDOW widget if it is inside
8773 * widget->window; points that are outside of widget->window
8774 * but within the allocation are not counted. This is consistent
8775 * with the way we highlight drag targets.
8777 if (gtk_widget_get_has_window (widget))
8779 new_allocation.x = 0;
8780 new_allocation.y = 0;
8783 if (gtk_widget_get_parent (widget) && !data->first)
8785 GdkWindow *window = gtk_widget_get_window (widget);
8786 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8788 gint tx, ty, twidth, theight;
8789 gdk_drawable_get_size (window, &twidth, &theight);
8791 if (new_allocation.x < 0)
8793 new_allocation.width += new_allocation.x;
8794 new_allocation.x = 0;
8796 if (new_allocation.y < 0)
8798 new_allocation.height += new_allocation.y;
8799 new_allocation.y = 0;
8801 if (new_allocation.x + new_allocation.width > twidth)
8802 new_allocation.width = twidth - new_allocation.x;
8803 if (new_allocation.y + new_allocation.height > theight)
8804 new_allocation.height = theight - new_allocation.y;
8806 gdk_window_get_position (window, &tx, &ty);
8807 new_allocation.x += tx;
8809 new_allocation.y += ty;
8812 window = gdk_window_get_parent (window);
8816 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8817 (data->x < new_allocation.x + new_allocation.width) &&
8818 (data->y < new_allocation.y + new_allocation.height))
8820 /* First, check if the drag is in a valid drop site in
8821 * one of our children
8823 if (GTK_IS_CONTAINER (widget))
8825 FindWidgetData new_data = *data;
8827 new_data.x -= x_offset;
8828 new_data.y -= y_offset;
8829 new_data.found = FALSE;
8830 new_data.first = FALSE;
8832 gtk_container_forall (GTK_CONTAINER (widget),
8833 (GtkCallback)find_widget,
8836 data->found = new_data.found;
8838 data->res_widget = new_data.res_widget;
8841 /* If not, and this widget is registered as a drop site, check to
8842 * emit "drag_motion" to check if we are actually in
8848 data->res_widget = widget;
8854 find_widget_at_pointer (GdkDisplay *display)
8856 GtkWidget *widget = NULL;
8857 GdkWindow *pointer_window;
8859 FindWidgetData data;
8861 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
8865 gpointer widget_ptr;
8867 gdk_window_get_user_data (pointer_window, &widget_ptr);
8868 widget = widget_ptr;
8873 gdk_window_get_pointer (gtk_widget_get_window (widget),
8881 find_widget (widget, &data);
8883 return data.res_widget;
8889 struct PropertiesData {
8897 destroy_properties (GtkWidget *widget,
8898 struct PropertiesData *data)
8902 *data->window = NULL;
8903 data->window = NULL;
8908 gdk_cursor_unref (data->cursor);
8909 data->cursor = NULL;
8914 g_signal_handler_disconnect (widget, data->handler);
8922 property_query_event (GtkWidget *widget,
8924 struct PropertiesData *data)
8926 GtkWidget *res_widget = NULL;
8928 if (!data->in_query)
8931 if (event->type == GDK_BUTTON_RELEASE)
8933 gtk_grab_remove (widget);
8934 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8937 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8940 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8941 gtk_widget_get_screen (widget));
8942 create_prop_editor (G_OBJECT (res_widget), 0);
8945 data->in_query = FALSE;
8952 query_properties (GtkButton *button,
8953 struct PropertiesData *data)
8955 GtkWidget *widget = GTK_WIDGET (button);
8958 g_signal_connect (button, "event",
8959 G_CALLBACK (property_query_event), data);
8963 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8966 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
8968 GDK_BUTTON_RELEASE_MASK,
8973 gtk_grab_add (widget);
8975 data->in_query = TRUE;
8979 create_properties (GtkWidget *widget)
8981 static GtkWidget *window = NULL;
8985 struct PropertiesData *data;
8987 data = g_new (struct PropertiesData, 1);
8988 data->window = &window;
8989 data->in_query = FALSE;
8990 data->cursor = NULL;
8995 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8997 gtk_window_set_screen (GTK_WINDOW (window),
8998 gtk_widget_get_screen (widget));
9000 data->handler = g_signal_connect (window, "destroy",
9001 G_CALLBACK (destroy_properties),
9004 gtk_window_set_title (GTK_WINDOW (window), "test properties");
9005 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9007 vbox = gtk_vbox_new (FALSE, 1);
9008 gtk_container_add (GTK_CONTAINER (window), vbox);
9010 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9011 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9013 button = gtk_button_new_with_label ("Query properties");
9014 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9015 g_signal_connect (button, "clicked",
9016 G_CALLBACK (query_properties),
9020 if (!gtk_widget_get_visible (window))
9021 gtk_widget_show_all (window);
9023 gtk_widget_destroy (window);
9027 struct SnapshotData {
9028 GtkWidget *toplevel_button;
9032 gboolean is_toplevel;
9037 destroy_snapshot_data (GtkWidget *widget,
9038 struct SnapshotData *data)
9041 *data->window = NULL;
9045 gdk_cursor_unref (data->cursor);
9046 data->cursor = NULL;
9051 g_signal_handler_disconnect (widget, data->handler);
9059 snapshot_widget_event (GtkWidget *widget,
9061 struct SnapshotData *data)
9063 GtkWidget *res_widget = NULL;
9065 if (!data->in_query)
9068 if (event->type == GDK_BUTTON_RELEASE)
9070 gtk_grab_remove (widget);
9071 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9074 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9075 if (data->is_toplevel && res_widget)
9076 res_widget = gtk_widget_get_toplevel (res_widget);
9080 GtkWidget *window, *image;
9082 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9083 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9084 gtk_widget_realize (window);
9085 if (gdk_drawable_get_depth (gtk_widget_get_window (window)) != gdk_drawable_get_depth (pixmap))
9087 /* this branch is needed to convert ARGB -> RGB */
9090 gdk_drawable_get_size (pixmap, &width, &height);
9091 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9092 gtk_widget_get_colormap (res_widget),
9096 image = gtk_image_new_from_pixbuf (pixbuf);
9097 g_object_unref (pixbuf);
9100 image = gtk_image_new_from_pixmap (pixmap, NULL);
9101 gtk_container_add (GTK_CONTAINER (window), image);
9102 g_object_unref (pixmap);
9103 gtk_widget_show_all (window);
9106 data->in_query = FALSE;
9113 snapshot_widget (GtkButton *button,
9114 struct SnapshotData *data)
9116 GtkWidget *widget = GTK_WIDGET (button);
9119 g_signal_connect (button, "event",
9120 G_CALLBACK (snapshot_widget_event), data);
9122 data->is_toplevel = widget == data->toplevel_button;
9125 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
9128 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
9130 GDK_BUTTON_RELEASE_MASK,
9135 gtk_grab_add (widget);
9137 data->in_query = TRUE;
9141 create_snapshot (GtkWidget *widget)
9143 static GtkWidget *window = NULL;
9146 struct SnapshotData *data;
9148 data = g_new (struct SnapshotData, 1);
9149 data->window = &window;
9150 data->in_query = FALSE;
9151 data->cursor = NULL;
9156 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9158 gtk_window_set_screen (GTK_WINDOW (window),
9159 gtk_widget_get_screen (widget));
9161 data->handler = g_signal_connect (window, "destroy",
9162 G_CALLBACK (destroy_snapshot_data),
9165 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9166 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9168 vbox = gtk_vbox_new (FALSE, 1);
9169 gtk_container_add (GTK_CONTAINER (window), vbox);
9171 button = gtk_button_new_with_label ("Snapshot widget");
9172 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9173 g_signal_connect (button, "clicked",
9174 G_CALLBACK (snapshot_widget),
9177 button = gtk_button_new_with_label ("Snapshot toplevel");
9178 data->toplevel_button = button;
9179 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9180 g_signal_connect (button, "clicked",
9181 G_CALLBACK (snapshot_widget),
9185 if (!gtk_widget_get_visible (window))
9186 gtk_widget_show_all (window);
9188 gtk_widget_destroy (window);
9197 selection_test_received (GtkWidget *tree_view,
9198 GtkSelectionData *data)
9200 GtkTreeModel *model;
9201 GtkListStore *store;
9205 if (data->length < 0)
9207 g_print ("Selection retrieval failed\n");
9210 if (data->type != GDK_SELECTION_TYPE_ATOM)
9212 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9216 /* Clear out any current list items */
9218 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9219 store = GTK_LIST_STORE (model);
9220 gtk_list_store_clear (store);
9222 /* Add new items to list */
9224 atoms = (GdkAtom *)data->data;
9226 l = data->length / sizeof (GdkAtom);
9227 for (i = 0; i < l; i++)
9232 name = gdk_atom_name (atoms[i]);
9235 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9239 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9246 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9248 static GdkAtom targets_atom = GDK_NONE;
9250 if (targets_atom == GDK_NONE)
9251 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9253 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9258 create_selection_test (GtkWidget *widget)
9260 static GtkWidget *window = NULL;
9261 GtkWidget *action_area, *content_area;
9264 GtkWidget *scrolled_win;
9265 GtkListStore* store;
9266 GtkWidget *tree_view;
9267 GtkTreeViewColumn *column;
9268 GtkCellRenderer *renderer;
9273 window = gtk_dialog_new ();
9275 gtk_window_set_screen (GTK_WINDOW (window),
9276 gtk_widget_get_screen (widget));
9278 g_signal_connect (window, "destroy",
9279 G_CALLBACK (gtk_widget_destroyed),
9282 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9283 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9285 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9286 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9288 /* Create the list */
9290 vbox = gtk_vbox_new (FALSE, 5);
9291 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9292 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9294 label = gtk_label_new ("Gets available targets for current selection");
9295 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9297 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9298 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9299 GTK_POLICY_AUTOMATIC,
9300 GTK_POLICY_AUTOMATIC);
9301 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9302 gtk_widget_set_size_request (scrolled_win, 100, 200);
9304 store = gtk_list_store_new (1, G_TYPE_STRING);
9305 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9306 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9308 renderer = gtk_cell_renderer_text_new ();
9309 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9311 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9313 g_signal_connect (tree_view, "selection_received",
9314 G_CALLBACK (selection_test_received), NULL);
9316 /* .. And create some buttons */
9317 button = gtk_button_new_with_label ("Get Targets");
9318 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9320 g_signal_connect (button, "clicked",
9321 G_CALLBACK (selection_test_get_targets), tree_view);
9323 button = gtk_button_new_with_label ("Quit");
9324 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9326 g_signal_connect_swapped (button, "clicked",
9327 G_CALLBACK (gtk_widget_destroy),
9331 if (!gtk_widget_get_visible (window))
9332 gtk_widget_show_all (window);
9334 gtk_widget_destroy (window);
9341 static int scroll_test_pos = 0.0;
9344 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9349 gint imin, imax, jmin, jmax;
9352 imin = (event->area.x) / 10;
9353 imax = (event->area.x + event->area.width + 9) / 10;
9355 jmin = ((int)adj->value + event->area.y) / 10;
9356 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9358 window = gtk_widget_get_window (widget);
9360 gdk_window_clear_area (window,
9361 event->area.x, event->area.y,
9362 event->area.width, event->area.height);
9364 cr = gdk_cairo_create (window);
9366 for (i=imin; i<imax; i++)
9367 for (j=jmin; j<jmax; j++)
9369 cairo_rectangle (cr, 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9379 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9382 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9383 -adj->page_increment / 2:
9384 adj->page_increment / 2);
9385 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9386 gtk_adjustment_set_value (adj, new_value);
9392 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9395 GtkAllocation allocation;
9397 gtk_widget_get_allocation (widget, &allocation);
9398 adj->page_increment = 0.9 * allocation.height;
9399 adj->page_size = allocation.height;
9401 g_signal_emit_by_name (adj, "changed");
9405 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9410 dy = scroll_test_pos - (int)adj->value;
9411 scroll_test_pos = adj->value;
9413 if (!gtk_widget_is_drawable (widget))
9416 window = gtk_widget_get_window (widget);
9417 gdk_window_scroll (window, 0, dy);
9418 gdk_window_process_updates (window, FALSE);
9423 create_scroll_test (GtkWidget *widget)
9425 static GtkWidget *window = NULL;
9426 GtkWidget *action_area, *content_area;
9428 GtkWidget *drawing_area;
9429 GtkWidget *scrollbar;
9432 GdkGeometry geometry;
9433 GdkWindowHints geometry_mask;
9437 window = gtk_dialog_new ();
9439 gtk_window_set_screen (GTK_WINDOW (window),
9440 gtk_widget_get_screen (widget));
9442 g_signal_connect (window, "destroy",
9443 G_CALLBACK (gtk_widget_destroyed),
9446 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9447 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9449 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9450 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9452 hbox = gtk_hbox_new (FALSE, 0);
9453 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9454 gtk_widget_show (hbox);
9456 drawing_area = gtk_drawing_area_new ();
9457 gtk_widget_set_size_request (drawing_area, 200, 200);
9458 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9459 gtk_widget_show (drawing_area);
9461 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9463 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9464 scroll_test_pos = 0.0;
9466 scrollbar = gtk_vscrollbar_new (adj);
9467 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9468 gtk_widget_show (scrollbar);
9470 g_signal_connect (drawing_area, "expose_event",
9471 G_CALLBACK (scroll_test_expose), adj);
9472 g_signal_connect (drawing_area, "configure_event",
9473 G_CALLBACK (scroll_test_configure), adj);
9474 g_signal_connect (drawing_area, "scroll_event",
9475 G_CALLBACK (scroll_test_scroll), adj);
9477 g_signal_connect (adj, "value_changed",
9478 G_CALLBACK (scroll_test_adjustment_changed),
9481 /* .. And create some buttons */
9483 button = gtk_button_new_with_label ("Quit");
9484 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9486 g_signal_connect_swapped (button, "clicked",
9487 G_CALLBACK (gtk_widget_destroy),
9489 gtk_widget_show (button);
9491 /* Set up gridded geometry */
9493 geometry_mask = GDK_HINT_MIN_SIZE |
9494 GDK_HINT_BASE_SIZE |
9495 GDK_HINT_RESIZE_INC;
9497 geometry.min_width = 20;
9498 geometry.min_height = 20;
9499 geometry.base_width = 0;
9500 geometry.base_height = 0;
9501 geometry.width_inc = 10;
9502 geometry.height_inc = 10;
9504 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9505 drawing_area, &geometry, geometry_mask);
9508 if (!gtk_widget_get_visible (window))
9509 gtk_widget_show (window);
9511 gtk_widget_destroy (window);
9518 static int timer = 0;
9521 timeout_test (GtkWidget *label)
9523 static int count = 0;
9524 static char buffer[32];
9526 sprintf (buffer, "count: %d", ++count);
9527 gtk_label_set_text (GTK_LABEL (label), buffer);
9533 start_timeout_test (GtkWidget *widget,
9538 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9543 stop_timeout_test (GtkWidget *widget,
9548 g_source_remove (timer);
9554 destroy_timeout_test (GtkWidget *widget,
9557 stop_timeout_test (NULL, NULL);
9563 create_timeout_test (GtkWidget *widget)
9565 static GtkWidget *window = NULL;
9566 GtkWidget *action_area, *content_area;
9572 window = gtk_dialog_new ();
9574 gtk_window_set_screen (GTK_WINDOW (window),
9575 gtk_widget_get_screen (widget));
9577 g_signal_connect (window, "destroy",
9578 G_CALLBACK (destroy_timeout_test),
9581 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9582 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9584 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9585 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9587 label = gtk_label_new ("count: 0");
9588 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9589 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9590 gtk_widget_show (label);
9592 button = gtk_button_new_with_label ("close");
9593 g_signal_connect_swapped (button, "clicked",
9594 G_CALLBACK (gtk_widget_destroy),
9596 gtk_widget_set_can_default (button, TRUE);
9597 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9598 gtk_widget_grab_default (button);
9599 gtk_widget_show (button);
9601 button = gtk_button_new_with_label ("start");
9602 g_signal_connect (button, "clicked",
9603 G_CALLBACK(start_timeout_test),
9605 gtk_widget_set_can_default (button, TRUE);
9606 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9607 gtk_widget_show (button);
9609 button = gtk_button_new_with_label ("stop");
9610 g_signal_connect (button, "clicked",
9611 G_CALLBACK (stop_timeout_test),
9613 gtk_widget_set_can_default (button, TRUE);
9614 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9615 gtk_widget_show (button);
9618 if (!gtk_widget_get_visible (window))
9619 gtk_widget_show (window);
9621 gtk_widget_destroy (window);
9628 static int idle_id = 0;
9631 idle_test (GtkWidget *label)
9633 static int count = 0;
9634 static char buffer[32];
9636 sprintf (buffer, "count: %d", ++count);
9637 gtk_label_set_text (GTK_LABEL (label), buffer);
9643 start_idle_test (GtkWidget *widget,
9648 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9653 stop_idle_test (GtkWidget *widget,
9658 g_source_remove (idle_id);
9664 destroy_idle_test (GtkWidget *widget,
9667 stop_idle_test (NULL, NULL);
9673 toggle_idle_container (GObject *button,
9674 GtkContainer *container)
9676 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9680 create_idle_test (GtkWidget *widget)
9682 static GtkWidget *window = NULL;
9685 GtkWidget *container;
9689 GtkWidget *action_area, *content_area;
9694 window = gtk_dialog_new ();
9696 gtk_window_set_screen (GTK_WINDOW (window),
9697 gtk_widget_get_screen (widget));
9699 g_signal_connect (window, "destroy",
9700 G_CALLBACK (destroy_idle_test),
9703 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9704 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9706 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9707 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9709 label = gtk_label_new ("count: 0");
9710 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9711 gtk_widget_show (label);
9714 g_object_new (GTK_TYPE_HBOX,
9716 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9717 * "GtkWidget::visible", TRUE,
9722 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9725 g_object_new (GTK_TYPE_FRAME,
9727 "label", "Label Container",
9729 "parent", content_area,
9732 g_object_new (GTK_TYPE_VBOX,
9737 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9738 "label", "Resize-Parent",
9739 "user_data", (void*)GTK_RESIZE_PARENT,
9743 "signal::clicked", toggle_idle_container, container,
9745 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9746 "label", "Resize-Queue",
9747 "user_data", (void*)GTK_RESIZE_QUEUE,
9752 g_object_connect (button,
9753 "signal::clicked", toggle_idle_container, container,
9755 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9756 "label", "Resize-Immediate",
9757 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9759 g_object_connect (button2,
9760 "signal::clicked", toggle_idle_container, container,
9762 g_object_set (button2,
9768 button = gtk_button_new_with_label ("close");
9769 g_signal_connect_swapped (button, "clicked",
9770 G_CALLBACK (gtk_widget_destroy),
9772 gtk_widget_set_can_default (button, TRUE);
9773 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9774 gtk_widget_grab_default (button);
9775 gtk_widget_show (button);
9777 button = gtk_button_new_with_label ("start");
9778 g_signal_connect (button, "clicked",
9779 G_CALLBACK (start_idle_test),
9781 gtk_widget_set_can_default (button, TRUE);
9782 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9783 gtk_widget_show (button);
9785 button = gtk_button_new_with_label ("stop");
9786 g_signal_connect (button, "clicked",
9787 G_CALLBACK (stop_idle_test),
9789 gtk_widget_set_can_default (button, TRUE);
9790 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9791 gtk_widget_show (button);
9794 if (!gtk_widget_get_visible (window))
9795 gtk_widget_show (window);
9797 gtk_widget_destroy (window);
9805 reload_all_rc_files (void)
9807 static GdkAtom atom_rcfiles = GDK_NONE;
9809 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
9813 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
9815 for(i = 0; i < 5; i++)
9816 send_event->client.data.l[i] = 0;
9817 send_event->client.data_format = 32;
9818 send_event->client.message_type = atom_rcfiles;
9819 gdk_event_send_clientmessage_toall (send_event);
9821 gdk_event_free (send_event);
9825 create_rc_file (GtkWidget *widget)
9827 static GtkWidget *window = NULL;
9828 GtkWidget *action_area, *content_area;
9836 window = gtk_dialog_new ();
9838 gtk_window_set_screen (GTK_WINDOW (window),
9839 gtk_widget_get_screen (widget));
9841 g_signal_connect (window, "destroy",
9842 G_CALLBACK (gtk_widget_destroyed),
9845 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9846 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9848 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9849 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9851 vbox = gtk_vbox_new (FALSE, 0);
9852 gtk_container_add (GTK_CONTAINER (frame), vbox);
9854 label = gtk_label_new ("This label should be red");
9855 gtk_widget_set_name (label, "testgtk-red-label");
9856 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9858 label = gtk_label_new ("This label should be green");
9859 gtk_widget_set_name (label, "testgtk-green-label");
9860 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9862 label = gtk_label_new ("This label should be blue");
9863 gtk_widget_set_name (label, "testgtk-blue-label");
9864 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9866 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9867 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9869 button = gtk_button_new_with_label ("Reload");
9870 g_signal_connect (button, "clicked",
9871 G_CALLBACK (gtk_rc_reparse_all), NULL);
9872 gtk_widget_set_can_default (button, TRUE);
9873 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9874 gtk_widget_grab_default (button);
9876 button = gtk_button_new_with_label ("Reload All");
9877 g_signal_connect (button, "clicked",
9878 G_CALLBACK (reload_all_rc_files), NULL);
9879 gtk_widget_set_can_default (button, TRUE);
9880 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9882 button = gtk_button_new_with_label ("Close");
9883 g_signal_connect_swapped (button, "clicked",
9884 G_CALLBACK (gtk_widget_destroy),
9886 gtk_widget_set_can_default (button, TRUE);
9887 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9890 if (!gtk_widget_get_visible (window))
9891 gtk_widget_show_all (window);
9893 gtk_widget_destroy (window);
9897 * Test of recursive mainloop
9901 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9908 create_mainloop (GtkWidget *widget)
9910 static GtkWidget *window = NULL;
9911 GtkWidget *action_area, *content_area;
9917 window = gtk_dialog_new ();
9919 gtk_window_set_screen (GTK_WINDOW (window),
9920 gtk_widget_get_screen (widget));
9922 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9924 g_signal_connect (window, "destroy",
9925 G_CALLBACK (mainloop_destroyed),
9928 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9929 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9931 label = gtk_label_new ("In recursive main loop...");
9932 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9934 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9935 gtk_widget_show (label);
9937 button = gtk_button_new_with_label ("Leave");
9938 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9940 g_signal_connect_swapped (button, "clicked",
9941 G_CALLBACK (gtk_widget_destroy),
9944 gtk_widget_set_can_default (button, TRUE);
9945 gtk_widget_grab_default (button);
9947 gtk_widget_show (button);
9950 if (!gtk_widget_get_visible (window))
9952 gtk_widget_show (window);
9954 g_print ("create_mainloop: start\n");
9956 g_print ("create_mainloop: done\n");
9959 gtk_widget_destroy (window);
9963 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
9966 GdkWindow *bin_window;
9970 gint imin, imax, jmin, jmax;
9972 layout = GTK_LAYOUT (widget);
9973 bin_window = gtk_layout_get_bin_window (layout);
9975 if (event->window != bin_window)
9978 imin = (event->area.x) / 10;
9979 imax = (event->area.x + event->area.width + 9) / 10;
9981 jmin = (event->area.y) / 10;
9982 jmax = (event->area.y + event->area.height + 9) / 10;
9984 cr = gdk_cairo_create (bin_window);
9986 for (i=imin; i<imax; i++)
9987 for (j=jmin; j<jmax; j++)
9989 cairo_rectangle (cr,
10000 void create_layout (GtkWidget *widget)
10002 GtkAdjustment *hadjustment, *vadjustment;
10004 static GtkWidget *window = NULL;
10005 GtkWidget *layout_widget;
10006 GtkWidget *scrolledwindow;
10015 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10016 gtk_window_set_screen (GTK_WINDOW (window),
10017 gtk_widget_get_screen (widget));
10019 g_signal_connect (window, "destroy",
10020 G_CALLBACK (gtk_widget_destroyed),
10023 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10024 gtk_widget_set_size_request (window, 200, 200);
10026 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10027 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10029 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10030 GTK_CORNER_TOP_RIGHT);
10032 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10034 layout_widget = gtk_layout_new (NULL, NULL);
10035 layout = GTK_LAYOUT (layout_widget);
10036 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
10038 /* We set step sizes here since GtkLayout does not set
10041 hadjustment = gtk_layout_get_hadjustment (layout);
10042 vadjustment = gtk_layout_get_vadjustment (layout);
10043 gtk_adjustment_set_step_increment (hadjustment, 10.0);
10044 gtk_adjustment_set_step_increment (vadjustment, 10.0);
10045 gtk_layout_set_hadjustment (layout, hadjustment);
10046 gtk_layout_set_vadjustment (layout, vadjustment);
10048 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
10049 g_signal_connect (layout, "expose_event",
10050 G_CALLBACK (layout_expose_handler), NULL);
10052 gtk_layout_set_size (layout, 1600, 128000);
10054 for (i=0 ; i < 16 ; i++)
10055 for (j=0 ; j < 16 ; j++)
10057 sprintf(buf, "Button %d, %d", i, j);
10059 button = gtk_button_new_with_label (buf);
10061 button = gtk_label_new (buf);
10063 gtk_layout_put (layout, button, j*100, i*100);
10066 for (i=16; i < 1280; i++)
10068 sprintf(buf, "Button %d, %d", i, 0);
10070 button = gtk_button_new_with_label (buf);
10072 button = gtk_label_new (buf);
10074 gtk_layout_put (layout, button, 0, i*100);
10078 if (!gtk_widget_get_visible (window))
10079 gtk_widget_show_all (window);
10081 gtk_widget_destroy (window);
10085 create_styles (GtkWidget *widget)
10087 static GtkWidget *window = NULL;
10088 GtkWidget *content_area, *action_area;
10093 static GdkColor red = { 0, 0xffff, 0, 0 };
10094 static GdkColor green = { 0, 0, 0xffff, 0 };
10095 static GdkColor blue = { 0, 0, 0, 0xffff };
10096 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10097 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10098 PangoFontDescription *font_desc;
10100 GtkRcStyle *rc_style;
10104 window = gtk_dialog_new ();
10105 gtk_window_set_screen (GTK_WINDOW (window),
10106 gtk_widget_get_screen (widget));
10108 g_signal_connect (window, "destroy",
10109 G_CALLBACK (gtk_widget_destroyed),
10112 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10113 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10115 button = gtk_button_new_with_label ("Close");
10116 g_signal_connect_swapped (button, "clicked",
10117 G_CALLBACK (gtk_widget_destroy),
10119 gtk_widget_set_can_default (button, TRUE);
10120 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10121 gtk_widget_show (button);
10123 vbox = gtk_vbox_new (FALSE, 5);
10124 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10125 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
10127 label = gtk_label_new ("Font:");
10128 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10129 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10131 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10133 button = gtk_button_new_with_label ("Some Text");
10134 gtk_widget_modify_font (gtk_bin_get_child (GTK_BIN (button)),
10136 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10138 label = gtk_label_new ("Foreground:");
10139 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10140 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10142 button = gtk_button_new_with_label ("Some Text");
10143 gtk_widget_modify_fg (gtk_bin_get_child (GTK_BIN (button)),
10144 GTK_STATE_NORMAL, &red);
10145 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10147 label = gtk_label_new ("Background:");
10148 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10149 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10151 button = gtk_button_new_with_label ("Some Text");
10152 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10153 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10155 label = gtk_label_new ("Text:");
10156 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10157 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10159 entry = gtk_entry_new ();
10160 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10161 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10162 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10164 label = gtk_label_new ("Base:");
10165 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10166 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10168 entry = gtk_entry_new ();
10169 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10170 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10171 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10173 label = gtk_label_new ("Cursor:");
10174 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10175 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10177 entry = gtk_entry_new ();
10178 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10179 gtk_widget_modify_cursor (entry, &red, &red);
10180 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10182 label = gtk_label_new ("Multiple:");
10183 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10184 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10186 button = gtk_button_new_with_label ("Some Text");
10188 rc_style = gtk_rc_style_new ();
10190 rc_style->font_desc = pango_font_description_copy (font_desc);
10191 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10192 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10193 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10194 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10195 rc_style->bg[GTK_STATE_NORMAL] = blue;
10196 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10197 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10198 rc_style->fg[GTK_STATE_ACTIVE] = red;
10199 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10200 rc_style->xthickness = 5;
10201 rc_style->ythickness = 5;
10203 gtk_widget_modify_style (button, rc_style);
10204 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
10206 g_object_unref (rc_style);
10208 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10211 if (!gtk_widget_get_visible (window))
10212 gtk_widget_show_all (window);
10214 gtk_widget_destroy (window);
10218 * Main Window and Exit
10222 do_exit (GtkWidget *widget, GtkWidget *window)
10224 gtk_widget_destroy (window);
10230 void (*func) (GtkWidget *widget);
10231 gboolean do_not_benchmark;
10234 { "alpha window", create_alpha_window },
10235 { "big windows", create_big_windows },
10236 { "button box", create_button_box },
10237 { "buttons", create_buttons },
10238 { "check buttons", create_check_buttons },
10239 { "color selection", create_color_selection },
10240 { "composited window", create_composited_window },
10241 { "cursors", create_cursors },
10242 { "dialog", create_dialog },
10243 { "display & screen", create_display_screen, TRUE },
10244 { "entry", create_entry },
10245 { "event box", create_event_box },
10246 { "event watcher", create_event_watcher },
10247 { "expander", create_expander },
10248 { "flipping", create_flipping },
10249 { "focus", create_focus },
10250 { "font selection", create_font_selection },
10251 { "gridded geometry", create_gridded_geometry },
10252 { "handle box", create_handle_box },
10253 { "image", create_image },
10254 { "key lookup", create_key_lookup },
10255 { "labels", create_labels },
10256 { "layout", create_layout },
10257 { "menus", create_menus },
10258 { "message dialog", create_message_dialog },
10259 { "modal window", create_modal_window, TRUE },
10260 { "notebook", create_notebook },
10261 { "panes", create_panes },
10262 { "paned keyboard", create_paned_keyboard_navigation },
10263 { "pixbuf", create_pixbuf },
10264 { "progress bar", create_progress_bar },
10265 { "properties", create_properties },
10266 { "radio buttons", create_radio_buttons },
10267 { "range controls", create_range_controls },
10268 { "rc file", create_rc_file },
10269 { "reparent", create_reparent },
10270 { "resize grips", create_resize_grips },
10271 { "rotated label", create_rotated_label },
10272 { "rotated text", create_rotated_text },
10273 { "rulers", create_rulers },
10274 { "saved position", create_saved_position },
10275 { "scrolled windows", create_scrolled_windows },
10276 { "shapes", create_shapes },
10277 { "size groups", create_size_groups },
10278 { "snapshot", create_snapshot },
10279 { "spinbutton", create_spins },
10280 { "statusbar", create_statusbar },
10281 { "styles", create_styles },
10282 { "test idle", create_idle_test },
10283 { "test mainloop", create_mainloop, TRUE },
10284 { "test scrolling", create_scroll_test },
10285 { "test selection", create_selection_test },
10286 { "test timeout", create_timeout_test },
10287 { "toggle buttons", create_toggle_buttons },
10288 { "toolbar", create_toolbar },
10289 { "tooltips", create_tooltips },
10290 { "WM hints", create_wmhints },
10291 { "window sizing", create_window_sizing },
10292 { "window states", create_window_states }
10294 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10297 create_main_window (void)
10302 GtkWidget *scrolled_window;
10306 GtkWidget *separator;
10307 GdkGeometry geometry;
10310 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10311 gtk_widget_set_name (window, "main window");
10312 gtk_window_move (GTK_WINDOW (window), 50, 20);
10313 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10315 geometry.min_width = -1;
10316 geometry.min_height = -1;
10317 geometry.max_width = -1;
10318 geometry.max_height = G_MAXSHORT;
10319 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10321 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10323 g_signal_connect (window, "destroy",
10324 G_CALLBACK (gtk_main_quit),
10326 g_signal_connect (window, "delete-event",
10327 G_CALLBACK (gtk_false),
10330 box1 = gtk_vbox_new (FALSE, 0);
10331 gtk_container_add (GTK_CONTAINER (window), box1);
10333 if (gtk_micro_version > 0)
10338 gtk_micro_version);
10343 gtk_minor_version);
10345 label = gtk_label_new (buffer);
10346 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10347 gtk_widget_set_name (label, "testgtk-version-label");
10349 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10350 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10351 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10353 GTK_POLICY_AUTOMATIC);
10354 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10356 box2 = gtk_vbox_new (FALSE, 0);
10357 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10358 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10359 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10360 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10361 gtk_widget_show (box2);
10363 for (i = 0; i < nbuttons; i++)
10365 button = gtk_button_new_with_label (buttons[i].label);
10366 if (buttons[i].func)
10367 g_signal_connect (button,
10369 G_CALLBACK(buttons[i].func),
10372 gtk_widget_set_sensitive (button, FALSE);
10373 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10376 separator = gtk_hseparator_new ();
10377 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10379 box2 = gtk_vbox_new (FALSE, 10);
10380 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10381 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10383 button = gtk_button_new_with_mnemonic ("_Close");
10384 g_signal_connect (button, "clicked",
10385 G_CALLBACK (do_exit),
10387 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10388 gtk_widget_set_can_default (button, TRUE);
10389 gtk_widget_grab_default (button);
10391 gtk_widget_show_all (window);
10397 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10398 G_FILE_TEST_EXISTS))
10400 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10401 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10406 pad (const char *str, int to)
10408 static char buf[256];
10409 int len = strlen (str);
10412 for (i = 0; i < to; i++)
10417 memcpy (buf, str, len);
10423 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10425 fn (widget); /* on */
10426 while (g_main_context_iteration (NULL, FALSE));
10427 fn (widget); /* off */
10428 while (g_main_context_iteration (NULL, FALSE));
10432 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10438 static gboolean printed_headers = FALSE;
10440 if (!printed_headers) {
10441 g_print ("Test Iters First Other\n");
10442 g_print ("-------------------- ----- ---------- ----------\n");
10443 printed_headers = TRUE;
10446 g_get_current_time (&tv0);
10447 bench_iteration (widget, fn);
10448 g_get_current_time (&tv1);
10450 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10451 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10453 g_get_current_time (&tv0);
10454 for (n = 0; n < num - 1; n++)
10455 bench_iteration (widget, fn);
10456 g_get_current_time (&tv1);
10457 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10458 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10460 g_print ("%s %5d ", pad (name, 20), num);
10462 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10464 g_print ("%10.1f\n", dt_first);
10468 do_bench (char* what, int num)
10472 void (* fn) (GtkWidget *widget);
10474 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10476 if (g_ascii_strcasecmp (what, "ALL") == 0)
10478 for (i = 0; i < nbuttons; i++)
10480 if (!buttons[i].do_not_benchmark)
10481 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10488 for (i = 0; i < nbuttons; i++)
10490 if (strcmp (buttons[i].label, what) == 0)
10492 fn = buttons[i].func;
10498 g_print ("Can't bench: \"%s\" not found.\n", what);
10500 do_real_bench (widget, fn, buttons[i].label, num);
10507 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10512 main (int argc, char *argv[])
10514 GtkBindingSet *binding_set;
10516 gboolean done_benchmarks = FALSE;
10518 srand (time (NULL));
10522 /* Check to see if we are being run from the correct
10525 if (file_exists ("testgtkrc"))
10526 gtk_rc_add_default_file ("testgtkrc");
10527 else if (file_exists ("tests/testgtkrc"))
10528 gtk_rc_add_default_file ("tests/testgtkrc");
10530 g_warning ("Couldn't find file \"testgtkrc\".");
10532 g_set_application_name ("GTK+ Test Program");
10534 gtk_init (&argc, &argv);
10536 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10545 for (i = 1; i < argc; i++)
10547 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10554 nextarg = strchr (argv[i], '=');
10565 count = strchr (nextarg, ':');
10568 what = g_strndup (nextarg, count - nextarg);
10570 num = atoi (count);
10575 what = g_strdup (nextarg);
10577 do_bench (what, num ? num : 1);
10578 done_benchmarks = TRUE;
10583 if (done_benchmarks)
10588 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10589 gtk_binding_entry_add_signal (binding_set,
10590 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10593 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10595 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
10599 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
10600 " fg[NORMAL] = \"#ff0000\"\n"
10601 " font = \"Sans 18\"\n"
10603 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
10605 create_main_window ();
10611 while (g_main_context_pending (NULL))
10612 g_main_context_iteration (NULL, FALSE);
10615 while (g_main_context_pending (NULL))
10616 g_main_context_iteration (NULL, FALSE);