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)
135 cairo_pattern_t *pattern;
138 cr = gdk_cairo_create (widget->window);
140 radius = MIN (widget->allocation.width, widget->allocation.height) / 2;
141 pattern = cairo_pattern_create_radial (widget->allocation.width / 2,
142 widget->allocation.height / 2,
144 widget->allocation.width / 2,
145 widget->allocation.height / 2,
148 if (gdk_screen_get_rgba_colormap (gtk_widget_get_screen (widget)) &&
149 gtk_widget_is_composited (widget))
150 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
152 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
154 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
157 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
158 1.0, 0.75, 0.0, 1.0); /* solid orange */
159 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
160 1.0, 0.75, 0.0, 0.0); /* transparent orange */
162 cairo_set_source (cr, pattern);
163 cairo_pattern_destroy (pattern);
165 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
174 build_alpha_widgets (void)
177 GtkWidget *radio_button;
182 table = gtk_table_new (1, 1, FALSE);
184 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
185 gtk_table_attach (GTK_TABLE (table),
188 GTK_EXPAND | GTK_FILL, 0,
191 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
192 gtk_table_attach (GTK_TABLE (table),
195 GTK_EXPAND | GTK_FILL, 0,
198 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
199 gtk_table_attach (GTK_TABLE (table),
202 GTK_EXPAND | GTK_FILL, 0,
205 gtk_table_attach (GTK_TABLE (table),
206 gtk_check_button_new_with_label ("Sedentary"),
208 GTK_EXPAND | GTK_FILL, 0,
210 gtk_table_attach (GTK_TABLE (table),
211 gtk_check_button_new_with_label ("Nocturnal"),
213 GTK_EXPAND | GTK_FILL, 0,
215 gtk_table_attach (GTK_TABLE (table),
216 gtk_check_button_new_with_label ("Compulsive"),
218 GTK_EXPAND | GTK_FILL, 0,
221 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
222 gtk_table_attach (GTK_TABLE (table),
225 GTK_EXPAND | GTK_FILL, 0,
228 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
229 gtk_table_attach (GTK_TABLE (table),
232 GTK_EXPAND | GTK_FILL, 0,
235 hbox = gtk_hbox_new (FALSE, 0);
236 label = gtk_label_new (NULL);
237 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
238 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
239 entry = gtk_entry_new ();
240 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
241 gtk_table_attach (GTK_TABLE (table),
244 GTK_EXPAND | GTK_FILL, 0,
251 on_alpha_screen_changed (GtkWidget *widget,
252 GdkScreen *old_screen,
255 GdkScreen *screen = gtk_widget_get_screen (widget);
256 GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
260 colormap = gdk_screen_get_default_colormap (screen);
261 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
265 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
268 gtk_widget_set_colormap (widget, colormap);
272 on_composited_changed (GtkWidget *window,
275 gboolean is_composited = gtk_widget_is_composited (window);
278 gtk_label_set_text (label, "Composited");
280 gtk_label_set_text (label, "Not composited");
284 create_alpha_window (GtkWidget *widget)
286 static GtkWidget *window;
290 GtkWidget *content_area;
294 window = gtk_dialog_new_with_buttons ("Alpha Window",
295 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
299 gtk_widget_set_app_paintable (window, TRUE);
300 g_signal_connect (window, "expose-event",
301 G_CALLBACK (on_alpha_window_expose), NULL);
303 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
305 vbox = gtk_vbox_new (FALSE, 8);
306 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
307 gtk_box_pack_start (GTK_BOX (content_area), vbox,
310 label = gtk_label_new (NULL);
311 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
312 on_alpha_screen_changed (window, NULL, label);
313 g_signal_connect (window, "screen-changed",
314 G_CALLBACK (on_alpha_screen_changed), label);
316 label = gtk_label_new (NULL);
317 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
318 on_composited_changed (window, GTK_LABEL (label));
319 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
321 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
323 g_signal_connect (window, "destroy",
324 G_CALLBACK (gtk_widget_destroyed),
327 g_signal_connect (window, "response",
328 G_CALLBACK (gtk_widget_destroy),
332 if (!gtk_widget_get_visible (window))
333 gtk_widget_show_all (window);
335 gtk_widget_destroy (window);
339 * Composited non-toplevel window
342 /* The expose event handler for the event box.
344 * This function simply draws a transparency onto a widget on the area
345 * for which it receives expose events. This is intended to give the
346 * event box a "transparent" background.
348 * In order for this to work properly, the widget must have an RGBA
349 * colourmap. The widget should also be set as app-paintable since it
350 * doesn't make sense for GTK to draw a background if we are drawing it
351 * (and because GTK might actually replace our transparency with its
352 * default background colour).
355 transparent_expose (GtkWidget *widget,
356 GdkEventExpose *event)
360 cr = gdk_cairo_create (widget->window);
361 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
362 gdk_cairo_region (cr, event->region);
369 /* The expose event handler for the window.
371 * This function performs the actual compositing of the event box onto
372 * the already-existing background of the window at 50% normal opacity.
374 * In this case we do not want app-paintable to be set on the widget
375 * since we want it to draw its own (red) background. Because of this,
376 * however, we must ensure that we use g_signal_register_after so that
377 * this handler is called after the red has been drawn. If it was
378 * called before then GTK would just blindly paint over our work.
381 window_expose_event (GtkWidget *widget,
382 GdkEventExpose *event)
384 cairo_region_t *region;
388 /* get our child (in this case, the event box) */
389 child = gtk_bin_get_child (GTK_BIN (widget));
391 /* create a cairo context to draw to the window */
392 cr = gdk_cairo_create (widget->window);
394 /* the source data is the (composited) event box */
395 gdk_cairo_set_source_pixmap (cr, child->window,
397 child->allocation.y);
399 /* draw no more than our expose event intersects our child */
400 region = cairo_region_create_rectangle (&child->allocation);
401 cairo_region_intersect (region, event->region);
402 gdk_cairo_region (cr, region);
405 /* composite, with a 50% opacity */
406 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
407 cairo_paint_with_alpha (cr, 0.5);
416 create_composited_window (GtkWidget *widget)
418 static GtkWidget *window;
422 GtkWidget *event, *button;
427 /* make the widgets */
428 button = gtk_button_new_with_label ("A Button");
429 event = gtk_event_box_new ();
430 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
432 g_signal_connect (window, "destroy",
433 G_CALLBACK (gtk_widget_destroyed),
436 /* put a red background on the window */
437 gdk_color_parse ("red", &red);
438 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
440 /* set the colourmap for the event box.
441 * must be done before the event box is realised.
443 screen = gtk_widget_get_screen (event);
444 rgba = gdk_screen_get_rgba_colormap (screen);
445 gtk_widget_set_colormap (event, rgba);
447 /* set our event box to have a fully-transparent background
448 * drawn on it. currently there is no way to simply tell gtk
449 * that "transparency" is the background colour for a widget.
451 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
452 g_signal_connect (event, "expose-event",
453 G_CALLBACK (transparent_expose), NULL);
455 /* put them inside one another */
456 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
457 gtk_container_add (GTK_CONTAINER (window), event);
458 gtk_container_add (GTK_CONTAINER (event), button);
460 /* realise and show everything */
461 gtk_widget_realize (button);
463 /* set the event box GdkWindow to be composited.
464 * obviously must be performed after event box is realised.
466 gdk_window_set_composited (event->window, TRUE);
468 /* set up the compositing handler.
469 * note that we do _after so that the normal (red) background is drawn
470 * by gtk before our compositing occurs.
472 g_signal_connect_after (window, "expose-event",
473 G_CALLBACK (window_expose_event), NULL);
476 if (!gtk_widget_get_visible (window))
477 gtk_widget_show_all (window);
479 gtk_widget_destroy (window);
483 * Big windows and guffaw scrolling
487 pattern_expose (GtkWidget *widget,
488 GdkEventExpose *event,
492 GdkWindow *window = event->window;
494 color = g_object_get_data (G_OBJECT (window), "pattern-color");
497 cairo_t *cr = gdk_cairo_create (window);
499 gdk_cairo_set_source_color (cr, color);
500 gdk_cairo_rectangle (cr, &event->area);
510 pattern_set_bg (GtkWidget *widget,
514 static const GdkColor colors[] = {
515 { 0, 0x4444, 0x4444, 0xffff },
516 { 0, 0x8888, 0x8888, 0xffff },
517 { 0, 0xaaaa, 0xaaaa, 0xffff }
520 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
521 gdk_window_set_user_data (child, widget);
525 create_pattern (GtkWidget *widget,
536 while (2 * h <= height)
541 while (2 * w <= width)
543 if ((i + j) % 2 == 0)
548 GdkWindowAttr attributes;
550 attributes.window_type = GDK_WINDOW_CHILD;
553 attributes.width = w;
554 attributes.height = h;
555 attributes.wclass = GDK_INPUT_OUTPUT;
556 attributes.event_mask = GDK_EXPOSURE_MASK;
557 attributes.visual = gtk_widget_get_visual (widget);
558 attributes.colormap = gtk_widget_get_colormap (widget);
560 child = gdk_window_new (parent, &attributes,
561 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
563 pattern_set_bg (widget, child, level);
566 create_pattern (widget, child, level + 1, w, h);
568 gdk_window_show (child);
578 #define PATTERN_SIZE (1 << 18)
581 pattern_hadj_changed (GtkAdjustment *adj,
584 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
585 gint new_value = adj->value;
587 if (gtk_widget_get_realized (darea))
589 gdk_window_scroll (darea->window, *old_value - new_value, 0);
590 *old_value = new_value;
595 pattern_vadj_changed (GtkAdjustment *adj,
598 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
599 gint new_value = adj->value;
601 if (gtk_widget_get_realized (darea))
603 gdk_window_scroll (darea->window, 0, *old_value - new_value);
604 *old_value = new_value;
609 pattern_realize (GtkWidget *widget,
612 pattern_set_bg (widget, widget->window, 0);
613 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
617 create_big_windows (GtkWidget *widget)
619 static GtkWidget *window = NULL;
620 GtkWidget *content_area;
621 GtkWidget *darea, *table, *scrollbar;
625 static gint current_x;
626 static gint current_y;
633 window = gtk_dialog_new_with_buttons ("Big Windows",
639 gtk_window_set_screen (GTK_WINDOW (window),
640 gtk_widget_get_screen (widget));
642 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
644 g_signal_connect (window, "destroy",
645 G_CALLBACK (gtk_widget_destroyed),
648 g_signal_connect (window, "response",
649 G_CALLBACK (gtk_widget_destroy),
652 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
654 table = gtk_table_new (2, 2, FALSE);
655 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
657 darea = gtk_drawing_area_new ();
659 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
660 g_signal_connect (hadj, "value_changed",
661 G_CALLBACK (pattern_hadj_changed), darea);
662 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
664 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
665 g_signal_connect (vadj, "value_changed",
666 G_CALLBACK (pattern_vadj_changed), darea);
667 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
669 g_signal_connect (darea, "realize",
670 G_CALLBACK (pattern_realize),
672 g_signal_connect (darea, "expose_event",
673 G_CALLBACK (pattern_expose),
676 eventbox = gtk_event_box_new ();
677 gtk_table_attach (GTK_TABLE (table), eventbox,
679 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
682 gtk_container_add (GTK_CONTAINER (eventbox), darea);
684 scrollbar = gtk_hscrollbar_new (hadj);
685 gtk_table_attach (GTK_TABLE (table), scrollbar,
687 GTK_FILL | GTK_EXPAND, GTK_FILL,
690 scrollbar = gtk_vscrollbar_new (vadj);
691 gtk_table_attach (GTK_TABLE (table), scrollbar,
693 GTK_FILL, GTK_EXPAND | GTK_FILL,
698 if (!gtk_widget_get_visible (window))
699 gtk_widget_show_all (window);
701 gtk_widget_hide (window);
709 button_window (GtkWidget *widget,
712 if (!gtk_widget_get_visible (button))
713 gtk_widget_show (button);
715 gtk_widget_hide (button);
719 create_buttons (GtkWidget *widget)
721 static GtkWidget *window = NULL;
725 GtkWidget *button[10];
726 GtkWidget *separator;
730 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
731 gtk_window_set_screen (GTK_WINDOW (window),
732 gtk_widget_get_screen (widget));
734 g_signal_connect (window, "destroy",
735 G_CALLBACK (gtk_widget_destroyed),
738 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
739 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
741 box1 = gtk_vbox_new (FALSE, 0);
742 gtk_container_add (GTK_CONTAINER (window), box1);
744 table = gtk_table_new (3, 3, FALSE);
745 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
746 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
747 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
748 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
750 button[0] = gtk_button_new_with_label ("button1");
751 button[1] = gtk_button_new_with_mnemonic ("_button2");
752 button[2] = gtk_button_new_with_mnemonic ("_button3");
753 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
754 button[4] = gtk_button_new_with_label ("button5");
755 button[5] = gtk_button_new_with_label ("button6");
756 button[6] = gtk_button_new_with_label ("button7");
757 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
758 button[8] = gtk_button_new_with_label ("button9");
760 g_signal_connect (button[0], "clicked",
761 G_CALLBACK (button_window),
764 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
765 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
767 g_signal_connect (button[1], "clicked",
768 G_CALLBACK (button_window),
771 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
772 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
774 g_signal_connect (button[2], "clicked",
775 G_CALLBACK (button_window),
777 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
778 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
780 g_signal_connect (button[3], "clicked",
781 G_CALLBACK (button_window),
783 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
784 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
786 g_signal_connect (button[4], "clicked",
787 G_CALLBACK (button_window),
789 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
790 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
792 g_signal_connect (button[5], "clicked",
793 G_CALLBACK (button_window),
795 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
796 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
798 g_signal_connect (button[6], "clicked",
799 G_CALLBACK (button_window),
801 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
802 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
804 g_signal_connect (button[7], "clicked",
805 G_CALLBACK (button_window),
807 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
808 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
810 g_signal_connect (button[8], "clicked",
811 G_CALLBACK (button_window),
813 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
814 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
816 separator = gtk_hseparator_new ();
817 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
819 box2 = gtk_vbox_new (FALSE, 10);
820 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
821 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
823 button[9] = gtk_button_new_with_label ("close");
824 g_signal_connect_swapped (button[9], "clicked",
825 G_CALLBACK (gtk_widget_destroy),
827 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
828 gtk_widget_set_can_default (button[9], TRUE);
829 gtk_widget_grab_default (button[9]);
832 if (!gtk_widget_get_visible (window))
833 gtk_widget_show_all (window);
835 gtk_widget_destroy (window);
843 create_toggle_buttons (GtkWidget *widget)
845 static GtkWidget *window = NULL;
849 GtkWidget *separator;
853 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
854 gtk_window_set_screen (GTK_WINDOW (window),
855 gtk_widget_get_screen (widget));
857 g_signal_connect (window, "destroy",
858 G_CALLBACK (gtk_widget_destroyed),
861 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
862 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
864 box1 = gtk_vbox_new (FALSE, 0);
865 gtk_container_add (GTK_CONTAINER (window), box1);
867 box2 = gtk_vbox_new (FALSE, 10);
868 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
869 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
871 button = gtk_toggle_button_new_with_label ("button1");
872 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
874 button = gtk_toggle_button_new_with_label ("button2");
875 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
877 button = gtk_toggle_button_new_with_label ("button3");
878 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
880 button = gtk_toggle_button_new_with_label ("inconsistent");
881 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
882 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
884 separator = gtk_hseparator_new ();
885 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
887 box2 = gtk_vbox_new (FALSE, 10);
888 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
889 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
891 button = gtk_button_new_with_label ("close");
892 g_signal_connect_swapped (button, "clicked",
893 G_CALLBACK (gtk_widget_destroy),
895 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
896 gtk_widget_set_can_default (button, TRUE);
897 gtk_widget_grab_default (button);
900 if (!gtk_widget_get_visible (window))
901 gtk_widget_show_all (window);
903 gtk_widget_destroy (window);
907 create_widget_grid (GType widget_type)
910 GtkWidget *group_widget = NULL;
913 table = gtk_table_new (FALSE, 3, 3);
915 for (i = 0; i < 5; i++)
917 for (j = 0; j < 5; j++)
922 if (i == 0 && j == 0)
928 tmp = g_strdup_printf ("%d", j);
929 widget = gtk_label_new (tmp);
934 tmp = g_strdup_printf ("%c", 'A' + i - 1);
935 widget = gtk_label_new (tmp);
940 widget = g_object_new (widget_type, NULL);
942 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
945 group_widget = widget;
947 g_object_set (widget, "group", group_widget, NULL);
952 gtk_table_attach (GTK_TABLE (table), widget,
967 create_check_buttons (GtkWidget *widget)
969 static GtkWidget *window = NULL;
973 GtkWidget *separator;
978 window = gtk_dialog_new_with_buttons ("Check Buttons",
984 gtk_window_set_screen (GTK_WINDOW (window),
985 gtk_widget_get_screen (widget));
987 g_signal_connect (window, "destroy",
988 G_CALLBACK (gtk_widget_destroyed),
990 g_signal_connect (window, "response",
991 G_CALLBACK (gtk_widget_destroy),
994 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
996 box2 = gtk_vbox_new (FALSE, 10);
997 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
998 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1000 button = gtk_check_button_new_with_mnemonic ("_button1");
1001 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1003 button = gtk_check_button_new_with_label ("button2");
1004 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1006 button = gtk_check_button_new_with_label ("button3");
1007 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1009 button = gtk_check_button_new_with_label ("inconsistent");
1010 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1011 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1013 separator = gtk_hseparator_new ();
1014 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1016 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
1017 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1018 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1021 if (!gtk_widget_get_visible (window))
1022 gtk_widget_show_all (window);
1024 gtk_widget_destroy (window);
1032 create_radio_buttons (GtkWidget *widget)
1034 static GtkWidget *window = NULL;
1038 GtkWidget *separator;
1043 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1049 gtk_window_set_screen (GTK_WINDOW (window),
1050 gtk_widget_get_screen (widget));
1052 g_signal_connect (window, "destroy",
1053 G_CALLBACK (gtk_widget_destroyed),
1055 g_signal_connect (window, "response",
1056 G_CALLBACK (gtk_widget_destroy),
1059 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1061 box2 = gtk_vbox_new (FALSE, 10);
1062 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1063 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1065 button = gtk_radio_button_new_with_label (NULL, "button1");
1066 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1068 button = gtk_radio_button_new_with_label (
1069 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1071 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1072 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1074 button = gtk_radio_button_new_with_label (
1075 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1077 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1079 button = gtk_radio_button_new_with_label (
1080 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1082 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1083 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1085 separator = gtk_hseparator_new ();
1086 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1088 box2 = gtk_vbox_new (FALSE, 10);
1089 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1090 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1092 button = gtk_radio_button_new_with_label (NULL, "button4");
1093 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1094 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1096 button = gtk_radio_button_new_with_label (
1097 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1099 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1100 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1101 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1103 button = gtk_radio_button_new_with_label (
1104 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1106 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1107 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1109 separator = gtk_hseparator_new ();
1110 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1112 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1113 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1114 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1117 if (!gtk_widget_get_visible (window))
1118 gtk_widget_show_all (window);
1120 gtk_widget_destroy (window);
1128 create_bbox (gint horizontal,
1139 frame = gtk_frame_new (title);
1142 bbox = gtk_hbutton_box_new ();
1144 bbox = gtk_vbutton_box_new ();
1146 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1147 gtk_container_add (GTK_CONTAINER (frame), bbox);
1149 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1150 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1152 button = gtk_button_new_with_label ("OK");
1153 gtk_container_add (GTK_CONTAINER (bbox), button);
1155 button = gtk_button_new_with_label ("Cancel");
1156 gtk_container_add (GTK_CONTAINER (bbox), button);
1158 button = gtk_button_new_with_label ("Help");
1159 gtk_container_add (GTK_CONTAINER (bbox), button);
1165 create_button_box (GtkWidget *widget)
1167 static GtkWidget* window = NULL;
1168 GtkWidget *main_vbox;
1171 GtkWidget *frame_horz;
1172 GtkWidget *frame_vert;
1176 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1177 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1178 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1180 g_signal_connect (window, "destroy",
1181 G_CALLBACK (gtk_widget_destroyed),
1184 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1186 main_vbox = gtk_vbox_new (FALSE, 0);
1187 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1189 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1190 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1192 vbox = gtk_vbox_new (FALSE, 0);
1193 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1194 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1196 gtk_box_pack_start (GTK_BOX (vbox),
1197 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1200 gtk_box_pack_start (GTK_BOX (vbox),
1201 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1204 gtk_box_pack_start (GTK_BOX (vbox),
1205 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1208 gtk_box_pack_start (GTK_BOX (vbox),
1209 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1212 gtk_box_pack_start (GTK_BOX (vbox),
1213 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1216 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1217 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1219 hbox = gtk_hbox_new (FALSE, 0);
1220 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1221 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1223 gtk_box_pack_start (GTK_BOX (hbox),
1224 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1227 gtk_box_pack_start (GTK_BOX (hbox),
1228 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1231 gtk_box_pack_start (GTK_BOX (hbox),
1232 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1235 gtk_box_pack_start (GTK_BOX (hbox),
1236 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1239 gtk_box_pack_start (GTK_BOX (hbox),
1240 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1244 if (!gtk_widget_get_visible (window))
1245 gtk_widget_show_all (window);
1247 gtk_widget_destroy (window);
1255 new_pixbuf (char *filename,
1257 GdkColor *background)
1262 if (strcmp (filename, "test.xpm") == 0)
1265 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1268 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1270 widget = gtk_image_new_from_pixbuf (pixbuf);
1272 g_object_unref (pixbuf);
1279 set_toolbar_small_stock (GtkWidget *widget,
1282 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1286 set_toolbar_large_stock (GtkWidget *widget,
1289 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1293 set_toolbar_horizontal (GtkWidget *widget,
1296 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1300 set_toolbar_vertical (GtkWidget *widget,
1303 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1307 set_toolbar_icons (GtkWidget *widget,
1310 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1314 set_toolbar_text (GtkWidget *widget,
1317 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1321 set_toolbar_both (GtkWidget *widget,
1324 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1328 set_toolbar_both_horiz (GtkWidget *widget,
1331 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1335 set_toolbar_enable (GtkWidget *widget,
1338 GtkSettings *settings = gtk_widget_get_settings (widget);
1339 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1343 set_toolbar_disable (GtkWidget *widget,
1346 GtkSettings *settings = gtk_widget_get_settings (widget);
1347 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1350 static GtkActionEntry create_toolbar_items[] = {
1351 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1352 G_CALLBACK (set_toolbar_small_stock) },
1353 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1354 G_CALLBACK (set_toolbar_large_stock) },
1355 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1356 G_CALLBACK (set_toolbar_horizontal) },
1357 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1358 G_CALLBACK (set_toolbar_vertical) },
1360 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1361 G_CALLBACK (set_toolbar_icons) },
1362 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1363 G_CALLBACK (set_toolbar_text) },
1364 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1365 G_CALLBACK (set_toolbar_both) },
1366 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1367 G_CALLBACK (set_toolbar_both_horiz) },
1369 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1373 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1374 G_CALLBACK (set_toolbar_enable) },
1375 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1376 G_CALLBACK (set_toolbar_disable) },
1378 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1380 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1383 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1385 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1390 create_toolbar (GtkWidget *widget)
1392 static GtkWidget *window = NULL;
1399 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1400 gtk_window_set_screen (GTK_WINDOW (window),
1401 gtk_widget_get_screen (widget));
1403 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1405 g_signal_connect (window, "destroy",
1406 G_CALLBACK (gtk_widget_destroyed),
1409 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1410 gtk_widget_realize (window);
1412 toolbar = gtk_toolbar_new ();
1413 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1415 GtkToolItem *toolitem;
1417 if (create_toolbar_items[i].tooltip == NULL)
1418 toolitem = gtk_separator_tool_item_new ();
1419 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1423 toolitem = gtk_tool_item_new ();
1424 entry = gtk_entry_new ();
1425 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1427 else if (create_toolbar_items[i].stock_id)
1428 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1433 icon = new_pixbuf ("test.xpm", window->window,
1434 &window->style->bg[GTK_STATE_NORMAL]);
1435 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1437 if (create_toolbar_items[i].callback)
1438 g_signal_connect (toolitem, "clicked",
1439 create_toolbar_items[i].callback, toolbar);
1440 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1441 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1444 gtk_container_add (GTK_CONTAINER (window), toolbar);
1446 gtk_widget_set_size_request (toolbar, 200, -1);
1449 if (!gtk_widget_get_visible (window))
1450 gtk_widget_show_all (window);
1452 gtk_widget_destroy (window);
1455 static GtkActionEntry make_toolbar_items[] = {
1456 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1457 G_CALLBACK (set_toolbar_horizontal) },
1458 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1459 G_CALLBACK (set_toolbar_vertical) },
1461 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1462 G_CALLBACK (set_toolbar_icons) },
1463 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1464 G_CALLBACK (set_toolbar_text) },
1465 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1466 G_CALLBACK (set_toolbar_both) },
1468 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1470 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1473 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1474 G_CALLBACK (set_toolbar_enable) },
1475 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1476 G_CALLBACK (set_toolbar_disable) },
1478 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1480 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1485 make_toolbar (GtkWidget *window)
1490 if (!gtk_widget_get_realized (window))
1491 gtk_widget_realize (window);
1493 toolbar = gtk_toolbar_new ();
1494 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1497 GtkToolItem *toolitem;
1499 if (make_toolbar_items[i].label == NULL)
1501 toolitem = gtk_separator_tool_item_new ();
1504 icon = new_pixbuf ("test.xpm", window->window,
1505 &window->style->bg[GTK_STATE_NORMAL]);
1506 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1507 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1508 if (make_toolbar_items[i].callback != NULL)
1509 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1510 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1520 static guint statusbar_counter = 1;
1523 statusbar_push (GtkWidget *button,
1524 GtkStatusbar *statusbar)
1528 sprintf (text, "something %d", statusbar_counter++);
1530 gtk_statusbar_push (statusbar, 1, text);
1534 statusbar_push_long (GtkWidget *button,
1535 GtkStatusbar *statusbar)
1539 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\").");
1541 gtk_statusbar_push (statusbar, 1, text);
1545 statusbar_pop (GtkWidget *button,
1546 GtkStatusbar *statusbar)
1548 gtk_statusbar_pop (statusbar, 1);
1552 statusbar_steal (GtkWidget *button,
1553 GtkStatusbar *statusbar)
1555 gtk_statusbar_remove (statusbar, 1, 4);
1559 statusbar_popped (GtkStatusbar *statusbar,
1564 statusbar_counter = 1;
1568 statusbar_contexts (GtkStatusbar *statusbar)
1572 string = "any context";
1573 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1575 gtk_statusbar_get_context_id (statusbar, string));
1577 string = "idle messages";
1578 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1580 gtk_statusbar_get_context_id (statusbar, string));
1582 string = "some text";
1583 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1585 gtk_statusbar_get_context_id (statusbar, string));
1587 string = "hit the mouse";
1588 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1590 gtk_statusbar_get_context_id (statusbar, string));
1592 string = "hit the mouse2";
1593 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1595 gtk_statusbar_get_context_id (statusbar, string));
1599 create_statusbar (GtkWidget *widget)
1601 static GtkWidget *window = NULL;
1605 GtkWidget *separator;
1606 GtkWidget *statusbar;
1610 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1611 gtk_window_set_screen (GTK_WINDOW (window),
1612 gtk_widget_get_screen (widget));
1614 g_signal_connect (window, "destroy",
1615 G_CALLBACK (gtk_widget_destroyed),
1618 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1619 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1621 box1 = gtk_vbox_new (FALSE, 0);
1622 gtk_container_add (GTK_CONTAINER (window), box1);
1624 box2 = gtk_vbox_new (FALSE, 10);
1625 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1626 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1628 statusbar = gtk_statusbar_new ();
1629 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1630 g_signal_connect (statusbar,
1632 G_CALLBACK (statusbar_popped),
1635 button = g_object_new (gtk_button_get_type (),
1636 "label", "push something",
1640 g_object_connect (button,
1641 "signal::clicked", statusbar_push, statusbar,
1644 button = g_object_connect (g_object_new (gtk_button_get_type (),
1649 "signal_after::clicked", statusbar_pop, statusbar,
1652 button = g_object_connect (g_object_new (gtk_button_get_type (),
1653 "label", "steal #4",
1657 "signal_after::clicked", statusbar_steal, statusbar,
1660 button = g_object_connect (g_object_new (gtk_button_get_type (),
1661 "label", "test contexts",
1665 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1668 button = g_object_connect (g_object_new (gtk_button_get_type (),
1669 "label", "push something long",
1673 "signal_after::clicked", statusbar_push_long, statusbar,
1676 separator = gtk_hseparator_new ();
1677 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1679 box2 = gtk_vbox_new (FALSE, 10);
1680 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1681 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1683 button = gtk_button_new_with_label ("close");
1684 g_signal_connect_swapped (button, "clicked",
1685 G_CALLBACK (gtk_widget_destroy),
1687 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1688 gtk_widget_set_can_default (button, TRUE);
1689 gtk_widget_grab_default (button);
1692 if (!gtk_widget_get_visible (window))
1693 gtk_widget_show_all (window);
1695 gtk_widget_destroy (window);
1701 #define GRID_SIZE 20
1702 #define DEFAULT_GEOMETRY "10x10"
1705 gridded_geometry_expose (GtkWidget *widget,
1706 GdkEventExpose *event)
1711 cr = gdk_cairo_create (widget->window);
1713 cairo_rectangle (cr, 0, 0, widget->allocation.width, widget->allocation.height);
1714 gdk_cairo_set_source_color (cr, &widget->style->base[widget->state]);
1717 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
1718 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
1720 if ((i + j) % 2 == 0)
1721 cairo_rectangle (cr, i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1724 gdk_cairo_set_source_color (cr, &widget->style->text[widget->state]);
1733 gridded_geometry_subresponse (GtkDialog *dialog,
1735 gchar *geometry_string)
1737 if (response_id == GTK_RESPONSE_NONE)
1739 gtk_widget_destroy (GTK_WIDGET (dialog));
1743 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1745 g_print ("Can't parse geometry string %s\n", geometry_string);
1746 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1752 gridded_geometry_response (GtkDialog *dialog,
1756 if (response_id == GTK_RESPONSE_NONE)
1758 gtk_widget_destroy (GTK_WIDGET (dialog));
1762 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1763 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1764 GtkWidget *content_area;
1766 GtkWidget *drawing_area;
1768 GdkGeometry geometry;
1770 window = gtk_dialog_new_with_buttons (title,
1773 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1776 gtk_window_set_screen (GTK_WINDOW (window),
1777 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1779 g_signal_connect (window, "response",
1780 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1782 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1784 box = gtk_vbox_new (FALSE, 0);
1785 gtk_box_pack_start (GTK_BOX (content_area), box, TRUE, TRUE, 0);
1787 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1789 drawing_area = gtk_drawing_area_new ();
1790 g_signal_connect (drawing_area, "expose_event",
1791 G_CALLBACK (gridded_geometry_expose), NULL);
1792 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1794 /* Gross hack to work around bug 68668... if we set the size request
1795 * large enough, then the current
1797 * request_of_window - request_of_geometry_widget
1799 * method of getting the base size works more or less works.
1801 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1803 geometry.base_width = 0;
1804 geometry.base_height = 0;
1805 geometry.min_width = 2 * GRID_SIZE;
1806 geometry.min_height = 2 * GRID_SIZE;
1807 geometry.width_inc = GRID_SIZE;
1808 geometry.height_inc = GRID_SIZE;
1810 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1812 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1814 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1816 g_print ("Can't parse geometry string %s\n", geometry_string);
1817 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1820 gtk_widget_show_all (window);
1825 create_gridded_geometry (GtkWidget *widget)
1827 static GtkWidget *window = NULL;
1828 gpointer window_ptr;
1829 GtkWidget *content_area;
1835 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1838 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1841 gtk_window_set_screen (GTK_WINDOW (window),
1842 gtk_widget_get_screen (widget));
1844 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1846 label = gtk_label_new ("Geometry string:");
1847 gtk_box_pack_start (GTK_BOX (content_area), label, FALSE, FALSE, 0);
1849 entry = gtk_entry_new ();
1850 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1851 gtk_box_pack_start (GTK_BOX (content_area), entry, FALSE, FALSE, 0);
1853 g_signal_connect (window, "response",
1854 G_CALLBACK (gridded_geometry_response), entry);
1855 window_ptr = &window;
1856 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
1858 gtk_widget_show_all (window);
1861 gtk_widget_destroy (window);
1869 handle_box_child_signal (GtkHandleBox *hb,
1871 const gchar *action)
1873 printf ("%s: child <%s> %sed\n",
1874 g_type_name (G_OBJECT_TYPE (hb)),
1875 g_type_name (G_OBJECT_TYPE (child)),
1880 create_handle_box (GtkWidget *widget)
1882 static GtkWidget* window = NULL;
1883 GtkWidget *handle_box;
1884 GtkWidget *handle_box2;
1889 GtkWidget *separator;
1893 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1895 gtk_window_set_screen (GTK_WINDOW (window),
1896 gtk_widget_get_screen (widget));
1897 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1898 gtk_window_set_title (GTK_WINDOW (window),
1900 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1902 g_signal_connect (window, "destroy",
1903 G_CALLBACK (gtk_widget_destroyed),
1906 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1908 vbox = gtk_vbox_new (FALSE, 0);
1909 gtk_container_add (GTK_CONTAINER (window), vbox);
1910 gtk_widget_show (vbox);
1912 label = gtk_label_new ("Above");
1913 gtk_container_add (GTK_CONTAINER (vbox), label);
1914 gtk_widget_show (label);
1916 separator = gtk_hseparator_new ();
1917 gtk_container_add (GTK_CONTAINER (vbox), separator);
1918 gtk_widget_show (separator);
1920 hbox = gtk_hbox_new (FALSE, 10);
1921 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1922 gtk_widget_show (hbox);
1924 separator = gtk_hseparator_new ();
1925 gtk_container_add (GTK_CONTAINER (vbox), separator);
1926 gtk_widget_show (separator);
1928 label = gtk_label_new ("Below");
1929 gtk_container_add (GTK_CONTAINER (vbox), label);
1930 gtk_widget_show (label);
1932 handle_box = gtk_handle_box_new ();
1933 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1934 g_signal_connect (handle_box,
1936 G_CALLBACK (handle_box_child_signal),
1938 g_signal_connect (handle_box,
1940 G_CALLBACK (handle_box_child_signal),
1942 gtk_widget_show (handle_box);
1944 toolbar = make_toolbar (window);
1946 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1947 gtk_widget_show (toolbar);
1949 handle_box = gtk_handle_box_new ();
1950 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1951 g_signal_connect (handle_box,
1953 G_CALLBACK (handle_box_child_signal),
1955 g_signal_connect (handle_box,
1957 G_CALLBACK (handle_box_child_signal),
1959 gtk_widget_show (handle_box);
1961 handle_box2 = gtk_handle_box_new ();
1962 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1963 g_signal_connect (handle_box2,
1965 G_CALLBACK (handle_box_child_signal),
1967 g_signal_connect (handle_box2,
1969 G_CALLBACK (handle_box_child_signal),
1971 gtk_widget_show (handle_box2);
1973 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
1974 label = gtk_label_new ("Fooo!");
1975 gtk_container_add (GTK_CONTAINER (hbox), label);
1976 gtk_widget_show (label);
1977 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1980 if (!gtk_widget_get_visible (window))
1981 gtk_widget_show (window);
1983 gtk_widget_destroy (window);
1990 sensitivity_toggled (GtkWidget *toggle,
1993 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
1997 create_sensitivity_control (GtkWidget *widget)
2001 button = gtk_toggle_button_new_with_label ("Sensitive");
2003 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2004 gtk_widget_is_sensitive (widget));
2006 g_signal_connect (button,
2008 G_CALLBACK (sensitivity_toggled),
2011 gtk_widget_show_all (button);
2017 set_selectable_recursive (GtkWidget *widget,
2020 if (GTK_IS_CONTAINER (widget))
2025 children = gtk_container_get_children (GTK_CONTAINER (widget));
2029 set_selectable_recursive (tmp->data, setting);
2033 g_list_free (children);
2035 else if (GTK_IS_LABEL (widget))
2037 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2042 selectable_toggled (GtkWidget *toggle,
2045 set_selectable_recursive (widget,
2046 GTK_TOGGLE_BUTTON (toggle)->active);
2050 create_selectable_control (GtkWidget *widget)
2054 button = gtk_toggle_button_new_with_label ("Selectable");
2056 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2059 g_signal_connect (button,
2061 G_CALLBACK (selectable_toggled),
2064 gtk_widget_show_all (button);
2070 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
2074 gtk_widget_destroy (dialog);
2076 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2077 "as hyperlinks, which can be clicked\n"
2078 "or activated via <a href=\"keynav\">keynav</a>.\n"
2079 "The links remain the same.";
2080 gtk_label_set_markup (label, text);
2084 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
2086 if (g_strcmp0 (uri, "keynav") == 0)
2090 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
2091 GTK_DIALOG_DESTROY_WITH_PARENT,
2094 "The term <i>keynav</i> is a shorthand for "
2095 "keyboard navigation and refers to the process of using a program "
2096 "(exclusively) via keyboard input.");
2098 gtk_window_present (GTK_WINDOW (dialog));
2100 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
2108 void create_labels (GtkWidget *widget)
2110 static GtkWidget *window = NULL;
2119 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2121 gtk_window_set_screen (GTK_WINDOW (window),
2122 gtk_widget_get_screen (widget));
2124 g_signal_connect (window, "destroy",
2125 G_CALLBACK (gtk_widget_destroyed),
2128 gtk_window_set_title (GTK_WINDOW (window), "Label");
2130 vbox = gtk_vbox_new (FALSE, 5);
2132 hbox = gtk_hbox_new (FALSE, 5);
2133 gtk_container_add (GTK_CONTAINER (window), vbox);
2135 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2137 button = create_sensitivity_control (hbox);
2139 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2141 button = create_selectable_control (hbox);
2143 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2145 vbox = gtk_vbox_new (FALSE, 5);
2147 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2148 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2150 frame = gtk_frame_new ("Normal Label");
2151 label = gtk_label_new ("This is a Normal label");
2152 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2153 gtk_container_add (GTK_CONTAINER (frame), label);
2154 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2156 frame = gtk_frame_new ("Multi-line Label");
2157 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2158 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
2159 gtk_container_add (GTK_CONTAINER (frame), label);
2160 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2162 frame = gtk_frame_new ("Left Justified Label");
2163 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2164 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
2165 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2166 gtk_container_add (GTK_CONTAINER (frame), label);
2167 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2169 frame = gtk_frame_new ("Right Justified Label");
2170 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2171 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2172 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2173 gtk_container_add (GTK_CONTAINER (frame), label);
2174 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2176 frame = gtk_frame_new ("Internationalized Label");
2177 label = gtk_label_new (NULL);
2178 gtk_label_set_markup (GTK_LABEL (label),
2179 "French (Fran\303\247ais) Bonjour, Salut\n"
2180 "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"
2181 "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"
2182 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2183 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2184 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2185 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2186 gtk_container_add (GTK_CONTAINER (frame), label);
2187 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2189 frame = gtk_frame_new ("Bidirection Label");
2190 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"
2191 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
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 ("Links in a label");
2196 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2197 "as hyperlinks, which can be clicked\n"
2198 "or activated via <a href=\"keynav\">keynav</a>");
2199 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
2200 gtk_container_add (GTK_CONTAINER (frame), label);
2201 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2202 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
2204 vbox = gtk_vbox_new (FALSE, 5);
2205 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2206 frame = gtk_frame_new ("Line wrapped label");
2207 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2208 "up the entire "/* big space to test spacing */\
2209 "width allocated to it, but automatically wraps the words to fit. "\
2210 "The time has come, for all good men, to come to the aid of their party. "\
2211 "The sixth sheik's six sheep's sick.\n"\
2212 " It supports multiple paragraphs correctly, and correctly adds "\
2213 "many extra spaces. ");
2215 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2216 gtk_container_add (GTK_CONTAINER (frame), label);
2217 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2219 frame = gtk_frame_new ("Filled, wrapped label");
2220 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2221 "up the entire width allocated to it. Here is a seneance to prove "\
2222 "my point. Here is another sentence. "\
2223 "Here comes the sun, do de do de do.\n"\
2224 " This is a new paragraph.\n"\
2225 " This is another newer, longer, better paragraph. It is coming to an end, "\
2227 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2228 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2229 gtk_container_add (GTK_CONTAINER (frame), label);
2230 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2232 frame = gtk_frame_new ("Underlined label");
2233 label = gtk_label_new ("This label is underlined!\n"
2234 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2235 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2236 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2237 gtk_container_add (GTK_CONTAINER (frame), label);
2238 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2240 frame = gtk_frame_new ("Markup label");
2241 label = gtk_label_new (NULL);
2243 /* There's also a gtk_label_set_markup() without accel if you
2244 * don't have an accelerator key
2246 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2247 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2248 "<b>markup</b> _such as "
2249 "<big><i>Big Italics</i></big>\n"
2250 "<tt>Monospace font</tt>\n"
2251 "<u>Underline!</u>\n"
2253 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2254 "and nothing on this line,\n"
2257 "or even on this one\n"
2258 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2259 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2260 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2262 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2264 gtk_container_add (GTK_CONTAINER (frame), label);
2265 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2268 if (!gtk_widget_get_visible (window))
2269 gtk_widget_show_all (window);
2271 gtk_widget_destroy (window);
2275 on_angle_scale_changed (GtkRange *range,
2278 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2282 create_rotated_label (GtkWidget *widget)
2284 static GtkWidget *window = NULL;
2285 GtkWidget *content_area;
2289 GtkWidget *scale_label;
2290 GtkWidget *scale_hbox;
2294 window = gtk_dialog_new_with_buttons ("Rotated Label",
2295 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2296 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2299 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2301 gtk_window_set_screen (GTK_WINDOW (window),
2302 gtk_widget_get_screen (widget));
2304 g_signal_connect (window, "response",
2305 G_CALLBACK (gtk_object_destroy), NULL);
2306 g_signal_connect (window, "destroy",
2307 G_CALLBACK (gtk_widget_destroyed), &window);
2309 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2311 vbox = gtk_vbox_new (FALSE, 5);
2312 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2313 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2315 label = gtk_label_new (NULL);
2316 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2317 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2319 scale_hbox = gtk_hbox_new (FALSE, 0);
2320 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2322 scale_label = gtk_label_new (NULL);
2323 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2324 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2326 hscale = gtk_hscale_new_with_range (0, 360, 5);
2327 g_signal_connect (hscale, "value-changed",
2328 G_CALLBACK (on_angle_scale_changed), label);
2330 gtk_range_set_value (GTK_RANGE (hscale), 45);
2331 gtk_widget_set_size_request (hscale, 200, -1);
2332 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2335 if (!gtk_widget_get_visible (window))
2336 gtk_widget_show_all (window);
2338 gtk_widget_destroy (window);
2341 #define DEFAULT_TEXT_RADIUS 200
2344 on_rotated_text_unrealize (GtkWidget *widget)
2346 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2350 on_rotated_text_expose (GtkWidget *widget,
2351 GdkEventExpose *event,
2352 GdkPixbuf *tile_pixbuf)
2354 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2355 "had", "10,000", "men" };
2359 PangoLayout *layout;
2360 PangoContext *context;
2361 PangoFontDescription *desc;
2364 cr = gdk_cairo_create (event->window);
2368 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2369 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2372 cairo_set_source_rgb (cr, 0, 0, 0);
2374 radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
2376 cairo_translate (cr,
2377 radius + (widget->allocation.width - 2 * radius) / 2,
2378 radius + (widget->allocation.height - 2 * radius) / 2);
2379 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2381 context = gtk_widget_get_pango_context (widget);
2382 layout = pango_layout_new (context);
2383 desc = pango_font_description_from_string ("Sans Bold 30");
2384 pango_layout_set_font_description (layout, desc);
2385 pango_font_description_free (desc);
2387 n_words = G_N_ELEMENTS (words);
2388 for (i = 0; i < n_words; i++)
2394 cairo_rotate (cr, 2 * G_PI * i / n_words);
2395 pango_cairo_update_layout (cr, layout);
2397 pango_layout_set_text (layout, words[i], -1);
2398 pango_layout_get_size (layout, &width, &height);
2400 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2401 pango_cairo_show_layout (cr, layout);
2406 g_object_unref (layout);
2413 create_rotated_text (GtkWidget *widget)
2415 static GtkWidget *window = NULL;
2419 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
2420 GtkRequisition requisition;
2421 GtkWidget *content_area;
2422 GtkWidget *drawing_area;
2423 GdkPixbuf *tile_pixbuf;
2425 window = gtk_dialog_new_with_buttons ("Rotated Text",
2426 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2427 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2430 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2432 gtk_window_set_screen (GTK_WINDOW (window),
2433 gtk_widget_get_screen (widget));
2435 g_signal_connect (window, "response",
2436 G_CALLBACK (gtk_object_destroy), NULL);
2437 g_signal_connect (window, "destroy",
2438 G_CALLBACK (gtk_widget_destroyed), &window);
2440 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2442 drawing_area = gtk_drawing_area_new ();
2443 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2444 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
2446 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2448 g_signal_connect (drawing_area, "expose-event",
2449 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
2450 g_signal_connect (drawing_area, "unrealize",
2451 G_CALLBACK (on_rotated_text_unrealize), NULL);
2453 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2455 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2456 gtk_widget_size_request (window, &requisition);
2457 gtk_widget_set_size_request (drawing_area, -1, -1);
2458 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2461 if (!gtk_widget_get_visible (window))
2462 gtk_widget_show (window);
2464 gtk_widget_destroy (window);
2472 reparent_label (GtkWidget *widget,
2473 GtkWidget *new_parent)
2477 label = g_object_get_data (G_OBJECT (widget), "user_data");
2479 gtk_widget_reparent (label, new_parent);
2483 set_parent_signal (GtkWidget *child,
2484 GtkWidget *old_parent,
2487 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2488 g_type_name (G_OBJECT_TYPE (child)),
2489 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
2490 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2491 GPOINTER_TO_INT (func_data));
2495 create_reparent (GtkWidget *widget)
2497 static GtkWidget *window = NULL;
2504 GtkWidget *separator;
2505 GtkWidget *event_box;
2509 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2511 gtk_window_set_screen (GTK_WINDOW (window),
2512 gtk_widget_get_screen (widget));
2514 g_signal_connect (window, "destroy",
2515 G_CALLBACK (gtk_widget_destroyed),
2518 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2519 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2521 box1 = gtk_vbox_new (FALSE, 0);
2522 gtk_container_add (GTK_CONTAINER (window), box1);
2524 box2 = gtk_hbox_new (FALSE, 5);
2525 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2526 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2528 label = gtk_label_new ("Hello World");
2530 frame = gtk_frame_new ("Frame 1");
2531 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2533 box3 = gtk_vbox_new (FALSE, 5);
2534 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2535 gtk_container_add (GTK_CONTAINER (frame), box3);
2537 button = gtk_button_new_with_label ("switch");
2538 g_object_set_data (G_OBJECT (button), "user_data", label);
2539 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2541 event_box = gtk_event_box_new ();
2542 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2543 gtk_container_add (GTK_CONTAINER (event_box), label);
2545 g_signal_connect (button, "clicked",
2546 G_CALLBACK (reparent_label),
2549 g_signal_connect (label, "parent_set",
2550 G_CALLBACK (set_parent_signal),
2551 GINT_TO_POINTER (42));
2553 frame = gtk_frame_new ("Frame 2");
2554 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2556 box3 = gtk_vbox_new (FALSE, 5);
2557 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2558 gtk_container_add (GTK_CONTAINER (frame), box3);
2560 button = gtk_button_new_with_label ("switch");
2561 g_object_set_data (G_OBJECT (button), "user_data", label);
2562 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2564 event_box = gtk_event_box_new ();
2565 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2567 g_signal_connect (button, "clicked",
2568 G_CALLBACK (reparent_label),
2571 separator = gtk_hseparator_new ();
2572 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2574 box2 = gtk_vbox_new (FALSE, 10);
2575 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2576 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2578 button = gtk_button_new_with_label ("close");
2579 g_signal_connect_swapped (button, "clicked",
2580 G_CALLBACK (gtk_widget_destroy), window);
2581 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2582 gtk_widget_set_can_default (button, TRUE);
2583 gtk_widget_grab_default (button);
2586 if (!gtk_widget_get_visible (window))
2587 gtk_widget_show_all (window);
2589 gtk_widget_destroy (window);
2596 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2598 if (event->type == GDK_BUTTON_PRESS)
2600 if (event->button == 1)
2601 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2602 event->button, event->x_root, event->y_root,
2604 else if (event->button == 2)
2605 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2606 event->button, event->x_root, event->y_root,
2613 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
2615 gtk_paint_resize_grip (area->style,
2617 gtk_widget_get_state (area),
2623 area->allocation.width,
2624 area->allocation.height);
2630 create_resize_grips (GtkWidget *widget)
2632 static GtkWidget *window = NULL;
2634 GtkWidget *hbox, *vbox;
2637 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2639 gtk_window_set_screen (GTK_WINDOW (window),
2640 gtk_widget_get_screen (widget));
2642 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2644 g_signal_connect (window, "destroy",
2645 G_CALLBACK (gtk_widget_destroyed),
2648 vbox = gtk_vbox_new (FALSE, 0);
2649 gtk_container_add (GTK_CONTAINER (window), vbox);
2651 hbox = gtk_hbox_new (FALSE, 0);
2652 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2655 area = gtk_drawing_area_new ();
2656 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2657 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2658 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2659 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2660 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2661 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2664 area = gtk_drawing_area_new ();
2665 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2666 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2667 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2668 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2669 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2670 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2673 area = gtk_drawing_area_new ();
2674 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2675 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2676 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2677 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2678 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2679 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2681 hbox = gtk_hbox_new (FALSE, 0);
2682 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2685 area = gtk_drawing_area_new ();
2686 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2687 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2688 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2689 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2690 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2691 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2694 area = gtk_drawing_area_new ();
2695 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2698 area = gtk_drawing_area_new ();
2699 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2700 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2701 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2702 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2703 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2704 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2707 hbox = gtk_hbox_new (FALSE, 0);
2708 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2711 area = gtk_drawing_area_new ();
2712 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2713 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2714 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2715 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2716 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2717 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2719 area = gtk_drawing_area_new ();
2720 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2721 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2722 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2723 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2724 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2725 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2728 area = gtk_drawing_area_new ();
2729 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2730 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2731 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2732 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2733 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2734 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2737 if (!gtk_widget_get_visible (window))
2738 gtk_widget_show_all (window);
2740 gtk_widget_destroy (window);
2746 gint upositionx = 0;
2747 gint upositiony = 0;
2750 uposition_configure (GtkWidget *window)
2756 lx = g_object_get_data (G_OBJECT (window), "x");
2757 ly = g_object_get_data (G_OBJECT (window), "y");
2759 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
2760 sprintf (buffer, "%d", upositionx);
2761 gtk_label_set_text (lx, buffer);
2762 sprintf (buffer, "%d", upositiony);
2763 gtk_label_set_text (ly, buffer);
2769 uposition_stop_configure (GtkToggleButton *toggle,
2773 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2775 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2779 create_saved_position (GtkWidget *widget)
2781 static GtkWidget *window = NULL;
2786 GtkWidget *main_vbox;
2794 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2795 "type", GTK_WINDOW_TOPLEVEL,
2796 "title", "Saved Position",
2798 "signal::configure_event", uposition_configure, NULL,
2801 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2803 gtk_window_set_screen (GTK_WINDOW (window),
2804 gtk_widget_get_screen (widget));
2807 g_signal_connect (window, "destroy",
2808 G_CALLBACK (gtk_widget_destroyed),
2811 main_vbox = gtk_vbox_new (FALSE, 5);
2812 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2813 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2816 g_object_new (gtk_vbox_get_type (),
2817 "GtkBox::homogeneous", FALSE,
2818 "GtkBox::spacing", 5,
2819 "GtkContainer::border_width", 10,
2820 "GtkWidget::parent", main_vbox,
2821 "GtkWidget::visible", TRUE,
2822 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2823 "label", "Stop Events",
2827 "signal::clicked", uposition_stop_configure, window,
2831 hbox = gtk_hbox_new (FALSE, 0);
2832 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2833 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2835 label = gtk_label_new ("X Origin : ");
2836 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2837 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2839 x_label = gtk_label_new ("");
2840 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2841 g_object_set_data (G_OBJECT (window), "x", x_label);
2843 hbox = gtk_hbox_new (FALSE, 0);
2844 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2845 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2847 label = gtk_label_new ("Y Origin : ");
2848 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2849 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2851 y_label = gtk_label_new ("");
2852 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2853 g_object_set_data (G_OBJECT (window), "y", y_label);
2856 g_object_new (gtk_hseparator_get_type (),
2857 "GtkWidget::visible", TRUE,
2859 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2861 hbox = gtk_hbox_new (FALSE, 0);
2862 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2863 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2865 button = gtk_button_new_with_label ("Close");
2866 g_signal_connect_swapped (button, "clicked",
2867 G_CALLBACK (gtk_widget_destroy),
2869 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2870 gtk_widget_set_can_default (button, TRUE);
2871 gtk_widget_grab_default (button);
2873 gtk_widget_show_all (window);
2876 gtk_widget_destroy (window);
2884 create_pixbuf (GtkWidget *widget)
2886 static GtkWidget *window = NULL;
2892 GtkWidget *separator;
2893 GtkWidget *pixbufwid;
2897 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2899 gtk_window_set_screen (GTK_WINDOW (window),
2900 gtk_widget_get_screen (widget));
2902 g_signal_connect (window, "destroy",
2903 G_CALLBACK (gtk_widget_destroyed),
2906 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2907 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2908 gtk_widget_realize(window);
2910 box1 = gtk_vbox_new (FALSE, 0);
2911 gtk_container_add (GTK_CONTAINER (window), box1);
2913 box2 = gtk_vbox_new (FALSE, 10);
2914 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2915 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2917 button = gtk_button_new ();
2918 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2920 pixbufwid = new_pixbuf ("test.xpm", window->window, NULL);
2922 label = gtk_label_new ("Pixbuf\ntest");
2923 box3 = gtk_hbox_new (FALSE, 0);
2924 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2925 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2926 gtk_container_add (GTK_CONTAINER (box3), label);
2927 gtk_container_add (GTK_CONTAINER (button), box3);
2929 button = gtk_button_new ();
2930 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2932 pixbufwid = new_pixbuf ("test.xpm", window->window, NULL);
2934 label = gtk_label_new ("Pixbuf\ntest");
2935 box3 = gtk_hbox_new (FALSE, 0);
2936 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2937 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2938 gtk_container_add (GTK_CONTAINER (box3), label);
2939 gtk_container_add (GTK_CONTAINER (button), box3);
2941 gtk_widget_set_sensitive (button, FALSE);
2943 separator = gtk_hseparator_new ();
2944 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2946 box2 = gtk_vbox_new (FALSE, 10);
2947 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2948 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2950 button = gtk_button_new_with_label ("close");
2951 g_signal_connect_swapped (button, "clicked",
2952 G_CALLBACK (gtk_widget_destroy),
2954 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2955 gtk_widget_set_can_default (button, TRUE);
2956 gtk_widget_grab_default (button);
2959 if (!gtk_widget_get_visible (window))
2960 gtk_widget_show_all (window);
2962 gtk_widget_destroy (window);
2966 create_tooltips (GtkWidget *widget)
2968 static GtkWidget *window = NULL;
2975 GtkWidget *separator;
2980 g_object_new (gtk_window_get_type (),
2981 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2982 "GtkContainer::border_width", 0,
2983 "GtkWindow::title", "Tooltips",
2984 "GtkWindow::resizable", FALSE,
2987 gtk_window_set_screen (GTK_WINDOW (window),
2988 gtk_widget_get_screen (widget));
2990 box1 = gtk_vbox_new (FALSE, 0);
2991 gtk_container_add (GTK_CONTAINER (window), box1);
2993 box2 = gtk_vbox_new (FALSE, 10);
2994 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2995 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2997 button = gtk_toggle_button_new_with_label ("button1");
2998 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3000 gtk_widget_set_tooltip_text (button, "This is button 1");
3002 button = gtk_toggle_button_new_with_label ("button2");
3003 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3005 gtk_widget_set_tooltip_text (button,
3006 "This is button 2. This is also a really long tooltip which probably "
3007 "won't fit on a single line and will therefore need to be wrapped. "
3008 "Hopefully the wrapping will work correctly.");
3010 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3011 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3013 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
3016 g_object_new (gtk_vbox_get_type (),
3017 "homogeneous", FALSE,
3024 g_object_new (gtk_button_get_type (),
3029 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3030 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
3032 frame = g_object_new (gtk_frame_get_type (),
3033 "label", "ToolTips Inspector",
3034 "label_xalign", (double) 0.5,
3040 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3042 separator = gtk_hseparator_new ();
3043 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3045 box2 = gtk_vbox_new (FALSE, 10);
3046 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3047 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3049 button = gtk_button_new_with_label ("close");
3050 g_signal_connect_swapped (button, "clicked",
3051 G_CALLBACK (gtk_widget_destroy),
3053 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3054 gtk_widget_set_can_default (button, TRUE);
3055 gtk_widget_grab_default (button);
3057 gtk_widget_set_tooltip_text (button, "Push this button to close window");
3060 if (!gtk_widget_get_visible (window))
3061 gtk_widget_show_all (window);
3063 gtk_widget_destroy (window);
3071 pack_image (GtkWidget *box,
3075 gtk_box_pack_start (GTK_BOX (box),
3076 gtk_label_new (text),
3079 gtk_box_pack_start (GTK_BOX (box),
3085 create_image (GtkWidget *widget)
3087 static GtkWidget *window = NULL;
3094 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3096 gtk_window_set_screen (GTK_WINDOW (window),
3097 gtk_widget_get_screen (widget));
3099 /* this is bogus for testing drawing when allocation < request,
3100 * don't copy into real code
3102 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3104 g_signal_connect (window, "destroy",
3105 G_CALLBACK (gtk_widget_destroyed),
3108 vbox = gtk_vbox_new (FALSE, 5);
3110 gtk_container_add (GTK_CONTAINER (window), vbox);
3112 pack_image (vbox, "Stock Warning Dialog",
3113 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3114 GTK_ICON_SIZE_DIALOG));
3116 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
3118 pack_image (vbox, "Pixbuf",
3119 gtk_image_new_from_pixbuf (pixbuf));
3121 g_object_unref (pixbuf);
3124 if (!gtk_widget_get_visible (window))
3125 gtk_widget_show_all (window);
3127 gtk_widget_destroy (window);
3135 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3138 GtkWidget *menuitem;
3147 menu = gtk_menu_new ();
3148 gtk_menu_set_screen (GTK_MENU (menu), screen);
3154 menuitem = gtk_tearoff_menu_item_new ();
3155 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3156 gtk_widget_show (menuitem);
3159 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3160 GTK_ICON_SIZE_MENU);
3161 gtk_widget_show (image);
3162 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3163 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3164 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3165 gtk_widget_show (menuitem);
3167 for (i = 0, j = 1; i < length; i++, j++)
3169 sprintf (buf, "item %2d - %d", depth, j);
3171 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3172 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3174 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3175 gtk_widget_show (menuitem);
3177 gtk_widget_set_sensitive (menuitem, FALSE);
3180 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3184 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3185 create_menu (screen, depth - 1, 5, TRUE));
3192 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3195 GtkWidget *menuitem;
3201 menu = gtk_menu_new ();
3202 gtk_menu_set_screen (GTK_MENU (menu), screen);
3207 menuitem = gtk_tearoff_menu_item_new ();
3208 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3209 gtk_widget_show (menuitem);
3213 menuitem = gtk_menu_item_new_with_label ("items");
3214 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3216 submenu = gtk_menu_new ();
3217 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3218 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3219 gtk_widget_show (menuitem);
3222 /* now fill the items submenu */
3223 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3224 GTK_ICON_SIZE_MENU);
3225 gtk_widget_show (image);
3226 menuitem = gtk_image_menu_item_new_with_label ("Image");
3227 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3228 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3229 gtk_widget_show (menuitem);
3231 menuitem = gtk_menu_item_new_with_label ("x");
3232 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3233 gtk_widget_show (menuitem);
3235 menuitem = gtk_menu_item_new_with_label ("x");
3236 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3237 gtk_widget_show (menuitem);
3239 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3240 GTK_ICON_SIZE_MENU);
3241 gtk_widget_show (image);
3242 menuitem = gtk_image_menu_item_new_with_label ("Image");
3243 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3244 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3245 gtk_widget_show (menuitem);
3247 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3248 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3249 gtk_widget_show (menuitem);
3251 menuitem = gtk_menu_item_new_with_label ("x");
3252 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3253 gtk_widget_show (menuitem);
3255 menuitem = gtk_menu_item_new_with_label ("x");
3256 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3257 gtk_widget_show (menuitem);
3259 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3260 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3261 gtk_widget_show (menuitem);
3263 menuitem = gtk_check_menu_item_new_with_label ("Check");
3264 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3265 gtk_widget_show (menuitem);
3267 menuitem = gtk_menu_item_new_with_label ("x");
3268 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3269 gtk_widget_show (menuitem);
3271 menuitem = gtk_menu_item_new_with_label ("x");
3272 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3273 gtk_widget_show (menuitem);
3275 menuitem = gtk_check_menu_item_new_with_label ("Check");
3276 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3277 gtk_widget_show (menuitem);
3279 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3280 gtk_widget_show (menuitem);
3281 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3283 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3284 gtk_widget_show (menuitem);
3285 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3287 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3288 gtk_widget_show (menuitem);
3289 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3291 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3292 gtk_widget_show (menuitem);
3293 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3295 /* end of items submenu */
3297 menuitem = gtk_menu_item_new_with_label ("spanning");
3298 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3300 submenu = gtk_menu_new ();
3301 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3302 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3303 gtk_widget_show (menuitem);
3306 /* now fill the spanning submenu */
3307 menuitem = gtk_menu_item_new_with_label ("a");
3308 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3309 gtk_widget_show (menuitem);
3311 menuitem = gtk_menu_item_new_with_label ("b");
3312 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3313 gtk_widget_show (menuitem);
3315 menuitem = gtk_menu_item_new_with_label ("c");
3316 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3317 gtk_widget_show (menuitem);
3319 menuitem = gtk_menu_item_new_with_label ("d");
3320 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3321 gtk_widget_show (menuitem);
3323 menuitem = gtk_menu_item_new_with_label ("e");
3324 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3325 gtk_widget_show (menuitem);
3326 /* end of spanning submenu */
3328 menuitem = gtk_menu_item_new_with_label ("left");
3329 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3330 submenu = gtk_menu_new ();
3331 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3332 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3333 gtk_widget_show (menuitem);
3335 menuitem = gtk_menu_item_new_with_label ("Empty");
3336 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3337 submenu = gtk_menu_new ();
3338 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3339 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3340 gtk_widget_show (menuitem);
3342 menuitem = gtk_menu_item_new_with_label ("right");
3343 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3344 submenu = gtk_menu_new ();
3345 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3346 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3347 gtk_widget_show (menuitem);
3349 menuitem = gtk_menu_item_new_with_label ("Empty");
3350 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3351 gtk_widget_show (menuitem);
3355 for (; j < rows; j++)
3356 for (i = 0; i < cols; i++)
3358 sprintf (buf, "(%d %d)", i, j);
3359 menuitem = gtk_menu_item_new_with_label (buf);
3360 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3361 gtk_widget_show (menuitem);
3364 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3365 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3366 gtk_widget_show (menuitem);
3367 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3368 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3369 gtk_widget_show (menuitem);
3370 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3371 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3372 gtk_widget_show (menuitem);
3373 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3374 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3375 gtk_widget_show (menuitem);
3381 create_menus (GtkWidget *widget)
3383 static GtkWidget *window = NULL;
3387 GtkWidget *optionmenu;
3388 GtkWidget *separator;
3394 GtkWidget *menuitem;
3395 GtkAccelGroup *accel_group;
3397 GdkScreen *screen = gtk_widget_get_screen (widget);
3399 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3401 gtk_window_set_screen (GTK_WINDOW (window), screen);
3403 g_signal_connect (window, "destroy",
3404 G_CALLBACK (gtk_widget_destroyed),
3406 g_signal_connect (window, "delete-event",
3407 G_CALLBACK (gtk_true),
3410 accel_group = gtk_accel_group_new ();
3411 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3413 gtk_window_set_title (GTK_WINDOW (window), "menus");
3414 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3417 box1 = gtk_vbox_new (FALSE, 0);
3418 gtk_container_add (GTK_CONTAINER (window), box1);
3419 gtk_widget_show (box1);
3421 menubar = gtk_menu_bar_new ();
3422 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3423 gtk_widget_show (menubar);
3425 menu = create_menu (screen, 2, 50, TRUE);
3427 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3428 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3429 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3430 gtk_widget_show (menuitem);
3432 menu = create_table_menu (screen, 2, 50, TRUE);
3434 menuitem = gtk_menu_item_new_with_label ("table");
3435 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3436 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3437 gtk_widget_show (menuitem);
3439 menuitem = gtk_menu_item_new_with_label ("foo");
3440 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3441 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3442 gtk_widget_show (menuitem);
3444 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3445 GTK_ICON_SIZE_MENU);
3446 gtk_widget_show (image);
3447 menuitem = gtk_image_menu_item_new_with_label ("Help");
3448 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3449 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3450 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3451 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3452 gtk_widget_show (menuitem);
3454 menubar = gtk_menu_bar_new ();
3455 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3456 gtk_widget_show (menubar);
3458 menu = create_menu (screen, 2, 10, TRUE);
3460 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3461 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3462 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3463 gtk_widget_show (menuitem);
3465 box2 = gtk_vbox_new (FALSE, 10);
3466 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3467 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3468 gtk_widget_show (box2);
3470 menu = create_menu (screen, 1, 5, FALSE);
3471 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3473 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3474 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3475 gtk_widget_show (menuitem);
3477 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3478 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3479 gtk_widget_show (menuitem);
3480 gtk_widget_add_accelerator (menuitem,
3486 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3487 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3488 gtk_widget_show (menuitem);
3489 gtk_widget_add_accelerator (menuitem,
3494 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3495 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3496 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3497 gtk_widget_show (menuitem);
3498 gtk_widget_add_accelerator (menuitem,
3504 gtk_widget_add_accelerator (menuitem,
3511 optionmenu = gtk_combo_box_new_text ();
3512 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3513 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3514 gtk_widget_show (optionmenu);
3516 separator = gtk_hseparator_new ();
3517 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3518 gtk_widget_show (separator);
3520 box2 = gtk_vbox_new (FALSE, 10);
3521 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3522 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3523 gtk_widget_show (box2);
3525 button = gtk_button_new_with_label ("close");
3526 g_signal_connect_swapped (button, "clicked",
3527 G_CALLBACK (gtk_widget_destroy),
3529 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3530 gtk_widget_set_can_default (button, TRUE);
3531 gtk_widget_grab_default (button);
3532 gtk_widget_show (button);
3535 if (!gtk_widget_get_visible (window))
3536 gtk_widget_show (window);
3538 gtk_widget_destroy (window);
3541 /* GdkPixbuf RGBA C-Source image dump */
3543 static const guint8 apple[] =
3545 /* Pixbuf magic (0x47646b50) */
3547 /* length: header (24) + pixel_data (2304) */
3549 /* pixdata_type (0x1010002) */
3551 /* rowstride (96) */
3558 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3559 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3560 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3561 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3562 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3563 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3564 "\0\0\0\0\0\0\0\0\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"
3565 "\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"
3566 "\0\0\0\0\0\0\0\0\0\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"
3567 "[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"
3568 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3569 "\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"
3570 "\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"
3571 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3572 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3573 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3574 "\0\0\0\0\0\0\0\0\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"
3575 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3576 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3577 "\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["
3578 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3579 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3580 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3581 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3582 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3583 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3584 "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"
3585 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3586 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3587 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3588 "\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"
3589 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3590 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3591 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3592 "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"
3593 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3594 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3595 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3596 "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"
3597 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3598 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3599 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3600 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3601 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3602 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3603 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3604 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3605 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3606 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3607 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3608 "\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>"
3609 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3610 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3611 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3612 "\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"
3613 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3614 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3615 "\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"
3616 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3617 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3618 "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"
3619 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3620 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3621 "\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"
3622 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3623 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3624 "\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"
3625 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3626 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3627 "\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"
3628 "\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"
3629 "\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"
3630 "\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"
3631 "\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"
3632 "\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"
3633 "\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"
3634 "\0\0\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"
3635 "\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"
3636 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3640 accel_button_new (GtkAccelGroup *accel_group,
3645 GdkModifierType modifiers;
3649 gtk_accelerator_parse (accel, &keyval, &modifiers);
3652 button = gtk_button_new ();
3653 gtk_widget_add_accelerator (button, "activate", accel_group,
3654 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3656 label = gtk_accel_label_new (text);
3657 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3658 gtk_widget_show (label);
3660 gtk_container_add (GTK_CONTAINER (button), label);
3666 create_key_lookup (GtkWidget *widget)
3668 static GtkWidget *window = NULL;
3669 gpointer window_ptr;
3673 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3675 GtkWidget *content_area;
3677 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3678 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3681 gtk_window_set_screen (GTK_WINDOW (window),
3682 gtk_widget_get_screen (widget));
3684 /* We have to expand it so the accel labels will draw their labels
3686 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3688 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3690 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3692 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3693 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3694 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3695 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3696 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3697 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3698 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3699 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3700 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3701 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3702 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3703 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3704 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3705 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3706 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3707 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3708 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3709 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3710 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3711 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3712 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3713 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3714 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3715 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3716 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3717 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3718 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3719 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3721 window_ptr = &window;
3722 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3723 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
3725 gtk_widget_show_all (window);
3728 gtk_widget_destroy (window);
3737 cmw_destroy_cb(GtkWidget *widget)
3739 /* This is needed to get out of gtk_main */
3746 cmw_color (GtkWidget *widget, GtkWidget *parent)
3749 GtkWidget *colorsel;
3750 GtkWidget *ok_button, *cancel_button;
3752 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3754 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3756 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3757 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3761 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3763 /* And mark it as a transient dialog */
3764 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3766 g_signal_connect (csd, "destroy",
3767 G_CALLBACK (cmw_destroy_cb), NULL);
3770 "ok-button", &ok_button,
3771 "cancel-button", &cancel_button,
3774 g_signal_connect_swapped (ok_button,
3775 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3776 g_signal_connect_swapped (cancel_button,
3777 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3779 /* wait until destroy calls gtk_main_quit */
3780 gtk_widget_show (csd);
3785 cmw_file (GtkWidget *widget, GtkWidget *parent)
3789 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3790 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3791 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3792 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3794 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3795 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3797 g_signal_connect (fs, "destroy",
3798 G_CALLBACK (cmw_destroy_cb), NULL);
3799 g_signal_connect_swapped (fs, "response",
3800 G_CALLBACK (gtk_widget_destroy), fs);
3802 /* wait until destroy calls gtk_main_quit */
3803 gtk_widget_show (fs);
3809 create_modal_window (GtkWidget *widget)
3811 GtkWidget *window = NULL;
3812 GtkWidget *box1,*box2;
3814 GtkWidget *btnColor,*btnFile,*btnClose;
3816 /* Create modal window (Here you can use any window descendent )*/
3817 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3818 gtk_window_set_screen (GTK_WINDOW (window),
3819 gtk_widget_get_screen (widget));
3821 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3823 /* Set window as modal */
3824 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3826 /* Create widgets */
3827 box1 = gtk_vbox_new (FALSE,5);
3828 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3829 box2 = gtk_vbox_new (TRUE,5);
3830 btnColor = gtk_button_new_with_label ("Color");
3831 btnFile = gtk_button_new_with_label ("File Selection");
3832 btnClose = gtk_button_new_with_label ("Close");
3835 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3836 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3839 gtk_container_add (GTK_CONTAINER (window), box1);
3840 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3841 gtk_container_add (GTK_CONTAINER (frame1), box2);
3842 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3843 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3844 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
3845 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3847 /* connect signals */
3848 g_signal_connect_swapped (btnClose, "clicked",
3849 G_CALLBACK (gtk_widget_destroy), window);
3851 g_signal_connect (window, "destroy",
3852 G_CALLBACK (cmw_destroy_cb), NULL);
3854 g_signal_connect (btnColor, "clicked",
3855 G_CALLBACK (cmw_color), window);
3856 g_signal_connect (btnFile, "clicked",
3857 G_CALLBACK (cmw_file), window);
3860 gtk_widget_show_all (window);
3862 /* wait until dialog get destroyed */
3871 make_message_dialog (GdkScreen *screen,
3873 GtkMessageType type,
3874 GtkButtonsType buttons,
3875 guint default_response)
3879 gtk_widget_destroy (*dialog);
3884 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3885 "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.)");
3887 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3889 g_signal_connect_swapped (*dialog,
3891 G_CALLBACK (gtk_widget_destroy),
3894 g_signal_connect (*dialog,
3896 G_CALLBACK (gtk_widget_destroyed),
3899 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3901 gtk_widget_show (*dialog);
3905 create_message_dialog (GtkWidget *widget)
3907 static GtkWidget *info = NULL;
3908 static GtkWidget *warning = NULL;
3909 static GtkWidget *error = NULL;
3910 static GtkWidget *question = NULL;
3911 GdkScreen *screen = gtk_widget_get_screen (widget);
3913 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3914 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3915 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3916 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3923 static GtkWidget *sw_parent = NULL;
3924 static GtkWidget *sw_float_parent;
3925 static guint sw_destroyed_handler = 0;
3928 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3930 gtk_widget_reparent (scrollwin, sw_parent);
3932 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3933 sw_float_parent = NULL;
3935 sw_destroyed_handler = 0;
3941 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3943 gtk_widget_destroy (sw_float_parent);
3945 sw_float_parent = NULL;
3947 sw_destroyed_handler = 0;
3951 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3955 gtk_widget_reparent (scrollwin, sw_parent);
3956 gtk_widget_destroy (sw_float_parent);
3958 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3959 sw_float_parent = NULL;
3961 sw_destroyed_handler = 0;
3965 sw_parent = scrollwin->parent;
3966 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3967 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3968 gtk_widget_get_screen (widget));
3970 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3972 gtk_widget_reparent (scrollwin, sw_float_parent);
3973 gtk_widget_show (sw_float_parent);
3975 sw_destroyed_handler =
3976 g_signal_connect (sw_parent, "destroy",
3977 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3978 g_signal_connect (sw_float_parent, "delete_event",
3979 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3984 create_scrolled_windows (GtkWidget *widget)
3986 static GtkWidget *window;
3987 GtkWidget *content_area, *action_area;
3988 GtkWidget *scrolled_window;
3996 window = gtk_dialog_new ();
3998 gtk_window_set_screen (GTK_WINDOW (window),
3999 gtk_widget_get_screen (widget));
4001 g_signal_connect (window, "destroy",
4002 G_CALLBACK (gtk_widget_destroyed),
4005 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4006 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
4008 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4009 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4011 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4012 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4013 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4014 GTK_POLICY_AUTOMATIC,
4015 GTK_POLICY_AUTOMATIC);
4016 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
4017 gtk_widget_show (scrolled_window);
4019 table = gtk_table_new (20, 20, FALSE);
4020 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4021 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4022 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4023 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4024 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4025 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4026 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4027 gtk_widget_show (table);
4029 for (i = 0; i < 20; i++)
4030 for (j = 0; j < 20; j++)
4032 sprintf (buffer, "button (%d,%d)\n", i, j);
4033 button = gtk_toggle_button_new_with_label (buffer);
4034 gtk_table_attach_defaults (GTK_TABLE (table), button,
4036 gtk_widget_show (button);
4040 button = gtk_button_new_with_label ("Close");
4041 g_signal_connect_swapped (button, "clicked",
4042 G_CALLBACK (gtk_widget_destroy),
4044 gtk_widget_set_can_default (button, TRUE);
4045 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4046 gtk_widget_grab_default (button);
4047 gtk_widget_show (button);
4049 button = gtk_button_new_with_label ("Reparent Out");
4050 g_signal_connect (button, "clicked",
4051 G_CALLBACK (scrolled_windows_remove),
4053 gtk_widget_set_can_default (button, TRUE);
4054 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4055 gtk_widget_grab_default (button);
4056 gtk_widget_show (button);
4058 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4061 if (!gtk_widget_get_visible (window))
4062 gtk_widget_show (window);
4064 gtk_widget_destroy (window);
4072 entry_toggle_frame (GtkWidget *checkbutton,
4075 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4076 GTK_TOGGLE_BUTTON(checkbutton)->active);
4080 entry_toggle_sensitive (GtkWidget *checkbutton,
4083 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4087 entry_progress_timeout (gpointer data)
4089 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
4091 gtk_entry_progress_pulse (GTK_ENTRY (data));
4097 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
4100 if (fraction > 1.0001)
4103 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
4110 entry_remove_timeout (gpointer data)
4112 g_source_remove (GPOINTER_TO_UINT (data));
4116 entry_toggle_progress (GtkWidget *checkbutton,
4119 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
4121 guint timeout = gdk_threads_add_timeout (100,
4122 entry_progress_timeout,
4124 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
4125 GUINT_TO_POINTER (timeout),
4126 entry_remove_timeout);
4130 g_object_set_data (G_OBJECT (entry), "timeout-id",
4131 GUINT_TO_POINTER (0));
4133 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
4138 entry_toggle_pulse (GtkWidget *checkbutton,
4141 g_object_set_data (G_OBJECT (entry), "progress-pulse",
4142 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
4146 props_clicked (GtkWidget *button,
4149 GtkWidget *window = create_prop_editor (object, 0);
4151 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
4155 create_entry (GtkWidget *widget)
4157 static GtkWidget *window = NULL;
4161 GtkWidget *has_frame_check;
4162 GtkWidget *sensitive_check;
4163 GtkWidget *progress_check;
4166 GtkWidget *cb_entry;
4168 GtkWidget *separator;
4172 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4173 gtk_window_set_screen (GTK_WINDOW (window),
4174 gtk_widget_get_screen (widget));
4176 g_signal_connect (window, "destroy",
4177 G_CALLBACK (gtk_widget_destroyed),
4180 gtk_window_set_title (GTK_WINDOW (window), "entry");
4181 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4184 box1 = gtk_vbox_new (FALSE, 0);
4185 gtk_container_add (GTK_CONTAINER (window), box1);
4188 box2 = gtk_vbox_new (FALSE, 10);
4189 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4190 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4192 hbox = gtk_hbox_new (FALSE, 5);
4193 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4195 entry = gtk_entry_new ();
4196 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");
4197 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4198 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4200 button = gtk_button_new_with_mnemonic ("_Props");
4201 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4202 g_signal_connect (button, "clicked",
4203 G_CALLBACK (props_clicked),
4206 cb = GTK_COMBO_BOX (gtk_combo_box_entry_new_text ());
4207 gtk_combo_box_append_text (cb, "item0");
4208 gtk_combo_box_append_text (cb, "item0");
4209 gtk_combo_box_append_text (cb, "item1 item1");
4210 gtk_combo_box_append_text (cb, "item2 item2 item2");
4211 gtk_combo_box_append_text (cb, "item3 item3 item3 item3");
4212 gtk_combo_box_append_text (cb, "item4 item4 item4 item4 item4");
4213 gtk_combo_box_append_text (cb, "item5 item5 item5 item5 item5 item5");
4214 gtk_combo_box_append_text (cb, "item6 item6 item6 item6 item6");
4215 gtk_combo_box_append_text (cb, "item7 item7 item7 item7");
4216 gtk_combo_box_append_text (cb, "item8 item8 item8");
4217 gtk_combo_box_append_text (cb, "item9 item9");
4219 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4220 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4221 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4222 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4224 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4225 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4226 g_signal_connect (sensitive_check, "toggled",
4227 G_CALLBACK (entry_toggle_sensitive), entry);
4228 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4230 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4231 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4232 g_signal_connect (has_frame_check, "toggled",
4233 G_CALLBACK (entry_toggle_frame), entry);
4234 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4236 progress_check = gtk_check_button_new_with_label("Show Progress");
4237 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4238 g_signal_connect (progress_check, "toggled",
4239 G_CALLBACK (entry_toggle_progress), entry);
4241 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4242 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4243 g_signal_connect (progress_check, "toggled",
4244 G_CALLBACK (entry_toggle_pulse), entry);
4246 separator = gtk_hseparator_new ();
4247 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4249 box2 = gtk_vbox_new (FALSE, 10);
4250 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4251 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4253 button = gtk_button_new_with_label ("close");
4254 g_signal_connect_swapped (button, "clicked",
4255 G_CALLBACK (gtk_widget_destroy),
4257 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4258 gtk_widget_set_can_default (button, TRUE);
4259 gtk_widget_grab_default (button);
4262 if (!gtk_widget_get_visible (window))
4263 gtk_widget_show_all (window);
4265 gtk_widget_destroy (window);
4269 create_expander (GtkWidget *widget)
4272 GtkWidget *expander;
4274 static GtkWidget *window = NULL;
4278 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4279 gtk_window_set_screen (GTK_WINDOW (window),
4280 gtk_widget_get_screen (widget));
4282 g_signal_connect (window, "destroy",
4283 G_CALLBACK (gtk_widget_destroyed),
4286 gtk_window_set_title (GTK_WINDOW (window), "expander");
4287 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4289 box1 = gtk_vbox_new (FALSE, 0);
4290 gtk_container_add (GTK_CONTAINER (window), box1);
4292 expander = gtk_expander_new ("The Hidden");
4294 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4296 hidden = gtk_label_new ("Revealed!");
4298 gtk_container_add (GTK_CONTAINER (expander), hidden);
4301 if (!gtk_widget_get_visible (window))
4302 gtk_widget_show_all (window);
4304 gtk_widget_destroy (window);
4312 event_box_label_pressed (GtkWidget *widget,
4313 GdkEventButton *event,
4316 g_print ("clicked on event box\n");
4320 event_box_button_clicked (GtkWidget *widget,
4324 g_print ("pushed button\n");
4328 event_box_toggle_visible_window (GtkWidget *checkbutton,
4329 GtkEventBox *event_box)
4331 gtk_event_box_set_visible_window (event_box,
4332 GTK_TOGGLE_BUTTON(checkbutton)->active);
4336 event_box_toggle_above_child (GtkWidget *checkbutton,
4337 GtkEventBox *event_box)
4339 gtk_event_box_set_above_child (event_box,
4340 GTK_TOGGLE_BUTTON(checkbutton)->active);
4344 create_event_box (GtkWidget *widget)
4346 static GtkWidget *window = NULL;
4352 GtkWidget *separator;
4353 GtkWidget *event_box;
4355 GtkWidget *visible_window_check;
4356 GtkWidget *above_child_check;
4365 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4366 gtk_window_set_screen (GTK_WINDOW (window),
4367 gtk_widget_get_screen (widget));
4369 g_signal_connect (window, "destroy",
4370 G_CALLBACK (gtk_widget_destroyed),
4373 gtk_window_set_title (GTK_WINDOW (window), "event box");
4374 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4376 box1 = gtk_vbox_new (FALSE, 0);
4377 gtk_container_add (GTK_CONTAINER (window), box1);
4378 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4380 hbox = gtk_hbox_new (FALSE, 0);
4381 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4383 event_box = gtk_event_box_new ();
4384 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4386 vbox = gtk_vbox_new (FALSE, 0);
4387 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4388 g_signal_connect (event_box, "button_press_event",
4389 G_CALLBACK (event_box_label_pressed),
4392 label = gtk_label_new ("Click on this label");
4393 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4395 button = gtk_button_new_with_label ("button in eventbox");
4396 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4397 g_signal_connect (button, "clicked",
4398 G_CALLBACK (event_box_button_clicked),
4402 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4403 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4404 g_signal_connect (visible_window_check, "toggled",
4405 G_CALLBACK (event_box_toggle_visible_window), event_box);
4406 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4408 above_child_check = gtk_check_button_new_with_label("Above Child");
4409 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4410 g_signal_connect (above_child_check, "toggled",
4411 G_CALLBACK (event_box_toggle_above_child), event_box);
4412 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4414 separator = gtk_hseparator_new ();
4415 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4417 box2 = gtk_vbox_new (FALSE, 10);
4418 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4419 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4421 button = gtk_button_new_with_label ("close");
4422 g_signal_connect_swapped (button, "clicked",
4423 G_CALLBACK (gtk_widget_destroy),
4425 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4426 gtk_widget_set_can_default (button, TRUE);
4427 gtk_widget_grab_default (button);
4430 if (!gtk_widget_get_visible (window))
4431 gtk_widget_show_all (window);
4433 gtk_widget_destroy (window);
4441 #define SIZE_GROUP_INITIAL_SIZE 50
4444 size_group_hsize_changed (GtkSpinButton *spin_button,
4447 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4448 gtk_spin_button_get_value_as_int (spin_button),
4453 size_group_vsize_changed (GtkSpinButton *spin_button,
4456 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4458 gtk_spin_button_get_value_as_int (spin_button));
4462 create_size_group_window (GdkScreen *screen,
4463 GtkSizeGroup *master_size_group)
4465 GtkWidget *content_area;
4468 GtkWidget *main_button;
4470 GtkWidget *spin_button;
4472 GtkSizeGroup *hgroup1;
4473 GtkSizeGroup *hgroup2;
4474 GtkSizeGroup *vgroup1;
4475 GtkSizeGroup *vgroup2;
4477 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4483 gtk_window_set_screen (GTK_WINDOW (window), screen);
4485 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4487 g_signal_connect (window, "response",
4488 G_CALLBACK (gtk_widget_destroy),
4491 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4493 table = gtk_table_new (2, 2, FALSE);
4494 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4496 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4497 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4498 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4499 gtk_widget_set_size_request (table, 250, 250);
4501 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4502 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4503 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4504 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4506 main_button = gtk_button_new_with_label ("X");
4508 gtk_table_attach (GTK_TABLE (table), main_button,
4510 GTK_EXPAND, GTK_EXPAND,
4512 gtk_size_group_add_widget (master_size_group, main_button);
4513 gtk_size_group_add_widget (hgroup1, main_button);
4514 gtk_size_group_add_widget (vgroup1, main_button);
4515 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4516 SIZE_GROUP_INITIAL_SIZE,
4517 SIZE_GROUP_INITIAL_SIZE);
4519 button = gtk_button_new ();
4520 gtk_table_attach (GTK_TABLE (table), button,
4522 GTK_EXPAND, GTK_EXPAND,
4524 gtk_size_group_add_widget (vgroup1, button);
4525 gtk_size_group_add_widget (vgroup2, button);
4527 button = gtk_button_new ();
4528 gtk_table_attach (GTK_TABLE (table), button,
4530 GTK_EXPAND, GTK_EXPAND,
4532 gtk_size_group_add_widget (hgroup1, button);
4533 gtk_size_group_add_widget (hgroup2, button);
4535 button = gtk_button_new ();
4536 gtk_table_attach (GTK_TABLE (table), button,
4538 GTK_EXPAND, GTK_EXPAND,
4540 gtk_size_group_add_widget (hgroup2, button);
4541 gtk_size_group_add_widget (vgroup2, button);
4543 g_object_unref (hgroup1);
4544 g_object_unref (hgroup2);
4545 g_object_unref (vgroup1);
4546 g_object_unref (vgroup2);
4548 hbox = gtk_hbox_new (FALSE, 5);
4549 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4551 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4552 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4553 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4554 g_signal_connect (spin_button, "value_changed",
4555 G_CALLBACK (size_group_hsize_changed), main_button);
4557 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4558 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4559 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4560 g_signal_connect (spin_button, "value_changed",
4561 G_CALLBACK (size_group_vsize_changed), main_button);
4567 create_size_groups (GtkWidget *widget)
4569 static GtkWidget *window1 = NULL;
4570 static GtkWidget *window2 = NULL;
4571 static GtkSizeGroup *master_size_group;
4573 if (!master_size_group)
4574 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4578 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4581 g_signal_connect (window1, "destroy",
4582 G_CALLBACK (gtk_widget_destroyed),
4588 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4591 g_signal_connect (window2, "destroy",
4592 G_CALLBACK (gtk_widget_destroyed),
4596 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4598 gtk_widget_destroy (window1);
4599 gtk_widget_destroy (window2);
4603 if (!gtk_widget_get_visible (window1))
4604 gtk_widget_show_all (window1);
4605 if (!gtk_widget_get_visible (window2))
4606 gtk_widget_show_all (window2);
4614 static GtkWidget *spinner1;
4617 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4619 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
4623 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4625 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
4629 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4631 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4632 gtk_spin_button_get_value_as_int (spin));
4636 get_value (GtkWidget *widget, gpointer data)
4640 GtkSpinButton *spin;
4642 spin = GTK_SPIN_BUTTON (spinner1);
4643 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4644 if (GPOINTER_TO_INT (data) == 1)
4645 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4647 sprintf (buf, "%0.*f",
4648 gtk_spin_button_get_digits (spin),
4649 gtk_spin_button_get_value (spin));
4651 gtk_label_set_text (label, buf);
4655 get_spin_value (GtkWidget *widget, gpointer data)
4659 GtkSpinButton *spin;
4661 spin = GTK_SPIN_BUTTON (widget);
4662 label = GTK_LABEL (data);
4664 buffer = g_strdup_printf ("%0.*f",
4665 gtk_spin_button_get_digits (spin),
4666 gtk_spin_button_get_value (spin));
4667 gtk_label_set_text (label, buffer);
4673 spin_button_time_output_func (GtkSpinButton *spin_button)
4675 GtkAdjustment *adjustment;
4676 static gchar buf[6];
4680 adjustment = gtk_spin_button_get_adjustment (spin_button);
4681 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4682 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4683 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4684 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4685 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4690 spin_button_month_input_func (GtkSpinButton *spin_button,
4694 static gchar *month[12] = { "January", "February", "March", "April",
4695 "May", "June", "July", "August",
4696 "September", "October", "November", "December" };
4698 gboolean found = FALSE;
4700 for (i = 1; i <= 12; i++)
4702 tmp1 = g_ascii_strup (month[i - 1], -1);
4703 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4704 if (strstr (tmp1, tmp2) == tmp1)
4714 return GTK_INPUT_ERROR;
4716 *new_val = (gdouble) i;
4721 spin_button_month_output_func (GtkSpinButton *spin_button)
4723 GtkAdjustment *adjustment;
4726 static gchar *month[12] = { "January", "February", "March", "April",
4727 "May", "June", "July", "August", "September",
4728 "October", "November", "December" };
4730 adjustment = gtk_spin_button_get_adjustment (spin_button);
4731 value = gtk_adjustment_get_value (adjustment);
4732 for (i = 1; i <= 12; i++)
4733 if (fabs (value - (double)i) < 1e-5)
4735 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4736 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4742 spin_button_hex_input_func (GtkSpinButton *spin_button,
4749 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4750 res = strtol(buf, &err, 16);
4753 return GTK_INPUT_ERROR;
4759 spin_button_hex_output_func (GtkSpinButton *spin_button)
4761 GtkAdjustment *adjustment;
4762 static gchar buf[7];
4765 adjustment = gtk_spin_button_get_adjustment (spin_button);
4766 val = (gint) gtk_adjustment_get_value (adjustment);
4767 if (fabs (val) < 1e-5)
4768 sprintf (buf, "0x00");
4770 sprintf (buf, "0x%.2X", val);
4771 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4772 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4777 create_spins (GtkWidget *widget)
4779 static GtkWidget *window = NULL;
4782 GtkWidget *main_vbox;
4785 GtkWidget *spinner2;
4789 GtkWidget *val_label;
4794 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4795 gtk_window_set_screen (GTK_WINDOW (window),
4796 gtk_widget_get_screen (widget));
4798 g_signal_connect (window, "destroy",
4799 G_CALLBACK (gtk_widget_destroyed),
4802 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4804 main_vbox = gtk_vbox_new (FALSE, 5);
4805 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4806 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4808 frame = gtk_frame_new ("Not accelerated");
4809 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4811 vbox = gtk_vbox_new (FALSE, 0);
4812 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4813 gtk_container_add (GTK_CONTAINER (frame), vbox);
4815 /* Time, month, hex spinners */
4817 hbox = gtk_hbox_new (FALSE, 0);
4818 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4820 vbox2 = gtk_vbox_new (FALSE, 0);
4821 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4823 label = gtk_label_new ("Time :");
4824 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4825 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4827 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4828 spinner = gtk_spin_button_new (adj, 0, 0);
4829 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4830 g_signal_connect (spinner,
4832 G_CALLBACK (spin_button_time_output_func),
4834 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4835 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4836 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4838 vbox2 = gtk_vbox_new (FALSE, 0);
4839 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4841 label = gtk_label_new ("Month :");
4842 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4843 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4845 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4847 spinner = gtk_spin_button_new (adj, 0, 0);
4848 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4849 GTK_UPDATE_IF_VALID);
4850 g_signal_connect (spinner,
4852 G_CALLBACK (spin_button_month_input_func),
4854 g_signal_connect (spinner,
4856 G_CALLBACK (spin_button_month_output_func),
4858 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4859 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4860 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4862 vbox2 = gtk_vbox_new (FALSE, 0);
4863 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4865 label = gtk_label_new ("Hex :");
4866 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4867 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4869 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4870 spinner = gtk_spin_button_new (adj, 0, 0);
4871 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4872 g_signal_connect (spinner,
4874 G_CALLBACK (spin_button_hex_input_func),
4876 g_signal_connect (spinner,
4878 G_CALLBACK (spin_button_hex_output_func),
4880 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4881 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4882 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4884 frame = gtk_frame_new ("Accelerated");
4885 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4887 vbox = gtk_vbox_new (FALSE, 0);
4888 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4889 gtk_container_add (GTK_CONTAINER (frame), vbox);
4891 hbox = gtk_hbox_new (FALSE, 0);
4892 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4894 vbox2 = gtk_vbox_new (FALSE, 0);
4895 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4897 label = gtk_label_new ("Value :");
4898 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4899 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4901 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
4903 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
4904 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4905 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4907 vbox2 = gtk_vbox_new (FALSE, 0);
4908 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4910 label = gtk_label_new ("Digits :");
4911 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4912 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4914 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4915 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
4916 g_signal_connect (adj, "value_changed",
4917 G_CALLBACK (change_digits),
4919 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4921 hbox = gtk_hbox_new (FALSE, 0);
4922 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4924 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4925 g_signal_connect (button, "clicked",
4926 G_CALLBACK (toggle_snap),
4928 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4929 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4931 button = gtk_check_button_new_with_label ("Numeric only input mode");
4932 g_signal_connect (button, "clicked",
4933 G_CALLBACK (toggle_numeric),
4935 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4936 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4938 val_label = gtk_label_new ("");
4940 hbox = gtk_hbox_new (FALSE, 0);
4941 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4943 button = gtk_button_new_with_label ("Value as Int");
4944 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4945 g_signal_connect (button, "clicked",
4946 G_CALLBACK (get_value),
4947 GINT_TO_POINTER (1));
4948 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4950 button = gtk_button_new_with_label ("Value as Float");
4951 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4952 g_signal_connect (button, "clicked",
4953 G_CALLBACK (get_value),
4954 GINT_TO_POINTER (2));
4955 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4957 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4958 gtk_label_set_text (GTK_LABEL (val_label), "0");
4960 frame = gtk_frame_new ("Using Convenience Constructor");
4961 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4963 hbox = gtk_hbox_new (FALSE, 0);
4964 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4965 gtk_container_add (GTK_CONTAINER (frame), hbox);
4967 val_label = gtk_label_new ("0.0");
4969 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4970 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4971 g_signal_connect (spinner, "value_changed",
4972 G_CALLBACK (get_spin_value), val_label);
4973 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4974 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4976 hbox = gtk_hbox_new (FALSE, 0);
4977 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4979 button = gtk_button_new_with_label ("Close");
4980 g_signal_connect_swapped (button, "clicked",
4981 G_CALLBACK (gtk_widget_destroy),
4983 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4986 if (!gtk_widget_get_visible (window))
4987 gtk_widget_show_all (window);
4989 gtk_widget_destroy (window);
4998 cursor_expose_event (GtkWidget *widget,
5002 GtkDrawingArea *darea;
5003 GdkDrawable *drawable;
5008 g_return_val_if_fail (widget != NULL, TRUE);
5009 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5011 darea = GTK_DRAWING_AREA (widget);
5012 drawable = widget->window;
5013 max_width = widget->allocation.width;
5014 max_height = widget->allocation.height;
5016 cr = gdk_cairo_create (drawable);
5018 cairo_set_source_rgb (cr, 1, 1, 1);
5019 cairo_rectangle (cr, 0, 0, max_width, max_height / 2);
5022 cairo_set_source_rgb (cr, 0, 0, 0);
5023 cairo_rectangle (cr, 0, max_height / 2, max_width, max_height / 2);
5026 gdk_cairo_set_source_color (cr, &widget->style->bg[GTK_STATE_NORMAL]);
5027 cairo_rectangle (cr, max_width / 3, max_height / 3, max_width / 3, max_height / 3);
5036 set_cursor (GtkWidget *spinner,
5045 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5048 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5050 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
5051 vals = class->values;
5053 while (vals && vals->value != c)
5056 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5058 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5060 g_type_class_unref (class);
5062 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5063 gdk_window_set_cursor (widget->window, cursor);
5064 gdk_cursor_unref (cursor);
5068 cursor_event (GtkWidget *widget,
5070 GtkSpinButton *spinner)
5072 if ((event->type == GDK_BUTTON_PRESS) &&
5073 ((event->button.button == 1) ||
5074 (event->button.button == 3)))
5076 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5077 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5084 #ifdef GDK_WINDOWING_X11
5085 #include "x11/gdkx.h"
5088 change_cursor_theme (GtkWidget *widget,
5095 children = gtk_container_get_children (GTK_CONTAINER (data));
5097 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
5098 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
5100 g_list_free (children);
5102 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
5109 create_cursors (GtkWidget *widget)
5111 static GtkWidget *window = NULL;
5114 GtkWidget *main_vbox;
5127 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5128 gtk_window_set_screen (GTK_WINDOW (window),
5129 gtk_widget_get_screen (widget));
5131 g_signal_connect (window, "destroy",
5132 G_CALLBACK (gtk_widget_destroyed),
5135 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5137 main_vbox = gtk_vbox_new (FALSE, 5);
5138 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5139 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5142 g_object_new (gtk_vbox_get_type (),
5143 "GtkBox::homogeneous", FALSE,
5144 "GtkBox::spacing", 5,
5145 "GtkContainer::border_width", 10,
5146 "GtkWidget::parent", main_vbox,
5147 "GtkWidget::visible", TRUE,
5150 #ifdef GDK_WINDOWING_X11
5151 hbox = gtk_hbox_new (FALSE, 0);
5152 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5153 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5155 label = gtk_label_new ("Cursor Theme : ");
5156 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5157 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5159 entry = gtk_entry_new ();
5160 gtk_entry_set_text (GTK_ENTRY (entry), "default");
5161 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
5163 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
5164 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
5165 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5167 g_signal_connect (entry, "changed",
5168 G_CALLBACK (change_cursor_theme), hbox);
5169 g_signal_connect (size, "changed",
5170 G_CALLBACK (change_cursor_theme), hbox);
5173 hbox = gtk_hbox_new (FALSE, 0);
5174 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5175 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5177 label = gtk_label_new ("Cursor Value : ");
5178 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5179 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5181 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5185 spinner = gtk_spin_button_new (adj, 0, 0);
5186 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5189 g_object_new (gtk_frame_get_type (),
5190 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5191 "GtkFrame::label_xalign", 0.5,
5192 "GtkFrame::label", "Cursor Area",
5193 "GtkContainer::border_width", 10,
5194 "GtkWidget::parent", vbox,
5195 "GtkWidget::visible", TRUE,
5198 darea = gtk_drawing_area_new ();
5199 gtk_widget_set_size_request (darea, 80, 80);
5200 gtk_container_add (GTK_CONTAINER (frame), darea);
5201 g_signal_connect (darea,
5203 G_CALLBACK (cursor_expose_event),
5205 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5206 g_signal_connect (darea,
5207 "button_press_event",
5208 G_CALLBACK (cursor_event),
5210 gtk_widget_show (darea);
5212 g_signal_connect (spinner, "changed",
5213 G_CALLBACK (set_cursor),
5216 label = g_object_new (GTK_TYPE_LABEL,
5221 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5224 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5227 g_object_new (gtk_hseparator_get_type (),
5228 "GtkWidget::visible", TRUE,
5230 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5232 hbox = gtk_hbox_new (FALSE, 0);
5233 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5234 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5236 button = gtk_button_new_with_label ("Close");
5237 g_signal_connect_swapped (button, "clicked",
5238 G_CALLBACK (gtk_widget_destroy),
5240 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5242 gtk_widget_show_all (window);
5244 set_cursor (spinner, darea);
5247 gtk_widget_destroy (window);
5255 color_selection_ok (GtkWidget *w,
5256 GtkColorSelectionDialog *cs)
5258 GtkWidget *colorsel;
5261 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5263 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5264 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5268 color_selection_changed (GtkWidget *w,
5269 GtkColorSelectionDialog *cs)
5271 GtkWidget *colorsel;
5274 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5275 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5276 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5281 opacity_toggled_cb (GtkWidget *w,
5282 GtkColorSelectionDialog *cs)
5284 GtkColorSelection *colorsel;
5286 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5287 gtk_color_selection_set_has_opacity_control (colorsel,
5288 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5292 palette_toggled_cb (GtkWidget *w,
5293 GtkColorSelectionDialog *cs)
5295 GtkColorSelection *colorsel;
5297 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5298 gtk_color_selection_set_has_palette (colorsel,
5299 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5304 create_color_selection (GtkWidget *widget)
5306 static GtkWidget *window = NULL;
5315 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5316 gtk_window_set_screen (GTK_WINDOW (window),
5317 gtk_widget_get_screen (widget));
5319 g_signal_connect (window, "destroy",
5320 G_CALLBACK (gtk_widget_destroyed),
5323 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5324 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5326 hbox = gtk_hbox_new (FALSE, 8);
5327 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5328 gtk_container_add (GTK_CONTAINER (window), hbox);
5330 label = gtk_label_new ("Pick a color");
5331 gtk_container_add (GTK_CONTAINER (hbox), label);
5333 picker = gtk_color_button_new ();
5334 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5335 gtk_container_add (GTK_CONTAINER (hbox), picker);
5337 button = gtk_button_new_with_mnemonic ("_Props");
5338 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5339 g_signal_connect (button, "clicked",
5340 G_CALLBACK (props_clicked),
5344 if (!gtk_widget_get_visible (window))
5345 gtk_widget_show_all (window);
5347 gtk_widget_destroy (window);
5351 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5353 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5354 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5356 gtk_widget_set_default_direction (new_direction);
5360 orientable_toggle_orientation (GtkOrientable *orientable)
5362 GtkOrientation orientation;
5364 orientation = gtk_orientable_get_orientation (orientable);
5365 gtk_orientable_set_orientation (orientable,
5366 orientation == GTK_ORIENTATION_HORIZONTAL ?
5367 GTK_ORIENTATION_VERTICAL :
5368 GTK_ORIENTATION_HORIZONTAL);
5370 if (GTK_IS_CONTAINER (orientable))
5375 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5377 for (child = children; child; child = child->next)
5379 if (GTK_IS_ORIENTABLE (child->data))
5380 orientable_toggle_orientation (child->data);
5383 g_list_free (children);
5388 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5390 GtkWidget *content_area;
5391 GtkWidget *toplevel;
5393 toplevel = gtk_widget_get_toplevel (widget);
5394 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5395 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5399 set_direction_recurse (GtkWidget *widget,
5402 GtkTextDirection *dir = data;
5404 gtk_widget_set_direction (widget, *dir);
5405 if (GTK_IS_CONTAINER (widget))
5406 gtk_container_foreach (GTK_CONTAINER (widget),
5407 set_direction_recurse,
5412 create_forward_back (const char *title,
5413 GtkTextDirection text_dir)
5415 GtkWidget *frame = gtk_frame_new (title);
5416 GtkWidget *bbox = gtk_hbutton_box_new ();
5417 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5418 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5420 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5422 gtk_container_add (GTK_CONTAINER (frame), bbox);
5423 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5424 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5426 set_direction_recurse (frame, &text_dir);
5432 create_flipping (GtkWidget *widget)
5434 static GtkWidget *window = NULL;
5435 GtkWidget *check_button, *button;
5436 GtkWidget *action_area, *content_area;
5440 window = gtk_dialog_new ();
5442 gtk_window_set_screen (GTK_WINDOW (window),
5443 gtk_widget_get_screen (widget));
5445 g_signal_connect (window, "destroy",
5446 G_CALLBACK (gtk_widget_destroyed),
5449 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5450 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5452 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5454 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5455 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5456 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5458 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5459 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5461 g_signal_connect (check_button, "toggled",
5462 G_CALLBACK (flipping_toggled_cb), NULL);
5464 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5465 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5466 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5468 g_signal_connect (check_button, "toggled",
5469 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5471 gtk_box_pack_start (GTK_BOX (content_area),
5472 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5475 gtk_box_pack_start (GTK_BOX (content_area),
5476 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5479 gtk_box_pack_start (GTK_BOX (content_area),
5480 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5483 button = gtk_button_new_with_label ("Close");
5484 g_signal_connect_swapped (button, "clicked",
5485 G_CALLBACK (gtk_widget_destroy), window);
5486 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5489 if (!gtk_widget_get_visible (window))
5490 gtk_widget_show_all (window);
5492 gtk_widget_destroy (window);
5500 make_focus_table (GList **list)
5505 table = gtk_table_new (5, 5, FALSE);
5518 widget = gtk_entry_new ();
5520 widget = gtk_button_new_with_label ("Foo");
5522 *list = g_list_prepend (*list, widget);
5524 gtk_table_attach (GTK_TABLE (table),
5528 GTK_EXPAND | GTK_FILL,
5529 GTK_EXPAND | GTK_FILL,
5538 *list = g_list_reverse (*list);
5544 create_focus (GtkWidget *widget)
5546 static GtkWidget *window = NULL;
5550 GtkWidget *content_area;
5555 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5561 gtk_window_set_screen (GTK_WINDOW (window),
5562 gtk_widget_get_screen (widget));
5564 g_signal_connect (window, "destroy",
5565 G_CALLBACK (gtk_widget_destroyed),
5568 g_signal_connect (window, "response",
5569 G_CALLBACK (gtk_widget_destroy),
5572 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5574 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5576 frame = gtk_frame_new ("Weird tab focus chain");
5578 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5580 table = make_focus_table (&list);
5582 gtk_container_add (GTK_CONTAINER (frame), table);
5584 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5589 frame = gtk_frame_new ("Default tab focus chain");
5591 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5594 table = make_focus_table (&list);
5598 gtk_container_add (GTK_CONTAINER (frame), table);
5601 if (!gtk_widget_get_visible (window))
5602 gtk_widget_show_all (window);
5604 gtk_widget_destroy (window);
5612 font_selection_ok (GtkWidget *w,
5613 GtkFontSelectionDialog *fs)
5615 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5617 g_print ("%s\n", s);
5619 gtk_widget_destroy (GTK_WIDGET (fs));
5623 create_font_selection (GtkWidget *widget)
5625 static GtkWidget *window = NULL;
5633 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5634 gtk_window_set_screen (GTK_WINDOW (window),
5635 gtk_widget_get_screen (widget));
5637 g_signal_connect (window, "destroy",
5638 G_CALLBACK (gtk_widget_destroyed),
5641 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5642 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5644 hbox = gtk_hbox_new (FALSE, 8);
5645 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5646 gtk_container_add (GTK_CONTAINER (window), hbox);
5648 label = gtk_label_new ("Pick a font");
5649 gtk_container_add (GTK_CONTAINER (hbox), label);
5651 picker = gtk_font_button_new ();
5652 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5653 gtk_container_add (GTK_CONTAINER (hbox), picker);
5656 if (!gtk_widget_get_visible (window))
5657 gtk_widget_show_all (window);
5659 gtk_widget_destroy (window);
5666 static GtkWidget *dialog_window = NULL;
5669 label_toggle (GtkWidget *widget,
5674 *label = gtk_label_new ("Dialog Test");
5675 g_signal_connect (*label,
5677 G_CALLBACK (gtk_widget_destroyed),
5679 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
5680 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5681 *label, TRUE, TRUE, 0);
5682 gtk_widget_show (*label);
5685 gtk_widget_destroy (*label);
5688 #define RESPONSE_TOGGLE_SEPARATOR 1
5691 print_response (GtkWidget *dialog,
5695 g_print ("response signal received (%d)\n", response_id);
5697 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
5699 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
5700 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
5705 create_dialog (GtkWidget *widget)
5707 static GtkWidget *label;
5708 GtkWidget *action_area;
5713 /* This is a terrible example; it's much simpler to create
5714 * dialogs than this. Don't use testgtk for example code,
5718 dialog_window = gtk_dialog_new ();
5719 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5720 gtk_widget_get_screen (widget));
5722 g_signal_connect (dialog_window,
5724 G_CALLBACK (print_response),
5727 g_signal_connect (dialog_window, "destroy",
5728 G_CALLBACK (gtk_widget_destroyed),
5731 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5733 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5734 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5736 button = gtk_button_new_with_label ("OK");
5737 gtk_widget_set_can_default (button, TRUE);
5738 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5739 gtk_widget_grab_default (button);
5740 gtk_widget_show (button);
5742 button = gtk_button_new_with_label ("Toggle");
5743 g_signal_connect (button, "clicked",
5744 G_CALLBACK (label_toggle),
5746 gtk_widget_set_can_default (button, TRUE);
5747 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5748 gtk_widget_show (button);
5752 button = gtk_button_new_with_label ("Separator");
5754 gtk_widget_set_can_default (button, TRUE);
5756 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
5758 RESPONSE_TOGGLE_SEPARATOR);
5759 gtk_widget_show (button);
5762 if (!gtk_widget_get_visible (dialog_window))
5763 gtk_widget_show (dialog_window);
5765 gtk_widget_destroy (dialog_window);
5768 /* Display & Screen test
5775 GtkWidget *radio_dpy;
5776 GtkWidget *toplevel;
5777 GtkWidget *dialog_window;
5778 } ScreenDisplaySelection;
5781 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5783 const gchar *display_name;
5784 GdkDisplay *display = gtk_widget_get_display (widget);
5786 GdkScreen *new_screen = NULL;
5787 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5789 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5791 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5792 display = gdk_display_open (display_name);
5796 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5797 GTK_DIALOG_DESTROY_WITH_PARENT,
5800 "The display :\n%s\ncannot be opened",
5802 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5803 gtk_widget_show (dialog);
5804 g_signal_connect (dialog, "response",
5805 G_CALLBACK (gtk_widget_destroy),
5810 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5813 gboolean found = FALSE;
5814 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5817 gtk_tree_model_get (model, &iter, 0, &name, -1);
5818 found = !g_ascii_strcasecmp (display_name, name);
5825 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
5826 new_screen = gdk_display_get_default_screen (display);
5831 gint number_of_screens = gdk_display_get_n_screens (display);
5832 gint screen_num = gdk_screen_get_number (current_screen);
5833 if ((screen_num +1) < number_of_screens)
5834 new_screen = gdk_display_get_screen (display, screen_num + 1);
5836 new_screen = gdk_display_get_screen (display, 0);
5841 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5842 gtk_widget_destroy (data->dialog_window);
5847 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5849 gtk_widget_destroy (data);
5853 create_display_screen (GtkWidget *widget)
5855 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5856 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5858 ScreenDisplaySelection *scr_dpy_data;
5859 GdkScreen *screen = gtk_widget_get_screen (widget);
5860 GdkDisplay *display = gdk_screen_get_display (screen);
5862 window = g_object_new (gtk_window_get_type (),
5865 "type", GTK_WINDOW_TOPLEVEL,
5867 "Screen or Display selection",
5868 "border_width", 10, NULL);
5869 g_signal_connect (window, "destroy",
5870 G_CALLBACK (gtk_widget_destroy), NULL);
5872 vbox = gtk_vbox_new (FALSE, 3);
5873 gtk_container_add (GTK_CONTAINER (window), vbox);
5875 frame = gtk_frame_new ("Select screen or display");
5876 gtk_container_add (GTK_CONTAINER (vbox), frame);
5878 table = gtk_table_new (2, 2, TRUE);
5879 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5880 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5882 gtk_container_add (GTK_CONTAINER (frame), table);
5884 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5885 if (gdk_display_get_n_screens(display) > 1)
5886 radio_scr = gtk_radio_button_new_with_label
5887 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5890 radio_scr = gtk_radio_button_new_with_label
5891 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5892 "only one screen on the current display");
5893 gtk_widget_set_sensitive (radio_scr, FALSE);
5895 combo_dpy = gtk_combo_box_new_text ();
5896 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
5897 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5898 "<hostname>:<X Server Num>.<Screen Num>");
5900 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5901 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5902 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5904 bbox = gtk_hbutton_box_new ();
5905 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5906 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5908 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5910 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5911 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5913 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5915 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5916 scr_dpy_data->radio_dpy = radio_dpy;
5917 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5918 scr_dpy_data->dialog_window = window;
5920 g_signal_connect (cancelb, "clicked",
5921 G_CALLBACK (screen_display_destroy_diag), window);
5922 g_signal_connect (applyb, "clicked",
5923 G_CALLBACK (screen_display_check), scr_dpy_data);
5924 gtk_widget_show_all (window);
5929 static gboolean event_watcher_enter_id = 0;
5930 static gboolean event_watcher_leave_id = 0;
5933 event_watcher (GSignalInvocationHint *ihint,
5934 guint n_param_values,
5935 const GValue *param_values,
5938 g_print ("Watch: \"%s\" emitted for %s\n",
5939 g_signal_name (ihint->signal_id),
5940 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5946 event_watcher_down (void)
5948 if (event_watcher_enter_id)
5952 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5953 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5954 event_watcher_enter_id = 0;
5955 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5956 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5957 event_watcher_leave_id = 0;
5962 event_watcher_toggle (void)
5964 if (event_watcher_enter_id)
5965 event_watcher_down ();
5970 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5971 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5972 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5973 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5978 create_event_watcher (GtkWidget *widget)
5980 GtkWidget *action_area, *content_area;
5985 dialog_window = gtk_dialog_new ();
5986 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5987 gtk_widget_get_screen (widget));
5989 g_signal_connect (dialog_window, "destroy",
5990 G_CALLBACK (gtk_widget_destroyed),
5992 g_signal_connect (dialog_window, "destroy",
5993 G_CALLBACK (event_watcher_down),
5996 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5997 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5999 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6000 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6001 gtk_widget_set_size_request (dialog_window, 200, 110);
6003 button = gtk_toggle_button_new_with_label ("Activate Watch");
6004 g_signal_connect (button, "clicked",
6005 G_CALLBACK (event_watcher_toggle),
6007 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6008 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
6009 gtk_widget_show (button);
6011 button = gtk_button_new_with_label ("Close");
6012 g_signal_connect_swapped (button, "clicked",
6013 G_CALLBACK (gtk_widget_destroy),
6015 gtk_widget_set_can_default (button, TRUE);
6016 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6017 gtk_widget_grab_default (button);
6018 gtk_widget_show (button);
6021 if (!gtk_widget_get_visible (dialog_window))
6022 gtk_widget_show (dialog_window);
6024 gtk_widget_destroy (dialog_window);
6032 reformat_value (GtkScale *scale,
6035 return g_strdup_printf ("-->%0.*g<--",
6036 gtk_scale_get_digits (scale), value);
6040 create_range_controls (GtkWidget *widget)
6042 static GtkWidget *window = NULL;
6046 GtkWidget *scrollbar;
6048 GtkWidget *separator;
6049 GtkObject *adjustment;
6054 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6056 gtk_window_set_screen (GTK_WINDOW (window),
6057 gtk_widget_get_screen (widget));
6059 g_signal_connect (window, "destroy",
6060 G_CALLBACK (gtk_widget_destroyed),
6063 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6064 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6067 box1 = gtk_vbox_new (FALSE, 0);
6068 gtk_container_add (GTK_CONTAINER (window), box1);
6069 gtk_widget_show (box1);
6072 box2 = gtk_vbox_new (FALSE, 10);
6073 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6074 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6075 gtk_widget_show (box2);
6078 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6080 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6081 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6082 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6083 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6084 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6085 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6086 gtk_widget_show (scale);
6088 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6089 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6090 GTK_UPDATE_CONTINUOUS);
6091 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6092 gtk_widget_show (scrollbar);
6094 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6095 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6096 g_signal_connect (scale,
6098 G_CALLBACK (reformat_value),
6100 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6101 gtk_widget_show (scale);
6103 hbox = gtk_hbox_new (FALSE, 0);
6105 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6106 gtk_widget_set_size_request (scale, -1, 200);
6107 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6108 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6109 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6110 gtk_widget_show (scale);
6112 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6113 gtk_widget_set_size_request (scale, -1, 200);
6114 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6115 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6116 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6117 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6118 gtk_widget_show (scale);
6120 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6121 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6122 g_signal_connect (scale,
6124 G_CALLBACK (reformat_value),
6126 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6127 gtk_widget_show (scale);
6130 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6131 gtk_widget_show (hbox);
6133 separator = gtk_hseparator_new ();
6134 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6135 gtk_widget_show (separator);
6138 box2 = gtk_vbox_new (FALSE, 10);
6139 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6140 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6141 gtk_widget_show (box2);
6144 button = gtk_button_new_with_label ("close");
6145 g_signal_connect_swapped (button, "clicked",
6146 G_CALLBACK (gtk_widget_destroy),
6148 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6149 gtk_widget_set_can_default (button, TRUE);
6150 gtk_widget_grab_default (button);
6151 gtk_widget_show (button);
6154 if (!gtk_widget_get_visible (window))
6155 gtk_widget_show (window);
6157 gtk_widget_destroy (window);
6165 create_rulers (GtkWidget *widget)
6167 static GtkWidget *window = NULL;
6173 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6175 gtk_window_set_screen (GTK_WINDOW (window),
6176 gtk_widget_get_screen (widget));
6178 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
6180 g_signal_connect (window, "destroy",
6181 G_CALLBACK (gtk_widget_destroyed),
6184 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6185 gtk_widget_set_size_request (window, 300, 300);
6186 gtk_widget_set_events (window,
6187 GDK_POINTER_MOTION_MASK
6188 | GDK_POINTER_MOTION_HINT_MASK);
6189 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6191 table = gtk_table_new (2, 2, FALSE);
6192 gtk_container_add (GTK_CONTAINER (window), table);
6193 gtk_widget_show (table);
6195 ruler = gtk_hruler_new ();
6196 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6197 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6199 g_signal_connect_swapped (window,
6200 "motion_notify_event",
6201 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6204 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6205 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6206 gtk_widget_show (ruler);
6209 ruler = gtk_vruler_new ();
6210 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6212 g_signal_connect_swapped (window,
6213 "motion_notify_event",
6214 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6217 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6218 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6219 gtk_widget_show (ruler);
6222 if (!gtk_widget_get_visible (window))
6223 gtk_widget_show (window);
6225 gtk_widget_destroy (window);
6232 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6233 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6234 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6235 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6236 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6237 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6238 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6239 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6242 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6248 static const char * book_open_xpm[] = {
6271 static const char * book_closed_xpm[] = {
6296 GdkPixbuf *book_open;
6297 GdkPixbuf *book_closed;
6298 GtkWidget *sample_notebook;
6301 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6303 GtkWidget *page_widget;
6306 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6308 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6309 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6311 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6312 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6316 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6318 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6319 gint old_page_num = gtk_notebook_get_current_page (notebook);
6321 if (page_num == old_page_num)
6324 set_page_image (notebook, page_num, book_open);
6326 if (old_page_num != -1)
6327 set_page_image (notebook, old_page_num, book_closed);
6331 tab_fill (GtkToggleButton *button, GtkWidget *child)
6333 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6334 "tab-fill", gtk_toggle_button_get_active (button),
6339 tab_expand (GtkToggleButton *button, GtkWidget *child)
6341 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6342 "tab-expand", gtk_toggle_button_get_active (button),
6347 create_pages (GtkNotebook *notebook, gint start, gint end)
6349 GtkWidget *child = NULL;
6354 GtkWidget *label_box;
6355 GtkWidget *menu_box;
6359 char accel_buffer[32];
6361 for (i = start; i <= end; i++)
6363 sprintf (buffer, "Page %d", i);
6364 sprintf (accel_buffer, "Page _%d", i);
6366 child = gtk_frame_new (buffer);
6367 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6369 vbox = gtk_vbox_new (TRUE,0);
6370 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6371 gtk_container_add (GTK_CONTAINER (child), vbox);
6373 hbox = gtk_hbox_new (TRUE,0);
6374 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6376 button = gtk_check_button_new_with_label ("Fill Tab");
6377 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6378 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6379 g_signal_connect (button, "toggled",
6380 G_CALLBACK (tab_fill), child);
6382 button = gtk_check_button_new_with_label ("Expand Tab");
6383 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6384 g_signal_connect (button, "toggled",
6385 G_CALLBACK (tab_expand), child);
6387 button = gtk_button_new_with_label ("Hide Page");
6388 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6389 g_signal_connect_swapped (button, "clicked",
6390 G_CALLBACK (gtk_widget_hide),
6393 gtk_widget_show_all (child);
6395 label_box = gtk_hbox_new (FALSE, 0);
6396 pixwid = gtk_image_new_from_pixbuf (book_closed);
6397 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6399 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6400 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6401 label = gtk_label_new_with_mnemonic (accel_buffer);
6402 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6403 gtk_widget_show_all (label_box);
6406 menu_box = gtk_hbox_new (FALSE, 0);
6407 pixwid = gtk_image_new_from_pixbuf (book_closed);
6408 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6410 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6411 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6412 label = gtk_label_new (buffer);
6413 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6414 gtk_widget_show_all (menu_box);
6416 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6421 rotate_notebook (GtkButton *button,
6422 GtkNotebook *notebook)
6424 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6428 show_all_pages (GtkButton *button,
6429 GtkNotebook *notebook)
6431 gtk_container_foreach (GTK_CONTAINER (notebook),
6432 (GtkCallback) gtk_widget_show, NULL);
6436 notebook_type_changed (GtkWidget *optionmenu,
6439 GtkNotebook *notebook;
6449 notebook = GTK_NOTEBOOK (data);
6451 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6456 /* standard notebook */
6457 gtk_notebook_set_show_tabs (notebook, TRUE);
6458 gtk_notebook_set_show_border (notebook, TRUE);
6459 gtk_notebook_set_scrollable (notebook, FALSE);
6463 /* notabs notebook */
6464 gtk_notebook_set_show_tabs (notebook, FALSE);
6465 gtk_notebook_set_show_border (notebook, TRUE);
6470 gtk_notebook_set_show_tabs (notebook, FALSE);
6471 gtk_notebook_set_show_border (notebook, FALSE);
6476 gtk_notebook_set_show_tabs (notebook, TRUE);
6477 gtk_notebook_set_show_border (notebook, TRUE);
6478 gtk_notebook_set_scrollable (notebook, TRUE);
6479 if (gtk_notebook_get_n_pages (notebook) == 5)
6480 create_pages (notebook, 6, 15);
6486 if (gtk_notebook_get_n_pages (notebook) == 15)
6487 for (i = 0; i < 10; i++)
6488 gtk_notebook_remove_page (notebook, 5);
6492 notebook_popup (GtkToggleButton *button,
6493 GtkNotebook *notebook)
6496 gtk_notebook_popup_enable (notebook);
6498 gtk_notebook_popup_disable (notebook);
6502 create_notebook (GtkWidget *widget)
6504 static GtkWidget *window = NULL;
6508 GtkWidget *separator;
6512 static gchar *items[] =
6522 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6523 gtk_window_set_screen (GTK_WINDOW (window),
6524 gtk_widget_get_screen (widget));
6526 g_signal_connect (window, "destroy",
6527 G_CALLBACK (gtk_widget_destroyed),
6530 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6531 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6533 box1 = gtk_vbox_new (FALSE, 0);
6534 gtk_container_add (GTK_CONTAINER (window), box1);
6536 sample_notebook = gtk_notebook_new ();
6537 g_signal_connect (sample_notebook, "switch_page",
6538 G_CALLBACK (page_switch), NULL);
6539 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6540 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6541 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6543 gtk_widget_realize (sample_notebook);
6546 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6549 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6551 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6553 separator = gtk_hseparator_new ();
6554 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6556 box2 = gtk_hbox_new (FALSE, 5);
6557 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6558 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6560 button = gtk_check_button_new_with_label ("popup menu");
6561 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6562 g_signal_connect (button, "clicked",
6563 G_CALLBACK (notebook_popup),
6566 box2 = gtk_hbox_new (FALSE, 5);
6567 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6568 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6570 label = gtk_label_new ("Notebook Style :");
6571 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6573 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6574 notebook_type_changed,
6576 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6578 button = gtk_button_new_with_label ("Show all Pages");
6579 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6580 g_signal_connect (button, "clicked",
6581 G_CALLBACK (show_all_pages), sample_notebook);
6583 box2 = gtk_hbox_new (TRUE, 10);
6584 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6585 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6587 button = gtk_button_new_with_label ("prev");
6588 g_signal_connect_swapped (button, "clicked",
6589 G_CALLBACK (gtk_notebook_prev_page),
6591 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6593 button = gtk_button_new_with_label ("next");
6594 g_signal_connect_swapped (button, "clicked",
6595 G_CALLBACK (gtk_notebook_next_page),
6597 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6599 button = gtk_button_new_with_label ("rotate");
6600 g_signal_connect (button, "clicked",
6601 G_CALLBACK (rotate_notebook), sample_notebook);
6602 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6604 separator = gtk_hseparator_new ();
6605 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6607 button = gtk_button_new_with_label ("close");
6608 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6609 g_signal_connect_swapped (button, "clicked",
6610 G_CALLBACK (gtk_widget_destroy),
6612 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6613 gtk_widget_set_can_default (button, TRUE);
6614 gtk_widget_grab_default (button);
6617 if (!gtk_widget_get_visible (window))
6618 gtk_widget_show_all (window);
6620 gtk_widget_destroy (window);
6628 toggle_resize (GtkWidget *widget, GtkWidget *child)
6630 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6631 GValue value = { 0, };
6632 g_value_init (&value, G_TYPE_BOOLEAN);
6633 gtk_container_child_get_property (container, child, "resize", &value);
6634 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6635 gtk_container_child_set_property (container, child, "resize", &value);
6639 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6641 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6642 GValue value = { 0, };
6643 g_value_init (&value, G_TYPE_BOOLEAN);
6644 gtk_container_child_get_property (container, child, "shrink", &value);
6645 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6646 gtk_container_child_set_property (container, child, "shrink", &value);
6650 paned_props_clicked (GtkWidget *button,
6653 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6655 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6659 create_pane_options (GtkPaned *paned,
6660 const gchar *frame_label,
6661 const gchar *label1,
6662 const gchar *label2)
6664 GtkWidget *child1, *child2;
6669 GtkWidget *check_button;
6671 child1 = gtk_paned_get_child1 (paned);
6672 child2 = gtk_paned_get_child2 (paned);
6674 frame = gtk_frame_new (frame_label);
6675 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6677 table = gtk_table_new (4, 2, 4);
6678 gtk_container_add (GTK_CONTAINER (frame), table);
6680 label = gtk_label_new (label1);
6681 gtk_table_attach_defaults (GTK_TABLE (table), label,
6684 check_button = gtk_check_button_new_with_label ("Resize");
6685 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6687 g_signal_connect (check_button, "toggled",
6688 G_CALLBACK (toggle_resize),
6691 check_button = gtk_check_button_new_with_label ("Shrink");
6692 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6694 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6696 g_signal_connect (check_button, "toggled",
6697 G_CALLBACK (toggle_shrink),
6700 label = gtk_label_new (label2);
6701 gtk_table_attach_defaults (GTK_TABLE (table), label,
6704 check_button = gtk_check_button_new_with_label ("Resize");
6705 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6707 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6709 g_signal_connect (check_button, "toggled",
6710 G_CALLBACK (toggle_resize),
6713 check_button = gtk_check_button_new_with_label ("Shrink");
6714 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6716 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6718 g_signal_connect (check_button, "toggled",
6719 G_CALLBACK (toggle_shrink),
6722 button = gtk_button_new_with_mnemonic ("_Properties");
6723 gtk_table_attach_defaults (GTK_TABLE (table), button,
6725 g_signal_connect (button, "clicked",
6726 G_CALLBACK (paned_props_clicked),
6733 create_panes (GtkWidget *widget)
6735 static GtkWidget *window = NULL;
6744 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6746 gtk_window_set_screen (GTK_WINDOW (window),
6747 gtk_widget_get_screen (widget));
6749 g_signal_connect (window, "destroy",
6750 G_CALLBACK (gtk_widget_destroyed),
6753 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6754 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6756 vbox = gtk_vbox_new (FALSE, 0);
6757 gtk_container_add (GTK_CONTAINER (window), vbox);
6759 vpaned = gtk_vpaned_new ();
6760 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6761 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6763 hpaned = gtk_hpaned_new ();
6764 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6766 frame = gtk_frame_new (NULL);
6767 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6768 gtk_widget_set_size_request (frame, 60, 60);
6769 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6771 button = gtk_button_new_with_label ("Hi there");
6772 gtk_container_add (GTK_CONTAINER(frame), button);
6774 frame = gtk_frame_new (NULL);
6775 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6776 gtk_widget_set_size_request (frame, 80, 60);
6777 gtk_paned_add2 (GTK_PANED (hpaned), frame);
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, 60, 80);
6782 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6784 /* Now create toggle buttons to control sizing */
6786 gtk_box_pack_start (GTK_BOX (vbox),
6787 create_pane_options (GTK_PANED (hpaned),
6793 gtk_box_pack_start (GTK_BOX (vbox),
6794 create_pane_options (GTK_PANED (vpaned),
6800 gtk_widget_show_all (vbox);
6803 if (!gtk_widget_get_visible (window))
6804 gtk_widget_show (window);
6806 gtk_widget_destroy (window);
6810 * Paned keyboard navigation
6814 paned_keyboard_window1 (GtkWidget *widget)
6837 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6838 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6839 gtk_window_set_screen (GTK_WINDOW (window1),
6840 gtk_widget_get_screen (widget));
6842 hpaned1 = gtk_hpaned_new ();
6843 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6845 frame1 = gtk_frame_new (NULL);
6846 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6847 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6849 vbox1 = gtk_vbox_new (FALSE, 0);
6850 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6852 button7 = gtk_button_new_with_label ("button7");
6853 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6855 button8 = gtk_button_new_with_label ("button8");
6856 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6858 button9 = gtk_button_new_with_label ("button9");
6859 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6861 vpaned1 = gtk_vpaned_new ();
6862 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6864 frame2 = gtk_frame_new (NULL);
6865 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6866 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6868 frame5 = gtk_frame_new (NULL);
6869 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6871 hbox1 = gtk_hbox_new (FALSE, 0);
6872 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6874 button5 = gtk_button_new_with_label ("button5");
6875 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6877 button6 = gtk_button_new_with_label ("button6");
6878 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6880 frame3 = gtk_frame_new (NULL);
6881 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6882 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6884 frame4 = gtk_frame_new ("Buttons");
6885 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6886 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6888 table1 = gtk_table_new (2, 2, FALSE);
6889 gtk_container_add (GTK_CONTAINER (frame4), table1);
6890 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6892 button1 = gtk_button_new_with_label ("button1");
6893 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6894 (GtkAttachOptions) (GTK_FILL),
6895 (GtkAttachOptions) (0), 0, 0);
6897 button2 = gtk_button_new_with_label ("button2");
6898 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6899 (GtkAttachOptions) (GTK_FILL),
6900 (GtkAttachOptions) (0), 0, 0);
6902 button3 = gtk_button_new_with_label ("button3");
6903 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6904 (GtkAttachOptions) (GTK_FILL),
6905 (GtkAttachOptions) (0), 0, 0);
6907 button4 = gtk_button_new_with_label ("button4");
6908 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6909 (GtkAttachOptions) (GTK_FILL),
6910 (GtkAttachOptions) (0), 0, 0);
6916 paned_keyboard_window2 (GtkWidget *widget)
6921 GtkWidget *button13;
6925 GtkWidget *button12;
6927 GtkWidget *button11;
6928 GtkWidget *button10;
6930 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6931 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6933 gtk_window_set_screen (GTK_WINDOW (window2),
6934 gtk_widget_get_screen (widget));
6936 hpaned2 = gtk_hpaned_new ();
6937 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6939 frame6 = gtk_frame_new (NULL);
6940 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6941 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6943 button13 = gtk_button_new_with_label ("button13");
6944 gtk_container_add (GTK_CONTAINER (frame6), button13);
6946 hbox2 = gtk_hbox_new (FALSE, 0);
6947 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6949 vpaned2 = gtk_vpaned_new ();
6950 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6952 frame7 = gtk_frame_new (NULL);
6953 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6954 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6956 button12 = gtk_button_new_with_label ("button12");
6957 gtk_container_add (GTK_CONTAINER (frame7), button12);
6959 frame8 = gtk_frame_new (NULL);
6960 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6961 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6963 button11 = gtk_button_new_with_label ("button11");
6964 gtk_container_add (GTK_CONTAINER (frame8), button11);
6966 button10 = gtk_button_new_with_label ("button10");
6967 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6973 paned_keyboard_window3 (GtkWidget *widget)
6980 GtkWidget *button14;
6983 GtkWidget *button15;
6986 GtkWidget *button16;
6988 GtkWidget *button17;
6990 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6991 g_object_set_data (G_OBJECT (window3), "window3", window3);
6992 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6994 gtk_window_set_screen (GTK_WINDOW (window3),
6995 gtk_widget_get_screen (widget));
6998 vbox2 = gtk_vbox_new (FALSE, 0);
6999 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7001 label1 = gtk_label_new ("Three panes nested inside each other");
7002 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7004 hpaned3 = gtk_hpaned_new ();
7005 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7007 frame9 = gtk_frame_new (NULL);
7008 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7009 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7011 button14 = gtk_button_new_with_label ("button14");
7012 gtk_container_add (GTK_CONTAINER (frame9), button14);
7014 hpaned4 = gtk_hpaned_new ();
7015 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7017 frame10 = gtk_frame_new (NULL);
7018 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7019 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7021 button15 = gtk_button_new_with_label ("button15");
7022 gtk_container_add (GTK_CONTAINER (frame10), button15);
7024 hpaned5 = gtk_hpaned_new ();
7025 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7027 frame11 = gtk_frame_new (NULL);
7028 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7029 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7031 button16 = gtk_button_new_with_label ("button16");
7032 gtk_container_add (GTK_CONTAINER (frame11), button16);
7034 frame12 = gtk_frame_new (NULL);
7035 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7036 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7038 button17 = gtk_button_new_with_label ("button17");
7039 gtk_container_add (GTK_CONTAINER (frame12), button17);
7045 paned_keyboard_window4 (GtkWidget *widget)
7052 GtkWidget *button19;
7053 GtkWidget *button18;
7056 GtkWidget *button21;
7057 GtkWidget *button20;
7059 GtkWidget *button23;
7060 GtkWidget *button22;
7062 GtkWidget *button25;
7063 GtkWidget *button24;
7065 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7066 g_object_set_data (G_OBJECT (window4), "window4", window4);
7067 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7069 gtk_window_set_screen (GTK_WINDOW (window4),
7070 gtk_widget_get_screen (widget));
7072 vbox3 = gtk_vbox_new (FALSE, 0);
7073 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7075 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7076 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7077 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7079 hpaned6 = gtk_hpaned_new ();
7080 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7082 vpaned3 = gtk_vpaned_new ();
7083 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7085 button19 = gtk_button_new_with_label ("button19");
7086 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7088 button18 = gtk_button_new_with_label ("button18");
7089 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7091 hbox3 = gtk_hbox_new (FALSE, 0);
7092 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7094 vpaned4 = gtk_vpaned_new ();
7095 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7097 button21 = gtk_button_new_with_label ("button21");
7098 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7100 button20 = gtk_button_new_with_label ("button20");
7101 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7103 vpaned5 = gtk_vpaned_new ();
7104 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7106 button23 = gtk_button_new_with_label ("button23");
7107 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7109 button22 = gtk_button_new_with_label ("button22");
7110 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7112 vpaned6 = gtk_vpaned_new ();
7113 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7115 button25 = gtk_button_new_with_label ("button25");
7116 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7118 button24 = gtk_button_new_with_label ("button24");
7119 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7125 create_paned_keyboard_navigation (GtkWidget *widget)
7127 static GtkWidget *window1 = NULL;
7128 static GtkWidget *window2 = NULL;
7129 static GtkWidget *window3 = NULL;
7130 static GtkWidget *window4 = NULL;
7133 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7135 gtk_widget_destroy (window1);
7136 gtk_widget_destroy (window2);
7137 gtk_widget_destroy (window3);
7138 gtk_widget_destroy (window4);
7143 window1 = paned_keyboard_window1 (widget);
7144 g_signal_connect (window1, "destroy",
7145 G_CALLBACK (gtk_widget_destroyed),
7151 window2 = paned_keyboard_window2 (widget);
7152 g_signal_connect (window2, "destroy",
7153 G_CALLBACK (gtk_widget_destroyed),
7159 window3 = paned_keyboard_window3 (widget);
7160 g_signal_connect (window3, "destroy",
7161 G_CALLBACK (gtk_widget_destroyed),
7167 window4 = paned_keyboard_window4 (widget);
7168 g_signal_connect (window4, "destroy",
7169 G_CALLBACK (gtk_widget_destroyed),
7173 if (gtk_widget_get_visible (window1))
7174 gtk_widget_destroy (GTK_WIDGET (window1));
7176 gtk_widget_show_all (GTK_WIDGET (window1));
7178 if (gtk_widget_get_visible (window2))
7179 gtk_widget_destroy (GTK_WIDGET (window2));
7181 gtk_widget_show_all (GTK_WIDGET (window2));
7183 if (gtk_widget_get_visible (window3))
7184 gtk_widget_destroy (GTK_WIDGET (window3));
7186 gtk_widget_show_all (GTK_WIDGET (window3));
7188 if (gtk_widget_get_visible (window4))
7189 gtk_widget_destroy (GTK_WIDGET (window4));
7191 gtk_widget_show_all (GTK_WIDGET (window4));
7199 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7202 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7206 /* ignore double and triple click */
7207 if (event->type != GDK_BUTTON_PRESS)
7210 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7211 p->x = (int) event->x;
7212 p->y = (int) event->y;
7214 gtk_grab_add (widget);
7215 gdk_pointer_grab (widget->window, TRUE,
7216 GDK_BUTTON_RELEASE_MASK |
7217 GDK_BUTTON_MOTION_MASK |
7218 GDK_POINTER_MOTION_HINT_MASK,
7223 shape_released (GtkWidget *widget)
7225 gtk_grab_remove (widget);
7226 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7231 shape_motion (GtkWidget *widget,
7232 GdkEventMotion *event)
7236 GdkModifierType mask;
7238 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7241 * Can't use event->x / event->y here
7242 * because I need absolute coordinates.
7244 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7245 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7249 shape_create_icon (GdkScreen *screen,
7260 CursorOffset* icon_pos;
7265 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7267 window = gtk_window_new (window_type);
7268 gtk_window_set_screen (GTK_WINDOW (window), screen);
7270 fixed = gtk_fixed_new ();
7271 gtk_widget_set_size_request (fixed, 100, 100);
7272 gtk_container_add (GTK_CONTAINER (window), fixed);
7273 gtk_widget_show (fixed);
7275 gtk_widget_set_events (window,
7276 gtk_widget_get_events (window) |
7277 GDK_BUTTON_MOTION_MASK |
7278 GDK_POINTER_MOTION_HINT_MASK |
7279 GDK_BUTTON_PRESS_MASK);
7281 gtk_widget_realize (window);
7283 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7284 g_assert (pixbuf); /* FIXME: error handling */
7286 gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf,
7287 gtk_widget_get_colormap (window),
7292 image = gtk_image_new_from_pixbuf (pixbuf);
7293 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7294 gtk_widget_show (image);
7296 gtk_widget_shape_combine_mask (window, mask, px, py);
7298 g_object_unref (mask);
7299 g_object_unref (pixbuf);
7301 g_signal_connect (window, "button_press_event",
7302 G_CALLBACK (shape_pressed), NULL);
7303 g_signal_connect (window, "button_release_event",
7304 G_CALLBACK (shape_released), NULL);
7305 g_signal_connect (window, "motion_notify_event",
7306 G_CALLBACK (shape_motion), NULL);
7308 icon_pos = g_new (CursorOffset, 1);
7309 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7311 gtk_window_move (GTK_WINDOW (window), x, y);
7312 gtk_widget_show (window);
7318 create_shapes (GtkWidget *widget)
7320 /* Variables used by the Drag/Drop and Shape Window demos */
7321 static GtkWidget *modeller = NULL;
7322 static GtkWidget *sheets = NULL;
7323 static GtkWidget *rings = NULL;
7324 static GtkWidget *with_region = NULL;
7325 GdkScreen *screen = gtk_widget_get_screen (widget);
7327 if (!(file_exists ("Modeller.xpm") &&
7328 file_exists ("FilesQueue.xpm") &&
7329 file_exists ("3DRings.xpm")))
7335 modeller = shape_create_icon (screen, "Modeller.xpm",
7336 440, 140, 0,0, GTK_WINDOW_POPUP);
7338 g_signal_connect (modeller, "destroy",
7339 G_CALLBACK (gtk_widget_destroyed),
7343 gtk_widget_destroy (modeller);
7347 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7348 580, 170, 0,0, GTK_WINDOW_POPUP);
7350 g_signal_connect (sheets, "destroy",
7351 G_CALLBACK (gtk_widget_destroyed),
7356 gtk_widget_destroy (sheets);
7360 rings = shape_create_icon (screen, "3DRings.xpm",
7361 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7363 g_signal_connect (rings, "destroy",
7364 G_CALLBACK (gtk_widget_destroyed),
7368 gtk_widget_destroy (rings);
7372 cairo_region_t *region;
7375 with_region = shape_create_icon (screen, "3DRings.xpm",
7376 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7378 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7380 g_signal_connect (with_region, "destroy",
7381 G_CALLBACK (gtk_widget_destroyed),
7384 /* reset shape from mask to a region */
7387 region = cairo_region_create ();
7399 cairo_region_union_rectangle (region, &rect);
7407 gdk_window_shape_combine_region (with_region->window,
7412 gtk_widget_destroy (with_region);
7420 create_wmhints (GtkWidget *widget)
7422 static GtkWidget *window = NULL;
7424 GtkWidget *separator;
7429 cairo_surface_t *image;
7434 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7436 gtk_window_set_screen (GTK_WINDOW (window),
7437 gtk_widget_get_screen (widget));
7439 g_signal_connect (window, "destroy",
7440 G_CALLBACK (gtk_widget_destroyed),
7443 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7444 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7446 gtk_widget_realize (window);
7448 circles = gdk_pixmap_new (window->window, circles_width, circles_height, 1);
7449 cr = gdk_cairo_create (circles);
7450 image = cairo_image_surface_create_for_data (circles_bits, CAIRO_FORMAT_A1,
7451 circles_width, circles_height,
7453 cairo_set_source_surface (cr, image, 0, 0);
7454 cairo_surface_destroy (image);
7455 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
7459 gdk_window_set_icon (window->window, NULL,
7462 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
7464 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7465 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7467 box1 = gtk_vbox_new (FALSE, 0);
7468 gtk_container_add (GTK_CONTAINER (window), box1);
7469 gtk_widget_show (box1);
7471 label = gtk_label_new ("Try iconizing me!");
7472 gtk_widget_set_size_request (label, 150, 50);
7473 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7474 gtk_widget_show (label);
7477 separator = gtk_hseparator_new ();
7478 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7479 gtk_widget_show (separator);
7482 box2 = gtk_vbox_new (FALSE, 10);
7483 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7484 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7485 gtk_widget_show (box2);
7488 button = gtk_button_new_with_label ("close");
7490 g_signal_connect_swapped (button, "clicked",
7491 G_CALLBACK (gtk_widget_destroy),
7494 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7495 gtk_widget_set_can_default (button, TRUE);
7496 gtk_widget_grab_default (button);
7497 gtk_widget_show (button);
7500 if (!gtk_widget_get_visible (window))
7501 gtk_widget_show (window);
7503 gtk_widget_destroy (window);
7508 * Window state tracking
7512 window_state_callback (GtkWidget *widget,
7513 GdkEventWindowState *event,
7516 GtkWidget *label = data;
7519 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
7520 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7521 "withdrawn" : "not withdrawn", ", ",
7522 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7523 "iconified" : "not iconified", ", ",
7524 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7525 "sticky" : "not sticky", ", ",
7526 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7527 "maximized" : "not maximized", ", ",
7528 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7529 "fullscreen" : "not fullscreen",
7530 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7531 "above" : "not above", ", ",
7532 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7533 "below" : "not below", ", ",
7536 gtk_label_set_text (GTK_LABEL (label), msg);
7544 tracking_label (GtkWidget *window)
7550 hbox = gtk_hbox_new (FALSE, 5);
7552 g_signal_connect_object (hbox,
7554 G_CALLBACK (gtk_widget_destroy),
7558 label = gtk_label_new ("<no window state events received>");
7559 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7560 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7562 g_signal_connect (window,
7563 "window_state_event",
7564 G_CALLBACK (window_state_callback),
7567 button = gtk_button_new_with_label ("Deiconify");
7568 g_signal_connect_object (button,
7570 G_CALLBACK (gtk_window_deiconify),
7573 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7575 button = gtk_button_new_with_label ("Iconify");
7576 g_signal_connect_object (button,
7578 G_CALLBACK (gtk_window_iconify),
7581 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7583 button = gtk_button_new_with_label ("Fullscreen");
7584 g_signal_connect_object (button,
7586 G_CALLBACK (gtk_window_fullscreen),
7589 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7591 button = gtk_button_new_with_label ("Unfullscreen");
7592 g_signal_connect_object (button,
7594 G_CALLBACK (gtk_window_unfullscreen),
7597 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7599 button = gtk_button_new_with_label ("Present");
7600 g_signal_connect_object (button,
7602 G_CALLBACK (gtk_window_present),
7605 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7607 button = gtk_button_new_with_label ("Show");
7608 g_signal_connect_object (button,
7610 G_CALLBACK (gtk_widget_show),
7613 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7615 gtk_widget_show_all (hbox);
7621 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7623 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7625 gtk_window_set_keep_above (GTK_WINDOW (data),
7626 gtk_toggle_button_get_active (togglebutton));
7628 if (gtk_toggle_button_get_active (togglebutton))
7629 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7633 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7635 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7637 gtk_window_set_keep_below (GTK_WINDOW (data),
7638 gtk_toggle_button_get_active (togglebutton));
7640 if (gtk_toggle_button_get_active (togglebutton))
7641 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7646 get_state_controls (GtkWidget *window)
7650 GtkWidget *button_above;
7651 GtkWidget *button_below;
7653 vbox = gtk_vbox_new (FALSE, 0);
7655 button = gtk_button_new_with_label ("Stick");
7656 g_signal_connect_object (button,
7658 G_CALLBACK (gtk_window_stick),
7661 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7663 button = gtk_button_new_with_label ("Unstick");
7664 g_signal_connect_object (button,
7666 G_CALLBACK (gtk_window_unstick),
7669 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7671 button = gtk_button_new_with_label ("Maximize");
7672 g_signal_connect_object (button,
7674 G_CALLBACK (gtk_window_maximize),
7677 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7679 button = gtk_button_new_with_label ("Unmaximize");
7680 g_signal_connect_object (button,
7682 G_CALLBACK (gtk_window_unmaximize),
7685 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7687 button = gtk_button_new_with_label ("Iconify");
7688 g_signal_connect_object (button,
7690 G_CALLBACK (gtk_window_iconify),
7693 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7695 button = gtk_button_new_with_label ("Fullscreen");
7696 g_signal_connect_object (button,
7698 G_CALLBACK (gtk_window_fullscreen),
7701 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7703 button = gtk_button_new_with_label ("Unfullscreen");
7704 g_signal_connect_object (button,
7706 G_CALLBACK (gtk_window_unfullscreen),
7709 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7711 button_above = gtk_toggle_button_new_with_label ("Keep above");
7712 g_signal_connect (button_above,
7714 G_CALLBACK (keep_window_above),
7716 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7718 button_below = gtk_toggle_button_new_with_label ("Keep below");
7719 g_signal_connect (button_below,
7721 G_CALLBACK (keep_window_below),
7723 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7725 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7726 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7728 button = gtk_button_new_with_label ("Hide (withdraw)");
7729 g_signal_connect_object (button,
7731 G_CALLBACK (gtk_widget_hide),
7734 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7736 gtk_widget_show_all (vbox);
7742 create_window_states (GtkWidget *widget)
7744 static GtkWidget *window = NULL;
7747 GtkWidget *iconified;
7749 GtkWidget *controls;
7753 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7754 gtk_window_set_screen (GTK_WINDOW (window),
7755 gtk_widget_get_screen (widget));
7757 g_signal_connect (window, "destroy",
7758 G_CALLBACK (gtk_widget_destroyed),
7761 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7763 box1 = gtk_vbox_new (FALSE, 0);
7764 gtk_container_add (GTK_CONTAINER (window), box1);
7766 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7768 gtk_window_set_screen (GTK_WINDOW (iconified),
7769 gtk_widget_get_screen (widget));
7771 g_signal_connect_object (iconified, "destroy",
7772 G_CALLBACK (gtk_widget_destroy),
7775 gtk_window_iconify (GTK_WINDOW (iconified));
7776 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7777 controls = get_state_controls (iconified);
7778 gtk_container_add (GTK_CONTAINER (iconified), controls);
7780 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7782 gtk_window_set_screen (GTK_WINDOW (normal),
7783 gtk_widget_get_screen (widget));
7785 g_signal_connect_object (normal, "destroy",
7786 G_CALLBACK (gtk_widget_destroy),
7790 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7791 controls = get_state_controls (normal);
7792 gtk_container_add (GTK_CONTAINER (normal), controls);
7794 label = tracking_label (iconified);
7795 gtk_container_add (GTK_CONTAINER (box1), label);
7797 label = tracking_label (normal);
7798 gtk_container_add (GTK_CONTAINER (box1), label);
7800 gtk_widget_show_all (iconified);
7801 gtk_widget_show_all (normal);
7802 gtk_widget_show_all (box1);
7805 if (!gtk_widget_get_visible (window))
7806 gtk_widget_show (window);
7808 gtk_widget_destroy (window);
7816 configure_event_callback (GtkWidget *widget,
7817 GdkEventConfigure *event,
7820 GtkWidget *label = data;
7824 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7826 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7828 event->x, event->y, event->width, event->height,
7831 gtk_label_set_text (GTK_LABEL (label), msg);
7839 get_ints (GtkWidget *window,
7846 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7847 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7849 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7850 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7854 set_size_callback (GtkWidget *widget,
7859 get_ints (data, &w, &h);
7861 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7865 unset_default_size_callback (GtkWidget *widget,
7868 gtk_window_set_default_size (g_object_get_data (data, "target"),
7873 set_default_size_callback (GtkWidget *widget,
7878 get_ints (data, &w, &h);
7880 gtk_window_set_default_size (g_object_get_data (data, "target"),
7885 unset_size_request_callback (GtkWidget *widget,
7888 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7893 set_size_request_callback (GtkWidget *widget,
7898 get_ints (data, &w, &h);
7900 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7905 set_location_callback (GtkWidget *widget,
7910 get_ints (data, &x, &y);
7912 gtk_window_move (g_object_get_data (data, "target"), x, y);
7916 move_to_position_callback (GtkWidget *widget,
7922 window = g_object_get_data (data, "target");
7924 gtk_window_get_position (window, &x, &y);
7926 gtk_window_move (window, x, y);
7930 set_geometry_callback (GtkWidget *entry,
7936 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7938 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7940 if (!gtk_window_parse_geometry (target, text))
7941 g_print ("Bad geometry string '%s'\n", text);
7947 resizable_callback (GtkWidget *widget,
7950 g_object_set (g_object_get_data (data, "target"),
7951 "resizable", GTK_TOGGLE_BUTTON (widget)->active,
7956 gravity_selected (GtkWidget *widget,
7959 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7960 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7964 pos_selected (GtkWidget *widget,
7967 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7968 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7972 move_gravity_window_to_current_position (GtkWidget *widget,
7978 window = GTK_WINDOW (data);
7980 gtk_window_get_position (window, &x, &y);
7982 gtk_window_move (window, x, y);
7986 get_screen_corner (GtkWindow *window,
7991 GdkScreen * screen = gtk_window_get_screen (window);
7993 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7995 switch (gtk_window_get_gravity (window))
7997 case GDK_GRAVITY_SOUTH_EAST:
7998 *x = gdk_screen_get_width (screen) - w;
7999 *y = gdk_screen_get_height (screen) - h;
8002 case GDK_GRAVITY_NORTH_EAST:
8003 *x = gdk_screen_get_width (screen) - w;
8007 case GDK_GRAVITY_SOUTH_WEST:
8009 *y = gdk_screen_get_height (screen) - h;
8012 case GDK_GRAVITY_NORTH_WEST:
8017 case GDK_GRAVITY_SOUTH:
8018 *x = (gdk_screen_get_width (screen) - w) / 2;
8019 *y = gdk_screen_get_height (screen) - h;
8022 case GDK_GRAVITY_NORTH:
8023 *x = (gdk_screen_get_width (screen) - w) / 2;
8027 case GDK_GRAVITY_WEST:
8029 *y = (gdk_screen_get_height (screen) - h) / 2;
8032 case GDK_GRAVITY_EAST:
8033 *x = gdk_screen_get_width (screen) - w;
8034 *y = (gdk_screen_get_height (screen) - h) / 2;
8037 case GDK_GRAVITY_CENTER:
8038 *x = (gdk_screen_get_width (screen) - w) / 2;
8039 *y = (gdk_screen_get_height (screen) - h) / 2;
8042 case GDK_GRAVITY_STATIC:
8043 /* pick some random numbers */
8049 g_assert_not_reached ();
8055 move_gravity_window_to_starting_position (GtkWidget *widget,
8061 window = GTK_WINDOW (data);
8063 get_screen_corner (window,
8066 gtk_window_move (window, x, y);
8070 make_gravity_window (GtkWidget *destroy_with,
8079 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8081 gtk_window_set_screen (GTK_WINDOW (window),
8082 gtk_widget_get_screen (destroy_with));
8084 vbox = gtk_vbox_new (FALSE, 0);
8085 gtk_widget_show (vbox);
8087 gtk_container_add (GTK_CONTAINER (window), vbox);
8088 gtk_window_set_title (GTK_WINDOW (window), title);
8089 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8091 g_signal_connect_object (destroy_with,
8093 G_CALLBACK (gtk_widget_destroy),
8098 button = gtk_button_new_with_mnemonic ("_Move to current position");
8100 g_signal_connect (button, "clicked",
8101 G_CALLBACK (move_gravity_window_to_current_position),
8104 gtk_container_add (GTK_CONTAINER (vbox), button);
8105 gtk_widget_show (button);
8107 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8109 g_signal_connect (button, "clicked",
8110 G_CALLBACK (move_gravity_window_to_starting_position),
8113 gtk_container_add (GTK_CONTAINER (vbox), button);
8114 gtk_widget_show (button);
8116 /* Pretend this is the result of --geometry.
8117 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8118 * and in that case you probably should just use gtk_window_parse_geometry().
8119 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8120 * you are parsing --geometry or equivalent.
8122 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8126 gtk_window_set_default_size (GTK_WINDOW (window),
8129 get_screen_corner (GTK_WINDOW (window), &x, &y);
8131 gtk_window_move (GTK_WINDOW (window),
8138 do_gravity_test (GtkWidget *widget,
8141 GtkWidget *destroy_with = data;
8144 /* We put a window at each gravity point on the screen. */
8145 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8147 gtk_widget_show (window);
8149 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8151 gtk_widget_show (window);
8153 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8155 gtk_widget_show (window);
8157 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8159 gtk_widget_show (window);
8161 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8163 gtk_widget_show (window);
8165 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8167 gtk_widget_show (window);
8170 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8172 gtk_widget_show (window);
8175 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8177 gtk_widget_show (window);
8179 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8181 gtk_widget_show (window);
8183 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8185 gtk_widget_show (window);
8189 window_controls (GtkWidget *window)
8191 GtkWidget *control_window;
8201 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8203 gtk_window_set_screen (GTK_WINDOW (control_window),
8204 gtk_widget_get_screen (window));
8206 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8208 g_object_set_data (G_OBJECT (control_window),
8212 g_signal_connect_object (control_window,
8214 G_CALLBACK (gtk_widget_destroy),
8218 vbox = gtk_vbox_new (FALSE, 5);
8220 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8222 label = gtk_label_new ("<no configure events>");
8223 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8225 g_signal_connect (window,
8227 G_CALLBACK (configure_event_callback),
8230 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8232 spin = gtk_spin_button_new (adj, 0, 0);
8234 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8236 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8238 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8240 spin = gtk_spin_button_new (adj, 0, 0);
8242 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8244 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8246 entry = gtk_entry_new ();
8247 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8249 g_signal_connect (entry, "changed",
8250 G_CALLBACK (set_geometry_callback),
8253 button = gtk_button_new_with_label ("Show gravity test windows");
8254 g_signal_connect_swapped (button,
8256 G_CALLBACK (do_gravity_test),
8258 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8260 button = gtk_button_new_with_label ("Reshow with initial size");
8261 g_signal_connect_object (button,
8263 G_CALLBACK (gtk_window_reshow_with_initial_size),
8266 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8268 button = gtk_button_new_with_label ("Queue resize");
8269 g_signal_connect_object (button,
8271 G_CALLBACK (gtk_widget_queue_resize),
8274 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8276 button = gtk_button_new_with_label ("Resize");
8277 g_signal_connect (button,
8279 G_CALLBACK (set_size_callback),
8281 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8283 button = gtk_button_new_with_label ("Set default size");
8284 g_signal_connect (button,
8286 G_CALLBACK (set_default_size_callback),
8288 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8290 button = gtk_button_new_with_label ("Unset default size");
8291 g_signal_connect (button,
8293 G_CALLBACK (unset_default_size_callback),
8295 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8297 button = gtk_button_new_with_label ("Set size request");
8298 g_signal_connect (button,
8300 G_CALLBACK (set_size_request_callback),
8302 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8304 button = gtk_button_new_with_label ("Unset size request");
8305 g_signal_connect (button,
8307 G_CALLBACK (unset_size_request_callback),
8309 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8311 button = gtk_button_new_with_label ("Move");
8312 g_signal_connect (button,
8314 G_CALLBACK (set_location_callback),
8316 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8318 button = gtk_button_new_with_label ("Move to current position");
8319 g_signal_connect (button,
8321 G_CALLBACK (move_to_position_callback),
8323 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8325 button = gtk_check_button_new_with_label ("Allow resize");
8326 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8327 g_signal_connect (button,
8329 G_CALLBACK (resizable_callback),
8331 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8333 button = gtk_button_new_with_mnemonic ("_Show");
8334 g_signal_connect_object (button,
8336 G_CALLBACK (gtk_widget_show),
8339 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8341 button = gtk_button_new_with_mnemonic ("_Hide");
8342 g_signal_connect_object (button,
8344 G_CALLBACK (gtk_widget_hide),
8347 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8349 om = gtk_combo_box_new_text ();
8353 static gchar *names[] = {
8354 "GDK_GRAVITY_NORTH_WEST",
8355 "GDK_GRAVITY_NORTH",
8356 "GDK_GRAVITY_NORTH_EAST",
8358 "GDK_GRAVITY_CENTER",
8360 "GDK_GRAVITY_SOUTH_WEST",
8361 "GDK_GRAVITY_SOUTH",
8362 "GDK_GRAVITY_SOUTH_EAST",
8363 "GDK_GRAVITY_STATIC",
8367 g_assert (names[i]);
8368 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8373 g_signal_connect (om,
8375 G_CALLBACK (gravity_selected),
8378 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8381 om = gtk_combo_box_new_text ();
8385 static gchar *names[] = {
8387 "GTK_WIN_POS_CENTER",
8388 "GTK_WIN_POS_MOUSE",
8389 "GTK_WIN_POS_CENTER_ALWAYS",
8390 "GTK_WIN_POS_CENTER_ON_PARENT",
8394 g_assert (names[i]);
8395 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8400 g_signal_connect (om,
8402 G_CALLBACK (pos_selected),
8405 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8407 gtk_widget_show_all (vbox);
8409 return control_window;
8413 create_window_sizing (GtkWidget *widget)
8415 static GtkWidget *window = NULL;
8416 static GtkWidget *target_window = NULL;
8422 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8423 gtk_window_set_screen (GTK_WINDOW (target_window),
8424 gtk_widget_get_screen (widget));
8425 label = gtk_label_new (NULL);
8426 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");
8427 gtk_container_add (GTK_CONTAINER (target_window), label);
8428 gtk_widget_show (label);
8430 g_signal_connect (target_window, "destroy",
8431 G_CALLBACK (gtk_widget_destroyed),
8434 window = window_controls (target_window);
8436 g_signal_connect (window, "destroy",
8437 G_CALLBACK (gtk_widget_destroyed),
8440 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8443 /* don't show target window by default, we want to allow testing
8444 * of behavior on first show.
8447 if (!gtk_widget_get_visible (window))
8448 gtk_widget_show (window);
8450 gtk_widget_destroy (window);
8457 typedef struct _ProgressData {
8460 GtkWidget *block_spin;
8461 GtkWidget *x_align_spin;
8462 GtkWidget *y_align_spin;
8463 GtkWidget *step_spin;
8464 GtkWidget *act_blocks_spin;
8475 progress_timeout (gpointer data)
8477 ProgressData *pdata = data;
8481 if (pdata->activity)
8483 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8485 text = g_strdup_printf ("%s", "???");
8489 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8492 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8494 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8497 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8504 destroy_progress (GtkWidget *widget,
8505 ProgressData **pdata)
8507 g_source_remove ((*pdata)->timer);
8508 (*pdata)->timer = 0;
8509 (*pdata)->window = NULL;
8515 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8517 ProgressData *pdata;
8520 pdata = (ProgressData *) data;
8522 if (!gtk_widget_get_mapped (widget))
8525 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8527 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
8528 (GtkProgressBarOrientation) i);
8532 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8536 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8537 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8541 progressbar_toggle_ellipsize (GtkWidget *widget,
8544 ProgressData *pdata = data;
8545 if (gtk_widget_is_drawable (widget))
8547 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8548 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8553 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8555 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8559 entry_changed (GtkWidget *widget, ProgressData *pdata)
8561 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8562 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8566 create_progress_bar (GtkWidget *widget)
8568 GtkWidget *action_area, *content_area;
8578 static ProgressData *pdata = NULL;
8580 static gchar *items1[] =
8588 static char *ellipsize_items[] = {
8589 "None", // PANGO_ELLIPSIZE_NONE,
8590 "Start", // PANGO_ELLIPSIZE_START,
8591 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8592 "End", // PANGO_ELLIPSIZE_END
8596 pdata = g_new0 (ProgressData, 1);
8600 pdata->window = gtk_dialog_new ();
8602 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8603 gtk_widget_get_screen (widget));
8605 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8607 g_signal_connect (pdata->window, "destroy",
8608 G_CALLBACK (destroy_progress),
8612 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8613 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8615 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8616 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8618 vbox = gtk_vbox_new (FALSE, 5);
8619 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8620 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8622 frame = gtk_frame_new ("Progress");
8623 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8625 vbox2 = gtk_vbox_new (FALSE, 5);
8626 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8628 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8629 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8631 pdata->pbar = gtk_progress_bar_new ();
8632 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8633 PANGO_ELLIPSIZE_MIDDLE);
8635 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8636 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8638 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8639 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8641 hbox = gtk_hbox_new (FALSE, 5);
8642 gtk_container_add (GTK_CONTAINER (align), hbox);
8643 label = gtk_label_new ("Label updated by user :");
8644 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8645 pdata->label = gtk_label_new ("");
8646 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8648 frame = gtk_frame_new ("Options");
8649 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8651 vbox2 = gtk_vbox_new (FALSE, 5);
8652 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8654 tab = gtk_table_new (7, 2, FALSE);
8655 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8657 label = gtk_label_new ("Orientation :");
8658 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8659 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8661 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8663 pdata->omenu1 = build_option_menu (items1, 4, 0,
8664 progressbar_toggle_orientation,
8666 hbox = gtk_hbox_new (FALSE, 0);
8667 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8668 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8670 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8672 check = gtk_check_button_new_with_label ("Show text");
8673 g_signal_connect (check, "clicked",
8674 G_CALLBACK (toggle_show_text),
8676 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
8677 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8680 hbox = gtk_hbox_new (FALSE, 0);
8681 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
8682 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8685 label = gtk_label_new ("Text: ");
8686 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8688 pdata->entry = gtk_entry_new ();
8689 g_signal_connect (pdata->entry, "changed",
8690 G_CALLBACK (entry_changed),
8692 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8693 gtk_widget_set_size_request (pdata->entry, 100, -1);
8695 label = gtk_label_new ("Ellipsize text :");
8696 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8697 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8699 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8700 pdata->elmenu = build_option_menu (ellipsize_items,
8701 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8702 2, // PANGO_ELLIPSIZE_MIDDLE
8703 progressbar_toggle_ellipsize,
8705 hbox = gtk_hbox_new (FALSE, 0);
8706 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8707 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8709 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8711 check = gtk_check_button_new_with_label ("Activity mode");
8712 g_signal_connect (check, "clicked",
8713 G_CALLBACK (toggle_activity_mode), pdata);
8714 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8715 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8718 button = gtk_button_new_with_label ("close");
8719 g_signal_connect_swapped (button, "clicked",
8720 G_CALLBACK (gtk_widget_destroy),
8722 gtk_widget_set_can_default (button, TRUE);
8723 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8724 gtk_widget_grab_default (button);
8727 if (!gtk_widget_get_visible (pdata->window))
8728 gtk_widget_show_all (pdata->window);
8730 gtk_widget_destroy (pdata->window);
8742 GtkWidget *res_widget;
8746 find_widget (GtkWidget *widget, FindWidgetData *data)
8748 GtkAllocation new_allocation;
8752 new_allocation = widget->allocation;
8754 if (data->found || !gtk_widget_get_mapped (widget))
8757 /* Note that in the following code, we only count the
8758 * position as being inside a WINDOW widget if it is inside
8759 * widget->window; points that are outside of widget->window
8760 * but within the allocation are not counted. This is consistent
8761 * with the way we highlight drag targets.
8763 if (gtk_widget_get_has_window (widget))
8765 new_allocation.x = 0;
8766 new_allocation.y = 0;
8769 if (widget->parent && !data->first)
8771 GdkWindow *window = widget->window;
8772 while (window != widget->parent->window)
8774 gint tx, ty, twidth, theight;
8775 gdk_drawable_get_size (window, &twidth, &theight);
8777 if (new_allocation.x < 0)
8779 new_allocation.width += new_allocation.x;
8780 new_allocation.x = 0;
8782 if (new_allocation.y < 0)
8784 new_allocation.height += new_allocation.y;
8785 new_allocation.y = 0;
8787 if (new_allocation.x + new_allocation.width > twidth)
8788 new_allocation.width = twidth - new_allocation.x;
8789 if (new_allocation.y + new_allocation.height > theight)
8790 new_allocation.height = theight - new_allocation.y;
8792 gdk_window_get_position (window, &tx, &ty);
8793 new_allocation.x += tx;
8795 new_allocation.y += ty;
8798 window = gdk_window_get_parent (window);
8802 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8803 (data->x < new_allocation.x + new_allocation.width) &&
8804 (data->y < new_allocation.y + new_allocation.height))
8806 /* First, check if the drag is in a valid drop site in
8807 * one of our children
8809 if (GTK_IS_CONTAINER (widget))
8811 FindWidgetData new_data = *data;
8813 new_data.x -= x_offset;
8814 new_data.y -= y_offset;
8815 new_data.found = FALSE;
8816 new_data.first = FALSE;
8818 gtk_container_forall (GTK_CONTAINER (widget),
8819 (GtkCallback)find_widget,
8822 data->found = new_data.found;
8824 data->res_widget = new_data.res_widget;
8827 /* If not, and this widget is registered as a drop site, check to
8828 * emit "drag_motion" to check if we are actually in
8834 data->res_widget = widget;
8840 find_widget_at_pointer (GdkDisplay *display)
8842 GtkWidget *widget = NULL;
8843 GdkWindow *pointer_window;
8845 FindWidgetData data;
8847 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
8851 gpointer widget_ptr;
8853 gdk_window_get_user_data (pointer_window, &widget_ptr);
8854 widget = widget_ptr;
8859 gdk_window_get_pointer (widget->window,
8867 find_widget (widget, &data);
8869 return data.res_widget;
8875 struct PropertiesData {
8883 destroy_properties (GtkWidget *widget,
8884 struct PropertiesData *data)
8888 *data->window = NULL;
8889 data->window = NULL;
8894 gdk_cursor_unref (data->cursor);
8895 data->cursor = NULL;
8900 g_signal_handler_disconnect (widget, data->handler);
8908 property_query_event (GtkWidget *widget,
8910 struct PropertiesData *data)
8912 GtkWidget *res_widget = NULL;
8914 if (!data->in_query)
8917 if (event->type == GDK_BUTTON_RELEASE)
8919 gtk_grab_remove (widget);
8920 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8923 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8926 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8927 gtk_widget_get_screen (widget));
8928 create_prop_editor (G_OBJECT (res_widget), 0);
8931 data->in_query = FALSE;
8938 query_properties (GtkButton *button,
8939 struct PropertiesData *data)
8943 g_signal_connect (button, "event",
8944 G_CALLBACK (property_query_event), data);
8948 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
8951 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
8953 GDK_BUTTON_RELEASE_MASK,
8958 gtk_grab_add (GTK_WIDGET (button));
8960 data->in_query = TRUE;
8964 create_properties (GtkWidget *widget)
8966 static GtkWidget *window = NULL;
8970 struct PropertiesData *data;
8972 data = g_new (struct PropertiesData, 1);
8973 data->window = &window;
8974 data->in_query = FALSE;
8975 data->cursor = NULL;
8980 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8982 gtk_window_set_screen (GTK_WINDOW (window),
8983 gtk_widget_get_screen (widget));
8985 data->handler = g_signal_connect (window, "destroy",
8986 G_CALLBACK (destroy_properties),
8989 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8990 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8992 vbox = gtk_vbox_new (FALSE, 1);
8993 gtk_container_add (GTK_CONTAINER (window), vbox);
8995 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8996 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8998 button = gtk_button_new_with_label ("Query properties");
8999 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9000 g_signal_connect (button, "clicked",
9001 G_CALLBACK (query_properties),
9005 if (!gtk_widget_get_visible (window))
9006 gtk_widget_show_all (window);
9008 gtk_widget_destroy (window);
9012 struct SnapshotData {
9013 GtkWidget *toplevel_button;
9017 gboolean is_toplevel;
9022 destroy_snapshot_data (GtkWidget *widget,
9023 struct SnapshotData *data)
9026 *data->window = NULL;
9030 gdk_cursor_unref (data->cursor);
9031 data->cursor = NULL;
9036 g_signal_handler_disconnect (widget, data->handler);
9044 snapshot_widget_event (GtkWidget *widget,
9046 struct SnapshotData *data)
9048 GtkWidget *res_widget = NULL;
9050 if (!data->in_query)
9053 if (event->type == GDK_BUTTON_RELEASE)
9055 gtk_grab_remove (widget);
9056 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9059 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9060 if (data->is_toplevel && res_widget)
9061 res_widget = gtk_widget_get_toplevel (res_widget);
9065 GtkWidget *window, *image;
9067 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9068 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9069 gtk_widget_realize (window);
9070 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
9072 /* this branch is needed to convert ARGB -> RGB */
9075 gdk_drawable_get_size (pixmap, &width, &height);
9076 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9077 gtk_widget_get_colormap (res_widget),
9081 image = gtk_image_new_from_pixbuf (pixbuf);
9082 g_object_unref (pixbuf);
9085 image = gtk_image_new_from_pixmap (pixmap, NULL);
9086 gtk_container_add (GTK_CONTAINER (window), image);
9087 g_object_unref (pixmap);
9088 gtk_widget_show_all (window);
9091 data->in_query = FALSE;
9098 snapshot_widget (GtkButton *button,
9099 struct SnapshotData *data)
9103 g_signal_connect (button, "event",
9104 G_CALLBACK (snapshot_widget_event), data);
9106 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
9109 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9112 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9114 GDK_BUTTON_RELEASE_MASK,
9119 gtk_grab_add (GTK_WIDGET (button));
9121 data->in_query = TRUE;
9125 create_snapshot (GtkWidget *widget)
9127 static GtkWidget *window = NULL;
9130 struct SnapshotData *data;
9132 data = g_new (struct SnapshotData, 1);
9133 data->window = &window;
9134 data->in_query = FALSE;
9135 data->cursor = NULL;
9140 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9142 gtk_window_set_screen (GTK_WINDOW (window),
9143 gtk_widget_get_screen (widget));
9145 data->handler = g_signal_connect (window, "destroy",
9146 G_CALLBACK (destroy_snapshot_data),
9149 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9150 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9152 vbox = gtk_vbox_new (FALSE, 1);
9153 gtk_container_add (GTK_CONTAINER (window), vbox);
9155 button = gtk_button_new_with_label ("Snapshot widget");
9156 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9157 g_signal_connect (button, "clicked",
9158 G_CALLBACK (snapshot_widget),
9161 button = gtk_button_new_with_label ("Snapshot toplevel");
9162 data->toplevel_button = button;
9163 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9164 g_signal_connect (button, "clicked",
9165 G_CALLBACK (snapshot_widget),
9169 if (!gtk_widget_get_visible (window))
9170 gtk_widget_show_all (window);
9172 gtk_widget_destroy (window);
9181 selection_test_received (GtkWidget *tree_view,
9182 GtkSelectionData *data)
9184 GtkTreeModel *model;
9185 GtkListStore *store;
9189 if (data->length < 0)
9191 g_print ("Selection retrieval failed\n");
9194 if (data->type != GDK_SELECTION_TYPE_ATOM)
9196 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9200 /* Clear out any current list items */
9202 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9203 store = GTK_LIST_STORE (model);
9204 gtk_list_store_clear (store);
9206 /* Add new items to list */
9208 atoms = (GdkAtom *)data->data;
9210 l = data->length / sizeof (GdkAtom);
9211 for (i = 0; i < l; i++)
9216 name = gdk_atom_name (atoms[i]);
9219 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9223 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9230 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9232 static GdkAtom targets_atom = GDK_NONE;
9234 if (targets_atom == GDK_NONE)
9235 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9237 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9242 create_selection_test (GtkWidget *widget)
9244 static GtkWidget *window = NULL;
9245 GtkWidget *action_area, *content_area;
9248 GtkWidget *scrolled_win;
9249 GtkListStore* store;
9250 GtkWidget *tree_view;
9251 GtkTreeViewColumn *column;
9252 GtkCellRenderer *renderer;
9257 window = gtk_dialog_new ();
9259 gtk_window_set_screen (GTK_WINDOW (window),
9260 gtk_widget_get_screen (widget));
9262 g_signal_connect (window, "destroy",
9263 G_CALLBACK (gtk_widget_destroyed),
9266 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9267 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9269 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9270 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9272 /* Create the list */
9274 vbox = gtk_vbox_new (FALSE, 5);
9275 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9276 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9278 label = gtk_label_new ("Gets available targets for current selection");
9279 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9281 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9282 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9283 GTK_POLICY_AUTOMATIC,
9284 GTK_POLICY_AUTOMATIC);
9285 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9286 gtk_widget_set_size_request (scrolled_win, 100, 200);
9288 store = gtk_list_store_new (1, G_TYPE_STRING);
9289 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9290 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9292 renderer = gtk_cell_renderer_text_new ();
9293 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9295 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9297 g_signal_connect (tree_view, "selection_received",
9298 G_CALLBACK (selection_test_received), NULL);
9300 /* .. And create some buttons */
9301 button = gtk_button_new_with_label ("Get Targets");
9302 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9304 g_signal_connect (button, "clicked",
9305 G_CALLBACK (selection_test_get_targets), tree_view);
9307 button = gtk_button_new_with_label ("Quit");
9308 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9310 g_signal_connect_swapped (button, "clicked",
9311 G_CALLBACK (gtk_widget_destroy),
9315 if (!gtk_widget_get_visible (window))
9316 gtk_widget_show_all (window);
9318 gtk_widget_destroy (window);
9325 static int scroll_test_pos = 0.0;
9328 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9332 gint imin, imax, jmin, jmax;
9335 imin = (event->area.x) / 10;
9336 imax = (event->area.x + event->area.width + 9) / 10;
9338 jmin = ((int)adj->value + event->area.y) / 10;
9339 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9341 gdk_window_clear_area (widget->window,
9342 event->area.x, event->area.y,
9343 event->area.width, event->area.height);
9345 cr = gdk_cairo_create (widget->window);
9347 for (i=imin; i<imax; i++)
9348 for (j=jmin; j<jmax; j++)
9350 cairo_rectangle (cr, 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9360 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9363 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9364 -adj->page_increment / 2:
9365 adj->page_increment / 2);
9366 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9367 gtk_adjustment_set_value (adj, new_value);
9373 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9376 adj->page_increment = 0.9 * widget->allocation.height;
9377 adj->page_size = widget->allocation.height;
9379 g_signal_emit_by_name (adj, "changed");
9383 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9385 /* gint source_min = (int)adj->value - scroll_test_pos; */
9388 dy = scroll_test_pos - (int)adj->value;
9389 scroll_test_pos = adj->value;
9391 if (!gtk_widget_is_drawable (widget))
9393 gdk_window_scroll (widget->window, 0, dy);
9394 gdk_window_process_updates (widget->window, FALSE);
9399 create_scroll_test (GtkWidget *widget)
9401 static GtkWidget *window = NULL;
9402 GtkWidget *action_area, *content_area;
9404 GtkWidget *drawing_area;
9405 GtkWidget *scrollbar;
9408 GdkGeometry geometry;
9409 GdkWindowHints geometry_mask;
9413 window = gtk_dialog_new ();
9415 gtk_window_set_screen (GTK_WINDOW (window),
9416 gtk_widget_get_screen (widget));
9418 g_signal_connect (window, "destroy",
9419 G_CALLBACK (gtk_widget_destroyed),
9422 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9423 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9425 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9426 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9428 hbox = gtk_hbox_new (FALSE, 0);
9429 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9430 gtk_widget_show (hbox);
9432 drawing_area = gtk_drawing_area_new ();
9433 gtk_widget_set_size_request (drawing_area, 200, 200);
9434 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9435 gtk_widget_show (drawing_area);
9437 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9439 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9440 scroll_test_pos = 0.0;
9442 scrollbar = gtk_vscrollbar_new (adj);
9443 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9444 gtk_widget_show (scrollbar);
9446 g_signal_connect (drawing_area, "expose_event",
9447 G_CALLBACK (scroll_test_expose), adj);
9448 g_signal_connect (drawing_area, "configure_event",
9449 G_CALLBACK (scroll_test_configure), adj);
9450 g_signal_connect (drawing_area, "scroll_event",
9451 G_CALLBACK (scroll_test_scroll), adj);
9453 g_signal_connect (adj, "value_changed",
9454 G_CALLBACK (scroll_test_adjustment_changed),
9457 /* .. And create some buttons */
9459 button = gtk_button_new_with_label ("Quit");
9460 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9462 g_signal_connect_swapped (button, "clicked",
9463 G_CALLBACK (gtk_widget_destroy),
9465 gtk_widget_show (button);
9467 /* Set up gridded geometry */
9469 geometry_mask = GDK_HINT_MIN_SIZE |
9470 GDK_HINT_BASE_SIZE |
9471 GDK_HINT_RESIZE_INC;
9473 geometry.min_width = 20;
9474 geometry.min_height = 20;
9475 geometry.base_width = 0;
9476 geometry.base_height = 0;
9477 geometry.width_inc = 10;
9478 geometry.height_inc = 10;
9480 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9481 drawing_area, &geometry, geometry_mask);
9484 if (!gtk_widget_get_visible (window))
9485 gtk_widget_show (window);
9487 gtk_widget_destroy (window);
9494 static int timer = 0;
9497 timeout_test (GtkWidget *label)
9499 static int count = 0;
9500 static char buffer[32];
9502 sprintf (buffer, "count: %d", ++count);
9503 gtk_label_set_text (GTK_LABEL (label), buffer);
9509 start_timeout_test (GtkWidget *widget,
9514 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9519 stop_timeout_test (GtkWidget *widget,
9524 g_source_remove (timer);
9530 destroy_timeout_test (GtkWidget *widget,
9533 stop_timeout_test (NULL, NULL);
9539 create_timeout_test (GtkWidget *widget)
9541 static GtkWidget *window = NULL;
9542 GtkWidget *action_area, *content_area;
9548 window = gtk_dialog_new ();
9550 gtk_window_set_screen (GTK_WINDOW (window),
9551 gtk_widget_get_screen (widget));
9553 g_signal_connect (window, "destroy",
9554 G_CALLBACK (destroy_timeout_test),
9557 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9558 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9560 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9561 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9563 label = gtk_label_new ("count: 0");
9564 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9565 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9566 gtk_widget_show (label);
9568 button = gtk_button_new_with_label ("close");
9569 g_signal_connect_swapped (button, "clicked",
9570 G_CALLBACK (gtk_widget_destroy),
9572 gtk_widget_set_can_default (button, TRUE);
9573 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9574 gtk_widget_grab_default (button);
9575 gtk_widget_show (button);
9577 button = gtk_button_new_with_label ("start");
9578 g_signal_connect (button, "clicked",
9579 G_CALLBACK(start_timeout_test),
9581 gtk_widget_set_can_default (button, TRUE);
9582 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9583 gtk_widget_show (button);
9585 button = gtk_button_new_with_label ("stop");
9586 g_signal_connect (button, "clicked",
9587 G_CALLBACK (stop_timeout_test),
9589 gtk_widget_set_can_default (button, TRUE);
9590 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9591 gtk_widget_show (button);
9594 if (!gtk_widget_get_visible (window))
9595 gtk_widget_show (window);
9597 gtk_widget_destroy (window);
9604 static int idle_id = 0;
9607 idle_test (GtkWidget *label)
9609 static int count = 0;
9610 static char buffer[32];
9612 sprintf (buffer, "count: %d", ++count);
9613 gtk_label_set_text (GTK_LABEL (label), buffer);
9619 start_idle_test (GtkWidget *widget,
9624 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9629 stop_idle_test (GtkWidget *widget,
9634 g_source_remove (idle_id);
9640 destroy_idle_test (GtkWidget *widget,
9643 stop_idle_test (NULL, NULL);
9649 toggle_idle_container (GObject *button,
9650 GtkContainer *container)
9652 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9656 create_idle_test (GtkWidget *widget)
9658 static GtkWidget *window = NULL;
9661 GtkWidget *container;
9665 GtkWidget *action_area, *content_area;
9670 window = gtk_dialog_new ();
9672 gtk_window_set_screen (GTK_WINDOW (window),
9673 gtk_widget_get_screen (widget));
9675 g_signal_connect (window, "destroy",
9676 G_CALLBACK (destroy_idle_test),
9679 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9680 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9682 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9683 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9685 label = gtk_label_new ("count: 0");
9686 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9687 gtk_widget_show (label);
9690 g_object_new (GTK_TYPE_HBOX,
9692 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9693 * "GtkWidget::visible", TRUE,
9698 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9701 g_object_new (GTK_TYPE_FRAME,
9703 "label", "Label Container",
9705 "parent", content_area,
9708 g_object_new (GTK_TYPE_VBOX,
9713 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9714 "label", "Resize-Parent",
9715 "user_data", (void*)GTK_RESIZE_PARENT,
9719 "signal::clicked", toggle_idle_container, container,
9721 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9722 "label", "Resize-Queue",
9723 "user_data", (void*)GTK_RESIZE_QUEUE,
9728 g_object_connect (button,
9729 "signal::clicked", toggle_idle_container, container,
9731 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9732 "label", "Resize-Immediate",
9733 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9735 g_object_connect (button2,
9736 "signal::clicked", toggle_idle_container, container,
9738 g_object_set (button2,
9744 button = gtk_button_new_with_label ("close");
9745 g_signal_connect_swapped (button, "clicked",
9746 G_CALLBACK (gtk_widget_destroy),
9748 gtk_widget_set_can_default (button, TRUE);
9749 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9750 gtk_widget_grab_default (button);
9751 gtk_widget_show (button);
9753 button = gtk_button_new_with_label ("start");
9754 g_signal_connect (button, "clicked",
9755 G_CALLBACK (start_idle_test),
9757 gtk_widget_set_can_default (button, TRUE);
9758 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9759 gtk_widget_show (button);
9761 button = gtk_button_new_with_label ("stop");
9762 g_signal_connect (button, "clicked",
9763 G_CALLBACK (stop_idle_test),
9765 gtk_widget_set_can_default (button, TRUE);
9766 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9767 gtk_widget_show (button);
9770 if (!gtk_widget_get_visible (window))
9771 gtk_widget_show (window);
9773 gtk_widget_destroy (window);
9781 reload_all_rc_files (void)
9783 static GdkAtom atom_rcfiles = GDK_NONE;
9785 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
9789 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
9791 for(i = 0; i < 5; i++)
9792 send_event->client.data.l[i] = 0;
9793 send_event->client.data_format = 32;
9794 send_event->client.message_type = atom_rcfiles;
9795 gdk_event_send_clientmessage_toall (send_event);
9797 gdk_event_free (send_event);
9801 create_rc_file (GtkWidget *widget)
9803 static GtkWidget *window = NULL;
9804 GtkWidget *action_area, *content_area;
9812 window = gtk_dialog_new ();
9814 gtk_window_set_screen (GTK_WINDOW (window),
9815 gtk_widget_get_screen (widget));
9817 g_signal_connect (window, "destroy",
9818 G_CALLBACK (gtk_widget_destroyed),
9821 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9822 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9824 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9825 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9827 vbox = gtk_vbox_new (FALSE, 0);
9828 gtk_container_add (GTK_CONTAINER (frame), vbox);
9830 label = gtk_label_new ("This label should be red");
9831 gtk_widget_set_name (label, "testgtk-red-label");
9832 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9834 label = gtk_label_new ("This label should be green");
9835 gtk_widget_set_name (label, "testgtk-green-label");
9836 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9838 label = gtk_label_new ("This label should be blue");
9839 gtk_widget_set_name (label, "testgtk-blue-label");
9840 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9842 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9843 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9845 button = gtk_button_new_with_label ("Reload");
9846 g_signal_connect (button, "clicked",
9847 G_CALLBACK (gtk_rc_reparse_all), NULL);
9848 gtk_widget_set_can_default (button, TRUE);
9849 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9850 gtk_widget_grab_default (button);
9852 button = gtk_button_new_with_label ("Reload All");
9853 g_signal_connect (button, "clicked",
9854 G_CALLBACK (reload_all_rc_files), NULL);
9855 gtk_widget_set_can_default (button, TRUE);
9856 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9858 button = gtk_button_new_with_label ("Close");
9859 g_signal_connect_swapped (button, "clicked",
9860 G_CALLBACK (gtk_widget_destroy),
9862 gtk_widget_set_can_default (button, TRUE);
9863 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9866 if (!gtk_widget_get_visible (window))
9867 gtk_widget_show_all (window);
9869 gtk_widget_destroy (window);
9873 * Test of recursive mainloop
9877 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9884 create_mainloop (GtkWidget *widget)
9886 static GtkWidget *window = NULL;
9887 GtkWidget *action_area, *content_area;
9893 window = gtk_dialog_new ();
9895 gtk_window_set_screen (GTK_WINDOW (window),
9896 gtk_widget_get_screen (widget));
9898 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9900 g_signal_connect (window, "destroy",
9901 G_CALLBACK (mainloop_destroyed),
9904 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9905 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9907 label = gtk_label_new ("In recursive main loop...");
9908 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9910 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9911 gtk_widget_show (label);
9913 button = gtk_button_new_with_label ("Leave");
9914 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9916 g_signal_connect_swapped (button, "clicked",
9917 G_CALLBACK (gtk_widget_destroy),
9920 gtk_widget_set_can_default (button, TRUE);
9921 gtk_widget_grab_default (button);
9923 gtk_widget_show (button);
9926 if (!gtk_widget_get_visible (window))
9928 gtk_widget_show (window);
9930 g_print ("create_mainloop: start\n");
9932 g_print ("create_mainloop: done\n");
9935 gtk_widget_destroy (window);
9939 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
9942 GdkWindow *bin_window;
9946 gint imin, imax, jmin, jmax;
9948 layout = GTK_LAYOUT (widget);
9949 bin_window = gtk_layout_get_bin_window (layout);
9951 if (event->window != bin_window)
9954 imin = (event->area.x) / 10;
9955 imax = (event->area.x + event->area.width + 9) / 10;
9957 jmin = (event->area.y) / 10;
9958 jmax = (event->area.y + event->area.height + 9) / 10;
9960 cr = gdk_cairo_create (bin_window);
9962 for (i=imin; i<imax; i++)
9963 for (j=jmin; j<jmax; j++)
9965 cairo_rectangle (cr,
9976 void create_layout (GtkWidget *widget)
9978 GtkAdjustment *hadjustment, *vadjustment;
9980 static GtkWidget *window = NULL;
9981 GtkWidget *layout_widget;
9982 GtkWidget *scrolledwindow;
9991 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9992 gtk_window_set_screen (GTK_WINDOW (window),
9993 gtk_widget_get_screen (widget));
9995 g_signal_connect (window, "destroy",
9996 G_CALLBACK (gtk_widget_destroyed),
9999 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10000 gtk_widget_set_size_request (window, 200, 200);
10002 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10003 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10005 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10006 GTK_CORNER_TOP_RIGHT);
10008 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10010 layout_widget = gtk_layout_new (NULL, NULL);
10011 layout = GTK_LAYOUT (layout_widget);
10012 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
10014 /* We set step sizes here since GtkLayout does not set
10017 hadjustment = gtk_layout_get_hadjustment (layout);
10018 vadjustment = gtk_layout_get_vadjustment (layout);
10019 gtk_adjustment_set_step_increment (hadjustment, 10.0);
10020 gtk_adjustment_set_step_increment (vadjustment, 10.0);
10021 gtk_layout_set_hadjustment (layout, hadjustment);
10022 gtk_layout_set_vadjustment (layout, vadjustment);
10024 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
10025 g_signal_connect (layout, "expose_event",
10026 G_CALLBACK (layout_expose_handler), NULL);
10028 gtk_layout_set_size (layout, 1600, 128000);
10030 for (i=0 ; i < 16 ; i++)
10031 for (j=0 ; j < 16 ; j++)
10033 sprintf(buf, "Button %d, %d", i, j);
10035 button = gtk_button_new_with_label (buf);
10037 button = gtk_label_new (buf);
10039 gtk_layout_put (layout, button, j*100, i*100);
10042 for (i=16; i < 1280; i++)
10044 sprintf(buf, "Button %d, %d", i, 0);
10046 button = gtk_button_new_with_label (buf);
10048 button = gtk_label_new (buf);
10050 gtk_layout_put (layout, button, 0, i*100);
10054 if (!gtk_widget_get_visible (window))
10055 gtk_widget_show_all (window);
10057 gtk_widget_destroy (window);
10061 create_styles (GtkWidget *widget)
10063 static GtkWidget *window = NULL;
10064 GtkWidget *content_area, *action_area;
10069 static GdkColor red = { 0, 0xffff, 0, 0 };
10070 static GdkColor green = { 0, 0, 0xffff, 0 };
10071 static GdkColor blue = { 0, 0, 0, 0xffff };
10072 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10073 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10074 PangoFontDescription *font_desc;
10076 GtkRcStyle *rc_style;
10080 window = gtk_dialog_new ();
10081 gtk_window_set_screen (GTK_WINDOW (window),
10082 gtk_widget_get_screen (widget));
10084 g_signal_connect (window, "destroy",
10085 G_CALLBACK (gtk_widget_destroyed),
10088 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10089 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10091 button = gtk_button_new_with_label ("Close");
10092 g_signal_connect_swapped (button, "clicked",
10093 G_CALLBACK (gtk_widget_destroy),
10095 gtk_widget_set_can_default (button, TRUE);
10096 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10097 gtk_widget_show (button);
10099 vbox = gtk_vbox_new (FALSE, 5);
10100 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10101 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
10103 label = gtk_label_new ("Font:");
10104 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10105 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10107 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10109 button = gtk_button_new_with_label ("Some Text");
10110 gtk_widget_modify_font (gtk_bin_get_child (GTK_BIN (button)),
10112 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10114 label = gtk_label_new ("Foreground:");
10115 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10116 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10118 button = gtk_button_new_with_label ("Some Text");
10119 gtk_widget_modify_fg (gtk_bin_get_child (GTK_BIN (button)),
10120 GTK_STATE_NORMAL, &red);
10121 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10123 label = gtk_label_new ("Background:");
10124 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10125 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10127 button = gtk_button_new_with_label ("Some Text");
10128 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10129 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10131 label = gtk_label_new ("Text:");
10132 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10133 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10135 entry = gtk_entry_new ();
10136 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10137 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10138 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10140 label = gtk_label_new ("Base:");
10141 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10142 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10144 entry = gtk_entry_new ();
10145 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10146 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10147 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10149 label = gtk_label_new ("Cursor:");
10150 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10151 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10153 entry = gtk_entry_new ();
10154 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10155 gtk_widget_modify_cursor (entry, &red, &red);
10156 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10158 label = gtk_label_new ("Multiple:");
10159 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10160 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10162 button = gtk_button_new_with_label ("Some Text");
10164 rc_style = gtk_rc_style_new ();
10166 rc_style->font_desc = pango_font_description_copy (font_desc);
10167 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10168 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10169 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10170 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10171 rc_style->bg[GTK_STATE_NORMAL] = blue;
10172 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10173 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10174 rc_style->fg[GTK_STATE_ACTIVE] = red;
10175 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10176 rc_style->xthickness = 5;
10177 rc_style->ythickness = 5;
10179 gtk_widget_modify_style (button, rc_style);
10180 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
10182 g_object_unref (rc_style);
10184 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10187 if (!gtk_widget_get_visible (window))
10188 gtk_widget_show_all (window);
10190 gtk_widget_destroy (window);
10194 * Main Window and Exit
10198 do_exit (GtkWidget *widget, GtkWidget *window)
10200 gtk_widget_destroy (window);
10206 void (*func) (GtkWidget *widget);
10207 gboolean do_not_benchmark;
10210 { "alpha window", create_alpha_window },
10211 { "big windows", create_big_windows },
10212 { "button box", create_button_box },
10213 { "buttons", create_buttons },
10214 { "check buttons", create_check_buttons },
10215 { "color selection", create_color_selection },
10216 { "composited window", create_composited_window },
10217 { "cursors", create_cursors },
10218 { "dialog", create_dialog },
10219 { "display & screen", create_display_screen, TRUE },
10220 { "entry", create_entry },
10221 { "event box", create_event_box },
10222 { "event watcher", create_event_watcher },
10223 { "expander", create_expander },
10224 { "flipping", create_flipping },
10225 { "focus", create_focus },
10226 { "font selection", create_font_selection },
10227 { "gridded geometry", create_gridded_geometry },
10228 { "handle box", create_handle_box },
10229 { "image", create_image },
10230 { "key lookup", create_key_lookup },
10231 { "labels", create_labels },
10232 { "layout", create_layout },
10233 { "menus", create_menus },
10234 { "message dialog", create_message_dialog },
10235 { "modal window", create_modal_window, TRUE },
10236 { "notebook", create_notebook },
10237 { "panes", create_panes },
10238 { "paned keyboard", create_paned_keyboard_navigation },
10239 { "pixbuf", create_pixbuf },
10240 { "progress bar", create_progress_bar },
10241 { "properties", create_properties },
10242 { "radio buttons", create_radio_buttons },
10243 { "range controls", create_range_controls },
10244 { "rc file", create_rc_file },
10245 { "reparent", create_reparent },
10246 { "resize grips", create_resize_grips },
10247 { "rotated label", create_rotated_label },
10248 { "rotated text", create_rotated_text },
10249 { "rulers", create_rulers },
10250 { "saved position", create_saved_position },
10251 { "scrolled windows", create_scrolled_windows },
10252 { "shapes", create_shapes },
10253 { "size groups", create_size_groups },
10254 { "snapshot", create_snapshot },
10255 { "spinbutton", create_spins },
10256 { "statusbar", create_statusbar },
10257 { "styles", create_styles },
10258 { "test idle", create_idle_test },
10259 { "test mainloop", create_mainloop, TRUE },
10260 { "test scrolling", create_scroll_test },
10261 { "test selection", create_selection_test },
10262 { "test timeout", create_timeout_test },
10263 { "toggle buttons", create_toggle_buttons },
10264 { "toolbar", create_toolbar },
10265 { "tooltips", create_tooltips },
10266 { "WM hints", create_wmhints },
10267 { "window sizing", create_window_sizing },
10268 { "window states", create_window_states }
10270 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10273 create_main_window (void)
10278 GtkWidget *scrolled_window;
10282 GtkWidget *separator;
10283 GdkGeometry geometry;
10286 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10287 gtk_widget_set_name (window, "main window");
10288 gtk_window_move (GTK_WINDOW (window), 50, 20);
10289 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10291 geometry.min_width = -1;
10292 geometry.min_height = -1;
10293 geometry.max_width = -1;
10294 geometry.max_height = G_MAXSHORT;
10295 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10297 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10299 g_signal_connect (window, "destroy",
10300 G_CALLBACK (gtk_main_quit),
10302 g_signal_connect (window, "delete-event",
10303 G_CALLBACK (gtk_false),
10306 box1 = gtk_vbox_new (FALSE, 0);
10307 gtk_container_add (GTK_CONTAINER (window), box1);
10309 if (gtk_micro_version > 0)
10314 gtk_micro_version);
10319 gtk_minor_version);
10321 label = gtk_label_new (buffer);
10322 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10323 gtk_widget_set_name (label, "testgtk-version-label");
10325 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10326 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10327 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10329 GTK_POLICY_AUTOMATIC);
10330 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10332 box2 = gtk_vbox_new (FALSE, 0);
10333 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10334 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10335 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10336 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10337 gtk_widget_show (box2);
10339 for (i = 0; i < nbuttons; i++)
10341 button = gtk_button_new_with_label (buttons[i].label);
10342 if (buttons[i].func)
10343 g_signal_connect (button,
10345 G_CALLBACK(buttons[i].func),
10348 gtk_widget_set_sensitive (button, FALSE);
10349 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10352 separator = gtk_hseparator_new ();
10353 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10355 box2 = gtk_vbox_new (FALSE, 10);
10356 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10357 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10359 button = gtk_button_new_with_mnemonic ("_Close");
10360 g_signal_connect (button, "clicked",
10361 G_CALLBACK (do_exit),
10363 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10364 gtk_widget_set_can_default (button, TRUE);
10365 gtk_widget_grab_default (button);
10367 gtk_widget_show_all (window);
10373 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10374 G_FILE_TEST_EXISTS))
10376 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10377 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10382 pad (const char *str, int to)
10384 static char buf[256];
10385 int len = strlen (str);
10388 for (i = 0; i < to; i++)
10393 memcpy (buf, str, len);
10399 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10401 fn (widget); /* on */
10402 while (g_main_context_iteration (NULL, FALSE));
10403 fn (widget); /* off */
10404 while (g_main_context_iteration (NULL, FALSE));
10408 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10414 static gboolean printed_headers = FALSE;
10416 if (!printed_headers) {
10417 g_print ("Test Iters First Other\n");
10418 g_print ("-------------------- ----- ---------- ----------\n");
10419 printed_headers = TRUE;
10422 g_get_current_time (&tv0);
10423 bench_iteration (widget, fn);
10424 g_get_current_time (&tv1);
10426 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10427 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10429 g_get_current_time (&tv0);
10430 for (n = 0; n < num - 1; n++)
10431 bench_iteration (widget, fn);
10432 g_get_current_time (&tv1);
10433 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10434 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10436 g_print ("%s %5d ", pad (name, 20), num);
10438 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10440 g_print ("%10.1f\n", dt_first);
10444 do_bench (char* what, int num)
10448 void (* fn) (GtkWidget *widget);
10450 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10452 if (g_ascii_strcasecmp (what, "ALL") == 0)
10454 for (i = 0; i < nbuttons; i++)
10456 if (!buttons[i].do_not_benchmark)
10457 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10464 for (i = 0; i < nbuttons; i++)
10466 if (strcmp (buttons[i].label, what) == 0)
10468 fn = buttons[i].func;
10474 g_print ("Can't bench: \"%s\" not found.\n", what);
10476 do_real_bench (widget, fn, buttons[i].label, num);
10483 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10488 main (int argc, char *argv[])
10490 GtkBindingSet *binding_set;
10492 gboolean done_benchmarks = FALSE;
10494 srand (time (NULL));
10498 /* Check to see if we are being run from the correct
10501 if (file_exists ("testgtkrc"))
10502 gtk_rc_add_default_file ("testgtkrc");
10503 else if (file_exists ("tests/testgtkrc"))
10504 gtk_rc_add_default_file ("tests/testgtkrc");
10506 g_warning ("Couldn't find file \"testgtkrc\".");
10508 g_set_application_name ("GTK+ Test Program");
10510 gtk_init (&argc, &argv);
10512 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10521 for (i = 1; i < argc; i++)
10523 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10530 nextarg = strchr (argv[i], '=');
10541 count = strchr (nextarg, ':');
10544 what = g_strndup (nextarg, count - nextarg);
10546 num = atoi (count);
10551 what = g_strdup (nextarg);
10553 do_bench (what, num ? num : 1);
10554 done_benchmarks = TRUE;
10559 if (done_benchmarks)
10564 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10565 gtk_binding_entry_add_signal (binding_set,
10566 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10569 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10571 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
10575 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
10576 " fg[NORMAL] = \"#ff0000\"\n"
10577 " font = \"Sans 18\"\n"
10579 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
10581 create_main_window ();
10587 while (g_main_context_pending (NULL))
10588 g_main_context_iteration (NULL, FALSE);
10591 while (g_main_context_pending (NULL))
10592 g_main_context_iteration (NULL, FALSE);