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/.
27 #undef GTK_DISABLE_DEPRECATED
43 #define GTK_ENABLE_BROKEN
46 #include "gdk/gdkkeysyms.h"
49 #define sleep(n) _sleep(n)
52 #include "prop-editor.h"
54 #include "circles.xbm"
58 file_exists (const char *filename)
62 return stat (filename, &statbuf) == 0;
66 shape_create_icon (GdkScreen *screen,
75 build_option_menu (gchar *items[],
78 void (*func) (GtkWidget *widget, gpointer data),
81 /* macro, structure and variables used by tree window demos */
82 #define DEFAULT_NUMBER_OF_ITEM 3
83 #define DEFAULT_RECURSION_LEVEL 3
86 GSList* selection_mode_group;
87 GtkWidget* single_button;
88 GtkWidget* browse_button;
89 GtkWidget* multiple_button;
90 GtkWidget* draw_line_button;
91 GtkWidget* view_line_button;
92 GtkWidget* no_root_item_button;
93 GtkWidget* nb_item_spinner;
94 GtkWidget* recursion_spinner;
95 } sTreeSampleSelection;
97 typedef struct sTreeButtons {
99 GtkWidget* add_button;
100 GtkWidget* remove_button;
101 GtkWidget* subtree_button;
103 /* end of tree section */
106 build_option_menu (gchar *items[],
109 void (*func)(GtkWidget *widget, gpointer data),
114 GtkWidget *menu_item;
118 omenu = gtk_option_menu_new ();
119 g_signal_connect (omenu, "changed",
120 G_CALLBACK (func), data);
122 menu = gtk_menu_new ();
125 for (i = 0; i < num_items; i++)
127 menu_item = gtk_radio_menu_item_new_with_label (group, items[i]);
128 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menu_item));
129 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
131 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
132 gtk_widget_show (menu_item);
135 gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
136 gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), history);
142 destroy_tooltips (GtkWidget *widget, GtkWindow **window)
144 GtkTooltips *tt = g_object_get_data (G_OBJECT (*window), "tooltips");
151 * Windows with an alpha channel
156 on_alpha_window_expose (GtkWidget *widget,
157 GdkEventExpose *expose)
160 cairo_pattern_t *pattern;
163 cr = gdk_cairo_create (widget->window);
165 radius = MIN (widget->allocation.width, widget->allocation.height) / 2;
166 pattern = cairo_pattern_create_radial (widget->allocation.width / 2,
167 widget->allocation.height / 2,
169 widget->allocation.width / 2,
170 widget->allocation.height / 2,
173 if (gdk_screen_get_rgba_colormap (gtk_widget_get_screen (widget)) &&
174 gtk_widget_is_composited (widget))
175 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
177 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
179 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
182 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
183 1.0, 0.75, 0.0, 1.0); /* solid orange */
184 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
185 1.0, 0.75, 0.0, 0.0); /* transparent orange */
187 cairo_set_source (cr, pattern);
188 cairo_pattern_destroy (pattern);
190 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
199 build_alpha_widgets (void)
202 GtkWidget *radio_button;
207 table = gtk_table_new (1, 1, FALSE);
209 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
210 gtk_table_attach (GTK_TABLE (table),
213 GTK_EXPAND | GTK_FILL, 0,
216 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
217 gtk_table_attach (GTK_TABLE (table),
220 GTK_EXPAND | GTK_FILL, 0,
223 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
224 gtk_table_attach (GTK_TABLE (table),
227 GTK_EXPAND | GTK_FILL, 0,
230 gtk_table_attach (GTK_TABLE (table),
231 gtk_check_button_new_with_label ("Sedentary"),
233 GTK_EXPAND | GTK_FILL, 0,
235 gtk_table_attach (GTK_TABLE (table),
236 gtk_check_button_new_with_label ("Nocturnal"),
238 GTK_EXPAND | GTK_FILL, 0,
240 gtk_table_attach (GTK_TABLE (table),
241 gtk_check_button_new_with_label ("Compulsive"),
243 GTK_EXPAND | GTK_FILL, 0,
246 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
247 gtk_table_attach (GTK_TABLE (table),
250 GTK_EXPAND | GTK_FILL, 0,
253 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
254 gtk_table_attach (GTK_TABLE (table),
257 GTK_EXPAND | GTK_FILL, 0,
260 hbox = gtk_hbox_new (FALSE, 0);
261 label = gtk_label_new (NULL);
262 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
263 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
264 entry = gtk_entry_new ();
265 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
266 gtk_table_attach (GTK_TABLE (table),
269 GTK_EXPAND | GTK_FILL, 0,
276 on_alpha_drawing_expose (GtkWidget *widget,
277 GdkEventExpose *expose)
279 int x = widget->allocation.x;
280 int y = widget->allocation.y;
281 int width = widget->allocation.width;
282 int height = widget->allocation.height;
288 buffer = g_malloc (64 * 64 * 4);
290 gdk_draw_rectangle (widget->window, widget->style->black_gc, FALSE,
292 width - 1, height - 1);
295 for (i = 0; i < 64; i++) {
296 for (j = 0; j < 64; j++) {
300 *(p++) = MIN (255, ((32 - i) * (32 - i) + (32 - j) * (32 - j)) / 8);
305 gdk_draw_rgb_32_image (widget->window, widget->style->black_gc,
306 x + 18, y + (height - 64) /2,
307 64, 64, GDK_RGB_DITHER_NORMAL, buffer, 64 * 4);
309 pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, TRUE,
310 8, 64, 64, 4 * 64, NULL, NULL);
312 gdk_draw_pixbuf (widget->window, widget->style->black_gc, pixbuf,
313 0, 0, x + width - 18 - 64, y + (height - 64) /2,
314 64, 64, GDK_RGB_DITHER_NORMAL, 0, 0);
316 g_object_unref (pixbuf);
324 build_alpha_drawing ()
328 hbox = gtk_hbox_new (FALSE, 0);
329 gtk_widget_set_size_request (hbox, 100, 100);
331 g_signal_connect (hbox, "expose-event",
332 G_CALLBACK (on_alpha_drawing_expose), NULL);
338 on_alpha_screen_changed (GtkWidget *widget,
339 GdkScreen *old_screen,
342 GdkScreen *screen = gtk_widget_get_screen (widget);
343 GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
347 colormap = gdk_screen_get_rgb_colormap (screen);
348 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
352 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
355 gtk_widget_set_colormap (widget, colormap);
359 on_composited_changed (GtkWidget *window,
362 gboolean is_composited = gtk_widget_is_composited (window);
365 gtk_label_set_text (label, "Composited");
367 gtk_label_set_text (label, "Not composited");
371 create_alpha_window (GtkWidget *widget)
373 static GtkWidget *window;
380 window = gtk_dialog_new_with_buttons ("Alpha Window",
381 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
385 gtk_widget_set_app_paintable (window, TRUE);
386 g_signal_connect (window, "expose-event",
387 G_CALLBACK (on_alpha_window_expose), NULL);
389 vbox = gtk_vbox_new (FALSE, 8);
390 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
391 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
394 label = gtk_label_new (NULL);
395 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
396 on_alpha_screen_changed (window, NULL, label);
397 g_signal_connect (window, "screen-changed",
398 G_CALLBACK (on_alpha_screen_changed), label);
400 label = gtk_label_new (NULL);
401 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
402 on_composited_changed (window, GTK_LABEL (label));
403 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
405 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
406 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_drawing (), TRUE, TRUE, 0);
408 g_signal_connect (window, "destroy",
409 G_CALLBACK (gtk_widget_destroyed),
412 g_signal_connect (window, "response",
413 G_CALLBACK (gtk_widget_destroy),
417 if (!gtk_widget_get_visible (window))
418 gtk_widget_show_all (window);
420 gtk_widget_destroy (window);
424 * Composited non-toplevel window
427 /* The expose event handler for the event box.
429 * This function simply draws a transparency onto a widget on the area
430 * for which it receives expose events. This is intended to give the
431 * event box a "transparent" background.
433 * In order for this to work properly, the widget must have an RGBA
434 * colourmap. The widget should also be set as app-paintable since it
435 * doesn't make sense for GTK to draw a background if we are drawing it
436 * (and because GTK might actually replace our transparency with its
437 * default background colour).
440 transparent_expose (GtkWidget *widget,
441 GdkEventExpose *event)
445 cr = gdk_cairo_create (widget->window);
446 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
447 gdk_cairo_region (cr, event->region);
454 /* The expose event handler for the window.
456 * This function performs the actual compositing of the event box onto
457 * the already-existing background of the window at 50% normal opacity.
459 * In this case we do not want app-paintable to be set on the widget
460 * since we want it to draw its own (red) background. Because of this,
461 * however, we must ensure that we use g_signal_register_after so that
462 * this handler is called after the red has been drawn. If it was
463 * called before then GTK would just blindly paint over our work.
466 window_expose_event (GtkWidget *widget,
467 GdkEventExpose *event)
473 /* get our child (in this case, the event box) */
474 child = gtk_bin_get_child (GTK_BIN (widget));
476 /* create a cairo context to draw to the window */
477 cr = gdk_cairo_create (widget->window);
479 /* the source data is the (composited) event box */
480 gdk_cairo_set_source_pixmap (cr, child->window,
482 child->allocation.y);
484 /* draw no more than our expose event intersects our child */
485 region = gdk_region_rectangle (&child->allocation);
486 gdk_region_intersect (region, event->region);
487 gdk_cairo_region (cr, region);
490 /* composite, with a 50% opacity */
491 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
492 cairo_paint_with_alpha (cr, 0.5);
501 create_composited_window (GtkWidget *widget)
503 static GtkWidget *window;
507 GtkWidget *event, *button;
512 /* make the widgets */
513 button = gtk_button_new_with_label ("A Button");
514 event = gtk_event_box_new ();
515 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
517 g_signal_connect (window, "destroy",
518 G_CALLBACK (gtk_widget_destroyed),
521 /* put a red background on the window */
522 gdk_color_parse ("red", &red);
523 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
525 /* set the colourmap for the event box.
526 * must be done before the event box is realised.
528 screen = gtk_widget_get_screen (event);
529 rgba = gdk_screen_get_rgba_colormap (screen);
530 gtk_widget_set_colormap (event, rgba);
532 /* set our event box to have a fully-transparent background
533 * drawn on it. currently there is no way to simply tell gtk
534 * that "transparency" is the background colour for a widget.
536 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
537 g_signal_connect (event, "expose-event",
538 G_CALLBACK (transparent_expose), NULL);
540 /* put them inside one another */
541 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
542 gtk_container_add (GTK_CONTAINER (window), event);
543 gtk_container_add (GTK_CONTAINER (event), button);
545 /* realise and show everything */
546 gtk_widget_realize (button);
548 /* set the event box GdkWindow to be composited.
549 * obviously must be performed after event box is realised.
551 gdk_window_set_composited (event->window, TRUE);
553 /* set up the compositing handler.
554 * note that we do _after so that the normal (red) background is drawn
555 * by gtk before our compositing occurs.
557 g_signal_connect_after (window, "expose-event",
558 G_CALLBACK (window_expose_event), NULL);
561 if (!gtk_widget_get_visible (window))
562 gtk_widget_show_all (window);
564 gtk_widget_destroy (window);
568 * Big windows and guffaw scrolling
572 pattern_expose (GtkWidget *widget,
573 GdkEventExpose *event,
577 GdkWindow *window = event->window;
579 color = g_object_get_data (G_OBJECT (window), "pattern-color");
582 GdkGC *tmp_gc = gdk_gc_new (window);
583 gdk_gc_set_rgb_fg_color (tmp_gc, color);
585 gdk_draw_rectangle (window, tmp_gc, TRUE,
586 event->area.x, event->area.y,
587 event->area.width, event->area.height);
589 g_object_unref (tmp_gc);
596 pattern_set_bg (GtkWidget *widget,
600 static const GdkColor colors[] = {
601 { 0, 0x4444, 0x4444, 0xffff },
602 { 0, 0x8888, 0x8888, 0xffff },
603 { 0, 0xaaaa, 0xaaaa, 0xffff }
606 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
607 gdk_window_set_user_data (child, widget);
611 create_pattern (GtkWidget *widget,
622 while (2 * h <= height)
627 while (2 * w <= width)
629 if ((i + j) % 2 == 0)
634 GdkWindowAttr attributes;
636 attributes.window_type = GDK_WINDOW_CHILD;
639 attributes.width = w;
640 attributes.height = h;
641 attributes.wclass = GDK_INPUT_OUTPUT;
642 attributes.event_mask = GDK_EXPOSURE_MASK;
643 attributes.visual = gtk_widget_get_visual (widget);
644 attributes.colormap = gtk_widget_get_colormap (widget);
646 child = gdk_window_new (parent, &attributes,
647 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
649 pattern_set_bg (widget, child, level);
652 create_pattern (widget, child, level + 1, w, h);
654 gdk_window_show (child);
664 #define PATTERN_SIZE (1 << 18)
667 pattern_hadj_changed (GtkAdjustment *adj,
670 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
671 gint new_value = adj->value;
673 if (gtk_widget_get_realized (darea))
675 gdk_window_scroll (darea->window, *old_value - new_value, 0);
676 *old_value = new_value;
681 pattern_vadj_changed (GtkAdjustment *adj,
684 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
685 gint new_value = adj->value;
687 if (gtk_widget_get_realized (darea))
689 gdk_window_scroll (darea->window, 0, *old_value - new_value);
690 *old_value = new_value;
695 pattern_realize (GtkWidget *widget,
698 pattern_set_bg (widget, widget->window, 0);
699 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
703 create_big_windows (GtkWidget *widget)
705 static GtkWidget *window = NULL;
706 GtkWidget *darea, *table, *scrollbar;
710 static gint current_x;
711 static gint current_y;
718 window = gtk_dialog_new_with_buttons ("Big Windows",
724 gtk_window_set_screen (GTK_WINDOW (window),
725 gtk_widget_get_screen (widget));
727 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
729 g_signal_connect (window, "destroy",
730 G_CALLBACK (gtk_widget_destroyed),
733 g_signal_connect (window, "response",
734 G_CALLBACK (gtk_widget_destroy),
737 table = gtk_table_new (2, 2, FALSE);
738 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
739 table, TRUE, TRUE, 0);
741 darea = gtk_drawing_area_new ();
743 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
744 g_signal_connect (hadj, "value_changed",
745 G_CALLBACK (pattern_hadj_changed), darea);
746 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
748 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
749 g_signal_connect (vadj, "value_changed",
750 G_CALLBACK (pattern_vadj_changed), darea);
751 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
753 g_signal_connect (darea, "realize",
754 G_CALLBACK (pattern_realize),
756 g_signal_connect (darea, "expose_event",
757 G_CALLBACK (pattern_expose),
760 eventbox = gtk_event_box_new ();
761 gtk_table_attach (GTK_TABLE (table), eventbox,
763 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
766 gtk_container_add (GTK_CONTAINER (eventbox), darea);
768 scrollbar = gtk_hscrollbar_new (hadj);
769 gtk_table_attach (GTK_TABLE (table), scrollbar,
771 GTK_FILL | GTK_EXPAND, GTK_FILL,
774 scrollbar = gtk_vscrollbar_new (vadj);
775 gtk_table_attach (GTK_TABLE (table), scrollbar,
777 GTK_FILL, GTK_EXPAND | GTK_FILL,
782 if (!gtk_widget_get_visible (window))
783 gtk_widget_show_all (window);
785 gtk_widget_hide (window);
793 button_window (GtkWidget *widget,
796 if (!gtk_widget_get_visible (button))
797 gtk_widget_show (button);
799 gtk_widget_hide (button);
803 create_buttons (GtkWidget *widget)
805 static GtkWidget *window = NULL;
809 GtkWidget *button[10];
810 GtkWidget *separator;
814 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
815 gtk_window_set_screen (GTK_WINDOW (window),
816 gtk_widget_get_screen (widget));
818 g_signal_connect (window, "destroy",
819 G_CALLBACK (gtk_widget_destroyed),
822 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
823 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
825 box1 = gtk_vbox_new (FALSE, 0);
826 gtk_container_add (GTK_CONTAINER (window), box1);
828 table = gtk_table_new (3, 3, FALSE);
829 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
830 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
831 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
832 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
834 button[0] = gtk_button_new_with_label ("button1");
835 button[1] = gtk_button_new_with_mnemonic ("_button2");
836 button[2] = gtk_button_new_with_mnemonic ("_button3");
837 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
838 button[4] = gtk_button_new_with_label ("button5");
839 button[5] = gtk_button_new_with_label ("button6");
840 button[6] = gtk_button_new_with_label ("button7");
841 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
842 button[8] = gtk_button_new_with_label ("button9");
844 g_signal_connect (button[0], "clicked",
845 G_CALLBACK (button_window),
848 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
849 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
851 g_signal_connect (button[1], "clicked",
852 G_CALLBACK (button_window),
855 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
856 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
858 g_signal_connect (button[2], "clicked",
859 G_CALLBACK (button_window),
861 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
862 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
864 g_signal_connect (button[3], "clicked",
865 G_CALLBACK (button_window),
867 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
868 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
870 g_signal_connect (button[4], "clicked",
871 G_CALLBACK (button_window),
873 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
874 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
876 g_signal_connect (button[5], "clicked",
877 G_CALLBACK (button_window),
879 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
880 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
882 g_signal_connect (button[6], "clicked",
883 G_CALLBACK (button_window),
885 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
886 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
888 g_signal_connect (button[7], "clicked",
889 G_CALLBACK (button_window),
891 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
892 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
894 g_signal_connect (button[8], "clicked",
895 G_CALLBACK (button_window),
897 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
898 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
900 separator = gtk_hseparator_new ();
901 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
903 box2 = gtk_vbox_new (FALSE, 10);
904 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
905 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
907 button[9] = gtk_button_new_with_label ("close");
908 g_signal_connect_swapped (button[9], "clicked",
909 G_CALLBACK (gtk_widget_destroy),
911 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
912 gtk_widget_set_can_default (button[9], TRUE);
913 gtk_widget_grab_default (button[9]);
916 if (!gtk_widget_get_visible (window))
917 gtk_widget_show_all (window);
919 gtk_widget_destroy (window);
927 create_toggle_buttons (GtkWidget *widget)
929 static GtkWidget *window = NULL;
933 GtkWidget *separator;
937 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
938 gtk_window_set_screen (GTK_WINDOW (window),
939 gtk_widget_get_screen (widget));
941 g_signal_connect (window, "destroy",
942 G_CALLBACK (gtk_widget_destroyed),
945 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
946 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
948 box1 = gtk_vbox_new (FALSE, 0);
949 gtk_container_add (GTK_CONTAINER (window), box1);
951 box2 = gtk_vbox_new (FALSE, 10);
952 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
953 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
955 button = gtk_toggle_button_new_with_label ("button1");
956 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
958 button = gtk_toggle_button_new_with_label ("button2");
959 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
961 button = gtk_toggle_button_new_with_label ("button3");
962 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
964 button = gtk_toggle_button_new_with_label ("inconsistent");
965 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
966 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
968 separator = gtk_hseparator_new ();
969 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
971 box2 = gtk_vbox_new (FALSE, 10);
972 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
973 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
975 button = gtk_button_new_with_label ("close");
976 g_signal_connect_swapped (button, "clicked",
977 G_CALLBACK (gtk_widget_destroy),
979 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
980 gtk_widget_set_can_default (button, TRUE);
981 gtk_widget_grab_default (button);
984 if (!gtk_widget_get_visible (window))
985 gtk_widget_show_all (window);
987 gtk_widget_destroy (window);
991 create_widget_grid (GType widget_type)
994 GtkWidget *group_widget = NULL;
997 table = gtk_table_new (FALSE, 3, 3);
999 for (i = 0; i < 5; i++)
1001 for (j = 0; j < 5; j++)
1006 if (i == 0 && j == 0)
1012 tmp = g_strdup_printf ("%d", j);
1013 widget = gtk_label_new (tmp);
1018 tmp = g_strdup_printf ("%c", 'A' + i - 1);
1019 widget = gtk_label_new (tmp);
1024 widget = g_object_new (widget_type, NULL);
1026 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
1029 group_widget = widget;
1031 g_object_set (widget, "group", group_widget, NULL);
1036 gtk_table_attach (GTK_TABLE (table), widget,
1051 create_check_buttons (GtkWidget *widget)
1053 static GtkWidget *window = NULL;
1057 GtkWidget *separator;
1062 window = gtk_dialog_new_with_buttons ("Check Buttons",
1068 gtk_window_set_screen (GTK_WINDOW (window),
1069 gtk_widget_get_screen (widget));
1071 g_signal_connect (window, "destroy",
1072 G_CALLBACK (gtk_widget_destroyed),
1074 g_signal_connect (window, "response",
1075 G_CALLBACK (gtk_widget_destroy),
1078 box1 = GTK_DIALOG (window)->vbox;
1080 box2 = gtk_vbox_new (FALSE, 10);
1081 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1082 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1084 button = gtk_check_button_new_with_mnemonic ("_button1");
1085 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1087 button = gtk_check_button_new_with_label ("button2");
1088 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1090 button = gtk_check_button_new_with_label ("button3");
1091 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1093 button = gtk_check_button_new_with_label ("inconsistent");
1094 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1095 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1097 separator = gtk_hseparator_new ();
1098 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1100 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
1101 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1102 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1105 if (!gtk_widget_get_visible (window))
1106 gtk_widget_show_all (window);
1108 gtk_widget_destroy (window);
1116 create_radio_buttons (GtkWidget *widget)
1118 static GtkWidget *window = NULL;
1122 GtkWidget *separator;
1127 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1133 gtk_window_set_screen (GTK_WINDOW (window),
1134 gtk_widget_get_screen (widget));
1136 g_signal_connect (window, "destroy",
1137 G_CALLBACK (gtk_widget_destroyed),
1139 g_signal_connect (window, "response",
1140 G_CALLBACK (gtk_widget_destroy),
1143 box1 = GTK_DIALOG (window)->vbox;
1145 box2 = gtk_vbox_new (FALSE, 10);
1146 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1147 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1149 button = gtk_radio_button_new_with_label (NULL, "button1");
1150 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1152 button = gtk_radio_button_new_with_label (
1153 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1155 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1156 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1158 button = gtk_radio_button_new_with_label (
1159 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1161 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1163 button = gtk_radio_button_new_with_label (
1164 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1166 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1167 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1169 separator = gtk_hseparator_new ();
1170 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1172 box2 = gtk_vbox_new (FALSE, 10);
1173 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1174 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1176 button = gtk_radio_button_new_with_label (NULL, "button4");
1177 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1178 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1180 button = gtk_radio_button_new_with_label (
1181 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1183 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1184 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1185 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1187 button = gtk_radio_button_new_with_label (
1188 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1190 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1191 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1193 separator = gtk_hseparator_new ();
1194 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1196 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1197 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1198 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1201 if (!gtk_widget_get_visible (window))
1202 gtk_widget_show_all (window);
1204 gtk_widget_destroy (window);
1212 create_bbox (gint horizontal,
1223 frame = gtk_frame_new (title);
1226 bbox = gtk_hbutton_box_new ();
1228 bbox = gtk_vbutton_box_new ();
1230 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1231 gtk_container_add (GTK_CONTAINER (frame), bbox);
1233 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1234 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1235 gtk_button_box_set_child_size (GTK_BUTTON_BOX (bbox), child_w, child_h);
1237 button = gtk_button_new_with_label ("OK");
1238 gtk_container_add (GTK_CONTAINER (bbox), button);
1240 button = gtk_button_new_with_label ("Cancel");
1241 gtk_container_add (GTK_CONTAINER (bbox), button);
1243 button = gtk_button_new_with_label ("Help");
1244 gtk_container_add (GTK_CONTAINER (bbox), button);
1250 create_button_box (GtkWidget *widget)
1252 static GtkWidget* window = NULL;
1253 GtkWidget *main_vbox;
1256 GtkWidget *frame_horz;
1257 GtkWidget *frame_vert;
1261 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1262 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1263 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1265 g_signal_connect (window, "destroy",
1266 G_CALLBACK (gtk_widget_destroyed),
1269 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1271 main_vbox = gtk_vbox_new (FALSE, 0);
1272 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1274 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1275 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1277 vbox = gtk_vbox_new (FALSE, 0);
1278 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1279 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1281 gtk_box_pack_start (GTK_BOX (vbox),
1282 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1285 gtk_box_pack_start (GTK_BOX (vbox),
1286 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1289 gtk_box_pack_start (GTK_BOX (vbox),
1290 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1293 gtk_box_pack_start (GTK_BOX (vbox),
1294 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1297 gtk_box_pack_start (GTK_BOX (vbox),
1298 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1301 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1302 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1304 hbox = gtk_hbox_new (FALSE, 0);
1305 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1306 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1308 gtk_box_pack_start (GTK_BOX (hbox),
1309 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1312 gtk_box_pack_start (GTK_BOX (hbox),
1313 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1316 gtk_box_pack_start (GTK_BOX (hbox),
1317 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1320 gtk_box_pack_start (GTK_BOX (hbox),
1321 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1324 gtk_box_pack_start (GTK_BOX (hbox),
1325 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1329 if (!gtk_widget_get_visible (window))
1330 gtk_widget_show_all (window);
1332 gtk_widget_destroy (window);
1340 new_pixmap (char *filename,
1342 GdkColor *background)
1348 if (strcmp (filename, "test.xpm") == 0 ||
1349 !file_exists (filename))
1351 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask,
1356 pixmap = gdk_pixmap_create_from_xpm (window, &mask,
1360 wpixmap = gtk_image_new_from_pixmap (pixmap, mask);
1367 set_toolbar_small_stock (GtkWidget *widget,
1370 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1374 set_toolbar_large_stock (GtkWidget *widget,
1377 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1381 set_toolbar_horizontal (GtkWidget *widget,
1384 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_HORIZONTAL);
1388 set_toolbar_vertical (GtkWidget *widget,
1391 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_VERTICAL);
1395 set_toolbar_icons (GtkWidget *widget,
1398 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1402 set_toolbar_text (GtkWidget *widget,
1405 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1409 set_toolbar_both (GtkWidget *widget,
1412 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1416 set_toolbar_both_horiz (GtkWidget *widget,
1419 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1423 set_toolbar_enable (GtkWidget *widget,
1426 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), TRUE);
1430 set_toolbar_disable (GtkWidget *widget,
1433 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), FALSE);
1437 create_toolbar (GtkWidget *widget)
1439 static GtkWidget *window = NULL;
1445 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1446 gtk_window_set_screen (GTK_WINDOW (window),
1447 gtk_widget_get_screen (widget));
1449 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1451 g_signal_connect (window, "destroy",
1452 G_CALLBACK (gtk_widget_destroyed),
1455 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1456 gtk_widget_realize (window);
1458 toolbar = gtk_toolbar_new ();
1460 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1462 "Stock icon: New", "Toolbar/New",
1463 G_CALLBACK (set_toolbar_small_stock), toolbar, -1);
1465 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1467 "Stock icon: Open", "Toolbar/Open",
1468 G_CALLBACK (set_toolbar_large_stock), toolbar, -1);
1470 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1471 "Horizontal", "Horizontal toolbar layout", "Toolbar/Horizontal",
1472 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1473 G_CALLBACK (set_toolbar_horizontal), toolbar);
1474 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1475 "Vertical", "Vertical toolbar layout", "Toolbar/Vertical",
1476 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1477 G_CALLBACK (set_toolbar_vertical), toolbar);
1479 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1481 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1482 "Icons", "Only show toolbar icons", "Toolbar/IconsOnly",
1483 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1484 G_CALLBACK (set_toolbar_icons), toolbar);
1485 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1486 "Text", "Only show toolbar text", "Toolbar/TextOnly",
1487 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1488 G_CALLBACK (set_toolbar_text), toolbar);
1489 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1490 "Both", "Show toolbar icons and text", "Toolbar/Both",
1491 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1492 G_CALLBACK (set_toolbar_both), toolbar);
1493 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1494 "Both (horizontal)",
1495 "Show toolbar icons and text in a horizontal fashion",
1496 "Toolbar/BothHoriz",
1497 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1498 G_CALLBACK (set_toolbar_both_horiz), toolbar);
1500 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1502 entry = gtk_entry_new ();
1504 gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), entry, "This is an unusable GtkEntry ;)", "Hey don't click me!!!");
1506 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1509 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1511 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1512 "Enable", "Enable tooltips", NULL,
1513 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1514 G_CALLBACK (set_toolbar_enable), toolbar);
1515 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1516 "Disable", "Disable tooltips", NULL,
1517 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1518 G_CALLBACK (set_toolbar_disable), toolbar);
1520 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1522 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1523 "Frobate", "Frobate tooltip", NULL,
1524 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1526 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1527 "Baz", "Baz tooltip", NULL,
1528 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1531 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1533 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1534 "Blah", "Blah tooltip", NULL,
1535 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1537 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1538 "Bar", "Bar tooltip", NULL,
1539 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1542 gtk_container_add (GTK_CONTAINER (window), toolbar);
1544 gtk_widget_set_size_request (toolbar, 200, -1);
1547 if (!gtk_widget_get_visible (window))
1548 gtk_widget_show_all (window);
1550 gtk_widget_destroy (window);
1554 make_toolbar (GtkWidget *window)
1558 if (!gtk_widget_get_realized (window))
1559 gtk_widget_realize (window);
1561 toolbar = gtk_toolbar_new ();
1563 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1564 "Horizontal", "Horizontal toolbar layout", NULL,
1565 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1566 G_CALLBACK (set_toolbar_horizontal), toolbar);
1567 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1568 "Vertical", "Vertical toolbar layout", NULL,
1569 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1570 G_CALLBACK (set_toolbar_vertical), toolbar);
1572 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1574 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1575 "Icons", "Only show toolbar icons", NULL,
1576 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1577 G_CALLBACK (set_toolbar_icons), toolbar);
1578 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1579 "Text", "Only show toolbar text", NULL,
1580 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1581 G_CALLBACK (set_toolbar_text), toolbar);
1582 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1583 "Both", "Show toolbar icons and text", NULL,
1584 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1585 G_CALLBACK (set_toolbar_both), toolbar);
1587 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1589 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1590 "Woot", "Woot woot woot", NULL,
1591 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1593 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1594 "Blah", "Blah blah blah", "Toolbar/Big",
1595 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1598 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1600 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1601 "Enable", "Enable tooltips", NULL,
1602 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1603 G_CALLBACK (set_toolbar_enable), toolbar);
1604 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1605 "Disable", "Disable tooltips", NULL,
1606 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1607 G_CALLBACK (set_toolbar_disable), toolbar);
1609 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1611 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1612 "Hoo", "Hoo tooltip", NULL,
1613 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1615 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1616 "Woo", "Woo tooltip", NULL,
1617 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1627 static guint statusbar_counter = 1;
1630 statusbar_push (GtkWidget *button,
1631 GtkStatusbar *statusbar)
1635 sprintf (text, "something %d", statusbar_counter++);
1637 gtk_statusbar_push (statusbar, 1, text);
1641 statusbar_push_long (GtkWidget *button,
1642 GtkStatusbar *statusbar)
1646 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\").");
1648 gtk_statusbar_push (statusbar, 1, text);
1652 statusbar_pop (GtkWidget *button,
1653 GtkStatusbar *statusbar)
1655 gtk_statusbar_pop (statusbar, 1);
1659 statusbar_steal (GtkWidget *button,
1660 GtkStatusbar *statusbar)
1662 gtk_statusbar_remove (statusbar, 1, 4);
1666 statusbar_popped (GtkStatusbar *statusbar,
1670 if (!statusbar->messages)
1671 statusbar_counter = 1;
1675 statusbar_contexts (GtkStatusbar *statusbar)
1679 string = "any context";
1680 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1682 gtk_statusbar_get_context_id (statusbar, string));
1684 string = "idle messages";
1685 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1687 gtk_statusbar_get_context_id (statusbar, string));
1689 string = "some text";
1690 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1692 gtk_statusbar_get_context_id (statusbar, string));
1694 string = "hit the mouse";
1695 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1697 gtk_statusbar_get_context_id (statusbar, string));
1699 string = "hit the mouse2";
1700 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1702 gtk_statusbar_get_context_id (statusbar, string));
1706 create_statusbar (GtkWidget *widget)
1708 static GtkWidget *window = NULL;
1712 GtkWidget *separator;
1713 GtkWidget *statusbar;
1717 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1718 gtk_window_set_screen (GTK_WINDOW (window),
1719 gtk_widget_get_screen (widget));
1721 g_signal_connect (window, "destroy",
1722 G_CALLBACK (gtk_widget_destroyed),
1725 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1726 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1728 box1 = gtk_vbox_new (FALSE, 0);
1729 gtk_container_add (GTK_CONTAINER (window), box1);
1731 box2 = gtk_vbox_new (FALSE, 10);
1732 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1733 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1735 statusbar = gtk_statusbar_new ();
1736 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1737 g_signal_connect (statusbar,
1739 G_CALLBACK (statusbar_popped),
1742 button = g_object_new (gtk_button_get_type (),
1743 "label", "push something",
1747 g_object_connect (button,
1748 "signal::clicked", statusbar_push, statusbar,
1751 button = g_object_connect (g_object_new (gtk_button_get_type (),
1756 "signal_after::clicked", statusbar_pop, statusbar,
1759 button = g_object_connect (g_object_new (gtk_button_get_type (),
1760 "label", "steal #4",
1764 "signal_after::clicked", statusbar_steal, statusbar,
1767 button = g_object_connect (g_object_new (gtk_button_get_type (),
1768 "label", "test contexts",
1772 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1775 button = g_object_connect (g_object_new (gtk_button_get_type (),
1776 "label", "push something long",
1780 "signal_after::clicked", statusbar_push_long, statusbar,
1783 separator = gtk_hseparator_new ();
1784 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1786 box2 = gtk_vbox_new (FALSE, 10);
1787 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1788 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1790 button = gtk_button_new_with_label ("close");
1791 g_signal_connect_swapped (button, "clicked",
1792 G_CALLBACK (gtk_widget_destroy),
1794 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1795 gtk_widget_set_can_default (button, TRUE);
1796 gtk_widget_grab_default (button);
1799 if (!gtk_widget_get_visible (window))
1800 gtk_widget_show_all (window);
1802 gtk_widget_destroy (window);
1810 cb_tree_destroy_event(GtkWidget* w)
1812 sTreeButtons* tree_buttons;
1814 /* free buttons structure associate at this tree */
1815 tree_buttons = g_object_get_data (G_OBJECT (w), "user_data");
1816 g_free (tree_buttons);
1820 cb_add_new_item(GtkWidget* w, GtkTree* tree)
1822 sTreeButtons* tree_buttons;
1823 GList* selected_list;
1824 GtkWidget* selected_item;
1826 GtkWidget* item_new;
1829 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1831 selected_list = GTK_TREE_SELECTION_OLD(tree);
1833 if(selected_list == NULL)
1835 /* there is no item in tree */
1836 subtree = GTK_WIDGET(tree);
1840 /* list can have only one element */
1841 selected_item = GTK_WIDGET(selected_list->data);
1843 subtree = GTK_TREE_ITEM_SUBTREE(selected_item);
1847 /* current selected item have not subtree ... create it */
1848 subtree = gtk_tree_new();
1849 gtk_tree_item_set_subtree(GTK_TREE_ITEM(selected_item),
1854 /* at this point, we know which subtree will be used to add new item */
1855 /* create a new item */
1856 sprintf(buffer, "item add %d", tree_buttons->nb_item_add);
1857 item_new = gtk_tree_item_new_with_label(buffer);
1858 gtk_tree_append(GTK_TREE(subtree), item_new);
1859 gtk_widget_show(item_new);
1861 tree_buttons->nb_item_add++;
1865 cb_remove_item(GtkWidget*w, GtkTree* tree)
1867 GList* selected_list;
1870 selected_list = GTK_TREE_SELECTION_OLD(tree);
1874 while (selected_list)
1876 clear_list = g_list_prepend (clear_list, selected_list->data);
1877 selected_list = selected_list->next;
1880 clear_list = g_list_reverse (clear_list);
1881 gtk_tree_remove_items(tree, clear_list);
1883 g_list_free (clear_list);
1887 cb_remove_subtree(GtkWidget*w, GtkTree* tree)
1889 GList* selected_list;
1892 selected_list = GTK_TREE_SELECTION_OLD(tree);
1896 item = GTK_TREE_ITEM (selected_list->data);
1898 gtk_tree_item_remove_subtree (item);
1903 cb_tree_changed(GtkTree* tree)
1905 sTreeButtons* tree_buttons;
1906 GList* selected_list;
1909 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1911 selected_list = GTK_TREE_SELECTION_OLD(tree);
1912 nb_selected = g_list_length(selected_list);
1914 if(nb_selected == 0)
1916 if(tree->children == NULL)
1917 gtk_widget_set_sensitive(tree_buttons->add_button, TRUE);
1919 gtk_widget_set_sensitive(tree_buttons->add_button, FALSE);
1920 gtk_widget_set_sensitive(tree_buttons->remove_button, FALSE);
1921 gtk_widget_set_sensitive(tree_buttons->subtree_button, FALSE);
1925 gtk_widget_set_sensitive(tree_buttons->remove_button, TRUE);
1926 gtk_widget_set_sensitive(tree_buttons->add_button, (nb_selected == 1));
1927 gtk_widget_set_sensitive(tree_buttons->subtree_button, (nb_selected == 1));
1932 create_subtree(GtkWidget* item, guint level, guint nb_item_max, guint recursion_level_max)
1934 GtkWidget* item_subtree;
1935 GtkWidget* item_new;
1940 if(level == recursion_level_max) return;
1944 /* query with no root item */
1946 item_subtree = item;
1951 /* query with no root item */
1952 /* create subtree and associate it with current item */
1953 item_subtree = gtk_tree_new();
1957 for(nb_item = 0; nb_item < nb_item_max; nb_item++)
1959 sprintf(buffer, "item %d-%d", level, nb_item);
1960 item_new = gtk_tree_item_new_with_label(buffer);
1961 gtk_tree_append(GTK_TREE(item_subtree), item_new);
1962 create_subtree(item_new, level+1, nb_item_max, recursion_level_max);
1963 gtk_widget_show(item_new);
1967 gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), item_subtree);
1971 create_tree_sample(GdkScreen *screen, guint selection_mode,
1972 guint draw_line, guint view_line, guint no_root_item,
1973 guint nb_item_max, guint recursion_level_max)
1978 GtkWidget* separator;
1980 GtkWidget* scrolled_win;
1981 GtkWidget* root_tree;
1982 GtkWidget* root_item;
1983 sTreeButtons* tree_buttons;
1985 /* create tree buttons struct */
1986 if ((tree_buttons = g_malloc (sizeof (sTreeButtons))) == NULL)
1988 g_error("can't allocate memory for tree structure !\n");
1991 tree_buttons->nb_item_add = 0;
1993 /* create top level window */
1994 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1995 gtk_window_set_screen (GTK_WINDOW (window), screen);
1996 gtk_window_set_title(GTK_WINDOW(window), "Tree Sample");
1997 g_signal_connect (window, "destroy",
1998 G_CALLBACK (cb_tree_destroy_event), NULL);
1999 g_object_set_data (G_OBJECT (window), "user_data", tree_buttons);
2001 box1 = gtk_vbox_new(FALSE, 0);
2002 gtk_container_add(GTK_CONTAINER(window), box1);
2003 gtk_widget_show(box1);
2005 /* create tree box */
2006 box2 = gtk_vbox_new(FALSE, 0);
2007 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
2008 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2009 gtk_widget_show(box2);
2011 /* create scrolled window */
2012 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
2013 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
2014 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2015 gtk_box_pack_start (GTK_BOX (box2), scrolled_win, TRUE, TRUE, 0);
2016 gtk_widget_set_size_request (scrolled_win, 200, 200);
2017 gtk_widget_show (scrolled_win);
2019 /* create root tree widget */
2020 root_tree = gtk_tree_new();
2021 g_signal_connect (root_tree, "selection_changed",
2022 G_CALLBACK (cb_tree_changed),
2024 g_object_set_data (G_OBJECT (root_tree), "user_data", tree_buttons);
2025 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), root_tree);
2026 gtk_tree_set_selection_mode(GTK_TREE(root_tree), selection_mode);
2027 gtk_tree_set_view_lines(GTK_TREE(root_tree), draw_line);
2028 gtk_tree_set_view_mode(GTK_TREE(root_tree), !view_line);
2029 gtk_widget_show(root_tree);
2033 /* set root tree to subtree function with root item variable */
2034 root_item = GTK_WIDGET(root_tree);
2038 /* create root tree item widget */
2039 root_item = gtk_tree_item_new_with_label("root item");
2040 gtk_tree_append(GTK_TREE(root_tree), root_item);
2041 gtk_widget_show(root_item);
2043 create_subtree(root_item, -no_root_item, nb_item_max, recursion_level_max);
2045 box2 = gtk_vbox_new(FALSE, 0);
2046 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
2047 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2048 gtk_widget_show(box2);
2050 button = gtk_button_new_with_label("Add Item");
2051 gtk_widget_set_sensitive(button, FALSE);
2052 g_signal_connect (button, "clicked",
2053 G_CALLBACK (cb_add_new_item),
2055 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2056 gtk_widget_show(button);
2057 tree_buttons->add_button = button;
2059 button = gtk_button_new_with_label("Remove Item(s)");
2060 gtk_widget_set_sensitive(button, FALSE);
2061 g_signal_connect (button, "clicked",
2062 G_CALLBACK (cb_remove_item),
2064 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2065 gtk_widget_show(button);
2066 tree_buttons->remove_button = button;
2068 button = gtk_button_new_with_label("Remove Subtree");
2069 gtk_widget_set_sensitive(button, FALSE);
2070 g_signal_connect (button, "clicked",
2071 G_CALLBACK (cb_remove_subtree),
2073 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2074 gtk_widget_show(button);
2075 tree_buttons->subtree_button = button;
2077 /* create separator */
2078 separator = gtk_hseparator_new();
2079 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
2080 gtk_widget_show(separator);
2082 /* create button box */
2083 box2 = gtk_vbox_new(FALSE, 0);
2084 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
2085 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2086 gtk_widget_show(box2);
2088 button = gtk_button_new_with_label("Close");
2089 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2090 g_signal_connect_swapped (button, "clicked",
2091 G_CALLBACK (gtk_widget_destroy),
2093 gtk_widget_show(button);
2095 gtk_widget_show(window);
2099 cb_create_tree(GtkWidget* w)
2101 guint selection_mode = GTK_SELECTION_SINGLE;
2106 guint recursion_level;
2108 /* get selection mode choice */
2109 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.single_button)->active)
2110 selection_mode = GTK_SELECTION_SINGLE;
2112 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.browse_button)->active)
2113 selection_mode = GTK_SELECTION_BROWSE;
2115 selection_mode = GTK_SELECTION_MULTIPLE;
2117 /* get options choice */
2118 draw_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.draw_line_button)->active;
2119 view_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.view_line_button)->active;
2120 no_root_item = GTK_TOGGLE_BUTTON(sTreeSampleSelection.no_root_item_button)->active;
2123 nb_item = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.nb_item_spinner));
2124 recursion_level = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.recursion_spinner));
2126 if (pow (nb_item, recursion_level) > 10000)
2128 g_print ("%g total items? That will take a very long time. Try less\n",
2129 pow (nb_item, recursion_level));
2133 create_tree_sample(gtk_widget_get_screen (w),
2134 selection_mode, draw_line,
2135 view_line, no_root_item, nb_item, recursion_level);
2139 create_tree_mode_window(GtkWidget *widget)
2141 static GtkWidget* window;
2149 GtkWidget* separator;
2156 /* create toplevel window */
2157 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2158 gtk_window_set_screen (GTK_WINDOW (window),
2159 gtk_widget_get_screen (widget));
2160 gtk_window_set_title(GTK_WINDOW(window), "Set Tree Parameters");
2161 g_signal_connect (window, "destroy",
2162 G_CALLBACK (gtk_widget_destroyed),
2164 box1 = gtk_vbox_new(FALSE, 0);
2165 gtk_container_add(GTK_CONTAINER(window), box1);
2167 /* create upper box - selection box */
2168 box2 = gtk_vbox_new(FALSE, 5);
2169 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
2170 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2172 box3 = gtk_hbox_new(FALSE, 5);
2173 gtk_box_pack_start(GTK_BOX(box2), box3, TRUE, TRUE, 0);
2175 /* create selection mode frame */
2176 frame = gtk_frame_new("Selection Mode");
2177 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
2179 box4 = gtk_vbox_new(FALSE, 0);
2180 gtk_container_add(GTK_CONTAINER(frame), box4);
2181 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
2183 /* create radio button */
2184 button = gtk_radio_button_new_with_label(NULL, "SINGLE");
2185 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2186 sTreeSampleSelection.single_button = button;
2188 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
2190 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2191 sTreeSampleSelection.browse_button = button;
2193 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
2195 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2196 sTreeSampleSelection.multiple_button = button;
2198 sTreeSampleSelection.selection_mode_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
2200 /* create option mode frame */
2201 frame = gtk_frame_new("Options");
2202 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
2204 box4 = gtk_vbox_new(FALSE, 0);
2205 gtk_container_add(GTK_CONTAINER(frame), box4);
2206 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
2208 /* create check button */
2209 button = gtk_check_button_new_with_label("Draw line");
2210 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2211 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
2212 sTreeSampleSelection.draw_line_button = button;
2214 button = gtk_check_button_new_with_label("View Line mode");
2215 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2216 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
2217 sTreeSampleSelection.view_line_button = button;
2219 button = gtk_check_button_new_with_label("Without Root item");
2220 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2221 sTreeSampleSelection.no_root_item_button = button;
2223 /* create recursion parameter */
2224 frame = gtk_frame_new("Size Parameters");
2225 gtk_box_pack_start(GTK_BOX(box2), frame, TRUE, TRUE, 0);
2227 box4 = gtk_hbox_new(FALSE, 5);
2228 gtk_container_add(GTK_CONTAINER(frame), box4);
2229 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
2231 /* create number of item spin button */
2232 box5 = gtk_hbox_new(FALSE, 5);
2233 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
2235 label = gtk_label_new("Number of items : ");
2236 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2237 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
2239 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_NUMBER_OF_ITEM, 1.0, 255.0, 1.0,
2241 spinner = gtk_spin_button_new (adj, 0, 0);
2242 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
2243 sTreeSampleSelection.nb_item_spinner = spinner;
2245 /* create recursion level spin button */
2246 box5 = gtk_hbox_new(FALSE, 5);
2247 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
2249 label = gtk_label_new("Depth : ");
2250 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2251 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
2253 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_RECURSION_LEVEL, 0.0, 255.0, 1.0,
2255 spinner = gtk_spin_button_new (adj, 0, 0);
2256 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
2257 sTreeSampleSelection.recursion_spinner = spinner;
2259 /* create horizontal separator */
2260 separator = gtk_hseparator_new();
2261 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
2263 /* create bottom button box */
2264 box2 = gtk_hbox_new(TRUE, 10);
2265 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
2266 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2268 button = gtk_button_new_with_label("Create Tree");
2269 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2270 g_signal_connect (button, "clicked",
2271 G_CALLBACK (cb_create_tree), NULL);
2273 button = gtk_button_new_with_label("Close");
2274 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2275 g_signal_connect_swapped (button, "clicked",
2276 G_CALLBACK (gtk_widget_destroy),
2279 if (!gtk_widget_get_visible (window))
2280 gtk_widget_show_all (window);
2282 gtk_widget_destroy (window);
2288 #define GRID_SIZE 20
2289 #define DEFAULT_GEOMETRY "10x10"
2292 gridded_geometry_expose (GtkWidget *widget,
2293 GdkEventExpose *event)
2297 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
2298 0, 0, widget->allocation.width, widget->allocation.height);
2300 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
2301 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
2303 if ((i + j) % 2 == 0)
2304 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
2305 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
2312 gridded_geometry_subresponse (GtkDialog *dialog,
2314 gchar *geometry_string)
2316 if (response_id == GTK_RESPONSE_NONE)
2318 gtk_widget_destroy (GTK_WIDGET (dialog));
2322 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
2324 g_print ("Can't parse geometry string %s\n", geometry_string);
2325 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
2331 gridded_geometry_response (GtkDialog *dialog,
2335 if (response_id == GTK_RESPONSE_NONE)
2337 gtk_widget_destroy (GTK_WIDGET (dialog));
2341 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
2342 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
2344 GtkWidget *drawing_area;
2346 GdkGeometry geometry;
2348 window = gtk_dialog_new_with_buttons (title,
2351 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
2354 gtk_window_set_screen (GTK_WINDOW (window),
2355 gtk_widget_get_screen (GTK_WIDGET (dialog)));
2357 g_signal_connect (window, "response",
2358 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
2360 box = gtk_vbox_new (FALSE, 0);
2361 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), box, TRUE, TRUE, 0);
2363 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
2365 drawing_area = gtk_drawing_area_new ();
2366 g_signal_connect (drawing_area, "expose_event",
2367 G_CALLBACK (gridded_geometry_expose), NULL);
2368 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
2370 /* Gross hack to work around bug 68668... if we set the size request
2371 * large enough, then the current
2373 * request_of_window - request_of_geometry_widget
2375 * method of getting the base size works more or less works.
2377 gtk_widget_set_size_request (drawing_area, 2000, 2000);
2379 geometry.base_width = 0;
2380 geometry.base_height = 0;
2381 geometry.min_width = 2 * GRID_SIZE;
2382 geometry.min_height = 2 * GRID_SIZE;
2383 geometry.width_inc = GRID_SIZE;
2384 geometry.height_inc = GRID_SIZE;
2386 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
2388 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
2390 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
2392 g_print ("Can't parse geometry string %s\n", geometry_string);
2393 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
2396 gtk_widget_show_all (window);
2401 create_gridded_geometry (GtkWidget *widget)
2403 static GtkWidget *window = NULL;
2404 gpointer window_ptr;
2410 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
2413 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
2416 gtk_window_set_screen (GTK_WINDOW (window),
2417 gtk_widget_get_screen (widget));
2419 label = gtk_label_new ("Geometry string:");
2420 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0);
2422 entry = gtk_entry_new ();
2423 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
2424 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), entry, FALSE, FALSE, 0);
2426 g_signal_connect (window, "response",
2427 G_CALLBACK (gridded_geometry_response), entry);
2428 window_ptr = &window;
2429 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
2431 gtk_widget_show_all (window);
2434 gtk_widget_destroy (window);
2442 handle_box_child_signal (GtkHandleBox *hb,
2444 const gchar *action)
2446 printf ("%s: child <%s> %sed\n",
2447 g_type_name (G_OBJECT_TYPE (hb)),
2448 g_type_name (G_OBJECT_TYPE (child)),
2453 create_handle_box (GtkWidget *widget)
2455 static GtkWidget* window = NULL;
2456 GtkWidget *handle_box;
2457 GtkWidget *handle_box2;
2462 GtkWidget *separator;
2466 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2468 gtk_window_set_screen (GTK_WINDOW (window),
2469 gtk_widget_get_screen (widget));
2470 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
2471 gtk_window_set_title (GTK_WINDOW (window),
2473 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2475 g_signal_connect (window, "destroy",
2476 G_CALLBACK (gtk_widget_destroyed),
2479 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
2481 vbox = gtk_vbox_new (FALSE, 0);
2482 gtk_container_add (GTK_CONTAINER (window), vbox);
2483 gtk_widget_show (vbox);
2485 label = gtk_label_new ("Above");
2486 gtk_container_add (GTK_CONTAINER (vbox), label);
2487 gtk_widget_show (label);
2489 separator = gtk_hseparator_new ();
2490 gtk_container_add (GTK_CONTAINER (vbox), separator);
2491 gtk_widget_show (separator);
2493 hbox = gtk_hbox_new (FALSE, 10);
2494 gtk_container_add (GTK_CONTAINER (vbox), hbox);
2495 gtk_widget_show (hbox);
2497 separator = gtk_hseparator_new ();
2498 gtk_container_add (GTK_CONTAINER (vbox), separator);
2499 gtk_widget_show (separator);
2501 label = gtk_label_new ("Below");
2502 gtk_container_add (GTK_CONTAINER (vbox), label);
2503 gtk_widget_show (label);
2505 handle_box = gtk_handle_box_new ();
2506 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2507 g_signal_connect (handle_box,
2509 G_CALLBACK (handle_box_child_signal),
2511 g_signal_connect (handle_box,
2513 G_CALLBACK (handle_box_child_signal),
2515 gtk_widget_show (handle_box);
2517 toolbar = make_toolbar (window);
2519 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2520 gtk_widget_show (toolbar);
2522 handle_box = gtk_handle_box_new ();
2523 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2524 g_signal_connect (handle_box,
2526 G_CALLBACK (handle_box_child_signal),
2528 g_signal_connect (handle_box,
2530 G_CALLBACK (handle_box_child_signal),
2532 gtk_widget_show (handle_box);
2534 handle_box2 = gtk_handle_box_new ();
2535 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2536 g_signal_connect (handle_box2,
2538 G_CALLBACK (handle_box_child_signal),
2540 g_signal_connect (handle_box2,
2542 G_CALLBACK (handle_box_child_signal),
2544 gtk_widget_show (handle_box2);
2546 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
2547 label = gtk_label_new ("Fooo!");
2548 gtk_container_add (GTK_CONTAINER (hbox), label);
2549 gtk_widget_show (label);
2550 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
2553 if (!gtk_widget_get_visible (window))
2554 gtk_widget_show (window);
2556 gtk_widget_destroy (window);
2560 * Test for getting an image from a drawable
2571 take_snapshot (GtkWidget *button,
2574 struct GetImageData *gid = data;
2575 GdkRectangle visible;
2577 int height_fraction;
2580 GdkColor color = { 0, 30000, 0, 0 };
2581 GdkRectangle target;
2584 /* Do some begin_paint_rect on some random rects, draw some
2585 * distinctive stuff into those rects, then take the snapshot.
2586 * figure out whether any rects were overlapped and report to
2590 visible = gid->sw->allocation;
2592 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2593 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2595 width_fraction = visible.width / 4;
2596 height_fraction = visible.height / 4;
2598 gc = gdk_gc_new (gid->src->window);
2599 black_gc = gid->src->style->black_gc;
2601 gdk_gc_set_rgb_fg_color (gc, &color);
2604 target.x = visible.x + width_fraction;
2605 target.y = visible.y + height_fraction * 3;
2606 target.width = width_fraction;
2607 target.height = height_fraction / 2;
2609 gdk_window_begin_paint_rect (gid->src->window,
2612 gdk_draw_rectangle (gid->src->window,
2616 target.width, target.height);
2618 gdk_draw_rectangle (gid->src->window,
2621 target.x + 10, target.y + 10,
2622 target.width - 20, target.height - 20);
2624 target.x = visible.x + width_fraction;
2625 target.y = visible.y + height_fraction;
2626 target.width = width_fraction;
2627 target.height = height_fraction;
2629 gdk_window_begin_paint_rect (gid->src->window,
2632 gdk_draw_rectangle (gid->src->window,
2636 target.width, target.height);
2638 gdk_draw_rectangle (gid->src->window,
2641 target.x + 10, target.y + 10,
2642 target.width - 20, target.height - 20);
2644 target.x = visible.x + width_fraction * 3;
2645 target.y = visible.y + height_fraction;
2646 target.width = width_fraction / 2;
2647 target.height = height_fraction;
2649 gdk_window_begin_paint_rect (gid->src->window,
2652 gdk_draw_rectangle (gid->src->window,
2656 target.width, target.height);
2658 gdk_draw_rectangle (gid->src->window,
2661 target.x + 10, target.y + 10,
2662 target.width - 20, target.height - 20);
2664 target.x = visible.x + width_fraction * 2;
2665 target.y = visible.y + height_fraction * 2;
2666 target.width = width_fraction / 4;
2667 target.height = height_fraction / 4;
2669 gdk_window_begin_paint_rect (gid->src->window,
2672 gdk_draw_rectangle (gid->src->window,
2676 target.width, target.height);
2678 gdk_draw_rectangle (gid->src->window,
2681 target.x + 10, target.y + 10,
2682 target.width - 20, target.height - 20);
2684 target.x += target.width / 2;
2685 target.y += target.width / 2;
2687 gdk_window_begin_paint_rect (gid->src->window,
2690 gdk_draw_rectangle (gid->src->window,
2694 target.width, target.height);
2696 gdk_draw_rectangle (gid->src->window,
2699 target.x + 10, target.y + 10,
2700 target.width - 20, target.height - 20);
2702 /* Screen shot area */
2704 target.x = visible.x + width_fraction * 1.5;
2705 target.y = visible.y + height_fraction * 1.5;
2706 target.width = width_fraction * 2;
2707 target.height = height_fraction * 2;
2709 shot = gdk_drawable_get_image (gid->src->window,
2711 target.width, target.height);
2713 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2716 g_object_unref (shot);
2718 gdk_window_end_paint (gid->src->window);
2719 gdk_window_end_paint (gid->src->window);
2720 gdk_window_end_paint (gid->src->window);
2721 gdk_window_end_paint (gid->src->window);
2722 gdk_window_end_paint (gid->src->window);
2724 gdk_draw_rectangle (gid->src->window,
2725 gid->src->style->black_gc,
2728 target.width, target.height);
2730 g_object_unref (gc);
2734 image_source_expose (GtkWidget *da,
2735 GdkEventExpose *event,
2738 int x = event->area.x;
2739 GdkColor red = { 0, 65535, 0, 0 };
2740 GdkColor green = { 0, 0, 65535, 0 };
2741 GdkColor blue = { 0, 0, 0, 65535 };
2744 gc = gdk_gc_new (event->window);
2746 while (x < (event->area.x + event->area.width))
2753 gdk_gc_set_rgb_fg_color (gc, &red);
2759 gdk_gc_set_rgb_fg_color (gc, &green);
2765 gdk_gc_set_rgb_fg_color (gc, &blue);
2769 g_assert_not_reached ();
2773 gdk_draw_line (event->window,
2776 x, event->area.y + event->area.height);
2781 g_object_unref (gc);
2787 create_get_image (GtkWidget *widget)
2789 static GtkWidget *window = NULL;
2792 gtk_widget_destroy (window);
2801 struct GetImageData *gid;
2803 gid = g_new (struct GetImageData, 1);
2805 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2807 gtk_window_set_screen (GTK_WINDOW (window),
2808 gtk_widget_get_screen (widget));
2810 g_signal_connect (window,
2812 G_CALLBACK (gtk_widget_destroyed),
2815 g_object_set_data_full (G_OBJECT (window),
2816 "testgtk-get-image-data",
2820 hbox = gtk_hbox_new (FALSE, 0);
2822 gtk_container_add (GTK_CONTAINER (window), hbox);
2824 sw = gtk_scrolled_window_new (NULL, NULL);
2825 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2826 GTK_POLICY_AUTOMATIC,
2827 GTK_POLICY_AUTOMATIC);
2831 gtk_widget_set_size_request (sw, 400, 400);
2833 src = gtk_drawing_area_new ();
2834 gtk_widget_set_size_request (src, 10000, 10000);
2836 g_signal_connect (src,
2838 G_CALLBACK (image_source_expose),
2843 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2846 gtk_box_pack_start (GTK_BOX (hbox),
2850 vbox = gtk_vbox_new (FALSE, 3);
2852 snap = g_object_new (GTK_TYPE_IMAGE, NULL);
2856 sw = gtk_scrolled_window_new (NULL, NULL);
2857 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2858 GTK_POLICY_AUTOMATIC,
2859 GTK_POLICY_AUTOMATIC);
2860 gtk_widget_set_size_request (sw, 300, 300);
2862 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2864 gtk_box_pack_end (GTK_BOX (vbox), sw, FALSE, FALSE, 5);
2866 button = gtk_button_new_with_label ("Get image from drawable");
2868 g_signal_connect (button,
2870 G_CALLBACK (take_snapshot),
2873 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2875 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2877 gtk_widget_show_all (window);
2885 sensitivity_toggled (GtkWidget *toggle,
2888 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2892 create_sensitivity_control (GtkWidget *widget)
2896 button = gtk_toggle_button_new_with_label ("Sensitive");
2898 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2899 gtk_widget_is_sensitive (widget));
2901 g_signal_connect (button,
2903 G_CALLBACK (sensitivity_toggled),
2906 gtk_widget_show_all (button);
2912 set_selectable_recursive (GtkWidget *widget,
2915 if (GTK_IS_CONTAINER (widget))
2920 children = gtk_container_get_children (GTK_CONTAINER (widget));
2924 set_selectable_recursive (tmp->data, setting);
2928 g_list_free (children);
2930 else if (GTK_IS_LABEL (widget))
2932 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2937 selectable_toggled (GtkWidget *toggle,
2940 set_selectable_recursive (widget,
2941 GTK_TOGGLE_BUTTON (toggle)->active);
2945 create_selectable_control (GtkWidget *widget)
2949 button = gtk_toggle_button_new_with_label ("Selectable");
2951 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2954 g_signal_connect (button,
2956 G_CALLBACK (selectable_toggled),
2959 gtk_widget_show_all (button);
2965 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
2969 gtk_widget_destroy (dialog);
2971 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2972 "as hyperlinks, which can be clicked\n"
2973 "or activated via <a href=\"keynav\">keynav</a>.\n"
2974 "The links remain the same.";
2975 gtk_label_set_markup (label, text);
2979 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
2981 if (g_strcmp0 (uri, "keynav") == 0)
2985 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
2986 GTK_DIALOG_DESTROY_WITH_PARENT,
2989 "The term <i>keynav</i> is a shorthand for "
2990 "keyboard navigation and refers to the process of using a program "
2991 "(exclusively) via keyboard input.");
2993 gtk_window_present (GTK_WINDOW (dialog));
2995 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
3003 void create_labels (GtkWidget *widget)
3005 static GtkWidget *window = NULL;
3014 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3016 gtk_window_set_screen (GTK_WINDOW (window),
3017 gtk_widget_get_screen (widget));
3019 g_signal_connect (window, "destroy",
3020 G_CALLBACK (gtk_widget_destroyed),
3023 gtk_window_set_title (GTK_WINDOW (window), "Label");
3025 vbox = gtk_vbox_new (FALSE, 5);
3027 hbox = gtk_hbox_new (FALSE, 5);
3028 gtk_container_add (GTK_CONTAINER (window), vbox);
3030 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3032 button = create_sensitivity_control (hbox);
3034 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3036 button = create_selectable_control (hbox);
3038 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3040 vbox = gtk_vbox_new (FALSE, 5);
3042 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3043 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
3045 frame = gtk_frame_new ("Normal Label");
3046 label = gtk_label_new ("This is a Normal label");
3047 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
3048 gtk_container_add (GTK_CONTAINER (frame), label);
3049 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3051 frame = gtk_frame_new ("Multi-line Label");
3052 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
3053 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
3054 gtk_container_add (GTK_CONTAINER (frame), label);
3055 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3057 frame = gtk_frame_new ("Left Justified Label");
3058 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
3059 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
3060 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3061 gtk_container_add (GTK_CONTAINER (frame), label);
3062 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3064 frame = gtk_frame_new ("Right Justified Label");
3065 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
3066 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
3067 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
3068 gtk_container_add (GTK_CONTAINER (frame), label);
3069 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3071 frame = gtk_frame_new ("Internationalized Label");
3072 label = gtk_label_new (NULL);
3073 gtk_label_set_markup (GTK_LABEL (label),
3074 "French (Fran\303\247ais) Bonjour, Salut\n"
3075 "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"
3076 "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"
3077 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
3078 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
3079 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
3080 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3081 gtk_container_add (GTK_CONTAINER (frame), label);
3082 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3084 frame = gtk_frame_new ("Bidirection Label");
3085 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"
3086 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
3087 gtk_container_add (GTK_CONTAINER (frame), label);
3088 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3090 frame = gtk_frame_new ("Links in a label");
3091 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
3092 "as hyperlinks, which can be clicked\n"
3093 "or activated via <a href=\"keynav\">keynav</a>");
3094 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
3095 gtk_container_add (GTK_CONTAINER (frame), label);
3096 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3097 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
3099 vbox = gtk_vbox_new (FALSE, 5);
3100 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3101 frame = gtk_frame_new ("Line wrapped label");
3102 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
3103 "up the entire "/* big space to test spacing */\
3104 "width allocated to it, but automatically wraps the words to fit. "\
3105 "The time has come, for all good men, to come to the aid of their party. "\
3106 "The sixth sheik's six sheep's sick.\n"\
3107 " It supports multiple paragraphs correctly, and correctly adds "\
3108 "many extra spaces. ");
3110 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
3111 gtk_container_add (GTK_CONTAINER (frame), label);
3112 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3114 frame = gtk_frame_new ("Filled, wrapped label");
3115 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
3116 "up the entire width allocated to it. Here is a seneance to prove "\
3117 "my point. Here is another sentence. "\
3118 "Here comes the sun, do de do de do.\n"\
3119 " This is a new paragraph.\n"\
3120 " This is another newer, longer, better paragraph. It is coming to an end, "\
3122 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
3123 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
3124 gtk_container_add (GTK_CONTAINER (frame), label);
3125 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3127 frame = gtk_frame_new ("Underlined label");
3128 label = gtk_label_new ("This label is underlined!\n"
3129 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
3130 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3131 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
3132 gtk_container_add (GTK_CONTAINER (frame), label);
3133 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3135 frame = gtk_frame_new ("Markup label");
3136 label = gtk_label_new (NULL);
3138 /* There's also a gtk_label_set_markup() without accel if you
3139 * don't have an accelerator key
3141 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
3142 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
3143 "<b>markup</b> _such as "
3144 "<big><i>Big Italics</i></big>\n"
3145 "<tt>Monospace font</tt>\n"
3146 "<u>Underline!</u>\n"
3148 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
3149 "and nothing on this line,\n"
3152 "or even on this one\n"
3153 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
3154 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
3155 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
3157 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
3159 gtk_container_add (GTK_CONTAINER (frame), label);
3160 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3163 if (!gtk_widget_get_visible (window))
3164 gtk_widget_show_all (window);
3166 gtk_widget_destroy (window);
3170 on_angle_scale_changed (GtkRange *range,
3173 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
3177 create_rotated_label (GtkWidget *widget)
3179 static GtkWidget *window = NULL;
3183 GtkWidget *scale_label;
3184 GtkWidget *scale_hbox;
3188 window = gtk_dialog_new_with_buttons ("Rotated Label",
3189 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
3190 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3193 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3195 gtk_window_set_screen (GTK_WINDOW (window),
3196 gtk_widget_get_screen (widget));
3198 g_signal_connect (window, "response",
3199 G_CALLBACK (gtk_object_destroy), NULL);
3200 g_signal_connect (window, "destroy",
3201 G_CALLBACK (gtk_widget_destroyed), &window);
3203 vbox = gtk_vbox_new (FALSE, 5);
3204 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0);
3205 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
3207 label = gtk_label_new (NULL);
3208 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
3209 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
3211 scale_hbox = gtk_hbox_new (FALSE, 0);
3212 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
3214 scale_label = gtk_label_new (NULL);
3215 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
3216 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
3218 hscale = gtk_hscale_new_with_range (0, 360, 5);
3219 g_signal_connect (hscale, "value-changed",
3220 G_CALLBACK (on_angle_scale_changed), label);
3222 gtk_range_set_value (GTK_RANGE (hscale), 45);
3223 gtk_widget_set_usize (hscale, 200, -1);
3224 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
3227 if (!gtk_widget_get_visible (window))
3228 gtk_widget_show_all (window);
3230 gtk_widget_destroy (window);
3233 #define DEFAULT_TEXT_RADIUS 200
3236 on_rotated_text_unrealize (GtkWidget *widget)
3238 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
3242 on_rotated_text_expose (GtkWidget *widget,
3243 GdkEventExpose *event,
3244 GdkPixbuf *tile_pixbuf)
3246 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
3247 "had", "10,000", "men" };
3248 PangoRenderer *renderer;
3253 PangoMatrix matrix = PANGO_MATRIX_INIT;
3254 PangoLayout *layout;
3255 PangoContext *context;
3256 PangoFontDescription *desc;
3258 gc = g_object_get_data (G_OBJECT (widget), "text-gc");
3261 static GdkColor black = { 0, 0, 0, 0 };
3263 gc = gdk_gc_new (widget->window);
3264 gdk_gc_set_rgb_fg_color (gc, &black);
3270 gint width = gdk_pixbuf_get_width (tile_pixbuf);
3271 gint height = gdk_pixbuf_get_height (tile_pixbuf);
3273 tile = gdk_pixmap_new (widget->window, width, height, -1);
3274 gdk_draw_pixbuf (tile, gc, tile_pixbuf,
3275 0, 0, 0, 0, width, height,
3276 GDK_RGB_DITHER_NORMAL, 0, 0);
3278 gdk_gc_set_tile (gc, tile);
3279 gdk_gc_set_fill (gc, GDK_TILED);
3281 g_object_unref (tile);
3284 g_object_set_data_full (G_OBJECT (widget), "text-gc", gc, (GDestroyNotify)g_object_unref);
3287 renderer = gdk_pango_renderer_get_default (gtk_widget_get_screen (widget));
3288 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), widget->window);
3289 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), gc);
3291 radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
3293 pango_matrix_translate (&matrix,
3294 radius + (widget->allocation.width - 2 * radius) / 2,
3295 radius + (widget->allocation.height - 2 * radius) / 2);
3296 pango_matrix_scale (&matrix, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
3298 context = gtk_widget_get_pango_context (widget);
3299 layout = pango_layout_new (context);
3300 desc = pango_font_description_from_string ("Sans Bold 30");
3301 pango_layout_set_font_description (layout, desc);
3302 pango_font_description_free (desc);
3304 n_words = G_N_ELEMENTS (words);
3305 for (i = 0; i < n_words; i++)
3307 PangoMatrix rotated_matrix = matrix;
3310 pango_matrix_rotate (&rotated_matrix, - (360. * i) / n_words);
3312 pango_context_set_matrix (context, &rotated_matrix);
3313 pango_layout_context_changed (layout);
3314 pango_layout_set_text (layout, words[i], -1);
3316 pango_layout_get_size (layout, &width, &height);
3318 pango_renderer_draw_layout (renderer, layout,
3319 - width / 2, - DEFAULT_TEXT_RADIUS * PANGO_SCALE);
3322 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL);
3323 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL);
3325 g_object_unref (layout);
3331 create_rotated_text (GtkWidget *widget)
3333 static GtkWidget *window = NULL;
3337 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
3338 GtkRequisition requisition;
3339 GtkWidget *drawing_area;
3340 GdkPixbuf *tile_pixbuf;
3342 window = gtk_dialog_new_with_buttons ("Rotated Text",
3343 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
3344 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3347 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3349 gtk_window_set_screen (GTK_WINDOW (window),
3350 gtk_widget_get_screen (widget));
3352 g_signal_connect (window, "response",
3353 G_CALLBACK (gtk_object_destroy), NULL);
3354 g_signal_connect (window, "destroy",
3355 G_CALLBACK (gtk_widget_destroyed), &window);
3357 drawing_area = gtk_drawing_area_new ();
3358 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), drawing_area, TRUE, TRUE, 0);
3359 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
3361 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
3363 g_signal_connect (drawing_area, "expose-event",
3364 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
3365 g_signal_connect (drawing_area, "unrealize",
3366 G_CALLBACK (on_rotated_text_unrealize), NULL);
3368 gtk_widget_show_all (GTK_BIN (window)->child);
3370 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
3371 gtk_widget_size_request (window, &requisition);
3372 gtk_widget_set_size_request (drawing_area, -1, -1);
3373 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
3376 if (!gtk_widget_get_visible (window))
3377 gtk_widget_show (window);
3379 gtk_widget_destroy (window);
3387 reparent_label (GtkWidget *widget,
3388 GtkWidget *new_parent)
3392 label = g_object_get_data (G_OBJECT (widget), "user_data");
3394 gtk_widget_reparent (label, new_parent);
3398 set_parent_signal (GtkWidget *child,
3399 GtkWidget *old_parent,
3402 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
3403 g_type_name (G_OBJECT_TYPE (child)),
3404 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
3405 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
3406 GPOINTER_TO_INT (func_data));
3410 create_reparent (GtkWidget *widget)
3412 static GtkWidget *window = NULL;
3419 GtkWidget *separator;
3420 GtkWidget *event_box;
3424 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3426 gtk_window_set_screen (GTK_WINDOW (window),
3427 gtk_widget_get_screen (widget));
3429 g_signal_connect (window, "destroy",
3430 G_CALLBACK (gtk_widget_destroyed),
3433 gtk_window_set_title (GTK_WINDOW (window), "reparent");
3434 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3436 box1 = gtk_vbox_new (FALSE, 0);
3437 gtk_container_add (GTK_CONTAINER (window), box1);
3439 box2 = gtk_hbox_new (FALSE, 5);
3440 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3441 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3443 label = gtk_label_new ("Hello World");
3445 frame = gtk_frame_new ("Frame 1");
3446 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
3448 box3 = gtk_vbox_new (FALSE, 5);
3449 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
3450 gtk_container_add (GTK_CONTAINER (frame), box3);
3452 button = gtk_button_new_with_label ("switch");
3453 g_object_set_data (G_OBJECT (button), "user_data", label);
3454 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
3456 event_box = gtk_event_box_new ();
3457 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
3458 gtk_container_add (GTK_CONTAINER (event_box), label);
3460 g_signal_connect (button, "clicked",
3461 G_CALLBACK (reparent_label),
3464 g_signal_connect (label, "parent_set",
3465 G_CALLBACK (set_parent_signal),
3466 GINT_TO_POINTER (42));
3468 frame = gtk_frame_new ("Frame 2");
3469 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
3471 box3 = gtk_vbox_new (FALSE, 5);
3472 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
3473 gtk_container_add (GTK_CONTAINER (frame), box3);
3475 button = gtk_button_new_with_label ("switch");
3476 g_object_set_data (G_OBJECT (button), "user_data", label);
3477 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
3479 event_box = gtk_event_box_new ();
3480 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
3482 g_signal_connect (button, "clicked",
3483 G_CALLBACK (reparent_label),
3486 separator = gtk_hseparator_new ();
3487 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3489 box2 = gtk_vbox_new (FALSE, 10);
3490 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3491 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3493 button = gtk_button_new_with_label ("close");
3494 g_signal_connect_swapped (button, "clicked",
3495 G_CALLBACK (gtk_widget_destroy), window);
3496 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3497 gtk_widget_set_can_default (button, TRUE);
3498 gtk_widget_grab_default (button);
3501 if (!gtk_widget_get_visible (window))
3502 gtk_widget_show_all (window);
3504 gtk_widget_destroy (window);
3511 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
3513 if (event->type == GDK_BUTTON_PRESS)
3515 if (event->button == 1)
3516 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
3517 event->button, event->x_root, event->y_root,
3519 else if (event->button == 2)
3520 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
3521 event->button, event->x_root, event->y_root,
3528 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
3530 gtk_paint_resize_grip (area->style,
3532 gtk_widget_get_state (area),
3538 area->allocation.width,
3539 area->allocation.height);
3545 create_resize_grips (GtkWidget *widget)
3547 static GtkWidget *window = NULL;
3549 GtkWidget *hbox, *vbox;
3552 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3554 gtk_window_set_screen (GTK_WINDOW (window),
3555 gtk_widget_get_screen (widget));
3557 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
3559 g_signal_connect (window, "destroy",
3560 G_CALLBACK (gtk_widget_destroyed),
3563 vbox = gtk_vbox_new (FALSE, 0);
3564 gtk_container_add (GTK_CONTAINER (window), vbox);
3566 hbox = gtk_hbox_new (FALSE, 0);
3567 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3570 area = gtk_drawing_area_new ();
3571 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3572 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3573 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3574 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3575 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3576 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3579 area = gtk_drawing_area_new ();
3580 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3581 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3582 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3583 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3584 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3585 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3588 area = gtk_drawing_area_new ();
3589 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3590 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3591 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3592 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3593 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3594 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3596 hbox = gtk_hbox_new (FALSE, 0);
3597 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3600 area = gtk_drawing_area_new ();
3601 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3602 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3603 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3604 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3605 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3606 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3609 area = gtk_drawing_area_new ();
3610 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3613 area = gtk_drawing_area_new ();
3614 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3615 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3616 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3617 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3618 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3619 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3622 hbox = gtk_hbox_new (FALSE, 0);
3623 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3626 area = gtk_drawing_area_new ();
3627 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3628 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3629 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3630 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3631 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3632 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3634 area = gtk_drawing_area_new ();
3635 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3636 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3637 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3638 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3639 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3640 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3643 area = gtk_drawing_area_new ();
3644 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3645 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3646 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3647 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3648 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3649 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3652 if (!gtk_widget_get_visible (window))
3653 gtk_widget_show_all (window);
3655 gtk_widget_destroy (window);
3661 gint upositionx = 0;
3662 gint upositiony = 0;
3665 uposition_configure (GtkWidget *window)
3671 lx = g_object_get_data (G_OBJECT (window), "x");
3672 ly = g_object_get_data (G_OBJECT (window), "y");
3674 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
3675 sprintf (buffer, "%d", upositionx);
3676 gtk_label_set_text (lx, buffer);
3677 sprintf (buffer, "%d", upositiony);
3678 gtk_label_set_text (ly, buffer);
3684 uposition_stop_configure (GtkToggleButton *toggle,
3688 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
3690 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
3694 create_saved_position (GtkWidget *widget)
3696 static GtkWidget *window = NULL;
3701 GtkWidget *main_vbox;
3709 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
3710 "type", GTK_WINDOW_TOPLEVEL,
3711 "title", "Saved Position",
3713 "signal::configure_event", uposition_configure, NULL,
3716 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3718 gtk_window_set_screen (GTK_WINDOW (window),
3719 gtk_widget_get_screen (widget));
3722 g_signal_connect (window, "destroy",
3723 G_CALLBACK (gtk_widget_destroyed),
3726 main_vbox = gtk_vbox_new (FALSE, 5);
3727 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3728 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3731 g_object_new (gtk_vbox_get_type (),
3732 "GtkBox::homogeneous", FALSE,
3733 "GtkBox::spacing", 5,
3734 "GtkContainer::border_width", 10,
3735 "GtkWidget::parent", main_vbox,
3736 "GtkWidget::visible", TRUE,
3737 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
3738 "label", "Stop Events",
3742 "signal::clicked", uposition_stop_configure, window,
3746 hbox = gtk_hbox_new (FALSE, 0);
3747 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3748 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3750 label = gtk_label_new ("X Origin : ");
3751 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3752 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3754 x_label = gtk_label_new ("");
3755 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3756 g_object_set_data (G_OBJECT (window), "x", x_label);
3758 hbox = gtk_hbox_new (FALSE, 0);
3759 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3760 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3762 label = gtk_label_new ("Y Origin : ");
3763 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3764 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3766 y_label = gtk_label_new ("");
3767 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3768 g_object_set_data (G_OBJECT (window), "y", y_label);
3771 g_object_new (gtk_hseparator_get_type (),
3772 "GtkWidget::visible", TRUE,
3774 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3776 hbox = gtk_hbox_new (FALSE, 0);
3777 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3778 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3780 button = gtk_button_new_with_label ("Close");
3781 g_signal_connect_swapped (button, "clicked",
3782 G_CALLBACK (gtk_widget_destroy),
3784 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3785 gtk_widget_set_can_default (button, TRUE);
3786 gtk_widget_grab_default (button);
3788 gtk_widget_show_all (window);
3791 gtk_widget_destroy (window);
3799 create_pixmap (GtkWidget *widget)
3801 static GtkWidget *window = NULL;
3807 GtkWidget *separator;
3808 GtkWidget *pixmapwid;
3812 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3814 gtk_window_set_screen (GTK_WINDOW (window),
3815 gtk_widget_get_screen (widget));
3817 g_signal_connect (window, "destroy",
3818 G_CALLBACK (gtk_widget_destroyed),
3821 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3822 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3823 gtk_widget_realize(window);
3825 box1 = gtk_vbox_new (FALSE, 0);
3826 gtk_container_add (GTK_CONTAINER (window), box1);
3828 box2 = gtk_vbox_new (FALSE, 10);
3829 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3830 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3832 button = gtk_button_new ();
3833 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3835 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3837 label = gtk_label_new ("Pixmap\ntest");
3838 box3 = gtk_hbox_new (FALSE, 0);
3839 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3840 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3841 gtk_container_add (GTK_CONTAINER (box3), label);
3842 gtk_container_add (GTK_CONTAINER (button), box3);
3844 button = gtk_button_new ();
3845 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3847 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3849 label = gtk_label_new ("Pixmap\ntest");
3850 box3 = gtk_hbox_new (FALSE, 0);
3851 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3852 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3853 gtk_container_add (GTK_CONTAINER (box3), label);
3854 gtk_container_add (GTK_CONTAINER (button), box3);
3856 gtk_widget_set_sensitive (button, FALSE);
3858 separator = gtk_hseparator_new ();
3859 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3861 box2 = gtk_vbox_new (FALSE, 10);
3862 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3863 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3865 button = gtk_button_new_with_label ("close");
3866 g_signal_connect_swapped (button, "clicked",
3867 G_CALLBACK (gtk_widget_destroy),
3869 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3870 gtk_widget_set_can_default (button, TRUE);
3871 gtk_widget_grab_default (button);
3874 if (!gtk_widget_get_visible (window))
3875 gtk_widget_show_all (window);
3877 gtk_widget_destroy (window);
3881 tips_query_widget_entered (GtkTipsQuery *tips_query,
3883 const gchar *tip_text,
3884 const gchar *tip_private,
3887 if (GTK_TOGGLE_BUTTON (toggle)->active)
3889 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3890 /* don't let GtkTipsQuery reset its label */
3891 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3896 tips_query_widget_selected (GtkWidget *tips_query,
3898 const gchar *tip_text,
3899 const gchar *tip_private,
3900 GdkEventButton *event,
3904 g_print ("Help \"%s\" requested for <%s>\n",
3905 tip_private ? tip_private : "None",
3906 g_type_name (G_OBJECT_TYPE (widget)));
3911 create_tooltips (GtkWidget *widget)
3913 static GtkWidget *window = NULL;
3920 GtkWidget *tips_query;
3921 GtkWidget *separator;
3922 GtkTooltips *tooltips;
3927 g_object_new (gtk_window_get_type (),
3928 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3929 "GtkContainer::border_width", 0,
3930 "GtkWindow::title", "Tooltips",
3931 "GtkWindow::allow_shrink", TRUE,
3932 "GtkWindow::allow_grow", FALSE,
3935 gtk_window_set_screen (GTK_WINDOW (window),
3936 gtk_widget_get_screen (widget));
3938 g_signal_connect (window, "destroy",
3939 G_CALLBACK (destroy_tooltips),
3942 tooltips=gtk_tooltips_new();
3943 g_object_ref (tooltips);
3944 gtk_object_sink (GTK_OBJECT (tooltips));
3945 g_object_set_data (G_OBJECT (window), "tooltips", tooltips);
3947 box1 = gtk_vbox_new (FALSE, 0);
3948 gtk_container_add (GTK_CONTAINER (window), box1);
3950 box2 = gtk_vbox_new (FALSE, 10);
3951 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3952 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3954 button = gtk_toggle_button_new_with_label ("button1");
3955 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3957 gtk_tooltips_set_tip (tooltips,
3960 "ContextHelp/buttons/1");
3962 button = gtk_toggle_button_new_with_label ("button2");
3963 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3965 gtk_tooltips_set_tip (tooltips,
3967 "This is button 2. This is also a really long tooltip which probably won't fit on a single line and will therefore need to be wrapped. Hopefully the wrapping will work correctly.",
3968 "ContextHelp/buttons/2_long");
3970 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3971 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3973 gtk_tooltips_set_tip (tooltips,
3975 "Toggle TipsQuery view.",
3979 g_object_new (gtk_vbox_get_type (),
3980 "homogeneous", FALSE,
3986 tips_query = gtk_tips_query_new ();
3989 g_object_new (gtk_button_get_type (),
3994 g_object_connect (button,
3995 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3997 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3998 gtk_tooltips_set_tip (tooltips,
4000 "Start the Tooltips Inspector",
4001 "ContextHelp/buttons/?");
4004 g_object_set (g_object_connect (tips_query,
4005 "signal::widget_entered", tips_query_widget_entered, toggle,
4006 "signal::widget_selected", tips_query_widget_selected, NULL,
4013 frame = g_object_new (gtk_frame_get_type (),
4014 "label", "ToolTips Inspector",
4015 "label_xalign", (double) 0.5,
4021 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
4023 separator = gtk_hseparator_new ();
4024 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4026 box2 = gtk_vbox_new (FALSE, 10);
4027 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4028 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4030 button = gtk_button_new_with_label ("close");
4031 g_signal_connect_swapped (button, "clicked",
4032 G_CALLBACK (gtk_widget_destroy),
4034 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4035 gtk_widget_set_can_default (button, TRUE);
4036 gtk_widget_grab_default (button);
4038 gtk_tooltips_set_tip (tooltips, button, "Push this button to close window", "ContextHelp/buttons/Close");
4041 if (!gtk_widget_get_visible (window))
4042 gtk_widget_show_all (window);
4044 gtk_widget_destroy (window);
4052 pack_image (GtkWidget *box,
4056 gtk_box_pack_start (GTK_BOX (box),
4057 gtk_label_new (text),
4060 gtk_box_pack_start (GTK_BOX (box),
4066 create_image (GtkWidget *widget)
4068 static GtkWidget *window = NULL;
4076 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4078 gtk_window_set_screen (GTK_WINDOW (window),
4079 gtk_widget_get_screen (widget));
4081 /* this is bogus for testing drawing when allocation < request,
4082 * don't copy into real code
4084 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
4086 g_signal_connect (window, "destroy",
4087 G_CALLBACK (gtk_widget_destroyed),
4090 vbox = gtk_vbox_new (FALSE, 5);
4092 gtk_container_add (GTK_CONTAINER (window), vbox);
4094 pack_image (vbox, "Stock Warning Dialog",
4095 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
4096 GTK_ICON_SIZE_DIALOG));
4098 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
4099 gtk_widget_get_colormap (window),
4104 pack_image (vbox, "Pixmap",
4105 gtk_image_new_from_pixmap (pixmap, mask));
4108 if (!gtk_widget_get_visible (window))
4109 gtk_widget_show_all (window);
4111 gtk_widget_destroy (window);
4119 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
4122 GtkWidget *menuitem;
4131 menu = gtk_menu_new ();
4132 gtk_menu_set_screen (GTK_MENU (menu), screen);
4138 menuitem = gtk_tearoff_menu_item_new ();
4139 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4140 gtk_widget_show (menuitem);
4143 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
4144 GTK_ICON_SIZE_MENU);
4145 gtk_widget_show (image);
4146 menuitem = gtk_image_menu_item_new_with_label ("Image item");
4147 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4148 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4149 gtk_widget_show (menuitem);
4151 for (i = 0, j = 1; i < length; i++, j++)
4153 sprintf (buf, "item %2d - %d", depth, j);
4155 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
4156 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
4160 gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
4163 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4164 gtk_widget_show (menuitem);
4166 gtk_widget_set_sensitive (menuitem, FALSE);
4169 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
4173 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
4174 create_menu (screen, depth - 1, 5, TRUE));
4181 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
4184 GtkWidget *menuitem;
4190 menu = gtk_menu_new ();
4191 gtk_menu_set_screen (GTK_MENU (menu), screen);
4196 menuitem = gtk_tearoff_menu_item_new ();
4197 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4198 gtk_widget_show (menuitem);
4202 menuitem = gtk_menu_item_new_with_label ("items");
4203 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4205 submenu = gtk_menu_new ();
4206 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4207 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4208 gtk_widget_show (menuitem);
4211 /* now fill the items submenu */
4212 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4213 GTK_ICON_SIZE_MENU);
4214 gtk_widget_show (image);
4215 menuitem = gtk_image_menu_item_new_with_label ("Image");
4216 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4217 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4218 gtk_widget_show (menuitem);
4220 menuitem = gtk_menu_item_new_with_label ("x");
4221 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
4222 gtk_widget_show (menuitem);
4224 menuitem = gtk_menu_item_new_with_label ("x");
4225 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
4226 gtk_widget_show (menuitem);
4228 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4229 GTK_ICON_SIZE_MENU);
4230 gtk_widget_show (image);
4231 menuitem = gtk_image_menu_item_new_with_label ("Image");
4232 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4233 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4234 gtk_widget_show (menuitem);
4236 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4237 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
4238 gtk_widget_show (menuitem);
4240 menuitem = gtk_menu_item_new_with_label ("x");
4241 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
4242 gtk_widget_show (menuitem);
4244 menuitem = gtk_menu_item_new_with_label ("x");
4245 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
4246 gtk_widget_show (menuitem);
4248 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4249 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
4250 gtk_widget_show (menuitem);
4252 menuitem = gtk_check_menu_item_new_with_label ("Check");
4253 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
4254 gtk_widget_show (menuitem);
4256 menuitem = gtk_menu_item_new_with_label ("x");
4257 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
4258 gtk_widget_show (menuitem);
4260 menuitem = gtk_menu_item_new_with_label ("x");
4261 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
4262 gtk_widget_show (menuitem);
4264 menuitem = gtk_check_menu_item_new_with_label ("Check");
4265 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
4266 gtk_widget_show (menuitem);
4268 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4269 gtk_widget_show (menuitem);
4270 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
4272 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4273 gtk_widget_show (menuitem);
4274 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
4276 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4277 gtk_widget_show (menuitem);
4278 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
4280 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4281 gtk_widget_show (menuitem);
4282 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
4284 /* end of items submenu */
4286 menuitem = gtk_menu_item_new_with_label ("spanning");
4287 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4289 submenu = gtk_menu_new ();
4290 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4291 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4292 gtk_widget_show (menuitem);
4295 /* now fill the spanning submenu */
4296 menuitem = gtk_menu_item_new_with_label ("a");
4297 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
4298 gtk_widget_show (menuitem);
4300 menuitem = gtk_menu_item_new_with_label ("b");
4301 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
4302 gtk_widget_show (menuitem);
4304 menuitem = gtk_menu_item_new_with_label ("c");
4305 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
4306 gtk_widget_show (menuitem);
4308 menuitem = gtk_menu_item_new_with_label ("d");
4309 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4310 gtk_widget_show (menuitem);
4312 menuitem = gtk_menu_item_new_with_label ("e");
4313 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
4314 gtk_widget_show (menuitem);
4315 /* end of spanning submenu */
4317 menuitem = gtk_menu_item_new_with_label ("left");
4318 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
4319 submenu = gtk_menu_new ();
4320 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4321 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4322 gtk_widget_show (menuitem);
4324 menuitem = gtk_menu_item_new_with_label ("Empty");
4325 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4326 submenu = gtk_menu_new ();
4327 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4328 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4329 gtk_widget_show (menuitem);
4331 menuitem = gtk_menu_item_new_with_label ("right");
4332 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
4333 submenu = gtk_menu_new ();
4334 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4335 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4336 gtk_widget_show (menuitem);
4338 menuitem = gtk_menu_item_new_with_label ("Empty");
4339 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4340 gtk_widget_show (menuitem);
4344 for (; j < rows; j++)
4345 for (i = 0; i < cols; i++)
4347 sprintf (buf, "(%d %d)", i, j);
4348 menuitem = gtk_menu_item_new_with_label (buf);
4349 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
4350 gtk_widget_show (menuitem);
4353 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4354 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
4355 gtk_widget_show (menuitem);
4356 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4357 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
4358 gtk_widget_show (menuitem);
4359 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4360 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
4361 gtk_widget_show (menuitem);
4362 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4363 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
4364 gtk_widget_show (menuitem);
4370 create_menus (GtkWidget *widget)
4372 static GtkWidget *window = NULL;
4376 GtkWidget *optionmenu;
4377 GtkWidget *separator;
4383 GtkWidget *menuitem;
4384 GtkAccelGroup *accel_group;
4386 GdkScreen *screen = gtk_widget_get_screen (widget);
4388 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4390 gtk_window_set_screen (GTK_WINDOW (window), screen);
4392 g_signal_connect (window, "destroy",
4393 G_CALLBACK (gtk_widget_destroyed),
4395 g_signal_connect (window, "delete-event",
4396 G_CALLBACK (gtk_true),
4399 accel_group = gtk_accel_group_new ();
4400 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4402 gtk_window_set_title (GTK_WINDOW (window), "menus");
4403 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4406 box1 = gtk_vbox_new (FALSE, 0);
4407 gtk_container_add (GTK_CONTAINER (window), box1);
4408 gtk_widget_show (box1);
4410 menubar = gtk_menu_bar_new ();
4411 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4412 gtk_widget_show (menubar);
4414 menu = create_menu (screen, 2, 50, TRUE);
4416 menuitem = gtk_menu_item_new_with_label ("test\nline2");
4417 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4418 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4419 gtk_widget_show (menuitem);
4421 menu = create_table_menu (screen, 2, 50, TRUE);
4423 menuitem = gtk_menu_item_new_with_label ("table");
4424 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4425 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4426 gtk_widget_show (menuitem);
4428 menuitem = gtk_menu_item_new_with_label ("foo");
4429 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
4430 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4431 gtk_widget_show (menuitem);
4433 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4434 GTK_ICON_SIZE_MENU);
4435 gtk_widget_show (image);
4436 menuitem = gtk_image_menu_item_new_with_label ("Help");
4437 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4438 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
4439 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
4440 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4441 gtk_widget_show (menuitem);
4443 menubar = gtk_menu_bar_new ();
4444 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4445 gtk_widget_show (menubar);
4447 menu = create_menu (screen, 2, 10, TRUE);
4449 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
4450 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4451 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4452 gtk_widget_show (menuitem);
4454 box2 = gtk_vbox_new (FALSE, 10);
4455 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4456 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4457 gtk_widget_show (box2);
4459 menu = create_menu (screen, 1, 5, FALSE);
4460 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
4462 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
4463 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4464 gtk_widget_show (menuitem);
4466 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
4467 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4468 gtk_widget_show (menuitem);
4469 gtk_widget_add_accelerator (menuitem,
4475 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
4476 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4477 gtk_widget_show (menuitem);
4478 gtk_widget_add_accelerator (menuitem,
4483 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4484 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
4485 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4486 gtk_widget_show (menuitem);
4487 gtk_widget_add_accelerator (menuitem,
4493 gtk_widget_add_accelerator (menuitem,
4500 optionmenu = gtk_option_menu_new ();
4501 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
4502 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
4503 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
4504 gtk_widget_show (optionmenu);
4506 separator = gtk_hseparator_new ();
4507 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4508 gtk_widget_show (separator);
4510 box2 = gtk_vbox_new (FALSE, 10);
4511 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4512 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4513 gtk_widget_show (box2);
4515 button = gtk_button_new_with_label ("close");
4516 g_signal_connect_swapped (button, "clicked",
4517 G_CALLBACK (gtk_widget_destroy),
4519 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4520 gtk_widget_set_can_default (button, TRUE);
4521 gtk_widget_grab_default (button);
4522 gtk_widget_show (button);
4525 if (!gtk_widget_get_visible (window))
4526 gtk_widget_show (window);
4528 gtk_widget_destroy (window);
4532 gtk_ifactory_cb (gpointer callback_data,
4533 guint callback_action,
4536 g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
4539 /* GdkPixbuf RGBA C-Source image dump */
4541 static const guint8 apple[] =
4543 /* Pixbuf magic (0x47646b50) */
4545 /* length: header (24) + pixel_data (2304) */
4547 /* pixdata_type (0x1010002) */
4549 /* rowstride (96) */
4556 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4557 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4558 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4559 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4560 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4561 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4562 "\0\0\0\0\0\0\0\0\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"
4563 "\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"
4564 "\0\0\0\0\0\0\0\0\0\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"
4565 "[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"
4566 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4567 "\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"
4568 "\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"
4569 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4570 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
4571 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
4572 "\0\0\0\0\0\0\0\0\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"
4573 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
4574 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
4575 "\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["
4576 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
4577 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
4578 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
4579 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
4580 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
4581 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
4582 "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"
4583 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
4584 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
4585 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
4586 "\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"
4587 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
4588 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
4589 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
4590 "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"
4591 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
4592 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
4593 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
4594 "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"
4595 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
4596 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
4597 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4598 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4599 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4600 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4601 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4602 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4603 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4604 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4605 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4606 "\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>"
4607 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4608 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4609 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4610 "\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"
4611 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4612 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4613 "\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"
4614 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4615 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4616 "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"
4617 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4618 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4619 "\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"
4620 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4621 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4622 "\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"
4623 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4624 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4625 "\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"
4626 "\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"
4627 "\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"
4628 "\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"
4629 "\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"
4630 "\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"
4631 "\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"
4632 "\0\0\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"
4633 "\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"
4634 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4638 dump_accels (gpointer callback_data,
4639 guint callback_action,
4642 gtk_accel_map_save_fd (1 /* stdout */);
4645 static GtkItemFactoryEntry menu_items[] =
4647 { "/_File", NULL, NULL, 0, "<Branch>" },
4648 { "/File/tearoff1", NULL, gtk_ifactory_cb, 0, "<Tearoff>" },
4649 { "/File/_New", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_NEW },
4650 { "/File/_Open", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
4651 { "/File/_Save", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4652 { "/File/Save _As...", "<control>A", gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4653 { "/File/_Dump \"_Accels\"", NULL, dump_accels, 0 },
4654 { "/File/\\/Test__Escaping/And\\/\n\tWei\\\\rdly",
4655 NULL, gtk_ifactory_cb, 0 },
4656 { "/File/sep1", NULL, gtk_ifactory_cb, 0, "<Separator>" },
4657 { "/File/_Quit", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
4659 { "/_Preferences", NULL, 0, 0, "<Branch>" },
4660 { "/_Preferences/_Color", NULL, 0, 0, "<Branch>" },
4661 { "/_Preferences/Color/_Red", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4662 { "/_Preferences/Color/_Green", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4663 { "/_Preferences/Color/_Blue", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4664 { "/_Preferences/_Shape", NULL, 0, 0, "<Branch>" },
4665 { "/_Preferences/Shape/_Square", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4666 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
4667 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
4668 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
4669 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
4670 { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple },
4671 { "/_Preferences/Coffee", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4672 { "/_Preferences/Toast", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4673 { "/_Preferences/Marshmallow Froot Loops", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4675 /* For testing deletion of menus */
4676 { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
4677 { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
4678 { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
4680 { "/_Help", NULL, 0, 0, "<LastBranch>" },
4681 { "/Help/_Help", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_HELP},
4682 { "/Help/_About", NULL, gtk_ifactory_cb, 0 },
4686 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
4689 create_item_factory (GtkWidget *widget)
4691 static GtkWidget *window = NULL;
4697 GtkWidget *separator;
4700 GtkAccelGroup *accel_group;
4701 GtkItemFactory *item_factory;
4702 GtkTooltips *tooltips;
4704 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4706 gtk_window_set_screen (GTK_WINDOW (window),
4707 gtk_widget_get_screen (widget));
4709 g_signal_connect (window, "destroy",
4710 G_CALLBACK(gtk_widget_destroyed),
4712 g_signal_connect (window, "delete-event",
4713 G_CALLBACK (gtk_true),
4716 accel_group = gtk_accel_group_new ();
4717 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
4718 g_object_set_data_full (G_OBJECT (window),
4722 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4723 gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
4724 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4725 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
4727 /* preselect /Preferences/Shape/Oval over the other radios
4729 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4730 "/Preferences/Shape/Oval")),
4733 /* preselect /Preferences/Coffee
4735 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4736 "/Preferences/Coffee")),
4739 /* preselect /Preferences/Marshmallow Froot Loops and set it insensitive
4741 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4742 "/Preferences/Marshmallow Froot Loops")),
4744 gtk_widget_set_sensitive (GTK_WIDGET (gtk_item_factory_get_item (item_factory,
4745 "/Preferences/Marshmallow Froot Loops")),
4748 /* Test how tooltips (ugh) work on menu items
4750 tooltips = gtk_tooltips_new ();
4751 g_object_ref (tooltips);
4752 gtk_object_sink (GTK_OBJECT (tooltips));
4753 g_object_set_data_full (G_OBJECT (window), "testgtk-tooltips",
4754 tooltips, (GDestroyNotify)g_object_unref);
4756 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/New"),
4757 "Create a new file", NULL);
4758 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Open"),
4759 "Open a file", NULL);
4760 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Save"),
4762 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/Preferences/Color"),
4763 "Modify color", NULL);
4765 box1 = gtk_vbox_new (FALSE, 0);
4766 gtk_container_add (GTK_CONTAINER (window), box1);
4768 gtk_box_pack_start (GTK_BOX (box1),
4769 gtk_item_factory_get_widget (item_factory, "<main>"),
4772 label = gtk_label_new ("Type\n<alt>\nto start");
4773 gtk_widget_set_size_request (label, 200, 200);
4774 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
4775 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
4778 separator = gtk_hseparator_new ();
4779 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4782 box2 = gtk_vbox_new (FALSE, 10);
4783 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4784 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4786 button = gtk_button_new_with_label ("close");
4787 g_signal_connect_swapped (button, "clicked",
4788 G_CALLBACK (gtk_widget_destroy),
4790 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4791 gtk_widget_set_can_default (button, TRUE);
4792 gtk_widget_grab_default (button);
4794 gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
4796 gtk_widget_show_all (window);
4799 gtk_widget_destroy (window);
4803 accel_button_new (GtkAccelGroup *accel_group,
4808 GdkModifierType modifiers;
4812 gtk_accelerator_parse (accel, &keyval, &modifiers);
4815 button = gtk_button_new ();
4816 gtk_widget_add_accelerator (button, "activate", accel_group,
4817 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4819 label = gtk_accel_label_new (text);
4820 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4821 gtk_widget_show (label);
4823 gtk_container_add (GTK_CONTAINER (button), label);
4829 create_key_lookup (GtkWidget *widget)
4831 static GtkWidget *window = NULL;
4832 gpointer window_ptr;
4836 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4839 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4840 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4843 gtk_window_set_screen (GTK_WINDOW (window),
4844 gtk_widget_get_screen (widget));
4846 /* We have to expand it so the accel labels will draw their labels
4848 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4850 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4852 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4853 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4854 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4855 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4856 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4857 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4858 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4859 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4860 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4861 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4862 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4863 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4864 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4865 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4866 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4867 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4868 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4869 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4870 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4871 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4872 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4873 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4874 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4875 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4876 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4877 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4878 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4879 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4881 window_ptr = &window;
4882 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
4883 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4885 gtk_widget_show_all (window);
4888 gtk_widget_destroy (window);
4897 cmw_destroy_cb(GtkWidget *widget)
4899 /* This is needed to get out of gtk_main */
4906 cmw_color (GtkWidget *widget, GtkWidget *parent)
4910 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4912 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4914 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4918 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4920 /* And mark it as a transient dialog */
4921 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4923 g_signal_connect (csd, "destroy",
4924 G_CALLBACK (cmw_destroy_cb), NULL);
4926 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4927 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4928 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4929 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4931 /* wait until destroy calls gtk_main_quit */
4932 gtk_widget_show (csd);
4937 cmw_file (GtkWidget *widget, GtkWidget *parent)
4941 fs = gtk_file_selection_new("This is a modal file selection dialog");
4943 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4946 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4948 /* And mark it as a transient dialog */
4949 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4951 g_signal_connect (fs, "destroy",
4952 G_CALLBACK (cmw_destroy_cb), NULL);
4954 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4955 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4956 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4957 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4959 /* wait until destroy calls gtk_main_quit */
4960 gtk_widget_show (fs);
4967 create_modal_window (GtkWidget *widget)
4969 GtkWidget *window = NULL;
4970 GtkWidget *box1,*box2;
4972 GtkWidget *btnColor,*btnFile,*btnClose;
4974 /* Create modal window (Here you can use any window descendent )*/
4975 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4976 gtk_window_set_screen (GTK_WINDOW (window),
4977 gtk_widget_get_screen (widget));
4979 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4981 /* Set window as modal */
4982 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4984 /* Create widgets */
4985 box1 = gtk_vbox_new (FALSE,5);
4986 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4987 box2 = gtk_vbox_new (TRUE,5);
4988 btnColor = gtk_button_new_with_label ("Color");
4989 btnFile = gtk_button_new_with_label ("File Selection");
4990 btnClose = gtk_button_new_with_label ("Close");
4993 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4994 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4997 gtk_container_add (GTK_CONTAINER (window), box1);
4998 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4999 gtk_container_add (GTK_CONTAINER (frame1), box2);
5000 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
5001 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
5002 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
5003 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
5005 /* connect signals */
5006 g_signal_connect_swapped (btnClose, "clicked",
5007 G_CALLBACK (gtk_widget_destroy), window);
5009 g_signal_connect (window, "destroy",
5010 G_CALLBACK (cmw_destroy_cb), NULL);
5012 g_signal_connect (btnColor, "clicked",
5013 G_CALLBACK (cmw_color), window);
5014 g_signal_connect (btnFile, "clicked",
5015 G_CALLBACK (cmw_file), window);
5018 gtk_widget_show_all (window);
5020 /* wait until dialog get destroyed */
5029 make_message_dialog (GdkScreen *screen,
5031 GtkMessageType type,
5032 GtkButtonsType buttons,
5033 guint default_response)
5037 gtk_widget_destroy (*dialog);
5042 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
5043 "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.)");
5045 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
5047 g_signal_connect_swapped (*dialog,
5049 G_CALLBACK (gtk_widget_destroy),
5052 g_signal_connect (*dialog,
5054 G_CALLBACK (gtk_widget_destroyed),
5057 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
5059 gtk_widget_show (*dialog);
5063 create_message_dialog (GtkWidget *widget)
5065 static GtkWidget *info = NULL;
5066 static GtkWidget *warning = NULL;
5067 static GtkWidget *error = NULL;
5068 static GtkWidget *question = NULL;
5069 GdkScreen *screen = gtk_widget_get_screen (widget);
5071 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
5072 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
5073 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
5074 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
5081 static GtkWidget *sw_parent = NULL;
5082 static GtkWidget *sw_float_parent;
5083 static guint sw_destroyed_handler = 0;
5086 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
5088 gtk_widget_reparent (scrollwin, sw_parent);
5090 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5091 sw_float_parent = NULL;
5093 sw_destroyed_handler = 0;
5099 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
5101 gtk_widget_destroy (sw_float_parent);
5103 sw_float_parent = NULL;
5105 sw_destroyed_handler = 0;
5109 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
5113 gtk_widget_reparent (scrollwin, sw_parent);
5114 gtk_widget_destroy (sw_float_parent);
5116 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5117 sw_float_parent = NULL;
5119 sw_destroyed_handler = 0;
5123 sw_parent = scrollwin->parent;
5124 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5125 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
5126 gtk_widget_get_screen (widget));
5128 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
5130 gtk_widget_reparent (scrollwin, sw_float_parent);
5131 gtk_widget_show (sw_float_parent);
5133 sw_destroyed_handler =
5134 g_signal_connect (sw_parent, "destroy",
5135 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
5136 g_signal_connect (sw_float_parent, "delete_event",
5137 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
5142 create_scrolled_windows (GtkWidget *widget)
5144 static GtkWidget *window;
5145 GtkWidget *scrolled_window;
5153 window = gtk_dialog_new ();
5155 gtk_window_set_screen (GTK_WINDOW (window),
5156 gtk_widget_get_screen (widget));
5158 g_signal_connect (window, "destroy",
5159 G_CALLBACK (gtk_widget_destroyed),
5162 gtk_window_set_title (GTK_WINDOW (window), "dialog");
5163 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5166 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
5167 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
5168 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
5169 GTK_POLICY_AUTOMATIC,
5170 GTK_POLICY_AUTOMATIC);
5171 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5172 scrolled_window, TRUE, TRUE, 0);
5173 gtk_widget_show (scrolled_window);
5175 table = gtk_table_new (20, 20, FALSE);
5176 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
5177 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
5178 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
5179 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
5180 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5181 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
5182 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5183 gtk_widget_show (table);
5185 for (i = 0; i < 20; i++)
5186 for (j = 0; j < 20; j++)
5188 sprintf (buffer, "button (%d,%d)\n", i, j);
5189 button = gtk_toggle_button_new_with_label (buffer);
5190 gtk_table_attach_defaults (GTK_TABLE (table), button,
5192 gtk_widget_show (button);
5196 button = gtk_button_new_with_label ("Close");
5197 g_signal_connect_swapped (button, "clicked",
5198 G_CALLBACK (gtk_widget_destroy),
5200 gtk_widget_set_can_default (button, TRUE);
5201 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5202 button, TRUE, TRUE, 0);
5203 gtk_widget_grab_default (button);
5204 gtk_widget_show (button);
5206 button = gtk_button_new_with_label ("Reparent Out");
5207 g_signal_connect (button, "clicked",
5208 G_CALLBACK (scrolled_windows_remove),
5210 gtk_widget_set_can_default (button, TRUE);
5211 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5212 button, TRUE, TRUE, 0);
5213 gtk_widget_grab_default (button);
5214 gtk_widget_show (button);
5216 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
5219 if (!gtk_widget_get_visible (window))
5220 gtk_widget_show (window);
5222 gtk_widget_destroy (window);
5230 entry_toggle_frame (GtkWidget *checkbutton,
5233 gtk_entry_set_has_frame (GTK_ENTRY(entry),
5234 GTK_TOGGLE_BUTTON(checkbutton)->active);
5238 entry_toggle_sensitive (GtkWidget *checkbutton,
5241 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
5245 entry_progress_timeout (gpointer data)
5247 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
5249 gtk_entry_progress_pulse (GTK_ENTRY (data));
5255 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
5258 if (fraction > 1.0001)
5261 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
5268 entry_remove_timeout (gpointer data)
5270 g_source_remove (GPOINTER_TO_UINT (data));
5274 entry_toggle_progress (GtkWidget *checkbutton,
5277 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
5279 guint timeout = gdk_threads_add_timeout (100,
5280 entry_progress_timeout,
5282 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
5283 GUINT_TO_POINTER (timeout),
5284 entry_remove_timeout);
5288 g_object_set_data (G_OBJECT (entry), "timeout-id",
5289 GUINT_TO_POINTER (0));
5291 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
5296 entry_toggle_pulse (GtkWidget *checkbutton,
5299 g_object_set_data (G_OBJECT (entry), "progress-pulse",
5300 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
5304 props_clicked (GtkWidget *button,
5307 GtkWidget *window = create_prop_editor (object, 0);
5309 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
5313 create_entry (GtkWidget *widget)
5315 static GtkWidget *window = NULL;
5319 GtkWidget *has_frame_check;
5320 GtkWidget *sensitive_check;
5321 GtkWidget *progress_check;
5322 GtkWidget *entry, *cb;
5324 GtkWidget *separator;
5325 GList *cbitems = NULL;
5329 cbitems = g_list_append(cbitems, "item0");
5330 cbitems = g_list_append(cbitems, "item1 item1");
5331 cbitems = g_list_append(cbitems, "item2 item2 item2");
5332 cbitems = g_list_append(cbitems, "item3 item3 item3 item3");
5333 cbitems = g_list_append(cbitems, "item4 item4 item4 item4 item4");
5334 cbitems = g_list_append(cbitems, "item5 item5 item5 item5 item5 item5");
5335 cbitems = g_list_append(cbitems, "item6 item6 item6 item6 item6");
5336 cbitems = g_list_append(cbitems, "item7 item7 item7 item7");
5337 cbitems = g_list_append(cbitems, "item8 item8 item8");
5338 cbitems = g_list_append(cbitems, "item9 item9");
5340 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5341 gtk_window_set_screen (GTK_WINDOW (window),
5342 gtk_widget_get_screen (widget));
5344 g_signal_connect (window, "destroy",
5345 G_CALLBACK (gtk_widget_destroyed),
5348 gtk_window_set_title (GTK_WINDOW (window), "entry");
5349 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5352 box1 = gtk_vbox_new (FALSE, 0);
5353 gtk_container_add (GTK_CONTAINER (window), box1);
5356 box2 = gtk_vbox_new (FALSE, 10);
5357 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5358 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5360 hbox = gtk_hbox_new (FALSE, 5);
5361 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5363 entry = gtk_entry_new ();
5364 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");
5365 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
5366 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
5368 button = gtk_button_new_with_mnemonic ("_Props");
5369 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5370 g_signal_connect (button, "clicked",
5371 G_CALLBACK (props_clicked),
5374 cb = gtk_combo_new ();
5375 gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
5376 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO(cb)->entry), "hello world \n\n\n foo");
5377 gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry),
5379 gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0);
5381 sensitive_check = gtk_check_button_new_with_label("Sensitive");
5382 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
5383 g_signal_connect (sensitive_check, "toggled",
5384 G_CALLBACK (entry_toggle_sensitive), entry);
5385 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
5387 has_frame_check = gtk_check_button_new_with_label("Has Frame");
5388 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
5389 g_signal_connect (has_frame_check, "toggled",
5390 G_CALLBACK (entry_toggle_frame), entry);
5391 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
5393 progress_check = gtk_check_button_new_with_label("Show Progress");
5394 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
5395 g_signal_connect (progress_check, "toggled",
5396 G_CALLBACK (entry_toggle_progress), entry);
5398 progress_check = gtk_check_button_new_with_label("Pulse Progress");
5399 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
5400 g_signal_connect (progress_check, "toggled",
5401 G_CALLBACK (entry_toggle_pulse), entry);
5403 separator = gtk_hseparator_new ();
5404 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5406 box2 = gtk_vbox_new (FALSE, 10);
5407 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5408 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5410 button = gtk_button_new_with_label ("close");
5411 g_signal_connect_swapped (button, "clicked",
5412 G_CALLBACK (gtk_widget_destroy),
5414 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5415 gtk_widget_set_can_default (button, TRUE);
5416 gtk_widget_grab_default (button);
5419 if (!gtk_widget_get_visible (window))
5420 gtk_widget_show_all (window);
5422 gtk_widget_destroy (window);
5426 create_expander (GtkWidget *widget)
5429 GtkWidget *expander;
5431 static GtkWidget *window = NULL;
5435 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5436 gtk_window_set_screen (GTK_WINDOW (window),
5437 gtk_widget_get_screen (widget));
5439 g_signal_connect (window, "destroy",
5440 G_CALLBACK (gtk_widget_destroyed),
5443 gtk_window_set_title (GTK_WINDOW (window), "expander");
5444 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5446 box1 = gtk_vbox_new (FALSE, 0);
5447 gtk_container_add (GTK_CONTAINER (window), box1);
5449 expander = gtk_expander_new ("The Hidden");
5451 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
5453 hidden = gtk_label_new ("Revealed!");
5455 gtk_container_add (GTK_CONTAINER (expander), hidden);
5458 if (!gtk_widget_get_visible (window))
5459 gtk_widget_show_all (window);
5461 gtk_widget_destroy (window);
5469 event_box_label_pressed (GtkWidget *widget,
5470 GdkEventButton *event,
5473 g_print ("clicked on event box\n");
5477 event_box_button_clicked (GtkWidget *widget,
5481 g_print ("pushed button\n");
5485 event_box_toggle_visible_window (GtkWidget *checkbutton,
5486 GtkEventBox *event_box)
5488 gtk_event_box_set_visible_window (event_box,
5489 GTK_TOGGLE_BUTTON(checkbutton)->active);
5493 event_box_toggle_above_child (GtkWidget *checkbutton,
5494 GtkEventBox *event_box)
5496 gtk_event_box_set_above_child (event_box,
5497 GTK_TOGGLE_BUTTON(checkbutton)->active);
5501 create_event_box (GtkWidget *widget)
5503 static GtkWidget *window = NULL;
5509 GtkWidget *separator;
5510 GtkWidget *event_box;
5512 GtkWidget *visible_window_check;
5513 GtkWidget *above_child_check;
5522 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5523 gtk_window_set_screen (GTK_WINDOW (window),
5524 gtk_widget_get_screen (widget));
5526 g_signal_connect (window, "destroy",
5527 G_CALLBACK (gtk_widget_destroyed),
5530 gtk_window_set_title (GTK_WINDOW (window), "event box");
5531 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5533 box1 = gtk_vbox_new (FALSE, 0);
5534 gtk_container_add (GTK_CONTAINER (window), box1);
5535 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
5537 hbox = gtk_hbox_new (FALSE, 0);
5538 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
5540 event_box = gtk_event_box_new ();
5541 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
5543 vbox = gtk_vbox_new (FALSE, 0);
5544 gtk_container_add (GTK_CONTAINER (event_box), vbox);
5545 g_signal_connect (event_box, "button_press_event",
5546 G_CALLBACK (event_box_label_pressed),
5549 label = gtk_label_new ("Click on this label");
5550 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
5552 button = gtk_button_new_with_label ("button in eventbox");
5553 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
5554 g_signal_connect (button, "clicked",
5555 G_CALLBACK (event_box_button_clicked),
5559 visible_window_check = gtk_check_button_new_with_label("Visible Window");
5560 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
5561 g_signal_connect (visible_window_check, "toggled",
5562 G_CALLBACK (event_box_toggle_visible_window), event_box);
5563 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
5565 above_child_check = gtk_check_button_new_with_label("Above Child");
5566 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
5567 g_signal_connect (above_child_check, "toggled",
5568 G_CALLBACK (event_box_toggle_above_child), event_box);
5569 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
5571 separator = gtk_hseparator_new ();
5572 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5574 box2 = gtk_vbox_new (FALSE, 10);
5575 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5576 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5578 button = gtk_button_new_with_label ("close");
5579 g_signal_connect_swapped (button, "clicked",
5580 G_CALLBACK (gtk_widget_destroy),
5582 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5583 gtk_widget_set_can_default (button, TRUE);
5584 gtk_widget_grab_default (button);
5587 if (!gtk_widget_get_visible (window))
5588 gtk_widget_show_all (window);
5590 gtk_widget_destroy (window);
5598 #define SIZE_GROUP_INITIAL_SIZE 50
5601 size_group_hsize_changed (GtkSpinButton *spin_button,
5604 gtk_widget_set_size_request (GTK_BIN (button)->child,
5605 gtk_spin_button_get_value_as_int (spin_button),
5610 size_group_vsize_changed (GtkSpinButton *spin_button,
5613 gtk_widget_set_size_request (GTK_BIN (button)->child,
5615 gtk_spin_button_get_value_as_int (spin_button));
5619 create_size_group_window (GdkScreen *screen,
5620 GtkSizeGroup *master_size_group)
5624 GtkWidget *main_button;
5626 GtkWidget *spin_button;
5628 GtkSizeGroup *hgroup1;
5629 GtkSizeGroup *hgroup2;
5630 GtkSizeGroup *vgroup1;
5631 GtkSizeGroup *vgroup2;
5633 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
5639 gtk_window_set_screen (GTK_WINDOW (window), screen);
5641 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
5643 g_signal_connect (window, "response",
5644 G_CALLBACK (gtk_widget_destroy),
5647 table = gtk_table_new (2, 2, FALSE);
5648 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
5650 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
5651 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
5652 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
5653 gtk_widget_set_size_request (table, 250, 250);
5655 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5656 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5657 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5658 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5660 main_button = gtk_button_new_with_label ("X");
5662 gtk_table_attach (GTK_TABLE (table), main_button,
5664 GTK_EXPAND, GTK_EXPAND,
5666 gtk_size_group_add_widget (master_size_group, main_button);
5667 gtk_size_group_add_widget (hgroup1, main_button);
5668 gtk_size_group_add_widget (vgroup1, main_button);
5669 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
5670 SIZE_GROUP_INITIAL_SIZE,
5671 SIZE_GROUP_INITIAL_SIZE);
5673 button = gtk_button_new ();
5674 gtk_table_attach (GTK_TABLE (table), button,
5676 GTK_EXPAND, GTK_EXPAND,
5678 gtk_size_group_add_widget (vgroup1, button);
5679 gtk_size_group_add_widget (vgroup2, button);
5681 button = gtk_button_new ();
5682 gtk_table_attach (GTK_TABLE (table), button,
5684 GTK_EXPAND, GTK_EXPAND,
5686 gtk_size_group_add_widget (hgroup1, button);
5687 gtk_size_group_add_widget (hgroup2, button);
5689 button = gtk_button_new ();
5690 gtk_table_attach (GTK_TABLE (table), button,
5692 GTK_EXPAND, GTK_EXPAND,
5694 gtk_size_group_add_widget (hgroup2, button);
5695 gtk_size_group_add_widget (vgroup2, button);
5697 g_object_unref (hgroup1);
5698 g_object_unref (hgroup2);
5699 g_object_unref (vgroup1);
5700 g_object_unref (vgroup2);
5702 hbox = gtk_hbox_new (FALSE, 5);
5703 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
5705 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5706 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5707 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5708 g_signal_connect (spin_button, "value_changed",
5709 G_CALLBACK (size_group_hsize_changed), main_button);
5711 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5712 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5713 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5714 g_signal_connect (spin_button, "value_changed",
5715 G_CALLBACK (size_group_vsize_changed), main_button);
5721 create_size_groups (GtkWidget *widget)
5723 static GtkWidget *window1 = NULL;
5724 static GtkWidget *window2 = NULL;
5725 static GtkSizeGroup *master_size_group;
5727 if (!master_size_group)
5728 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
5732 window1 = create_size_group_window (gtk_widget_get_screen (widget),
5735 g_signal_connect (window1, "destroy",
5736 G_CALLBACK (gtk_widget_destroyed),
5742 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5745 g_signal_connect (window2, "destroy",
5746 G_CALLBACK (gtk_widget_destroyed),
5750 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
5752 gtk_widget_destroy (window1);
5753 gtk_widget_destroy (window2);
5757 if (!gtk_widget_get_visible (window1))
5758 gtk_widget_show_all (window1);
5759 if (!gtk_widget_get_visible (window2))
5760 gtk_widget_show_all (window2);
5768 static GtkWidget *spinner1;
5771 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5773 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5777 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5779 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5783 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5785 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5786 gtk_spin_button_get_value_as_int (spin));
5790 get_value (GtkWidget *widget, gpointer data)
5794 GtkSpinButton *spin;
5796 spin = GTK_SPIN_BUTTON (spinner1);
5797 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5798 if (GPOINTER_TO_INT (data) == 1)
5799 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5801 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5802 gtk_label_set_text (label, buf);
5806 get_spin_value (GtkWidget *widget, gpointer data)
5810 GtkSpinButton *spin;
5812 spin = GTK_SPIN_BUTTON (widget);
5813 label = GTK_LABEL (data);
5815 buffer = g_strdup_printf ("%0.*f", spin->digits,
5816 gtk_spin_button_get_value (spin));
5817 gtk_label_set_text (label, buffer);
5823 spin_button_time_output_func (GtkSpinButton *spin_button)
5825 static gchar buf[6];
5829 hours = spin_button->adjustment->value / 60.0;
5830 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5831 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5832 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5833 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5838 spin_button_month_input_func (GtkSpinButton *spin_button,
5842 static gchar *month[12] = { "January", "February", "March", "April",
5843 "May", "June", "July", "August",
5844 "September", "October", "November", "December" };
5846 gboolean found = FALSE;
5848 for (i = 1; i <= 12; i++)
5850 tmp1 = g_ascii_strup (month[i - 1], -1);
5851 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5852 if (strstr (tmp1, tmp2) == tmp1)
5862 return GTK_INPUT_ERROR;
5864 *new_val = (gdouble) i;
5869 spin_button_month_output_func (GtkSpinButton *spin_button)
5872 static gchar *month[12] = { "January", "February", "March", "April",
5873 "May", "June", "July", "August", "September",
5874 "October", "November", "December" };
5876 for (i = 1; i <= 12; i++)
5877 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5879 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5880 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5886 spin_button_hex_input_func (GtkSpinButton *spin_button,
5893 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5894 res = strtol(buf, &err, 16);
5897 return GTK_INPUT_ERROR;
5903 spin_button_hex_output_func (GtkSpinButton *spin_button)
5905 static gchar buf[7];
5908 val = (gint) spin_button->adjustment->value;
5909 if (fabs (val) < 1e-5)
5910 sprintf (buf, "0x00");
5912 sprintf (buf, "0x%.2X", val);
5913 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5914 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5919 create_spins (GtkWidget *widget)
5921 static GtkWidget *window = NULL;
5924 GtkWidget *main_vbox;
5927 GtkWidget *spinner2;
5931 GtkWidget *val_label;
5936 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5937 gtk_window_set_screen (GTK_WINDOW (window),
5938 gtk_widget_get_screen (widget));
5940 g_signal_connect (window, "destroy",
5941 G_CALLBACK (gtk_widget_destroyed),
5944 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5946 main_vbox = gtk_vbox_new (FALSE, 5);
5947 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5948 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5950 frame = gtk_frame_new ("Not accelerated");
5951 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5953 vbox = gtk_vbox_new (FALSE, 0);
5954 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5955 gtk_container_add (GTK_CONTAINER (frame), vbox);
5957 /* Time, month, hex spinners */
5959 hbox = gtk_hbox_new (FALSE, 0);
5960 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5962 vbox2 = gtk_vbox_new (FALSE, 0);
5963 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5965 label = gtk_label_new ("Time :");
5966 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5967 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5969 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5970 spinner = gtk_spin_button_new (adj, 0, 0);
5971 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5972 g_signal_connect (spinner,
5974 G_CALLBACK (spin_button_time_output_func),
5976 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5977 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5978 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5980 vbox2 = gtk_vbox_new (FALSE, 0);
5981 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5983 label = gtk_label_new ("Month :");
5984 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5985 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5987 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5989 spinner = gtk_spin_button_new (adj, 0, 0);
5990 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5991 GTK_UPDATE_IF_VALID);
5992 g_signal_connect (spinner,
5994 G_CALLBACK (spin_button_month_input_func),
5996 g_signal_connect (spinner,
5998 G_CALLBACK (spin_button_month_output_func),
6000 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
6001 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
6002 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
6004 vbox2 = gtk_vbox_new (FALSE, 0);
6005 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
6007 label = gtk_label_new ("Hex :");
6008 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6009 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
6011 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
6012 spinner = gtk_spin_button_new (adj, 0, 0);
6013 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
6014 g_signal_connect (spinner,
6016 G_CALLBACK (spin_button_hex_input_func),
6018 g_signal_connect (spinner,
6020 G_CALLBACK (spin_button_hex_output_func),
6022 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
6023 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
6024 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
6026 frame = gtk_frame_new ("Accelerated");
6027 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
6029 vbox = gtk_vbox_new (FALSE, 0);
6030 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
6031 gtk_container_add (GTK_CONTAINER (frame), vbox);
6033 hbox = gtk_hbox_new (FALSE, 0);
6034 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6036 vbox2 = gtk_vbox_new (FALSE, 0);
6037 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
6039 label = gtk_label_new ("Value :");
6040 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6041 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
6043 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
6045 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
6046 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
6047 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
6049 vbox2 = gtk_vbox_new (FALSE, 0);
6050 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
6052 label = gtk_label_new ("Digits :");
6053 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6054 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
6056 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
6057 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
6058 g_signal_connect (adj, "value_changed",
6059 G_CALLBACK (change_digits),
6061 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
6063 hbox = gtk_hbox_new (FALSE, 0);
6064 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
6066 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
6067 g_signal_connect (button, "clicked",
6068 G_CALLBACK (toggle_snap),
6070 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
6071 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6073 button = gtk_check_button_new_with_label ("Numeric only input mode");
6074 g_signal_connect (button, "clicked",
6075 G_CALLBACK (toggle_numeric),
6077 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
6078 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6080 val_label = gtk_label_new ("");
6082 hbox = gtk_hbox_new (FALSE, 0);
6083 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6085 button = gtk_button_new_with_label ("Value as Int");
6086 g_object_set_data (G_OBJECT (button), "user_data", val_label);
6087 g_signal_connect (button, "clicked",
6088 G_CALLBACK (get_value),
6089 GINT_TO_POINTER (1));
6090 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6092 button = gtk_button_new_with_label ("Value as Float");
6093 g_object_set_data (G_OBJECT (button), "user_data", val_label);
6094 g_signal_connect (button, "clicked",
6095 G_CALLBACK (get_value),
6096 GINT_TO_POINTER (2));
6097 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6099 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
6100 gtk_label_set_text (GTK_LABEL (val_label), "0");
6102 frame = gtk_frame_new ("Using Convenience Constructor");
6103 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
6105 hbox = gtk_hbox_new (FALSE, 0);
6106 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6107 gtk_container_add (GTK_CONTAINER (frame), hbox);
6109 val_label = gtk_label_new ("0.0");
6111 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
6112 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
6113 g_signal_connect (spinner, "value_changed",
6114 G_CALLBACK (get_spin_value), val_label);
6115 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
6116 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
6118 hbox = gtk_hbox_new (FALSE, 0);
6119 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
6121 button = gtk_button_new_with_label ("Close");
6122 g_signal_connect_swapped (button, "clicked",
6123 G_CALLBACK (gtk_widget_destroy),
6125 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6128 if (!gtk_widget_get_visible (window))
6129 gtk_widget_show_all (window);
6131 gtk_widget_destroy (window);
6140 cursor_expose_event (GtkWidget *widget,
6144 GtkDrawingArea *darea;
6145 GdkDrawable *drawable;
6152 g_return_val_if_fail (widget != NULL, TRUE);
6153 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
6155 darea = GTK_DRAWING_AREA (widget);
6156 drawable = widget->window;
6157 white_gc = widget->style->white_gc;
6158 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
6159 black_gc = widget->style->black_gc;
6160 max_width = widget->allocation.width;
6161 max_height = widget->allocation.height;
6163 gdk_draw_rectangle (drawable, white_gc,
6170 gdk_draw_rectangle (drawable, black_gc,
6177 gdk_draw_rectangle (drawable, gray_gc,
6188 set_cursor (GtkWidget *spinner,
6197 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
6200 label = g_object_get_data (G_OBJECT (spinner), "user_data");
6202 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
6203 vals = class->values;
6205 while (vals && vals->value != c)
6208 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
6210 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
6212 g_type_class_unref (class);
6214 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
6215 gdk_window_set_cursor (widget->window, cursor);
6216 gdk_cursor_unref (cursor);
6220 cursor_event (GtkWidget *widget,
6222 GtkSpinButton *spinner)
6224 if ((event->type == GDK_BUTTON_PRESS) &&
6225 ((event->button.button == 1) ||
6226 (event->button.button == 3)))
6228 gtk_spin_button_spin (spinner, event->button.button == 1 ?
6229 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
6236 #ifdef GDK_WINDOWING_X11
6237 #include "x11/gdkx.h"
6240 change_cursor_theme (GtkWidget *widget,
6247 children = gtk_container_get_children (GTK_CONTAINER (data));
6249 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
6250 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
6252 g_list_free (children);
6254 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
6261 create_cursors (GtkWidget *widget)
6263 static GtkWidget *window = NULL;
6266 GtkWidget *main_vbox;
6279 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6280 gtk_window_set_screen (GTK_WINDOW (window),
6281 gtk_widget_get_screen (widget));
6283 g_signal_connect (window, "destroy",
6284 G_CALLBACK (gtk_widget_destroyed),
6287 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
6289 main_vbox = gtk_vbox_new (FALSE, 5);
6290 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
6291 gtk_container_add (GTK_CONTAINER (window), main_vbox);
6294 g_object_new (gtk_vbox_get_type (),
6295 "GtkBox::homogeneous", FALSE,
6296 "GtkBox::spacing", 5,
6297 "GtkContainer::border_width", 10,
6298 "GtkWidget::parent", main_vbox,
6299 "GtkWidget::visible", TRUE,
6302 #ifdef GDK_WINDOWING_X11
6303 hbox = gtk_hbox_new (FALSE, 0);
6304 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6305 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6307 label = gtk_label_new ("Cursor Theme : ");
6308 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6309 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6311 entry = gtk_entry_new ();
6312 gtk_entry_set_text (GTK_ENTRY (entry), "default");
6313 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
6315 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
6316 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
6317 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
6319 g_signal_connect (entry, "changed",
6320 G_CALLBACK (change_cursor_theme), hbox);
6321 g_signal_connect (size, "changed",
6322 G_CALLBACK (change_cursor_theme), hbox);
6325 hbox = gtk_hbox_new (FALSE, 0);
6326 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6327 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6329 label = gtk_label_new ("Cursor Value : ");
6330 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6331 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6333 adj = (GtkAdjustment *) gtk_adjustment_new (0,
6337 spinner = gtk_spin_button_new (adj, 0, 0);
6338 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
6341 g_object_new (gtk_frame_get_type (),
6342 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
6343 "GtkFrame::label_xalign", 0.5,
6344 "GtkFrame::label", "Cursor Area",
6345 "GtkContainer::border_width", 10,
6346 "GtkWidget::parent", vbox,
6347 "GtkWidget::visible", TRUE,
6350 darea = gtk_drawing_area_new ();
6351 gtk_widget_set_size_request (darea, 80, 80);
6352 gtk_container_add (GTK_CONTAINER (frame), darea);
6353 g_signal_connect (darea,
6355 G_CALLBACK (cursor_expose_event),
6357 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
6358 g_signal_connect (darea,
6359 "button_press_event",
6360 G_CALLBACK (cursor_event),
6362 gtk_widget_show (darea);
6364 g_signal_connect (spinner, "changed",
6365 G_CALLBACK (set_cursor),
6368 label = g_object_new (GTK_TYPE_LABEL,
6373 gtk_container_child_set (GTK_CONTAINER (vbox), label,
6376 g_object_set_data (G_OBJECT (spinner), "user_data", label);
6379 g_object_new (gtk_hseparator_get_type (),
6380 "GtkWidget::visible", TRUE,
6382 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
6384 hbox = gtk_hbox_new (FALSE, 0);
6385 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
6386 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
6388 button = gtk_button_new_with_label ("Close");
6389 g_signal_connect_swapped (button, "clicked",
6390 G_CALLBACK (gtk_widget_destroy),
6392 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6394 gtk_widget_show_all (window);
6396 set_cursor (spinner, darea);
6399 gtk_widget_destroy (window);
6407 color_selection_ok (GtkWidget *w,
6408 GtkColorSelectionDialog *cs)
6410 GtkColorSelection *colorsel;
6413 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6415 gtk_color_selection_get_color(colorsel,color);
6416 gtk_color_selection_set_color(colorsel,color);
6420 color_selection_changed (GtkWidget *w,
6421 GtkColorSelectionDialog *cs)
6423 GtkColorSelection *colorsel;
6426 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6427 gtk_color_selection_get_color(colorsel,color);
6432 opacity_toggled_cb (GtkWidget *w,
6433 GtkColorSelectionDialog *cs)
6435 GtkColorSelection *colorsel;
6437 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6438 gtk_color_selection_set_has_opacity_control (colorsel,
6439 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
6443 palette_toggled_cb (GtkWidget *w,
6444 GtkColorSelectionDialog *cs)
6446 GtkColorSelection *colorsel;
6448 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6449 gtk_color_selection_set_has_palette (colorsel,
6450 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
6455 create_color_selection (GtkWidget *widget)
6457 static GtkWidget *window = NULL;
6466 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6467 gtk_window_set_screen (GTK_WINDOW (window),
6468 gtk_widget_get_screen (widget));
6470 g_signal_connect (window, "destroy",
6471 G_CALLBACK (gtk_widget_destroyed),
6474 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
6475 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6477 hbox = gtk_hbox_new (FALSE, 8);
6478 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6479 gtk_container_add (GTK_CONTAINER (window), hbox);
6481 label = gtk_label_new ("Pick a color");
6482 gtk_container_add (GTK_CONTAINER (hbox), label);
6484 picker = gtk_color_button_new ();
6485 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
6486 gtk_container_add (GTK_CONTAINER (hbox), picker);
6488 button = gtk_button_new_with_mnemonic ("_Props");
6489 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6490 g_signal_connect (button, "clicked",
6491 G_CALLBACK (props_clicked),
6495 if (!gtk_widget_get_visible (window))
6496 gtk_widget_show_all (window);
6498 gtk_widget_destroy (window);
6502 flipping_toggled_cb (GtkWidget *widget, gpointer data)
6504 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
6505 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
6507 gtk_widget_set_default_direction (new_direction);
6511 orientable_toggle_orientation (GtkOrientable *orientable)
6513 GtkOrientation orientation;
6515 orientation = gtk_orientable_get_orientation (orientable);
6516 gtk_orientable_set_orientation (orientable,
6517 orientation == GTK_ORIENTATION_HORIZONTAL ?
6518 GTK_ORIENTATION_VERTICAL :
6519 GTK_ORIENTATION_HORIZONTAL);
6521 if (GTK_IS_CONTAINER (orientable))
6526 children = gtk_container_get_children (GTK_CONTAINER (orientable));
6528 for (child = children; child; child = child->next)
6530 if (GTK_IS_ORIENTABLE (child->data))
6531 orientable_toggle_orientation (child->data);
6534 g_list_free (children);
6539 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
6541 orientable_toggle_orientation (GTK_ORIENTABLE (GTK_DIALOG (gtk_widget_get_toplevel (widget))->vbox));
6545 set_direction_recurse (GtkWidget *widget,
6548 GtkTextDirection *dir = data;
6550 gtk_widget_set_direction (widget, *dir);
6551 if (GTK_IS_CONTAINER (widget))
6552 gtk_container_foreach (GTK_CONTAINER (widget),
6553 set_direction_recurse,
6558 create_forward_back (const char *title,
6559 GtkTextDirection text_dir)
6561 GtkWidget *frame = gtk_frame_new (title);
6562 GtkWidget *bbox = gtk_hbutton_box_new ();
6563 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
6564 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
6566 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
6568 gtk_container_add (GTK_CONTAINER (frame), bbox);
6569 gtk_container_add (GTK_CONTAINER (bbox), back_button);
6570 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
6572 set_direction_recurse (frame, &text_dir);
6578 create_flipping (GtkWidget *widget)
6580 static GtkWidget *window = NULL;
6581 GtkWidget *check_button, *button;
6585 window = gtk_dialog_new ();
6587 gtk_window_set_screen (GTK_WINDOW (window),
6588 gtk_widget_get_screen (widget));
6590 g_signal_connect (window, "destroy",
6591 G_CALLBACK (gtk_widget_destroyed),
6594 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
6596 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
6597 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
6598 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6599 check_button, TRUE, TRUE, 0);
6601 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
6602 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
6604 g_signal_connect (check_button, "toggled",
6605 G_CALLBACK (flipping_toggled_cb), NULL);
6607 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
6608 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
6609 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6610 check_button, TRUE, TRUE, 0);
6612 g_signal_connect (check_button, "toggled",
6613 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
6615 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6616 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
6619 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6620 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
6623 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6624 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
6627 button = gtk_button_new_with_label ("Close");
6628 g_signal_connect_swapped (button, "clicked",
6629 G_CALLBACK (gtk_widget_destroy), window);
6630 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
6631 button, TRUE, TRUE, 0);
6634 if (!gtk_widget_get_visible (window))
6635 gtk_widget_show_all (window);
6637 gtk_widget_destroy (window);
6645 make_focus_table (GList **list)
6650 table = gtk_table_new (5, 5, FALSE);
6663 widget = gtk_entry_new ();
6665 widget = gtk_button_new_with_label ("Foo");
6667 *list = g_list_prepend (*list, widget);
6669 gtk_table_attach (GTK_TABLE (table),
6673 GTK_EXPAND | GTK_FILL,
6674 GTK_EXPAND | GTK_FILL,
6683 *list = g_list_reverse (*list);
6689 create_focus (GtkWidget *widget)
6691 static GtkWidget *window = NULL;
6699 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
6705 gtk_window_set_screen (GTK_WINDOW (window),
6706 gtk_widget_get_screen (widget));
6708 g_signal_connect (window, "destroy",
6709 G_CALLBACK (gtk_widget_destroyed),
6712 g_signal_connect (window, "response",
6713 G_CALLBACK (gtk_widget_destroy),
6716 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
6718 frame = gtk_frame_new ("Weird tab focus chain");
6720 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6721 frame, TRUE, TRUE, 0);
6723 table = make_focus_table (&list);
6725 gtk_container_add (GTK_CONTAINER (frame), table);
6727 gtk_container_set_focus_chain (GTK_CONTAINER (table),
6732 frame = gtk_frame_new ("Default tab focus chain");
6734 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6735 frame, TRUE, TRUE, 0);
6738 table = make_focus_table (&list);
6742 gtk_container_add (GTK_CONTAINER (frame), table);
6745 if (!gtk_widget_get_visible (window))
6746 gtk_widget_show_all (window);
6748 gtk_widget_destroy (window);
6756 font_selection_ok (GtkWidget *w,
6757 GtkFontSelectionDialog *fs)
6759 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
6761 g_print ("%s\n", s);
6763 gtk_widget_destroy (GTK_WIDGET (fs));
6767 create_font_selection (GtkWidget *widget)
6769 static GtkWidget *window = NULL;
6777 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6778 gtk_window_set_screen (GTK_WINDOW (window),
6779 gtk_widget_get_screen (widget));
6781 g_signal_connect (window, "destroy",
6782 G_CALLBACK (gtk_widget_destroyed),
6785 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
6786 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6788 hbox = gtk_hbox_new (FALSE, 8);
6789 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6790 gtk_container_add (GTK_CONTAINER (window), hbox);
6792 label = gtk_label_new ("Pick a font");
6793 gtk_container_add (GTK_CONTAINER (hbox), label);
6795 picker = gtk_font_button_new ();
6796 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
6797 gtk_container_add (GTK_CONTAINER (hbox), picker);
6800 if (!gtk_widget_get_visible (window))
6801 gtk_widget_show_all (window);
6803 gtk_widget_destroy (window);
6810 static GtkWidget *dialog_window = NULL;
6813 label_toggle (GtkWidget *widget,
6818 *label = gtk_label_new ("Dialog Test");
6819 g_signal_connect (*label,
6821 G_CALLBACK (gtk_widget_destroyed),
6823 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
6824 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6825 *label, TRUE, TRUE, 0);
6826 gtk_widget_show (*label);
6829 gtk_widget_destroy (*label);
6832 #define RESPONSE_TOGGLE_SEPARATOR 1
6835 print_response (GtkWidget *dialog,
6839 g_print ("response signal received (%d)\n", response_id);
6841 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
6843 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
6844 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
6849 create_dialog (GtkWidget *widget)
6851 static GtkWidget *label;
6856 /* This is a terrible example; it's much simpler to create
6857 * dialogs than this. Don't use testgtk for example code,
6861 dialog_window = gtk_dialog_new ();
6862 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6863 gtk_widget_get_screen (widget));
6865 g_signal_connect (dialog_window,
6867 G_CALLBACK (print_response),
6870 g_signal_connect (dialog_window, "destroy",
6871 G_CALLBACK (gtk_widget_destroyed),
6874 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
6875 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6877 button = gtk_button_new_with_label ("OK");
6878 gtk_widget_set_can_default (button, TRUE);
6879 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6880 button, TRUE, TRUE, 0);
6881 gtk_widget_grab_default (button);
6882 gtk_widget_show (button);
6884 button = gtk_button_new_with_label ("Toggle");
6885 g_signal_connect (button, "clicked",
6886 G_CALLBACK (label_toggle),
6888 gtk_widget_set_can_default (button, TRUE);
6889 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6890 button, TRUE, TRUE, 0);
6891 gtk_widget_show (button);
6895 button = gtk_button_new_with_label ("Separator");
6897 gtk_widget_set_can_default (button, TRUE);
6899 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
6901 RESPONSE_TOGGLE_SEPARATOR);
6902 gtk_widget_show (button);
6905 if (!gtk_widget_get_visible (dialog_window))
6906 gtk_widget_show (dialog_window);
6908 gtk_widget_destroy (dialog_window);
6911 /* Display & Screen test
6917 GtkWidget *radio_dpy;
6918 GtkWidget *toplevel;
6919 GtkWidget *dialog_window;
6920 GList *valid_display_list;
6921 } ScreenDisplaySelection;
6924 display_name_cmp (gconstpointer a,
6927 return g_ascii_strcasecmp (a,b);
6931 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
6934 GdkDisplay *display = gtk_widget_get_display (widget);
6936 GdkScreen *new_screen = NULL;
6937 GdkScreen *current_screen = gtk_widget_get_screen (widget);
6939 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
6941 display_name = g_strdup (gtk_entry_get_text (data->entry));
6942 display = gdk_display_open (display_name);
6946 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
6947 GTK_DIALOG_DESTROY_WITH_PARENT,
6950 "The display :\n%s\ncannot be opened",
6952 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
6953 gtk_widget_show (dialog);
6954 g_signal_connect (dialog, "response",
6955 G_CALLBACK (gtk_widget_destroy),
6960 if (!g_list_find_custom (data->valid_display_list,
6963 data->valid_display_list = g_list_append (data->valid_display_list,
6966 new_screen = gdk_display_get_default_screen (display);
6971 gint number_of_screens = gdk_display_get_n_screens (display);
6972 gint screen_num = gdk_screen_get_number (current_screen);
6973 if ((screen_num +1) < number_of_screens)
6974 new_screen = gdk_display_get_screen (display, screen_num + 1);
6976 new_screen = gdk_display_get_screen (display, 0);
6981 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
6982 gtk_widget_destroy (data->dialog_window);
6987 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
6989 gtk_widget_destroy (data);
6993 create_display_screen (GtkWidget *widget)
6995 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
6996 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
6998 ScreenDisplaySelection *scr_dpy_data;
6999 GdkScreen *screen = gtk_widget_get_screen (widget);
7000 static GList *valid_display_list = NULL;
7002 GdkDisplay *display = gdk_screen_get_display (screen);
7004 window = g_object_new (gtk_window_get_type (),
7007 "type", GTK_WINDOW_TOPLEVEL,
7009 "Screen or Display selection",
7010 "border_width", 10, NULL);
7011 g_signal_connect (window, "destroy",
7012 G_CALLBACK (gtk_widget_destroy), NULL);
7014 vbox = gtk_vbox_new (FALSE, 3);
7015 gtk_container_add (GTK_CONTAINER (window), vbox);
7017 frame = gtk_frame_new ("Select screen or display");
7018 gtk_container_add (GTK_CONTAINER (vbox), frame);
7020 table = gtk_table_new (2, 2, TRUE);
7021 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
7022 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
7024 gtk_container_add (GTK_CONTAINER (frame), table);
7026 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
7027 if (gdk_display_get_n_screens(display) > 1)
7028 radio_scr = gtk_radio_button_new_with_label
7029 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
7032 radio_scr = gtk_radio_button_new_with_label
7033 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
7034 "only one screen on the current display");
7035 gtk_widget_set_sensitive (radio_scr, FALSE);
7037 combo_dpy = gtk_combo_new ();
7038 if (!valid_display_list)
7039 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
7041 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
7043 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
7044 "<hostname>:<X Server Num>.<Screen Num>");
7046 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
7047 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
7048 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
7050 bbox = gtk_hbutton_box_new ();
7051 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
7052 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
7054 gtk_container_add (GTK_CONTAINER (vbox), bbox);
7056 gtk_container_add (GTK_CONTAINER (bbox), applyb);
7057 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
7059 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
7061 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
7062 scr_dpy_data->radio_dpy = radio_dpy;
7063 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
7064 scr_dpy_data->dialog_window = window;
7065 scr_dpy_data->valid_display_list = valid_display_list;
7067 g_signal_connect (cancelb, "clicked",
7068 G_CALLBACK (screen_display_destroy_diag), window);
7069 g_signal_connect (applyb, "clicked",
7070 G_CALLBACK (screen_display_check), scr_dpy_data);
7071 gtk_widget_show_all (window);
7076 static gboolean event_watcher_enter_id = 0;
7077 static gboolean event_watcher_leave_id = 0;
7080 event_watcher (GSignalInvocationHint *ihint,
7081 guint n_param_values,
7082 const GValue *param_values,
7085 g_print ("Watch: \"%s\" emitted for %s\n",
7086 g_signal_name (ihint->signal_id),
7087 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
7093 event_watcher_down (void)
7095 if (event_watcher_enter_id)
7099 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7100 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
7101 event_watcher_enter_id = 0;
7102 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7103 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
7104 event_watcher_leave_id = 0;
7109 event_watcher_toggle (void)
7111 if (event_watcher_enter_id)
7112 event_watcher_down ();
7117 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7118 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7119 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7120 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7125 create_event_watcher (GtkWidget *widget)
7131 dialog_window = gtk_dialog_new ();
7132 gtk_window_set_screen (GTK_WINDOW (dialog_window),
7133 gtk_widget_get_screen (widget));
7135 g_signal_connect (dialog_window, "destroy",
7136 G_CALLBACK (gtk_widget_destroyed),
7138 g_signal_connect (dialog_window, "destroy",
7139 G_CALLBACK (event_watcher_down),
7142 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
7143 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
7144 gtk_widget_set_size_request (dialog_window, 200, 110);
7146 button = gtk_toggle_button_new_with_label ("Activate Watch");
7147 g_signal_connect (button, "clicked",
7148 G_CALLBACK (event_watcher_toggle),
7150 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
7151 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
7152 button, TRUE, TRUE, 0);
7153 gtk_widget_show (button);
7155 button = gtk_button_new_with_label ("Close");
7156 g_signal_connect_swapped (button, "clicked",
7157 G_CALLBACK (gtk_widget_destroy),
7159 gtk_widget_set_can_default (button, TRUE);
7160 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7161 button, TRUE, TRUE, 0);
7162 gtk_widget_grab_default (button);
7163 gtk_widget_show (button);
7166 if (!gtk_widget_get_visible (dialog_window))
7167 gtk_widget_show (dialog_window);
7169 gtk_widget_destroy (dialog_window);
7177 reformat_value (GtkScale *scale,
7180 return g_strdup_printf ("-->%0.*g<--",
7181 gtk_scale_get_digits (scale), value);
7185 create_range_controls (GtkWidget *widget)
7187 static GtkWidget *window = NULL;
7191 GtkWidget *scrollbar;
7193 GtkWidget *separator;
7194 GtkObject *adjustment;
7199 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7201 gtk_window_set_screen (GTK_WINDOW (window),
7202 gtk_widget_get_screen (widget));
7204 g_signal_connect (window, "destroy",
7205 G_CALLBACK (gtk_widget_destroyed),
7208 gtk_window_set_title (GTK_WINDOW (window), "range controls");
7209 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7212 box1 = gtk_vbox_new (FALSE, 0);
7213 gtk_container_add (GTK_CONTAINER (window), box1);
7214 gtk_widget_show (box1);
7217 box2 = gtk_vbox_new (FALSE, 10);
7218 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7219 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
7220 gtk_widget_show (box2);
7223 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
7225 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7226 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
7227 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
7228 gtk_scale_set_digits (GTK_SCALE (scale), 1);
7229 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7230 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7231 gtk_widget_show (scale);
7233 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
7234 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
7235 GTK_UPDATE_CONTINUOUS);
7236 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
7237 gtk_widget_show (scrollbar);
7239 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7240 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7241 g_signal_connect (scale,
7243 G_CALLBACK (reformat_value),
7245 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7246 gtk_widget_show (scale);
7248 hbox = gtk_hbox_new (FALSE, 0);
7250 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7251 gtk_widget_set_size_request (scale, -1, 200);
7252 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7253 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7254 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7255 gtk_widget_show (scale);
7257 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7258 gtk_widget_set_size_request (scale, -1, 200);
7259 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7260 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7261 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
7262 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7263 gtk_widget_show (scale);
7265 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7266 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7267 g_signal_connect (scale,
7269 G_CALLBACK (reformat_value),
7271 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7272 gtk_widget_show (scale);
7275 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
7276 gtk_widget_show (hbox);
7278 separator = gtk_hseparator_new ();
7279 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7280 gtk_widget_show (separator);
7283 box2 = gtk_vbox_new (FALSE, 10);
7284 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7285 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7286 gtk_widget_show (box2);
7289 button = gtk_button_new_with_label ("close");
7290 g_signal_connect_swapped (button, "clicked",
7291 G_CALLBACK (gtk_widget_destroy),
7293 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7294 gtk_widget_set_can_default (button, TRUE);
7295 gtk_widget_grab_default (button);
7296 gtk_widget_show (button);
7299 if (!gtk_widget_get_visible (window))
7300 gtk_widget_show (window);
7302 gtk_widget_destroy (window);
7310 create_rulers (GtkWidget *widget)
7312 static GtkWidget *window = NULL;
7318 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7320 gtk_window_set_screen (GTK_WINDOW (window),
7321 gtk_widget_get_screen (widget));
7323 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
7325 g_signal_connect (window, "destroy",
7326 G_CALLBACK (gtk_widget_destroyed),
7329 gtk_window_set_title (GTK_WINDOW (window), "rulers");
7330 gtk_widget_set_size_request (window, 300, 300);
7331 gtk_widget_set_events (window,
7332 GDK_POINTER_MOTION_MASK
7333 | GDK_POINTER_MOTION_HINT_MASK);
7334 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7336 table = gtk_table_new (2, 2, FALSE);
7337 gtk_container_add (GTK_CONTAINER (window), table);
7338 gtk_widget_show (table);
7340 ruler = gtk_hruler_new ();
7341 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
7342 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
7344 g_signal_connect_swapped (window,
7345 "motion_notify_event",
7346 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7349 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
7350 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
7351 gtk_widget_show (ruler);
7354 ruler = gtk_vruler_new ();
7355 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
7357 g_signal_connect_swapped (window,
7358 "motion_notify_event",
7359 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7362 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
7363 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
7364 gtk_widget_show (ruler);
7367 if (!gtk_widget_get_visible (window))
7368 gtk_widget_show (window);
7370 gtk_widget_destroy (window);
7374 text_toggle_editable (GtkWidget *checkbutton,
7377 gtk_text_set_editable(GTK_TEXT(text),
7378 GTK_TOGGLE_BUTTON(checkbutton)->active);
7382 text_toggle_word_wrap (GtkWidget *checkbutton,
7385 gtk_text_set_word_wrap(GTK_TEXT(text),
7386 GTK_TOGGLE_BUTTON(checkbutton)->active);
7393 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
7394 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
7395 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
7396 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
7397 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
7398 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
7399 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
7400 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
7403 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
7409 text_insert_random (GtkWidget *w, GtkText *text)
7413 for (i=0; i<10; i++)
7415 c = 'A' + rand() % ('Z' - 'A');
7416 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
7417 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
7422 create_text (GtkWidget *widget)
7426 static GtkWidget *window = NULL;
7432 GtkWidget *separator;
7433 GtkWidget *scrolled_window;
7440 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7441 gtk_window_set_screen (GTK_WINDOW (window),
7442 gtk_widget_get_screen (widget));
7444 gtk_widget_set_name (window, "text window");
7445 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
7446 gtk_widget_set_size_request (window, 500, 500);
7448 g_signal_connect (window, "destroy",
7449 G_CALLBACK (gtk_widget_destroyed),
7452 gtk_window_set_title (GTK_WINDOW (window), "test");
7453 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7456 box1 = gtk_vbox_new (FALSE, 0);
7457 gtk_container_add (GTK_CONTAINER (window), box1);
7458 gtk_widget_show (box1);
7461 box2 = gtk_vbox_new (FALSE, 10);
7462 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7463 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
7464 gtk_widget_show (box2);
7467 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
7468 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
7469 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
7472 gtk_widget_show (scrolled_window);
7474 text = gtk_text_new (NULL, NULL);
7475 gtk_text_set_editable (GTK_TEXT (text), TRUE);
7476 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
7477 gtk_widget_grab_focus (text);
7478 gtk_widget_show (text);
7481 gtk_text_freeze (GTK_TEXT (text));
7483 for (i=0; i<ntext_colors; i++)
7485 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
7486 text_colors[i].name, -1);
7487 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
7489 for (j=0; j<ntext_colors; j++)
7491 gtk_text_insert (GTK_TEXT (text), NULL,
7492 &text_colors[j].color, &text_colors[i].color,
7495 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
7498 infile = fopen("testgtk.c", "r");
7503 int nbytes_read, nbytes_alloc;
7506 nbytes_alloc = 1024;
7507 buffer = g_new (char, nbytes_alloc);
7511 if (nbytes_alloc < nbytes_read + 1024)
7514 buffer = g_realloc (buffer, nbytes_alloc);
7516 len = fread (buffer + nbytes_read, 1, 1024, infile);
7522 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
7523 NULL, buffer, nbytes_read);
7528 gtk_text_thaw (GTK_TEXT (text));
7530 hbox = gtk_hbutton_box_new ();
7531 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
7532 gtk_widget_show (hbox);
7534 check = gtk_check_button_new_with_label("Editable");
7535 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
7536 g_signal_connect (check, "toggled",
7537 G_CALLBACK (text_toggle_editable), text);
7538 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
7539 gtk_widget_show (check);
7541 check = gtk_check_button_new_with_label("Wrap Words");
7542 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
7543 g_signal_connect (check, "toggled",
7544 G_CALLBACK (text_toggle_word_wrap), text);
7545 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
7546 gtk_widget_show (check);
7548 separator = gtk_hseparator_new ();
7549 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7550 gtk_widget_show (separator);
7553 box2 = gtk_vbox_new (FALSE, 10);
7554 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7555 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7556 gtk_widget_show (box2);
7559 button = gtk_button_new_with_label ("insert random");
7560 g_signal_connect (button, "clicked",
7561 G_CALLBACK (text_insert_random),
7563 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7564 gtk_widget_show (button);
7566 button = gtk_button_new_with_label ("close");
7567 g_signal_connect_swapped (button, "clicked",
7568 G_CALLBACK (gtk_widget_destroy),
7570 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7571 gtk_widget_set_can_default (button, TRUE);
7572 gtk_widget_grab_default (button);
7573 gtk_widget_show (button);
7576 if (!gtk_widget_get_visible (window))
7577 gtk_widget_show (window);
7579 gtk_widget_destroy (window);
7586 GdkPixbuf *book_open;
7587 GdkPixbuf *book_closed;
7588 GtkWidget *sample_notebook;
7591 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
7593 GtkWidget *page_widget;
7596 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
7598 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
7599 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
7601 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
7602 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
7606 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
7608 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
7609 gint old_page_num = gtk_notebook_get_current_page (notebook);
7611 if (page_num == old_page_num)
7614 set_page_image (notebook, page_num, book_open);
7616 if (old_page_num != -1)
7617 set_page_image (notebook, old_page_num, book_closed);
7621 tab_fill (GtkToggleButton *button, GtkWidget *child)
7624 GtkPackType pack_type;
7626 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7627 &expand, NULL, &pack_type);
7628 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7629 expand, button->active, pack_type);
7633 tab_expand (GtkToggleButton *button, GtkWidget *child)
7636 GtkPackType pack_type;
7638 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7639 NULL, &fill, &pack_type);
7640 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7641 button->active, fill, pack_type);
7645 tab_pack (GtkToggleButton *button, GtkWidget *child)
7651 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7652 &expand, &fill, NULL);
7653 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7654 expand, fill, button->active);
7658 create_pages (GtkNotebook *notebook, gint start, gint end)
7660 GtkWidget *child = NULL;
7665 GtkWidget *label_box;
7666 GtkWidget *menu_box;
7670 char accel_buffer[32];
7672 for (i = start; i <= end; i++)
7674 sprintf (buffer, "Page %d", i);
7675 sprintf (accel_buffer, "Page _%d", i);
7677 child = gtk_frame_new (buffer);
7678 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
7680 vbox = gtk_vbox_new (TRUE,0);
7681 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
7682 gtk_container_add (GTK_CONTAINER (child), vbox);
7684 hbox = gtk_hbox_new (TRUE,0);
7685 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
7687 button = gtk_check_button_new_with_label ("Fill Tab");
7688 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
7689 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
7690 g_signal_connect (button, "toggled",
7691 G_CALLBACK (tab_fill), child);
7693 button = gtk_check_button_new_with_label ("Expand Tab");
7694 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
7695 g_signal_connect (button, "toggled",
7696 G_CALLBACK (tab_expand), child);
7698 button = gtk_check_button_new_with_label ("Pack end");
7699 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
7700 g_signal_connect (button, "toggled",
7701 G_CALLBACK (tab_pack), child);
7703 button = gtk_button_new_with_label ("Hide Page");
7704 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
7705 g_signal_connect_swapped (button, "clicked",
7706 G_CALLBACK (gtk_widget_hide),
7709 gtk_widget_show_all (child);
7711 label_box = gtk_hbox_new (FALSE, 0);
7712 pixwid = gtk_image_new_from_pixbuf (book_closed);
7713 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
7715 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
7716 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
7717 label = gtk_label_new_with_mnemonic (accel_buffer);
7718 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
7719 gtk_widget_show_all (label_box);
7722 menu_box = gtk_hbox_new (FALSE, 0);
7723 pixwid = gtk_image_new_from_pixbuf (book_closed);
7724 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
7726 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
7727 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
7728 label = gtk_label_new (buffer);
7729 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
7730 gtk_widget_show_all (menu_box);
7732 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
7737 rotate_notebook (GtkButton *button,
7738 GtkNotebook *notebook)
7740 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
7744 show_all_pages (GtkButton *button,
7745 GtkNotebook *notebook)
7747 gtk_container_foreach (GTK_CONTAINER (notebook),
7748 (GtkCallback) gtk_widget_show, NULL);
7752 notebook_type_changed (GtkWidget *optionmenu,
7755 GtkNotebook *notebook;
7765 notebook = GTK_NOTEBOOK (data);
7767 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
7772 /* standard notebook */
7773 gtk_notebook_set_show_tabs (notebook, TRUE);
7774 gtk_notebook_set_show_border (notebook, TRUE);
7775 gtk_notebook_set_scrollable (notebook, FALSE);
7779 /* notabs notebook */
7780 gtk_notebook_set_show_tabs (notebook, FALSE);
7781 gtk_notebook_set_show_border (notebook, TRUE);
7786 gtk_notebook_set_show_tabs (notebook, FALSE);
7787 gtk_notebook_set_show_border (notebook, FALSE);
7792 gtk_notebook_set_show_tabs (notebook, TRUE);
7793 gtk_notebook_set_show_border (notebook, TRUE);
7794 gtk_notebook_set_scrollable (notebook, TRUE);
7795 if (g_list_length (notebook->children) == 5)
7796 create_pages (notebook, 6, 15);
7802 if (g_list_length (notebook->children) == 15)
7803 for (i = 0; i < 10; i++)
7804 gtk_notebook_remove_page (notebook, 5);
7808 notebook_popup (GtkToggleButton *button,
7809 GtkNotebook *notebook)
7812 gtk_notebook_popup_enable (notebook);
7814 gtk_notebook_popup_disable (notebook);
7818 notebook_homogeneous (GtkToggleButton *button,
7819 GtkNotebook *notebook)
7821 g_object_set (notebook, "homogeneous", button->active, NULL);
7825 create_notebook (GtkWidget *widget)
7827 static GtkWidget *window = NULL;
7831 GtkWidget *separator;
7835 static gchar *items[] =
7845 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7846 gtk_window_set_screen (GTK_WINDOW (window),
7847 gtk_widget_get_screen (widget));
7849 g_signal_connect (window, "destroy",
7850 G_CALLBACK (gtk_widget_destroyed),
7853 gtk_window_set_title (GTK_WINDOW (window), "notebook");
7854 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7856 box1 = gtk_vbox_new (FALSE, 0);
7857 gtk_container_add (GTK_CONTAINER (window), box1);
7859 sample_notebook = gtk_notebook_new ();
7860 g_signal_connect (sample_notebook, "switch_page",
7861 G_CALLBACK (page_switch), NULL);
7862 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
7863 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
7864 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
7866 gtk_widget_realize (sample_notebook);
7869 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
7872 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
7874 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
7876 separator = gtk_hseparator_new ();
7877 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
7879 box2 = gtk_hbox_new (FALSE, 5);
7880 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7881 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7883 button = gtk_check_button_new_with_label ("popup menu");
7884 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
7885 g_signal_connect (button, "clicked",
7886 G_CALLBACK (notebook_popup),
7889 button = gtk_check_button_new_with_label ("homogeneous tabs");
7890 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
7891 g_signal_connect (button, "clicked",
7892 G_CALLBACK (notebook_homogeneous),
7895 box2 = gtk_hbox_new (FALSE, 5);
7896 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7897 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7899 label = gtk_label_new ("Notebook Style :");
7900 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
7902 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
7903 notebook_type_changed,
7905 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
7907 button = gtk_button_new_with_label ("Show all Pages");
7908 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
7909 g_signal_connect (button, "clicked",
7910 G_CALLBACK (show_all_pages), sample_notebook);
7912 box2 = gtk_hbox_new (TRUE, 10);
7913 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7914 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7916 button = gtk_button_new_with_label ("prev");
7917 g_signal_connect_swapped (button, "clicked",
7918 G_CALLBACK (gtk_notebook_prev_page),
7920 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7922 button = gtk_button_new_with_label ("next");
7923 g_signal_connect_swapped (button, "clicked",
7924 G_CALLBACK (gtk_notebook_next_page),
7926 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7928 button = gtk_button_new_with_label ("rotate");
7929 g_signal_connect (button, "clicked",
7930 G_CALLBACK (rotate_notebook), sample_notebook);
7931 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7933 separator = gtk_hseparator_new ();
7934 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
7936 button = gtk_button_new_with_label ("close");
7937 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
7938 g_signal_connect_swapped (button, "clicked",
7939 G_CALLBACK (gtk_widget_destroy),
7941 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
7942 gtk_widget_set_can_default (button, TRUE);
7943 gtk_widget_grab_default (button);
7946 if (!gtk_widget_get_visible (window))
7947 gtk_widget_show_all (window);
7949 gtk_widget_destroy (window);
7957 toggle_resize (GtkWidget *widget, GtkWidget *child)
7959 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7960 GValue value = { 0, };
7961 g_value_init (&value, G_TYPE_BOOLEAN);
7962 gtk_container_child_get_property (container, child, "resize", &value);
7963 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7964 gtk_container_child_set_property (container, child, "resize", &value);
7968 toggle_shrink (GtkWidget *widget, GtkWidget *child)
7970 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7971 GValue value = { 0, };
7972 g_value_init (&value, G_TYPE_BOOLEAN);
7973 gtk_container_child_get_property (container, child, "shrink", &value);
7974 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7975 gtk_container_child_set_property (container, child, "shrink", &value);
7979 paned_props_clicked (GtkWidget *button,
7982 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
7984 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
7988 create_pane_options (GtkPaned *paned,
7989 const gchar *frame_label,
7990 const gchar *label1,
7991 const gchar *label2)
7997 GtkWidget *check_button;
7999 frame = gtk_frame_new (frame_label);
8000 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
8002 table = gtk_table_new (4, 2, 4);
8003 gtk_container_add (GTK_CONTAINER (frame), table);
8005 label = gtk_label_new (label1);
8006 gtk_table_attach_defaults (GTK_TABLE (table), label,
8009 check_button = gtk_check_button_new_with_label ("Resize");
8010 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8012 g_signal_connect (check_button, "toggled",
8013 G_CALLBACK (toggle_resize),
8016 check_button = gtk_check_button_new_with_label ("Shrink");
8017 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8019 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8021 g_signal_connect (check_button, "toggled",
8022 G_CALLBACK (toggle_shrink),
8025 label = gtk_label_new (label2);
8026 gtk_table_attach_defaults (GTK_TABLE (table), label,
8029 check_button = gtk_check_button_new_with_label ("Resize");
8030 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8032 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8034 g_signal_connect (check_button, "toggled",
8035 G_CALLBACK (toggle_resize),
8038 check_button = gtk_check_button_new_with_label ("Shrink");
8039 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8041 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8043 g_signal_connect (check_button, "toggled",
8044 G_CALLBACK (toggle_shrink),
8047 button = gtk_button_new_with_mnemonic ("_Properties");
8048 gtk_table_attach_defaults (GTK_TABLE (table), button,
8050 g_signal_connect (button, "clicked",
8051 G_CALLBACK (paned_props_clicked),
8058 create_panes (GtkWidget *widget)
8060 static GtkWidget *window = NULL;
8069 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8071 gtk_window_set_screen (GTK_WINDOW (window),
8072 gtk_widget_get_screen (widget));
8074 g_signal_connect (window, "destroy",
8075 G_CALLBACK (gtk_widget_destroyed),
8078 gtk_window_set_title (GTK_WINDOW (window), "Panes");
8079 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8081 vbox = gtk_vbox_new (FALSE, 0);
8082 gtk_container_add (GTK_CONTAINER (window), vbox);
8084 vpaned = gtk_vpaned_new ();
8085 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
8086 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
8088 hpaned = gtk_hpaned_new ();
8089 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
8091 frame = gtk_frame_new (NULL);
8092 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8093 gtk_widget_set_size_request (frame, 60, 60);
8094 gtk_paned_add1 (GTK_PANED (hpaned), frame);
8096 button = gtk_button_new_with_label ("Hi there");
8097 gtk_container_add (GTK_CONTAINER(frame), button);
8099 frame = gtk_frame_new (NULL);
8100 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8101 gtk_widget_set_size_request (frame, 80, 60);
8102 gtk_paned_add2 (GTK_PANED (hpaned), frame);
8104 frame = gtk_frame_new (NULL);
8105 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8106 gtk_widget_set_size_request (frame, 60, 80);
8107 gtk_paned_add2 (GTK_PANED (vpaned), frame);
8109 /* Now create toggle buttons to control sizing */
8111 gtk_box_pack_start (GTK_BOX (vbox),
8112 create_pane_options (GTK_PANED (hpaned),
8118 gtk_box_pack_start (GTK_BOX (vbox),
8119 create_pane_options (GTK_PANED (vpaned),
8125 gtk_widget_show_all (vbox);
8128 if (!gtk_widget_get_visible (window))
8129 gtk_widget_show (window);
8131 gtk_widget_destroy (window);
8135 * Paned keyboard navigation
8139 paned_keyboard_window1 (GtkWidget *widget)
8162 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8163 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
8164 gtk_window_set_screen (GTK_WINDOW (window1),
8165 gtk_widget_get_screen (widget));
8167 hpaned1 = gtk_hpaned_new ();
8168 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
8170 frame1 = gtk_frame_new (NULL);
8171 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
8172 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
8174 vbox1 = gtk_vbox_new (FALSE, 0);
8175 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
8177 button7 = gtk_button_new_with_label ("button7");
8178 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
8180 button8 = gtk_button_new_with_label ("button8");
8181 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
8183 button9 = gtk_button_new_with_label ("button9");
8184 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
8186 vpaned1 = gtk_vpaned_new ();
8187 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
8189 frame2 = gtk_frame_new (NULL);
8190 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
8191 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
8193 frame5 = gtk_frame_new (NULL);
8194 gtk_container_add (GTK_CONTAINER (frame2), frame5);
8196 hbox1 = gtk_hbox_new (FALSE, 0);
8197 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
8199 button5 = gtk_button_new_with_label ("button5");
8200 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
8202 button6 = gtk_button_new_with_label ("button6");
8203 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
8205 frame3 = gtk_frame_new (NULL);
8206 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
8207 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
8209 frame4 = gtk_frame_new ("Buttons");
8210 gtk_container_add (GTK_CONTAINER (frame3), frame4);
8211 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
8213 table1 = gtk_table_new (2, 2, FALSE);
8214 gtk_container_add (GTK_CONTAINER (frame4), table1);
8215 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
8217 button1 = gtk_button_new_with_label ("button1");
8218 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
8219 (GtkAttachOptions) (GTK_FILL),
8220 (GtkAttachOptions) (0), 0, 0);
8222 button2 = gtk_button_new_with_label ("button2");
8223 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
8224 (GtkAttachOptions) (GTK_FILL),
8225 (GtkAttachOptions) (0), 0, 0);
8227 button3 = gtk_button_new_with_label ("button3");
8228 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
8229 (GtkAttachOptions) (GTK_FILL),
8230 (GtkAttachOptions) (0), 0, 0);
8232 button4 = gtk_button_new_with_label ("button4");
8233 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
8234 (GtkAttachOptions) (GTK_FILL),
8235 (GtkAttachOptions) (0), 0, 0);
8241 paned_keyboard_window2 (GtkWidget *widget)
8246 GtkWidget *button13;
8250 GtkWidget *button12;
8252 GtkWidget *button11;
8253 GtkWidget *button10;
8255 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8256 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
8258 gtk_window_set_screen (GTK_WINDOW (window2),
8259 gtk_widget_get_screen (widget));
8261 hpaned2 = gtk_hpaned_new ();
8262 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
8264 frame6 = gtk_frame_new (NULL);
8265 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
8266 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
8268 button13 = gtk_button_new_with_label ("button13");
8269 gtk_container_add (GTK_CONTAINER (frame6), button13);
8271 hbox2 = gtk_hbox_new (FALSE, 0);
8272 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
8274 vpaned2 = gtk_vpaned_new ();
8275 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
8277 frame7 = gtk_frame_new (NULL);
8278 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
8279 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
8281 button12 = gtk_button_new_with_label ("button12");
8282 gtk_container_add (GTK_CONTAINER (frame7), button12);
8284 frame8 = gtk_frame_new (NULL);
8285 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
8286 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
8288 button11 = gtk_button_new_with_label ("button11");
8289 gtk_container_add (GTK_CONTAINER (frame8), button11);
8291 button10 = gtk_button_new_with_label ("button10");
8292 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
8298 paned_keyboard_window3 (GtkWidget *widget)
8305 GtkWidget *button14;
8308 GtkWidget *button15;
8311 GtkWidget *button16;
8313 GtkWidget *button17;
8315 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8316 g_object_set_data (G_OBJECT (window3), "window3", window3);
8317 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
8319 gtk_window_set_screen (GTK_WINDOW (window3),
8320 gtk_widget_get_screen (widget));
8323 vbox2 = gtk_vbox_new (FALSE, 0);
8324 gtk_container_add (GTK_CONTAINER (window3), vbox2);
8326 label1 = gtk_label_new ("Three panes nested inside each other");
8327 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
8329 hpaned3 = gtk_hpaned_new ();
8330 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
8332 frame9 = gtk_frame_new (NULL);
8333 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
8334 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
8336 button14 = gtk_button_new_with_label ("button14");
8337 gtk_container_add (GTK_CONTAINER (frame9), button14);
8339 hpaned4 = gtk_hpaned_new ();
8340 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
8342 frame10 = gtk_frame_new (NULL);
8343 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
8344 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
8346 button15 = gtk_button_new_with_label ("button15");
8347 gtk_container_add (GTK_CONTAINER (frame10), button15);
8349 hpaned5 = gtk_hpaned_new ();
8350 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
8352 frame11 = gtk_frame_new (NULL);
8353 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
8354 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
8356 button16 = gtk_button_new_with_label ("button16");
8357 gtk_container_add (GTK_CONTAINER (frame11), button16);
8359 frame12 = gtk_frame_new (NULL);
8360 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
8361 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
8363 button17 = gtk_button_new_with_label ("button17");
8364 gtk_container_add (GTK_CONTAINER (frame12), button17);
8370 paned_keyboard_window4 (GtkWidget *widget)
8377 GtkWidget *button19;
8378 GtkWidget *button18;
8381 GtkWidget *button21;
8382 GtkWidget *button20;
8384 GtkWidget *button23;
8385 GtkWidget *button22;
8387 GtkWidget *button25;
8388 GtkWidget *button24;
8390 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8391 g_object_set_data (G_OBJECT (window4), "window4", window4);
8392 gtk_window_set_title (GTK_WINDOW (window4), "window4");
8394 gtk_window_set_screen (GTK_WINDOW (window4),
8395 gtk_widget_get_screen (widget));
8397 vbox3 = gtk_vbox_new (FALSE, 0);
8398 gtk_container_add (GTK_CONTAINER (window4), vbox3);
8400 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
8401 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
8402 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
8404 hpaned6 = gtk_hpaned_new ();
8405 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
8407 vpaned3 = gtk_vpaned_new ();
8408 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
8410 button19 = gtk_button_new_with_label ("button19");
8411 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
8413 button18 = gtk_button_new_with_label ("button18");
8414 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
8416 hbox3 = gtk_hbox_new (FALSE, 0);
8417 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
8419 vpaned4 = gtk_vpaned_new ();
8420 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
8422 button21 = gtk_button_new_with_label ("button21");
8423 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
8425 button20 = gtk_button_new_with_label ("button20");
8426 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
8428 vpaned5 = gtk_vpaned_new ();
8429 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
8431 button23 = gtk_button_new_with_label ("button23");
8432 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
8434 button22 = gtk_button_new_with_label ("button22");
8435 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
8437 vpaned6 = gtk_vpaned_new ();
8438 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
8440 button25 = gtk_button_new_with_label ("button25");
8441 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
8443 button24 = gtk_button_new_with_label ("button24");
8444 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
8450 create_paned_keyboard_navigation (GtkWidget *widget)
8452 static GtkWidget *window1 = NULL;
8453 static GtkWidget *window2 = NULL;
8454 static GtkWidget *window3 = NULL;
8455 static GtkWidget *window4 = NULL;
8458 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
8460 gtk_widget_destroy (window1);
8461 gtk_widget_destroy (window2);
8462 gtk_widget_destroy (window3);
8463 gtk_widget_destroy (window4);
8468 window1 = paned_keyboard_window1 (widget);
8469 g_signal_connect (window1, "destroy",
8470 G_CALLBACK (gtk_widget_destroyed),
8476 window2 = paned_keyboard_window2 (widget);
8477 g_signal_connect (window2, "destroy",
8478 G_CALLBACK (gtk_widget_destroyed),
8484 window3 = paned_keyboard_window3 (widget);
8485 g_signal_connect (window3, "destroy",
8486 G_CALLBACK (gtk_widget_destroyed),
8492 window4 = paned_keyboard_window4 (widget);
8493 g_signal_connect (window4, "destroy",
8494 G_CALLBACK (gtk_widget_destroyed),
8498 if (gtk_widget_get_visible (window1))
8499 gtk_widget_destroy (GTK_WIDGET (window1));
8501 gtk_widget_show_all (GTK_WIDGET (window1));
8503 if (gtk_widget_get_visible (window2))
8504 gtk_widget_destroy (GTK_WIDGET (window2));
8506 gtk_widget_show_all (GTK_WIDGET (window2));
8508 if (gtk_widget_get_visible (window3))
8509 gtk_widget_destroy (GTK_WIDGET (window3));
8511 gtk_widget_show_all (GTK_WIDGET (window3));
8513 if (gtk_widget_get_visible (window4))
8514 gtk_widget_destroy (GTK_WIDGET (window4));
8516 gtk_widget_show_all (GTK_WIDGET (window4));
8524 typedef struct _cursoroffset {gint x,y;} CursorOffset;
8527 shape_pressed (GtkWidget *widget, GdkEventButton *event)
8531 /* ignore double and triple click */
8532 if (event->type != GDK_BUTTON_PRESS)
8535 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
8536 p->x = (int) event->x;
8537 p->y = (int) event->y;
8539 gtk_grab_add (widget);
8540 gdk_pointer_grab (widget->window, TRUE,
8541 GDK_BUTTON_RELEASE_MASK |
8542 GDK_BUTTON_MOTION_MASK |
8543 GDK_POINTER_MOTION_HINT_MASK,
8548 shape_released (GtkWidget *widget)
8550 gtk_grab_remove (widget);
8551 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8556 shape_motion (GtkWidget *widget,
8557 GdkEventMotion *event)
8561 GdkModifierType mask;
8563 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
8566 * Can't use event->x / event->y here
8567 * because I need absolute coordinates.
8569 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
8570 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
8574 shape_create_icon (GdkScreen *screen,
8585 CursorOffset* icon_pos;
8587 GdkBitmap *gdk_pixmap_mask;
8588 GdkPixmap *gdk_pixmap;
8591 style = gtk_widget_get_default_style ();
8592 gc = style->black_gc;
8595 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
8597 window = gtk_window_new (window_type);
8598 gtk_window_set_screen (GTK_WINDOW (window), screen);
8600 fixed = gtk_fixed_new ();
8601 gtk_widget_set_size_request (fixed, 100, 100);
8602 gtk_container_add (GTK_CONTAINER (window), fixed);
8603 gtk_widget_show (fixed);
8605 gtk_widget_set_events (window,
8606 gtk_widget_get_events (window) |
8607 GDK_BUTTON_MOTION_MASK |
8608 GDK_POINTER_MOTION_HINT_MASK |
8609 GDK_BUTTON_PRESS_MASK);
8611 gtk_widget_realize (window);
8612 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
8613 &style->bg[GTK_STATE_NORMAL],
8616 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
8617 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
8618 gtk_widget_show (pixmap);
8620 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
8622 g_object_unref (gdk_pixmap_mask);
8623 g_object_unref (gdk_pixmap);
8625 g_signal_connect (window, "button_press_event",
8626 G_CALLBACK (shape_pressed), NULL);
8627 g_signal_connect (window, "button_release_event",
8628 G_CALLBACK (shape_released), NULL);
8629 g_signal_connect (window, "motion_notify_event",
8630 G_CALLBACK (shape_motion), NULL);
8632 icon_pos = g_new (CursorOffset, 1);
8633 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
8635 gtk_widget_set_uposition (window, x, y);
8636 gtk_widget_show (window);
8642 create_shapes (GtkWidget *widget)
8644 /* Variables used by the Drag/Drop and Shape Window demos */
8645 static GtkWidget *modeller = NULL;
8646 static GtkWidget *sheets = NULL;
8647 static GtkWidget *rings = NULL;
8648 static GtkWidget *with_region = NULL;
8649 GdkScreen *screen = gtk_widget_get_screen (widget);
8651 if (!(file_exists ("Modeller.xpm") &&
8652 file_exists ("FilesQueue.xpm") &&
8653 file_exists ("3DRings.xpm")))
8659 modeller = shape_create_icon (screen, "Modeller.xpm",
8660 440, 140, 0,0, GTK_WINDOW_POPUP);
8662 g_signal_connect (modeller, "destroy",
8663 G_CALLBACK (gtk_widget_destroyed),
8667 gtk_widget_destroy (modeller);
8671 sheets = shape_create_icon (screen, "FilesQueue.xpm",
8672 580, 170, 0,0, GTK_WINDOW_POPUP);
8674 g_signal_connect (sheets, "destroy",
8675 G_CALLBACK (gtk_widget_destroyed),
8680 gtk_widget_destroy (sheets);
8684 rings = shape_create_icon (screen, "3DRings.xpm",
8685 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
8687 g_signal_connect (rings, "destroy",
8688 G_CALLBACK (gtk_widget_destroyed),
8692 gtk_widget_destroy (rings);
8699 with_region = shape_create_icon (screen, "3DRings.xpm",
8700 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
8702 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
8704 g_signal_connect (with_region, "destroy",
8705 G_CALLBACK (gtk_widget_destroyed),
8708 /* reset shape from mask to a region */
8711 region = gdk_region_new ();
8723 gdk_region_union_with_rect (region, &rect);
8731 gdk_window_shape_combine_region (with_region->window,
8736 gtk_widget_destroy (with_region);
8744 create_wmhints (GtkWidget *widget)
8746 static GtkWidget *window = NULL;
8748 GtkWidget *separator;
8757 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8759 gtk_window_set_screen (GTK_WINDOW (window),
8760 gtk_widget_get_screen (widget));
8762 g_signal_connect (window, "destroy",
8763 G_CALLBACK (gtk_widget_destroyed),
8766 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
8767 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8769 gtk_widget_realize (window);
8771 circles = gdk_bitmap_create_from_data (window->window,
8772 (gchar *) circles_bits,
8775 gdk_window_set_icon (window->window, NULL,
8778 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
8780 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
8781 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
8783 box1 = gtk_vbox_new (FALSE, 0);
8784 gtk_container_add (GTK_CONTAINER (window), box1);
8785 gtk_widget_show (box1);
8787 label = gtk_label_new ("Try iconizing me!");
8788 gtk_widget_set_size_request (label, 150, 50);
8789 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
8790 gtk_widget_show (label);
8793 separator = gtk_hseparator_new ();
8794 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
8795 gtk_widget_show (separator);
8798 box2 = gtk_vbox_new (FALSE, 10);
8799 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8800 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8801 gtk_widget_show (box2);
8804 button = gtk_button_new_with_label ("close");
8806 g_signal_connect_swapped (button, "clicked",
8807 G_CALLBACK (gtk_widget_destroy),
8810 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8811 gtk_widget_set_can_default (button, TRUE);
8812 gtk_widget_grab_default (button);
8813 gtk_widget_show (button);
8816 if (!gtk_widget_get_visible (window))
8817 gtk_widget_show (window);
8819 gtk_widget_destroy (window);
8824 * Window state tracking
8828 window_state_callback (GtkWidget *widget,
8829 GdkEventWindowState *event,
8832 GtkWidget *label = data;
8835 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
8836 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
8837 "withdrawn" : "not withdrawn", ", ",
8838 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
8839 "iconified" : "not iconified", ", ",
8840 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
8841 "sticky" : "not sticky", ", ",
8842 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
8843 "maximized" : "not maximized", ", ",
8844 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
8845 "fullscreen" : "not fullscreen",
8846 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
8847 "above" : "not above", ", ",
8848 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
8849 "below" : "not below", ", ",
8852 gtk_label_set_text (GTK_LABEL (label), msg);
8860 tracking_label (GtkWidget *window)
8866 hbox = gtk_hbox_new (FALSE, 5);
8868 g_signal_connect_object (hbox,
8870 G_CALLBACK (gtk_widget_destroy),
8874 label = gtk_label_new ("<no window state events received>");
8875 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
8876 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
8878 g_signal_connect (window,
8879 "window_state_event",
8880 G_CALLBACK (window_state_callback),
8883 button = gtk_button_new_with_label ("Deiconify");
8884 g_signal_connect_object (button,
8886 G_CALLBACK (gtk_window_deiconify),
8889 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8891 button = gtk_button_new_with_label ("Iconify");
8892 g_signal_connect_object (button,
8894 G_CALLBACK (gtk_window_iconify),
8897 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8899 button = gtk_button_new_with_label ("Fullscreen");
8900 g_signal_connect_object (button,
8902 G_CALLBACK (gtk_window_fullscreen),
8905 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8907 button = gtk_button_new_with_label ("Unfullscreen");
8908 g_signal_connect_object (button,
8910 G_CALLBACK (gtk_window_unfullscreen),
8913 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8915 button = gtk_button_new_with_label ("Present");
8916 g_signal_connect_object (button,
8918 G_CALLBACK (gtk_window_present),
8921 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8923 button = gtk_button_new_with_label ("Show");
8924 g_signal_connect_object (button,
8926 G_CALLBACK (gtk_widget_show),
8929 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8931 gtk_widget_show_all (hbox);
8937 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
8939 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8941 gtk_window_set_keep_above (GTK_WINDOW (data),
8942 gtk_toggle_button_get_active (togglebutton));
8944 if (gtk_toggle_button_get_active (togglebutton))
8945 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8949 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
8951 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8953 gtk_window_set_keep_below (GTK_WINDOW (data),
8954 gtk_toggle_button_get_active (togglebutton));
8956 if (gtk_toggle_button_get_active (togglebutton))
8957 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8962 get_state_controls (GtkWidget *window)
8966 GtkWidget *button_above;
8967 GtkWidget *button_below;
8969 vbox = gtk_vbox_new (FALSE, 0);
8971 button = gtk_button_new_with_label ("Stick");
8972 g_signal_connect_object (button,
8974 G_CALLBACK (gtk_window_stick),
8977 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8979 button = gtk_button_new_with_label ("Unstick");
8980 g_signal_connect_object (button,
8982 G_CALLBACK (gtk_window_unstick),
8985 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8987 button = gtk_button_new_with_label ("Maximize");
8988 g_signal_connect_object (button,
8990 G_CALLBACK (gtk_window_maximize),
8993 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8995 button = gtk_button_new_with_label ("Unmaximize");
8996 g_signal_connect_object (button,
8998 G_CALLBACK (gtk_window_unmaximize),
9001 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9003 button = gtk_button_new_with_label ("Iconify");
9004 g_signal_connect_object (button,
9006 G_CALLBACK (gtk_window_iconify),
9009 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9011 button = gtk_button_new_with_label ("Fullscreen");
9012 g_signal_connect_object (button,
9014 G_CALLBACK (gtk_window_fullscreen),
9017 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9019 button = gtk_button_new_with_label ("Unfullscreen");
9020 g_signal_connect_object (button,
9022 G_CALLBACK (gtk_window_unfullscreen),
9025 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9027 button_above = gtk_toggle_button_new_with_label ("Keep above");
9028 g_signal_connect (button_above,
9030 G_CALLBACK (keep_window_above),
9032 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
9034 button_below = gtk_toggle_button_new_with_label ("Keep below");
9035 g_signal_connect (button_below,
9037 G_CALLBACK (keep_window_below),
9039 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
9041 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
9042 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
9044 button = gtk_button_new_with_label ("Hide (withdraw)");
9045 g_signal_connect_object (button,
9047 G_CALLBACK (gtk_widget_hide),
9050 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9052 gtk_widget_show_all (vbox);
9058 create_window_states (GtkWidget *widget)
9060 static GtkWidget *window = NULL;
9063 GtkWidget *iconified;
9065 GtkWidget *controls;
9069 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9070 gtk_window_set_screen (GTK_WINDOW (window),
9071 gtk_widget_get_screen (widget));
9073 g_signal_connect (window, "destroy",
9074 G_CALLBACK (gtk_widget_destroyed),
9077 gtk_window_set_title (GTK_WINDOW (window), "Window states");
9079 box1 = gtk_vbox_new (FALSE, 0);
9080 gtk_container_add (GTK_CONTAINER (window), box1);
9082 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9084 gtk_window_set_screen (GTK_WINDOW (iconified),
9085 gtk_widget_get_screen (widget));
9087 g_signal_connect_object (iconified, "destroy",
9088 G_CALLBACK (gtk_widget_destroy),
9091 gtk_window_iconify (GTK_WINDOW (iconified));
9092 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
9093 controls = get_state_controls (iconified);
9094 gtk_container_add (GTK_CONTAINER (iconified), controls);
9096 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9098 gtk_window_set_screen (GTK_WINDOW (normal),
9099 gtk_widget_get_screen (widget));
9101 g_signal_connect_object (normal, "destroy",
9102 G_CALLBACK (gtk_widget_destroy),
9106 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
9107 controls = get_state_controls (normal);
9108 gtk_container_add (GTK_CONTAINER (normal), controls);
9110 label = tracking_label (iconified);
9111 gtk_container_add (GTK_CONTAINER (box1), label);
9113 label = tracking_label (normal);
9114 gtk_container_add (GTK_CONTAINER (box1), label);
9116 gtk_widget_show_all (iconified);
9117 gtk_widget_show_all (normal);
9118 gtk_widget_show_all (box1);
9121 if (!gtk_widget_get_visible (window))
9122 gtk_widget_show (window);
9124 gtk_widget_destroy (window);
9132 configure_event_callback (GtkWidget *widget,
9133 GdkEventConfigure *event,
9136 GtkWidget *label = data;
9140 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
9142 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
9144 event->x, event->y, event->width, event->height,
9147 gtk_label_set_text (GTK_LABEL (label), msg);
9155 get_ints (GtkWidget *window,
9162 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
9163 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
9165 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
9166 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
9170 set_size_callback (GtkWidget *widget,
9175 get_ints (data, &w, &h);
9177 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
9181 unset_default_size_callback (GtkWidget *widget,
9184 gtk_window_set_default_size (g_object_get_data (data, "target"),
9189 set_default_size_callback (GtkWidget *widget,
9194 get_ints (data, &w, &h);
9196 gtk_window_set_default_size (g_object_get_data (data, "target"),
9201 unset_size_request_callback (GtkWidget *widget,
9204 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9209 set_size_request_callback (GtkWidget *widget,
9214 get_ints (data, &w, &h);
9216 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9221 set_location_callback (GtkWidget *widget,
9226 get_ints (data, &x, &y);
9228 gtk_window_move (g_object_get_data (data, "target"), x, y);
9232 move_to_position_callback (GtkWidget *widget,
9238 window = g_object_get_data (data, "target");
9240 gtk_window_get_position (window, &x, &y);
9242 gtk_window_move (window, x, y);
9246 set_geometry_callback (GtkWidget *entry,
9252 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
9254 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
9256 if (!gtk_window_parse_geometry (target, text))
9257 g_print ("Bad geometry string '%s'\n", text);
9263 allow_shrink_callback (GtkWidget *widget,
9266 g_object_set (g_object_get_data (data, "target"),
9268 GTK_TOGGLE_BUTTON (widget)->active,
9273 allow_grow_callback (GtkWidget *widget,
9276 g_object_set (g_object_get_data (data, "target"),
9278 GTK_TOGGLE_BUTTON (widget)->active,
9283 gravity_selected (GtkWidget *widget,
9286 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
9287 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
9291 pos_selected (GtkWidget *widget,
9294 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
9295 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
9299 move_gravity_window_to_current_position (GtkWidget *widget,
9305 window = GTK_WINDOW (data);
9307 gtk_window_get_position (window, &x, &y);
9309 gtk_window_move (window, x, y);
9313 get_screen_corner (GtkWindow *window,
9318 GdkScreen * screen = gtk_window_get_screen (window);
9320 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
9322 switch (gtk_window_get_gravity (window))
9324 case GDK_GRAVITY_SOUTH_EAST:
9325 *x = gdk_screen_get_width (screen) - w;
9326 *y = gdk_screen_get_height (screen) - h;
9329 case GDK_GRAVITY_NORTH_EAST:
9330 *x = gdk_screen_get_width (screen) - w;
9334 case GDK_GRAVITY_SOUTH_WEST:
9336 *y = gdk_screen_get_height (screen) - h;
9339 case GDK_GRAVITY_NORTH_WEST:
9344 case GDK_GRAVITY_SOUTH:
9345 *x = (gdk_screen_get_width (screen) - w) / 2;
9346 *y = gdk_screen_get_height (screen) - h;
9349 case GDK_GRAVITY_NORTH:
9350 *x = (gdk_screen_get_width (screen) - w) / 2;
9354 case GDK_GRAVITY_WEST:
9356 *y = (gdk_screen_get_height (screen) - h) / 2;
9359 case GDK_GRAVITY_EAST:
9360 *x = gdk_screen_get_width (screen) - w;
9361 *y = (gdk_screen_get_height (screen) - h) / 2;
9364 case GDK_GRAVITY_CENTER:
9365 *x = (gdk_screen_get_width (screen) - w) / 2;
9366 *y = (gdk_screen_get_height (screen) - h) / 2;
9369 case GDK_GRAVITY_STATIC:
9370 /* pick some random numbers */
9376 g_assert_not_reached ();
9382 move_gravity_window_to_starting_position (GtkWidget *widget,
9388 window = GTK_WINDOW (data);
9390 get_screen_corner (window,
9393 gtk_window_move (window, x, y);
9397 make_gravity_window (GtkWidget *destroy_with,
9406 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9408 gtk_window_set_screen (GTK_WINDOW (window),
9409 gtk_widget_get_screen (destroy_with));
9411 vbox = gtk_vbox_new (FALSE, 0);
9412 gtk_widget_show (vbox);
9414 gtk_container_add (GTK_CONTAINER (window), vbox);
9415 gtk_window_set_title (GTK_WINDOW (window), title);
9416 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
9418 g_signal_connect_object (destroy_with,
9420 G_CALLBACK (gtk_widget_destroy),
9425 button = gtk_button_new_with_mnemonic ("_Move to current position");
9427 g_signal_connect (button, "clicked",
9428 G_CALLBACK (move_gravity_window_to_current_position),
9431 gtk_container_add (GTK_CONTAINER (vbox), button);
9432 gtk_widget_show (button);
9434 button = gtk_button_new_with_mnemonic ("Move to _starting position");
9436 g_signal_connect (button, "clicked",
9437 G_CALLBACK (move_gravity_window_to_starting_position),
9440 gtk_container_add (GTK_CONTAINER (vbox), button);
9441 gtk_widget_show (button);
9443 /* Pretend this is the result of --geometry.
9444 * DO NOT COPY THIS CODE unless you are setting --geometry results,
9445 * and in that case you probably should just use gtk_window_parse_geometry().
9446 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
9447 * you are parsing --geometry or equivalent.
9449 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9453 gtk_window_set_default_size (GTK_WINDOW (window),
9456 get_screen_corner (GTK_WINDOW (window), &x, &y);
9458 gtk_window_move (GTK_WINDOW (window),
9465 do_gravity_test (GtkWidget *widget,
9468 GtkWidget *destroy_with = data;
9471 /* We put a window at each gravity point on the screen. */
9472 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
9474 gtk_widget_show (window);
9476 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
9478 gtk_widget_show (window);
9480 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
9482 gtk_widget_show (window);
9484 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
9486 gtk_widget_show (window);
9488 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
9490 gtk_widget_show (window);
9492 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
9494 gtk_widget_show (window);
9497 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
9499 gtk_widget_show (window);
9502 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
9504 gtk_widget_show (window);
9506 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
9508 gtk_widget_show (window);
9510 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
9512 gtk_widget_show (window);
9516 window_controls (GtkWidget *window)
9518 GtkWidget *control_window;
9529 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9531 gtk_window_set_screen (GTK_WINDOW (control_window),
9532 gtk_widget_get_screen (window));
9534 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
9536 g_object_set_data (G_OBJECT (control_window),
9540 g_signal_connect_object (control_window,
9542 G_CALLBACK (gtk_widget_destroy),
9546 vbox = gtk_vbox_new (FALSE, 5);
9548 gtk_container_add (GTK_CONTAINER (control_window), vbox);
9550 label = gtk_label_new ("<no configure events>");
9551 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9553 g_signal_connect (window,
9555 G_CALLBACK (configure_event_callback),
9558 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
9560 spin = gtk_spin_button_new (adj, 0, 0);
9562 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
9564 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
9566 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
9568 spin = gtk_spin_button_new (adj, 0, 0);
9570 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
9572 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
9574 entry = gtk_entry_new ();
9575 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9577 g_signal_connect (entry, "changed",
9578 G_CALLBACK (set_geometry_callback),
9581 button = gtk_button_new_with_label ("Show gravity test windows");
9582 g_signal_connect_swapped (button,
9584 G_CALLBACK (do_gravity_test),
9586 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9588 button = gtk_button_new_with_label ("Reshow with initial size");
9589 g_signal_connect_object (button,
9591 G_CALLBACK (gtk_window_reshow_with_initial_size),
9594 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9596 button = gtk_button_new_with_label ("Queue resize");
9597 g_signal_connect_object (button,
9599 G_CALLBACK (gtk_widget_queue_resize),
9602 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9604 button = gtk_button_new_with_label ("Resize");
9605 g_signal_connect (button,
9607 G_CALLBACK (set_size_callback),
9609 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9611 button = gtk_button_new_with_label ("Set default size");
9612 g_signal_connect (button,
9614 G_CALLBACK (set_default_size_callback),
9616 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9618 button = gtk_button_new_with_label ("Unset default size");
9619 g_signal_connect (button,
9621 G_CALLBACK (unset_default_size_callback),
9623 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9625 button = gtk_button_new_with_label ("Set size request");
9626 g_signal_connect (button,
9628 G_CALLBACK (set_size_request_callback),
9630 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9632 button = gtk_button_new_with_label ("Unset size request");
9633 g_signal_connect (button,
9635 G_CALLBACK (unset_size_request_callback),
9637 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9639 button = gtk_button_new_with_label ("Move");
9640 g_signal_connect (button,
9642 G_CALLBACK (set_location_callback),
9644 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9646 button = gtk_button_new_with_label ("Move to current position");
9647 g_signal_connect (button,
9649 G_CALLBACK (move_to_position_callback),
9651 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9653 button = gtk_check_button_new_with_label ("Allow shrink");
9654 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
9655 g_signal_connect (button,
9657 G_CALLBACK (allow_shrink_callback),
9659 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9661 button = gtk_check_button_new_with_label ("Allow grow");
9662 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
9663 g_signal_connect (button,
9665 G_CALLBACK (allow_grow_callback),
9667 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9669 button = gtk_button_new_with_mnemonic ("_Show");
9670 g_signal_connect_object (button,
9672 G_CALLBACK (gtk_widget_show),
9675 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9677 button = gtk_button_new_with_mnemonic ("_Hide");
9678 g_signal_connect_object (button,
9680 G_CALLBACK (gtk_widget_hide),
9683 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9685 menu = gtk_menu_new ();
9691 static gchar *names[] = {
9692 "GDK_GRAVITY_NORTH_WEST",
9693 "GDK_GRAVITY_NORTH",
9694 "GDK_GRAVITY_NORTH_EAST",
9696 "GDK_GRAVITY_CENTER",
9698 "GDK_GRAVITY_SOUTH_WEST",
9699 "GDK_GRAVITY_SOUTH",
9700 "GDK_GRAVITY_SOUTH_EAST",
9701 "GDK_GRAVITY_STATIC",
9705 g_assert (names[i]);
9707 mi = gtk_menu_item_new_with_label (names[i]);
9709 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
9714 gtk_widget_show_all (menu);
9716 om = gtk_option_menu_new ();
9717 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
9720 g_signal_connect (om,
9722 G_CALLBACK (gravity_selected),
9725 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
9728 menu = gtk_menu_new ();
9734 static gchar *names[] = {
9736 "GTK_WIN_POS_CENTER",
9737 "GTK_WIN_POS_MOUSE",
9738 "GTK_WIN_POS_CENTER_ALWAYS",
9739 "GTK_WIN_POS_CENTER_ON_PARENT",
9743 g_assert (names[i]);
9745 mi = gtk_menu_item_new_with_label (names[i]);
9747 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
9752 gtk_widget_show_all (menu);
9754 om = gtk_option_menu_new ();
9755 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
9758 g_signal_connect (om,
9760 G_CALLBACK (pos_selected),
9763 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
9765 gtk_widget_show_all (vbox);
9767 return control_window;
9771 create_window_sizing (GtkWidget *widget)
9773 static GtkWidget *window = NULL;
9774 static GtkWidget *target_window = NULL;
9780 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9781 gtk_window_set_screen (GTK_WINDOW (target_window),
9782 gtk_widget_get_screen (widget));
9783 label = gtk_label_new (NULL);
9784 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");
9785 gtk_container_add (GTK_CONTAINER (target_window), label);
9786 gtk_widget_show (label);
9788 g_signal_connect (target_window, "destroy",
9789 G_CALLBACK (gtk_widget_destroyed),
9792 window = window_controls (target_window);
9794 g_signal_connect (window, "destroy",
9795 G_CALLBACK (gtk_widget_destroyed),
9798 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
9801 /* don't show target window by default, we want to allow testing
9802 * of behavior on first show.
9805 if (!gtk_widget_get_visible (window))
9806 gtk_widget_show (window);
9808 gtk_widget_destroy (window);
9815 typedef struct _ProgressData {
9818 GtkWidget *block_spin;
9819 GtkWidget *x_align_spin;
9820 GtkWidget *y_align_spin;
9821 GtkWidget *step_spin;
9822 GtkWidget *act_blocks_spin;
9832 progress_timeout (gpointer data)
9837 adj = GTK_PROGRESS (data)->adjustment;
9839 new_val = adj->value + 1;
9840 if (new_val > adj->upper)
9841 new_val = adj->lower;
9843 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
9849 destroy_progress (GtkWidget *widget,
9850 ProgressData **pdata)
9852 gtk_timeout_remove ((*pdata)->timer);
9853 (*pdata)->timer = 0;
9854 (*pdata)->window = NULL;
9860 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
9862 ProgressData *pdata;
9865 pdata = (ProgressData *) data;
9867 if (!gtk_widget_get_mapped (widget))
9870 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
9872 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
9873 (GtkProgressBarOrientation) i);
9877 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
9879 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
9880 GTK_TOGGLE_BUTTON (widget)->active);
9881 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
9882 gtk_widget_set_sensitive (pdata->x_align_spin,
9883 GTK_TOGGLE_BUTTON (widget)->active);
9884 gtk_widget_set_sensitive (pdata->y_align_spin,
9885 GTK_TOGGLE_BUTTON (widget)->active);
9889 progressbar_toggle_ellipsize (GtkWidget *widget,
9892 ProgressData *pdata = data;
9893 if (gtk_widget_is_drawable (widget))
9895 gint i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
9896 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
9901 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
9903 ProgressData *pdata;
9906 pdata = (ProgressData *) data;
9908 if (!gtk_widget_get_mapped (widget))
9911 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
9914 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
9916 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
9918 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
9919 (GtkProgressBarStyle) i);
9923 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
9927 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
9928 sprintf (buf, "???");
9930 sprintf (buf, "%.0f%%", 100 *
9931 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
9932 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
9936 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
9938 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
9939 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
9940 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
9944 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
9946 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
9947 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
9951 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
9953 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
9954 gtk_spin_button_get_value_as_int
9955 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
9959 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
9961 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
9962 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
9963 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
9967 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
9969 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
9970 GTK_TOGGLE_BUTTON (widget)->active);
9971 gtk_widget_set_sensitive (pdata->step_spin,
9972 GTK_TOGGLE_BUTTON (widget)->active);
9973 gtk_widget_set_sensitive (pdata->act_blocks_spin,
9974 GTK_TOGGLE_BUTTON (widget)->active);
9978 entry_changed (GtkWidget *widget, ProgressData *pdata)
9980 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
9981 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
9985 create_progress_bar (GtkWidget *widget)
9997 static ProgressData *pdata = NULL;
9999 static gchar *items1[] =
10007 static gchar *items2[] =
10013 static char *ellipsize_items[] = {
10014 "None", // PANGO_ELLIPSIZE_NONE,
10015 "Start", // PANGO_ELLIPSIZE_START,
10016 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
10017 "End", // PANGO_ELLIPSIZE_END
10021 pdata = g_new0 (ProgressData, 1);
10023 if (!pdata->window)
10025 pdata->window = gtk_dialog_new ();
10027 gtk_window_set_screen (GTK_WINDOW (pdata->window),
10028 gtk_widget_get_screen (widget));
10030 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
10032 g_signal_connect (pdata->window, "destroy",
10033 G_CALLBACK (destroy_progress),
10038 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
10039 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
10041 vbox = gtk_vbox_new (FALSE, 5);
10042 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10043 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
10044 vbox, FALSE, TRUE, 0);
10046 frame = gtk_frame_new ("Progress");
10047 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10049 vbox2 = gtk_vbox_new (FALSE, 5);
10050 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10052 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10053 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10055 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
10056 g_signal_connect (adj, "value_changed",
10057 G_CALLBACK (progress_value_changed), pdata);
10059 pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
10061 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
10063 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10064 "%v from [%l,%u] (=%p%%)");
10065 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
10066 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
10068 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10069 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10071 hbox = gtk_hbox_new (FALSE, 5);
10072 gtk_container_add (GTK_CONTAINER (align), hbox);
10073 label = gtk_label_new ("Label updated by user :");
10074 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10075 pdata->label = gtk_label_new ("");
10076 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
10078 frame = gtk_frame_new ("Options");
10079 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10081 vbox2 = gtk_vbox_new (FALSE, 5);
10082 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10084 tab = gtk_table_new (7, 2, FALSE);
10085 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
10087 label = gtk_label_new ("Orientation :");
10088 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
10089 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10091 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10093 pdata->omenu1 = build_option_menu (items1, 4, 0,
10094 progressbar_toggle_orientation,
10096 hbox = gtk_hbox_new (FALSE, 0);
10097 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
10098 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10100 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
10102 check = gtk_check_button_new_with_label ("Show text");
10103 g_signal_connect (check, "clicked",
10104 G_CALLBACK (toggle_show_text),
10106 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
10107 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10110 hbox = gtk_hbox_new (FALSE, 0);
10111 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
10112 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10115 label = gtk_label_new ("Format : ");
10116 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10118 pdata->entry = gtk_entry_new ();
10119 g_signal_connect (pdata->entry, "changed",
10120 G_CALLBACK (entry_changed),
10122 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
10123 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
10124 gtk_widget_set_size_request (pdata->entry, 100, -1);
10125 gtk_widget_set_sensitive (pdata->entry, FALSE);
10127 label = gtk_label_new ("Text align :");
10128 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
10129 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10131 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10133 hbox = gtk_hbox_new (FALSE, 0);
10134 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
10135 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10138 label = gtk_label_new ("x :");
10139 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10141 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10142 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
10143 g_signal_connect (adj, "value_changed",
10144 G_CALLBACK (adjust_align), pdata);
10145 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
10146 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
10148 label = gtk_label_new ("y :");
10149 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10151 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10152 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
10153 g_signal_connect (adj, "value_changed",
10154 G_CALLBACK (adjust_align), pdata);
10155 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
10156 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
10158 label = gtk_label_new ("Ellipsize text :");
10159 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
10160 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10162 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10163 pdata->elmenu = build_option_menu (ellipsize_items,
10164 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
10165 2, // PANGO_ELLIPSIZE_MIDDLE
10166 progressbar_toggle_ellipsize,
10168 hbox = gtk_hbox_new (FALSE, 0);
10169 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
10170 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10172 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
10174 label = gtk_label_new ("Bar Style :");
10175 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 13, 14,
10176 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10178 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10180 pdata->omenu2 = build_option_menu (items2, 2, 0,
10181 progressbar_toggle_bar_style,
10183 hbox = gtk_hbox_new (FALSE, 0);
10184 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 13, 14,
10185 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10187 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
10189 label = gtk_label_new ("Block count :");
10190 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 14, 15,
10191 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10193 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10195 hbox = gtk_hbox_new (FALSE, 0);
10196 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 14, 15,
10197 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10199 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
10200 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
10201 g_signal_connect (adj, "value_changed",
10202 G_CALLBACK (adjust_blocks), pdata);
10203 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
10204 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10206 check = gtk_check_button_new_with_label ("Activity mode");
10207 g_signal_connect (check, "clicked",
10208 G_CALLBACK (toggle_activity_mode), pdata);
10209 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
10210 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10213 hbox = gtk_hbox_new (FALSE, 0);
10214 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 15, 16,
10215 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10217 label = gtk_label_new ("Step size : ");
10218 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10219 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
10220 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
10221 g_signal_connect (adj, "value_changed",
10222 G_CALLBACK (adjust_step), pdata);
10223 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
10224 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
10226 hbox = gtk_hbox_new (FALSE, 0);
10227 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 16, 17,
10228 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10230 label = gtk_label_new ("Blocks : ");
10231 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10232 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
10233 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
10234 g_signal_connect (adj, "value_changed",
10235 G_CALLBACK (adjust_act_blocks), pdata);
10236 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
10238 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
10240 button = gtk_button_new_with_label ("close");
10241 g_signal_connect_swapped (button, "clicked",
10242 G_CALLBACK (gtk_widget_destroy),
10244 gtk_widget_set_can_default (button, TRUE);
10245 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
10246 button, TRUE, TRUE, 0);
10247 gtk_widget_grab_default (button);
10250 if (!gtk_widget_get_visible (pdata->window))
10251 gtk_widget_show_all (pdata->window);
10253 gtk_widget_destroy (pdata->window);
10265 GtkWidget *res_widget;
10269 find_widget (GtkWidget *widget, FindWidgetData *data)
10271 GtkAllocation new_allocation;
10275 new_allocation = widget->allocation;
10277 if (data->found || !gtk_widget_get_mapped (widget))
10280 /* Note that in the following code, we only count the
10281 * position as being inside a WINDOW widget if it is inside
10282 * widget->window; points that are outside of widget->window
10283 * but within the allocation are not counted. This is consistent
10284 * with the way we highlight drag targets.
10286 if (gtk_widget_get_has_window (widget))
10288 new_allocation.x = 0;
10289 new_allocation.y = 0;
10292 if (widget->parent && !data->first)
10294 GdkWindow *window = widget->window;
10295 while (window != widget->parent->window)
10297 gint tx, ty, twidth, theight;
10298 gdk_drawable_get_size (window, &twidth, &theight);
10300 if (new_allocation.x < 0)
10302 new_allocation.width += new_allocation.x;
10303 new_allocation.x = 0;
10305 if (new_allocation.y < 0)
10307 new_allocation.height += new_allocation.y;
10308 new_allocation.y = 0;
10310 if (new_allocation.x + new_allocation.width > twidth)
10311 new_allocation.width = twidth - new_allocation.x;
10312 if (new_allocation.y + new_allocation.height > theight)
10313 new_allocation.height = theight - new_allocation.y;
10315 gdk_window_get_position (window, &tx, &ty);
10316 new_allocation.x += tx;
10318 new_allocation.y += ty;
10321 window = gdk_window_get_parent (window);
10325 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
10326 (data->x < new_allocation.x + new_allocation.width) &&
10327 (data->y < new_allocation.y + new_allocation.height))
10329 /* First, check if the drag is in a valid drop site in
10330 * one of our children
10332 if (GTK_IS_CONTAINER (widget))
10334 FindWidgetData new_data = *data;
10336 new_data.x -= x_offset;
10337 new_data.y -= y_offset;
10338 new_data.found = FALSE;
10339 new_data.first = FALSE;
10341 gtk_container_forall (GTK_CONTAINER (widget),
10342 (GtkCallback)find_widget,
10345 data->found = new_data.found;
10347 data->res_widget = new_data.res_widget;
10350 /* If not, and this widget is registered as a drop site, check to
10351 * emit "drag_motion" to check if we are actually in
10356 data->found = TRUE;
10357 data->res_widget = widget;
10363 find_widget_at_pointer (GdkDisplay *display)
10365 GtkWidget *widget = NULL;
10366 GdkWindow *pointer_window;
10368 FindWidgetData data;
10370 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
10372 if (pointer_window)
10374 gpointer widget_ptr;
10376 gdk_window_get_user_data (pointer_window, &widget_ptr);
10377 widget = widget_ptr;
10382 gdk_window_get_pointer (widget->window,
10387 data.found = FALSE;
10390 find_widget (widget, &data);
10392 return data.res_widget;
10398 struct PropertiesData {
10399 GtkWidget **window;
10406 destroy_properties (GtkWidget *widget,
10407 struct PropertiesData *data)
10411 *data->window = NULL;
10412 data->window = NULL;
10417 gdk_cursor_unref (data->cursor);
10418 data->cursor = NULL;
10423 g_signal_handler_disconnect (widget, data->handler);
10431 property_query_event (GtkWidget *widget,
10433 struct PropertiesData *data)
10435 GtkWidget *res_widget = NULL;
10437 if (!data->in_query)
10440 if (event->type == GDK_BUTTON_RELEASE)
10442 gtk_grab_remove (widget);
10443 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10446 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
10449 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
10450 gtk_widget_get_screen (widget));
10451 create_prop_editor (G_OBJECT (res_widget), 0);
10454 data->in_query = FALSE;
10461 query_properties (GtkButton *button,
10462 struct PropertiesData *data)
10466 g_signal_connect (button, "event",
10467 G_CALLBACK (property_query_event), data);
10471 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
10474 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
10476 GDK_BUTTON_RELEASE_MASK,
10481 gtk_grab_add (GTK_WIDGET (button));
10483 data->in_query = TRUE;
10487 create_properties (GtkWidget *widget)
10489 static GtkWidget *window = NULL;
10493 struct PropertiesData *data;
10495 data = g_new (struct PropertiesData, 1);
10496 data->window = &window;
10497 data->in_query = FALSE;
10498 data->cursor = NULL;
10503 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10505 gtk_window_set_screen (GTK_WINDOW (window),
10506 gtk_widget_get_screen (widget));
10508 data->handler = g_signal_connect (window, "destroy",
10509 G_CALLBACK (destroy_properties),
10512 gtk_window_set_title (GTK_WINDOW (window), "test properties");
10513 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
10515 vbox = gtk_vbox_new (FALSE, 1);
10516 gtk_container_add (GTK_CONTAINER (window), vbox);
10518 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
10519 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
10521 button = gtk_button_new_with_label ("Query properties");
10522 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
10523 g_signal_connect (button, "clicked",
10524 G_CALLBACK (query_properties),
10528 if (!gtk_widget_get_visible (window))
10529 gtk_widget_show_all (window);
10531 gtk_widget_destroy (window);
10535 struct SnapshotData {
10536 GtkWidget *toplevel_button;
10537 GtkWidget **window;
10540 gboolean is_toplevel;
10545 destroy_snapshot_data (GtkWidget *widget,
10546 struct SnapshotData *data)
10549 *data->window = NULL;
10553 gdk_cursor_unref (data->cursor);
10554 data->cursor = NULL;
10559 g_signal_handler_disconnect (widget, data->handler);
10567 snapshot_widget_event (GtkWidget *widget,
10569 struct SnapshotData *data)
10571 GtkWidget *res_widget = NULL;
10573 if (!data->in_query)
10576 if (event->type == GDK_BUTTON_RELEASE)
10578 gtk_grab_remove (widget);
10579 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10582 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
10583 if (data->is_toplevel && res_widget)
10584 res_widget = gtk_widget_get_toplevel (res_widget);
10588 GtkWidget *window, *image;
10590 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10591 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
10592 gtk_widget_realize (window);
10593 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
10595 /* this branch is needed to convert ARGB -> RGB */
10598 gdk_drawable_get_size (pixmap, &width, &height);
10599 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
10600 gtk_widget_get_colormap (res_widget),
10604 image = gtk_image_new_from_pixbuf (pixbuf);
10605 g_object_unref (pixbuf);
10608 image = gtk_image_new_from_pixmap (pixmap, NULL);
10609 gtk_container_add (GTK_CONTAINER (window), image);
10610 g_object_unref (pixmap);
10611 gtk_widget_show_all (window);
10614 data->in_query = FALSE;
10621 snapshot_widget (GtkButton *button,
10622 struct SnapshotData *data)
10626 g_signal_connect (button, "event",
10627 G_CALLBACK (snapshot_widget_event), data);
10629 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
10632 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
10635 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
10637 GDK_BUTTON_RELEASE_MASK,
10642 gtk_grab_add (GTK_WIDGET (button));
10644 data->in_query = TRUE;
10648 create_snapshot (GtkWidget *widget)
10650 static GtkWidget *window = NULL;
10653 struct SnapshotData *data;
10655 data = g_new (struct SnapshotData, 1);
10656 data->window = &window;
10657 data->in_query = FALSE;
10658 data->cursor = NULL;
10663 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10665 gtk_window_set_screen (GTK_WINDOW (window),
10666 gtk_widget_get_screen (widget));
10668 data->handler = g_signal_connect (window, "destroy",
10669 G_CALLBACK (destroy_snapshot_data),
10672 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
10673 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
10675 vbox = gtk_vbox_new (FALSE, 1);
10676 gtk_container_add (GTK_CONTAINER (window), vbox);
10678 button = gtk_button_new_with_label ("Snapshot widget");
10679 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
10680 g_signal_connect (button, "clicked",
10681 G_CALLBACK (snapshot_widget),
10684 button = gtk_button_new_with_label ("Snapshot toplevel");
10685 data->toplevel_button = button;
10686 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
10687 g_signal_connect (button, "clicked",
10688 G_CALLBACK (snapshot_widget),
10692 if (!gtk_widget_get_visible (window))
10693 gtk_widget_show_all (window);
10695 gtk_widget_destroy (window);
10704 selection_test_received (GtkWidget *list, GtkSelectionData *data)
10707 GtkWidget *list_item;
10711 if (data->length < 0)
10713 g_print ("Selection retrieval failed\n");
10716 if (data->type != GDK_SELECTION_TYPE_ATOM)
10718 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
10722 /* Clear out any current list items */
10724 gtk_list_clear_items (GTK_LIST(list), 0, -1);
10726 /* Add new items to list */
10728 atoms = (GdkAtom *)data->data;
10731 l = data->length / sizeof (GdkAtom);
10732 for (i = 0; i < l; i++)
10735 name = gdk_atom_name (atoms[i]);
10738 list_item = gtk_list_item_new_with_label (name);
10742 list_item = gtk_list_item_new_with_label ("(bad atom)");
10744 gtk_widget_show (list_item);
10745 item_list = g_list_append (item_list, list_item);
10748 gtk_list_append_items (GTK_LIST (list), item_list);
10754 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
10756 static GdkAtom targets_atom = GDK_NONE;
10758 if (targets_atom == GDK_NONE)
10759 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
10761 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
10766 create_selection_test (GtkWidget *widget)
10768 static GtkWidget *window = NULL;
10771 GtkWidget *scrolled_win;
10777 window = gtk_dialog_new ();
10779 gtk_window_set_screen (GTK_WINDOW (window),
10780 gtk_widget_get_screen (widget));
10782 g_signal_connect (window, "destroy",
10783 G_CALLBACK (gtk_widget_destroyed),
10786 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
10787 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10789 /* Create the list */
10791 vbox = gtk_vbox_new (FALSE, 5);
10792 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10793 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
10796 label = gtk_label_new ("Gets available targets for current selection");
10797 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10799 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
10800 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
10801 GTK_POLICY_AUTOMATIC,
10802 GTK_POLICY_AUTOMATIC);
10803 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
10804 gtk_widget_set_size_request (scrolled_win, 100, 200);
10806 list = gtk_list_new ();
10807 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
10809 g_signal_connect (list, "selection_received",
10810 G_CALLBACK (selection_test_received), NULL);
10812 /* .. And create some buttons */
10813 button = gtk_button_new_with_label ("Get Targets");
10814 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10815 button, TRUE, TRUE, 0);
10817 g_signal_connect (button, "clicked",
10818 G_CALLBACK (selection_test_get_targets), list);
10820 button = gtk_button_new_with_label ("Quit");
10821 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10822 button, TRUE, TRUE, 0);
10824 g_signal_connect_swapped (button, "clicked",
10825 G_CALLBACK (gtk_widget_destroy),
10829 if (!gtk_widget_get_visible (window))
10830 gtk_widget_show_all (window);
10832 gtk_widget_destroy (window);
10840 create_gamma_curve (GtkWidget *widget)
10842 static GtkWidget *window = NULL, *curve;
10843 static int count = 0;
10850 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10851 gtk_window_set_screen (GTK_WINDOW (window),
10852 gtk_widget_get_screen (widget));
10854 gtk_window_set_title (GTK_WINDOW (window), "test");
10855 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
10857 g_signal_connect (window, "destroy",
10858 G_CALLBACK(gtk_widget_destroyed),
10861 curve = gtk_gamma_curve_new ();
10862 gtk_container_add (GTK_CONTAINER (window), curve);
10863 gtk_widget_show (curve);
10866 max = 127 + (count % 2)*128;
10867 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
10869 for (i = 0; i < max; ++i)
10870 vec[i] = (127 / sqrt (max)) * sqrt (i);
10871 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
10874 if (!gtk_widget_get_visible (window))
10875 gtk_widget_show (window);
10876 else if (count % 4 == 3)
10878 gtk_widget_destroy (window);
10889 static int scroll_test_pos = 0.0;
10892 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
10893 GtkAdjustment *adj)
10896 gint imin, imax, jmin, jmax;
10898 imin = (event->area.x) / 10;
10899 imax = (event->area.x + event->area.width + 9) / 10;
10901 jmin = ((int)adj->value + event->area.y) / 10;
10902 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
10904 gdk_window_clear_area (widget->window,
10905 event->area.x, event->area.y,
10906 event->area.width, event->area.height);
10908 for (i=imin; i<imax; i++)
10909 for (j=jmin; j<jmax; j++)
10911 gdk_draw_rectangle (widget->window,
10912 widget->style->black_gc,
10914 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
10920 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
10921 GtkAdjustment *adj)
10923 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
10924 -adj->page_increment / 2:
10925 adj->page_increment / 2);
10926 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
10927 gtk_adjustment_set_value (adj, new_value);
10933 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
10934 GtkAdjustment *adj)
10936 adj->page_increment = 0.9 * widget->allocation.height;
10937 adj->page_size = widget->allocation.height;
10939 g_signal_emit_by_name (adj, "changed");
10943 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
10945 /* gint source_min = (int)adj->value - scroll_test_pos; */
10948 dy = scroll_test_pos - (int)adj->value;
10949 scroll_test_pos = adj->value;
10951 if (!gtk_widget_is_drawable (widget))
10953 gdk_window_scroll (widget->window, 0, dy);
10954 gdk_window_process_updates (widget->window, FALSE);
10959 create_scroll_test (GtkWidget *widget)
10961 static GtkWidget *window = NULL;
10963 GtkWidget *drawing_area;
10964 GtkWidget *scrollbar;
10966 GtkAdjustment *adj;
10967 GdkGeometry geometry;
10968 GdkWindowHints geometry_mask;
10972 window = gtk_dialog_new ();
10974 gtk_window_set_screen (GTK_WINDOW (window),
10975 gtk_widget_get_screen (widget));
10977 g_signal_connect (window, "destroy",
10978 G_CALLBACK (gtk_widget_destroyed),
10981 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
10982 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10984 hbox = gtk_hbox_new (FALSE, 0);
10985 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
10987 gtk_widget_show (hbox);
10989 drawing_area = gtk_drawing_area_new ();
10990 gtk_widget_set_size_request (drawing_area, 200, 200);
10991 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
10992 gtk_widget_show (drawing_area);
10994 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
10996 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
10997 scroll_test_pos = 0.0;
10999 scrollbar = gtk_vscrollbar_new (adj);
11000 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
11001 gtk_widget_show (scrollbar);
11003 g_signal_connect (drawing_area, "expose_event",
11004 G_CALLBACK (scroll_test_expose), adj);
11005 g_signal_connect (drawing_area, "configure_event",
11006 G_CALLBACK (scroll_test_configure), adj);
11007 g_signal_connect (drawing_area, "scroll_event",
11008 G_CALLBACK (scroll_test_scroll), adj);
11010 g_signal_connect (adj, "value_changed",
11011 G_CALLBACK (scroll_test_adjustment_changed),
11014 /* .. And create some buttons */
11016 button = gtk_button_new_with_label ("Quit");
11017 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11018 button, TRUE, TRUE, 0);
11020 g_signal_connect_swapped (button, "clicked",
11021 G_CALLBACK (gtk_widget_destroy),
11023 gtk_widget_show (button);
11025 /* Set up gridded geometry */
11027 geometry_mask = GDK_HINT_MIN_SIZE |
11028 GDK_HINT_BASE_SIZE |
11029 GDK_HINT_RESIZE_INC;
11031 geometry.min_width = 20;
11032 geometry.min_height = 20;
11033 geometry.base_width = 0;
11034 geometry.base_height = 0;
11035 geometry.width_inc = 10;
11036 geometry.height_inc = 10;
11038 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11039 drawing_area, &geometry, geometry_mask);
11042 if (!gtk_widget_get_visible (window))
11043 gtk_widget_show (window);
11045 gtk_widget_destroy (window);
11052 static int timer = 0;
11055 timeout_test (GtkWidget *label)
11057 static int count = 0;
11058 static char buffer[32];
11060 sprintf (buffer, "count: %d", ++count);
11061 gtk_label_set_text (GTK_LABEL (label), buffer);
11067 start_timeout_test (GtkWidget *widget,
11072 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
11077 stop_timeout_test (GtkWidget *widget,
11082 gtk_timeout_remove (timer);
11088 destroy_timeout_test (GtkWidget *widget,
11089 GtkWidget **window)
11091 stop_timeout_test (NULL, NULL);
11097 create_timeout_test (GtkWidget *widget)
11099 static GtkWidget *window = NULL;
11105 window = gtk_dialog_new ();
11107 gtk_window_set_screen (GTK_WINDOW (window),
11108 gtk_widget_get_screen (widget));
11110 g_signal_connect (window, "destroy",
11111 G_CALLBACK (destroy_timeout_test),
11114 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
11115 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11117 label = gtk_label_new ("count: 0");
11118 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11119 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11120 label, TRUE, TRUE, 0);
11121 gtk_widget_show (label);
11123 button = gtk_button_new_with_label ("close");
11124 g_signal_connect_swapped (button, "clicked",
11125 G_CALLBACK (gtk_widget_destroy),
11127 gtk_widget_set_can_default (button, TRUE);
11128 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11129 button, TRUE, TRUE, 0);
11130 gtk_widget_grab_default (button);
11131 gtk_widget_show (button);
11133 button = gtk_button_new_with_label ("start");
11134 g_signal_connect (button, "clicked",
11135 G_CALLBACK(start_timeout_test),
11137 gtk_widget_set_can_default (button, TRUE);
11138 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11139 button, TRUE, TRUE, 0);
11140 gtk_widget_show (button);
11142 button = gtk_button_new_with_label ("stop");
11143 g_signal_connect (button, "clicked",
11144 G_CALLBACK (stop_timeout_test),
11146 gtk_widget_set_can_default (button, TRUE);
11147 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11148 button, TRUE, TRUE, 0);
11149 gtk_widget_show (button);
11152 if (!gtk_widget_get_visible (window))
11153 gtk_widget_show (window);
11155 gtk_widget_destroy (window);
11162 static int idle_id = 0;
11165 idle_test (GtkWidget *label)
11167 static int count = 0;
11168 static char buffer[32];
11170 sprintf (buffer, "count: %d", ++count);
11171 gtk_label_set_text (GTK_LABEL (label), buffer);
11177 start_idle_test (GtkWidget *widget,
11182 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
11187 stop_idle_test (GtkWidget *widget,
11192 gtk_idle_remove (idle_id);
11198 destroy_idle_test (GtkWidget *widget,
11199 GtkWidget **window)
11201 stop_idle_test (NULL, NULL);
11207 toggle_idle_container (GObject *button,
11208 GtkContainer *container)
11210 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
11214 create_idle_test (GtkWidget *widget)
11216 static GtkWidget *window = NULL;
11219 GtkWidget *container;
11223 GtkWidget *button2;
11227 window = gtk_dialog_new ();
11229 gtk_window_set_screen (GTK_WINDOW (window),
11230 gtk_widget_get_screen (widget));
11232 g_signal_connect (window, "destroy",
11233 G_CALLBACK (destroy_idle_test),
11236 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
11237 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11239 label = gtk_label_new ("count: 0");
11240 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11241 gtk_widget_show (label);
11244 g_object_new (GTK_TYPE_HBOX,
11246 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
11247 * "GtkWidget::visible", TRUE,
11252 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11253 container, TRUE, TRUE, 0);
11256 g_object_new (GTK_TYPE_FRAME,
11258 "label", "Label Container",
11260 "parent", GTK_DIALOG (window)->vbox,
11263 g_object_new (GTK_TYPE_VBOX,
11268 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
11269 "label", "Resize-Parent",
11270 "user_data", (void*)GTK_RESIZE_PARENT,
11274 "signal::clicked", toggle_idle_container, container,
11276 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
11277 "label", "Resize-Queue",
11278 "user_data", (void*)GTK_RESIZE_QUEUE,
11283 g_object_connect (button,
11284 "signal::clicked", toggle_idle_container, container,
11286 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
11287 "label", "Resize-Immediate",
11288 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
11290 g_object_connect (button2,
11291 "signal::clicked", toggle_idle_container, container,
11293 g_object_set (button2,
11299 button = gtk_button_new_with_label ("close");
11300 g_signal_connect_swapped (button, "clicked",
11301 G_CALLBACK (gtk_widget_destroy),
11303 gtk_widget_set_can_default (button, TRUE);
11304 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11305 button, TRUE, TRUE, 0);
11306 gtk_widget_grab_default (button);
11307 gtk_widget_show (button);
11309 button = gtk_button_new_with_label ("start");
11310 g_signal_connect (button, "clicked",
11311 G_CALLBACK (start_idle_test),
11313 gtk_widget_set_can_default (button, TRUE);
11314 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11315 button, TRUE, TRUE, 0);
11316 gtk_widget_show (button);
11318 button = gtk_button_new_with_label ("stop");
11319 g_signal_connect (button, "clicked",
11320 G_CALLBACK (stop_idle_test),
11322 gtk_widget_set_can_default (button, TRUE);
11323 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11324 button, TRUE, TRUE, 0);
11325 gtk_widget_show (button);
11328 if (!gtk_widget_get_visible (window))
11329 gtk_widget_show (window);
11331 gtk_widget_destroy (window);
11339 reload_all_rc_files (void)
11341 static GdkAtom atom_rcfiles = GDK_NONE;
11343 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
11347 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
11349 for(i = 0; i < 5; i++)
11350 send_event->client.data.l[i] = 0;
11351 send_event->client.data_format = 32;
11352 send_event->client.message_type = atom_rcfiles;
11353 gdk_event_send_clientmessage_toall (send_event);
11355 gdk_event_free (send_event);
11359 create_rc_file (GtkWidget *widget)
11361 static GtkWidget *window = NULL;
11369 window = gtk_dialog_new ();
11371 gtk_window_set_screen (GTK_WINDOW (window),
11372 gtk_widget_get_screen (widget));
11374 g_signal_connect (window, "destroy",
11375 G_CALLBACK (gtk_widget_destroyed),
11378 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
11379 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
11381 vbox = gtk_vbox_new (FALSE, 0);
11382 gtk_container_add (GTK_CONTAINER (frame), vbox);
11384 label = gtk_label_new ("This label should be red");
11385 gtk_widget_set_name (label, "testgtk-red-label");
11386 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11388 label = gtk_label_new ("This label should be green");
11389 gtk_widget_set_name (label, "testgtk-green-label");
11390 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11392 label = gtk_label_new ("This label should be blue");
11393 gtk_widget_set_name (label, "testgtk-blue-label");
11394 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11396 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
11397 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11399 button = gtk_button_new_with_label ("Reload");
11400 g_signal_connect (button, "clicked",
11401 G_CALLBACK (gtk_rc_reparse_all), NULL);
11402 gtk_widget_set_can_default (button, TRUE);
11403 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11404 button, TRUE, TRUE, 0);
11405 gtk_widget_grab_default (button);
11407 button = gtk_button_new_with_label ("Reload All");
11408 g_signal_connect (button, "clicked",
11409 G_CALLBACK (reload_all_rc_files), NULL);
11410 gtk_widget_set_can_default (button, TRUE);
11411 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11412 button, TRUE, TRUE, 0);
11414 button = gtk_button_new_with_label ("Close");
11415 g_signal_connect_swapped (button, "clicked",
11416 G_CALLBACK (gtk_widget_destroy),
11418 gtk_widget_set_can_default (button, TRUE);
11419 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11420 button, TRUE, TRUE, 0);
11423 if (!gtk_widget_get_visible (window))
11424 gtk_widget_show_all (window);
11426 gtk_widget_destroy (window);
11430 * Test of recursive mainloop
11434 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
11441 create_mainloop (GtkWidget *widget)
11443 static GtkWidget *window = NULL;
11449 window = gtk_dialog_new ();
11451 gtk_window_set_screen (GTK_WINDOW (window),
11452 gtk_widget_get_screen (widget));
11454 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
11456 g_signal_connect (window, "destroy",
11457 G_CALLBACK (mainloop_destroyed),
11460 label = gtk_label_new ("In recursive main loop...");
11461 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
11463 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
11465 gtk_widget_show (label);
11467 button = gtk_button_new_with_label ("Leave");
11468 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
11471 g_signal_connect_swapped (button, "clicked",
11472 G_CALLBACK (gtk_widget_destroy),
11475 gtk_widget_set_can_default (button, TRUE);
11476 gtk_widget_grab_default (button);
11478 gtk_widget_show (button);
11481 if (!gtk_widget_get_visible (window))
11483 gtk_widget_show (window);
11485 g_print ("create_mainloop: start\n");
11487 g_print ("create_mainloop: done\n");
11490 gtk_widget_destroy (window);
11494 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
11499 gint imin, imax, jmin, jmax;
11501 layout = GTK_LAYOUT (widget);
11503 if (event->window != layout->bin_window)
11506 imin = (event->area.x) / 10;
11507 imax = (event->area.x + event->area.width + 9) / 10;
11509 jmin = (event->area.y) / 10;
11510 jmax = (event->area.y + event->area.height + 9) / 10;
11512 for (i=imin; i<imax; i++)
11513 for (j=jmin; j<jmax; j++)
11515 gdk_draw_rectangle (layout->bin_window,
11516 widget->style->black_gc,
11524 void create_layout (GtkWidget *widget)
11526 static GtkWidget *window = NULL;
11528 GtkWidget *scrolledwindow;
11537 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11538 gtk_window_set_screen (GTK_WINDOW (window),
11539 gtk_widget_get_screen (widget));
11541 g_signal_connect (window, "destroy",
11542 G_CALLBACK (gtk_widget_destroyed),
11545 gtk_window_set_title (GTK_WINDOW (window), "Layout");
11546 gtk_widget_set_size_request (window, 200, 200);
11548 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
11549 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
11551 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
11552 GTK_CORNER_TOP_RIGHT);
11554 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
11556 layout = gtk_layout_new (NULL, NULL);
11557 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
11559 /* We set step sizes here since GtkLayout does not set
11562 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
11563 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
11565 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
11566 g_signal_connect (layout, "expose_event",
11567 G_CALLBACK (layout_expose_handler), NULL);
11569 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
11571 for (i=0 ; i < 16 ; i++)
11572 for (j=0 ; j < 16 ; j++)
11574 sprintf(buf, "Button %d, %d", i, j);
11576 button = gtk_button_new_with_label (buf);
11578 button = gtk_label_new (buf);
11580 gtk_layout_put (GTK_LAYOUT (layout), button,
11584 for (i=16; i < 1280; i++)
11586 sprintf(buf, "Button %d, %d", i, 0);
11588 button = gtk_button_new_with_label (buf);
11590 button = gtk_label_new (buf);
11592 gtk_layout_put (GTK_LAYOUT (layout), button,
11597 if (!gtk_widget_get_visible (window))
11598 gtk_widget_show_all (window);
11600 gtk_widget_destroy (window);
11604 create_styles (GtkWidget *widget)
11606 static GtkWidget *window = NULL;
11611 static GdkColor red = { 0, 0xffff, 0, 0 };
11612 static GdkColor green = { 0, 0, 0xffff, 0 };
11613 static GdkColor blue = { 0, 0, 0, 0xffff };
11614 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
11615 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
11616 PangoFontDescription *font_desc;
11618 GtkRcStyle *rc_style;
11622 window = gtk_dialog_new ();
11623 gtk_window_set_screen (GTK_WINDOW (window),
11624 gtk_widget_get_screen (widget));
11626 g_signal_connect (window, "destroy",
11627 G_CALLBACK (gtk_widget_destroyed),
11631 button = gtk_button_new_with_label ("Close");
11632 g_signal_connect_swapped (button, "clicked",
11633 G_CALLBACK (gtk_widget_destroy),
11635 gtk_widget_set_can_default (button, TRUE);
11636 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11637 button, TRUE, TRUE, 0);
11638 gtk_widget_show (button);
11640 vbox = gtk_vbox_new (FALSE, 5);
11641 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11642 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
11644 label = gtk_label_new ("Font:");
11645 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11646 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11648 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
11650 button = gtk_button_new_with_label ("Some Text");
11651 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
11652 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11654 label = gtk_label_new ("Foreground:");
11655 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11656 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11658 button = gtk_button_new_with_label ("Some Text");
11659 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
11660 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11662 label = gtk_label_new ("Background:");
11663 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11664 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11666 button = gtk_button_new_with_label ("Some Text");
11667 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
11668 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11670 label = gtk_label_new ("Text:");
11671 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11672 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11674 entry = gtk_entry_new ();
11675 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
11676 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
11677 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11679 label = gtk_label_new ("Base:");
11680 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11681 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11683 entry = gtk_entry_new ();
11684 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
11685 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
11686 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11688 label = gtk_label_new ("Cursor:");
11689 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11690 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11692 entry = gtk_entry_new ();
11693 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
11694 gtk_widget_modify_cursor (entry, &red, &red);
11695 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11697 label = gtk_label_new ("Multiple:");
11698 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11699 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11701 button = gtk_button_new_with_label ("Some Text");
11703 rc_style = gtk_rc_style_new ();
11705 rc_style->font_desc = pango_font_description_copy (font_desc);
11706 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
11707 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
11708 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
11709 rc_style->fg[GTK_STATE_NORMAL] = yellow;
11710 rc_style->bg[GTK_STATE_NORMAL] = blue;
11711 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
11712 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
11713 rc_style->fg[GTK_STATE_ACTIVE] = red;
11714 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
11715 rc_style->xthickness = 5;
11716 rc_style->ythickness = 5;
11718 gtk_widget_modify_style (button, rc_style);
11719 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
11721 g_object_unref (rc_style);
11723 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11726 if (!gtk_widget_get_visible (window))
11727 gtk_widget_show_all (window);
11729 gtk_widget_destroy (window);
11733 * Main Window and Exit
11737 do_exit (GtkWidget *widget, GtkWidget *window)
11739 gtk_widget_destroy (window);
11745 void (*func) (GtkWidget *widget);
11746 gboolean do_not_benchmark;
11749 { "alpha window", create_alpha_window },
11750 { "big windows", create_big_windows },
11751 { "button box", create_button_box },
11752 { "buttons", create_buttons },
11753 { "check buttons", create_check_buttons },
11754 { "color selection", create_color_selection },
11755 { "composited window", create_composited_window },
11756 { "cursors", create_cursors },
11757 { "dialog", create_dialog },
11758 { "display & screen", create_display_screen, TRUE },
11759 { "entry", create_entry },
11760 { "event box", create_event_box },
11761 { "event watcher", create_event_watcher },
11762 { "expander", create_expander },
11763 { "flipping", create_flipping },
11764 { "focus", create_focus },
11765 { "font selection", create_font_selection },
11766 { "gamma curve", create_gamma_curve, TRUE },
11767 { "gridded geometry", create_gridded_geometry },
11768 { "handle box", create_handle_box },
11769 { "image from drawable", create_get_image },
11770 { "image", create_image },
11771 { "item factory", create_item_factory },
11772 { "key lookup", create_key_lookup },
11773 { "labels", create_labels },
11774 { "layout", create_layout },
11775 { "list", create_list },
11776 { "menus", create_menus },
11777 { "message dialog", create_message_dialog },
11778 { "modal window", create_modal_window, TRUE },
11779 { "notebook", create_notebook },
11780 { "panes", create_panes },
11781 { "paned keyboard", create_paned_keyboard_navigation },
11782 { "pixmap", create_pixmap },
11783 { "progress bar", create_progress_bar },
11784 { "properties", create_properties },
11785 { "radio buttons", create_radio_buttons },
11786 { "range controls", create_range_controls },
11787 { "rc file", create_rc_file },
11788 { "reparent", create_reparent },
11789 { "resize grips", create_resize_grips },
11790 { "rotated label", create_rotated_label },
11791 { "rotated text", create_rotated_text },
11792 { "rulers", create_rulers },
11793 { "saved position", create_saved_position },
11794 { "scrolled windows", create_scrolled_windows },
11795 { "shapes", create_shapes },
11796 { "size groups", create_size_groups },
11797 { "snapshot", create_snapshot },
11798 { "spinbutton", create_spins },
11799 { "statusbar", create_statusbar },
11800 { "styles", create_styles },
11801 { "test idle", create_idle_test },
11802 { "test mainloop", create_mainloop, TRUE },
11803 { "test scrolling", create_scroll_test },
11804 { "test selection", create_selection_test },
11805 { "test timeout", create_timeout_test },
11806 { "text", create_text },
11807 { "toggle buttons", create_toggle_buttons },
11808 { "toolbar", create_toolbar },
11809 { "tooltips", create_tooltips },
11810 { "tree", create_tree_mode_window},
11811 { "WM hints", create_wmhints },
11812 { "window sizing", create_window_sizing },
11813 { "window states", create_window_states }
11815 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
11818 create_main_window (void)
11823 GtkWidget *scrolled_window;
11827 GtkWidget *separator;
11828 GdkGeometry geometry;
11831 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11832 gtk_widget_set_name (window, "main window");
11833 gtk_widget_set_uposition (window, 50, 20);
11834 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
11836 geometry.min_width = -1;
11837 geometry.min_height = -1;
11838 geometry.max_width = -1;
11839 geometry.max_height = G_MAXSHORT;
11840 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
11842 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
11844 g_signal_connect (window, "destroy",
11845 G_CALLBACK (gtk_main_quit),
11847 g_signal_connect (window, "delete-event",
11848 G_CALLBACK (gtk_false),
11851 box1 = gtk_vbox_new (FALSE, 0);
11852 gtk_container_add (GTK_CONTAINER (window), box1);
11854 if (gtk_micro_version > 0)
11859 gtk_micro_version);
11864 gtk_minor_version);
11866 label = gtk_label_new (buffer);
11867 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
11868 gtk_widget_set_name (label, "testgtk-version-label");
11870 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
11871 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
11872 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
11874 GTK_POLICY_AUTOMATIC);
11875 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
11877 box2 = gtk_vbox_new (FALSE, 0);
11878 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
11879 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
11880 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
11881 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
11882 gtk_widget_show (box2);
11884 for (i = 0; i < nbuttons; i++)
11886 button = gtk_button_new_with_label (buttons[i].label);
11887 if (buttons[i].func)
11888 g_signal_connect (button,
11890 G_CALLBACK(buttons[i].func),
11893 gtk_widget_set_sensitive (button, FALSE);
11894 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
11897 separator = gtk_hseparator_new ();
11898 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
11900 box2 = gtk_vbox_new (FALSE, 10);
11901 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
11902 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
11904 button = gtk_button_new_with_mnemonic ("_Close");
11905 g_signal_connect (button, "clicked",
11906 G_CALLBACK (do_exit),
11908 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
11909 gtk_widget_set_can_default (button, TRUE);
11910 gtk_widget_grab_default (button);
11912 gtk_widget_show_all (window);
11918 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
11919 G_FILE_TEST_EXISTS))
11921 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
11922 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
11927 pad (const char *str, int to)
11929 static char buf[256];
11930 int len = strlen (str);
11933 for (i = 0; i < to; i++)
11938 memcpy (buf, str, len);
11944 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
11946 fn (widget); /* on */
11947 while (g_main_context_iteration (NULL, FALSE));
11948 fn (widget); /* off */
11949 while (g_main_context_iteration (NULL, FALSE));
11953 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
11959 static gboolean printed_headers = FALSE;
11961 if (!printed_headers) {
11962 g_print ("Test Iters First Other\n");
11963 g_print ("-------------------- ----- ---------- ----------\n");
11964 printed_headers = TRUE;
11967 g_get_current_time (&tv0);
11968 bench_iteration (widget, fn);
11969 g_get_current_time (&tv1);
11971 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
11972 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
11974 g_get_current_time (&tv0);
11975 for (n = 0; n < num - 1; n++)
11976 bench_iteration (widget, fn);
11977 g_get_current_time (&tv1);
11978 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
11979 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
11981 g_print ("%s %5d ", pad (name, 20), num);
11983 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
11985 g_print ("%10.1f\n", dt_first);
11989 do_bench (char* what, int num)
11993 void (* fn) (GtkWidget *widget);
11995 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11997 if (g_ascii_strcasecmp (what, "ALL") == 0)
11999 for (i = 0; i < nbuttons; i++)
12001 if (!buttons[i].do_not_benchmark)
12002 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
12009 for (i = 0; i < nbuttons; i++)
12011 if (strcmp (buttons[i].label, what) == 0)
12013 fn = buttons[i].func;
12019 g_print ("Can't bench: \"%s\" not found.\n", what);
12021 do_real_bench (widget, fn, buttons[i].label, num);
12028 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
12033 main (int argc, char *argv[])
12035 GtkBindingSet *binding_set;
12037 gboolean done_benchmarks = FALSE;
12039 srand (time (NULL));
12043 /* Check to see if we are being run from the correct
12046 if (file_exists ("testgtkrc"))
12047 gtk_rc_add_default_file ("testgtkrc");
12048 else if (file_exists ("tests/testgtkrc"))
12049 gtk_rc_add_default_file ("tests/testgtkrc");
12051 g_warning ("Couldn't find file \"testgtkrc\".");
12053 g_set_application_name ("GTK+ Test Program");
12055 gtk_init (&argc, &argv);
12057 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
12066 for (i = 1; i < argc; i++)
12068 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
12075 nextarg = strchr (argv[i], '=');
12086 count = strchr (nextarg, ':');
12089 what = g_strndup (nextarg, count - nextarg);
12091 num = atoi (count);
12096 what = g_strdup (nextarg);
12098 do_bench (what, num ? num : 1);
12099 done_benchmarks = TRUE;
12104 if (done_benchmarks)
12109 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
12110 gtk_binding_entry_add_signal (binding_set,
12111 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
12114 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
12116 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
12120 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
12121 " fg[NORMAL] = \"#ff0000\"\n"
12122 " font = \"Sans 18\"\n"
12124 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
12126 create_main_window ();
12132 while (g_main_context_pending (NULL))
12133 g_main_context_iteration (NULL, FALSE);
12136 while (g_main_context_pending (NULL))
12137 g_main_context_iteration (NULL, FALSE);