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));
4158 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4159 gtk_widget_show (menuitem);
4161 gtk_widget_set_sensitive (menuitem, FALSE);
4164 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
4168 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
4169 create_menu (screen, depth - 1, 5, TRUE));
4176 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
4179 GtkWidget *menuitem;
4185 menu = gtk_menu_new ();
4186 gtk_menu_set_screen (GTK_MENU (menu), screen);
4191 menuitem = gtk_tearoff_menu_item_new ();
4192 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4193 gtk_widget_show (menuitem);
4197 menuitem = gtk_menu_item_new_with_label ("items");
4198 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4200 submenu = gtk_menu_new ();
4201 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4202 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4203 gtk_widget_show (menuitem);
4206 /* now fill the items submenu */
4207 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4208 GTK_ICON_SIZE_MENU);
4209 gtk_widget_show (image);
4210 menuitem = gtk_image_menu_item_new_with_label ("Image");
4211 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4212 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4213 gtk_widget_show (menuitem);
4215 menuitem = gtk_menu_item_new_with_label ("x");
4216 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
4217 gtk_widget_show (menuitem);
4219 menuitem = gtk_menu_item_new_with_label ("x");
4220 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
4221 gtk_widget_show (menuitem);
4223 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4224 GTK_ICON_SIZE_MENU);
4225 gtk_widget_show (image);
4226 menuitem = gtk_image_menu_item_new_with_label ("Image");
4227 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4228 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4229 gtk_widget_show (menuitem);
4231 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4232 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
4233 gtk_widget_show (menuitem);
4235 menuitem = gtk_menu_item_new_with_label ("x");
4236 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
4237 gtk_widget_show (menuitem);
4239 menuitem = gtk_menu_item_new_with_label ("x");
4240 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
4241 gtk_widget_show (menuitem);
4243 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4244 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
4245 gtk_widget_show (menuitem);
4247 menuitem = gtk_check_menu_item_new_with_label ("Check");
4248 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
4249 gtk_widget_show (menuitem);
4251 menuitem = gtk_menu_item_new_with_label ("x");
4252 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
4253 gtk_widget_show (menuitem);
4255 menuitem = gtk_menu_item_new_with_label ("x");
4256 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
4257 gtk_widget_show (menuitem);
4259 menuitem = gtk_check_menu_item_new_with_label ("Check");
4260 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
4261 gtk_widget_show (menuitem);
4263 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4264 gtk_widget_show (menuitem);
4265 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
4267 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4268 gtk_widget_show (menuitem);
4269 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
4271 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4272 gtk_widget_show (menuitem);
4273 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
4275 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4276 gtk_widget_show (menuitem);
4277 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
4279 /* end of items submenu */
4281 menuitem = gtk_menu_item_new_with_label ("spanning");
4282 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4284 submenu = gtk_menu_new ();
4285 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4286 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4287 gtk_widget_show (menuitem);
4290 /* now fill the spanning submenu */
4291 menuitem = gtk_menu_item_new_with_label ("a");
4292 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
4293 gtk_widget_show (menuitem);
4295 menuitem = gtk_menu_item_new_with_label ("b");
4296 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
4297 gtk_widget_show (menuitem);
4299 menuitem = gtk_menu_item_new_with_label ("c");
4300 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
4301 gtk_widget_show (menuitem);
4303 menuitem = gtk_menu_item_new_with_label ("d");
4304 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4305 gtk_widget_show (menuitem);
4307 menuitem = gtk_menu_item_new_with_label ("e");
4308 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
4309 gtk_widget_show (menuitem);
4310 /* end of spanning submenu */
4312 menuitem = gtk_menu_item_new_with_label ("left");
4313 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
4314 submenu = gtk_menu_new ();
4315 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4316 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4317 gtk_widget_show (menuitem);
4319 menuitem = gtk_menu_item_new_with_label ("Empty");
4320 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4321 submenu = gtk_menu_new ();
4322 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4323 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4324 gtk_widget_show (menuitem);
4326 menuitem = gtk_menu_item_new_with_label ("right");
4327 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
4328 submenu = gtk_menu_new ();
4329 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4330 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4331 gtk_widget_show (menuitem);
4333 menuitem = gtk_menu_item_new_with_label ("Empty");
4334 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4335 gtk_widget_show (menuitem);
4339 for (; j < rows; j++)
4340 for (i = 0; i < cols; i++)
4342 sprintf (buf, "(%d %d)", i, j);
4343 menuitem = gtk_menu_item_new_with_label (buf);
4344 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
4345 gtk_widget_show (menuitem);
4348 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4349 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
4350 gtk_widget_show (menuitem);
4351 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4352 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
4353 gtk_widget_show (menuitem);
4354 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4355 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
4356 gtk_widget_show (menuitem);
4357 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4358 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
4359 gtk_widget_show (menuitem);
4365 create_menus (GtkWidget *widget)
4367 static GtkWidget *window = NULL;
4371 GtkWidget *optionmenu;
4372 GtkWidget *separator;
4378 GtkWidget *menuitem;
4379 GtkAccelGroup *accel_group;
4381 GdkScreen *screen = gtk_widget_get_screen (widget);
4383 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4385 gtk_window_set_screen (GTK_WINDOW (window), screen);
4387 g_signal_connect (window, "destroy",
4388 G_CALLBACK (gtk_widget_destroyed),
4390 g_signal_connect (window, "delete-event",
4391 G_CALLBACK (gtk_true),
4394 accel_group = gtk_accel_group_new ();
4395 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4397 gtk_window_set_title (GTK_WINDOW (window), "menus");
4398 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4401 box1 = gtk_vbox_new (FALSE, 0);
4402 gtk_container_add (GTK_CONTAINER (window), box1);
4403 gtk_widget_show (box1);
4405 menubar = gtk_menu_bar_new ();
4406 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4407 gtk_widget_show (menubar);
4409 menu = create_menu (screen, 2, 50, TRUE);
4411 menuitem = gtk_menu_item_new_with_label ("test\nline2");
4412 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4413 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4414 gtk_widget_show (menuitem);
4416 menu = create_table_menu (screen, 2, 50, TRUE);
4418 menuitem = gtk_menu_item_new_with_label ("table");
4419 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4420 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4421 gtk_widget_show (menuitem);
4423 menuitem = gtk_menu_item_new_with_label ("foo");
4424 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
4425 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4426 gtk_widget_show (menuitem);
4428 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4429 GTK_ICON_SIZE_MENU);
4430 gtk_widget_show (image);
4431 menuitem = gtk_image_menu_item_new_with_label ("Help");
4432 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4433 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
4434 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
4435 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4436 gtk_widget_show (menuitem);
4438 menubar = gtk_menu_bar_new ();
4439 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4440 gtk_widget_show (menubar);
4442 menu = create_menu (screen, 2, 10, TRUE);
4444 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
4445 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4446 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4447 gtk_widget_show (menuitem);
4449 box2 = gtk_vbox_new (FALSE, 10);
4450 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4451 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4452 gtk_widget_show (box2);
4454 menu = create_menu (screen, 1, 5, FALSE);
4455 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
4457 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
4458 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4459 gtk_widget_show (menuitem);
4461 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
4462 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4463 gtk_widget_show (menuitem);
4464 gtk_widget_add_accelerator (menuitem,
4470 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
4471 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4472 gtk_widget_show (menuitem);
4473 gtk_widget_add_accelerator (menuitem,
4478 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4479 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
4480 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4481 gtk_widget_show (menuitem);
4482 gtk_widget_add_accelerator (menuitem,
4488 gtk_widget_add_accelerator (menuitem,
4495 optionmenu = gtk_option_menu_new ();
4496 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
4497 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
4498 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
4499 gtk_widget_show (optionmenu);
4501 separator = gtk_hseparator_new ();
4502 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4503 gtk_widget_show (separator);
4505 box2 = gtk_vbox_new (FALSE, 10);
4506 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4507 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4508 gtk_widget_show (box2);
4510 button = gtk_button_new_with_label ("close");
4511 g_signal_connect_swapped (button, "clicked",
4512 G_CALLBACK (gtk_widget_destroy),
4514 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4515 gtk_widget_set_can_default (button, TRUE);
4516 gtk_widget_grab_default (button);
4517 gtk_widget_show (button);
4520 if (!gtk_widget_get_visible (window))
4521 gtk_widget_show (window);
4523 gtk_widget_destroy (window);
4527 gtk_ifactory_cb (gpointer callback_data,
4528 guint callback_action,
4531 g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
4534 /* GdkPixbuf RGBA C-Source image dump */
4536 static const guint8 apple[] =
4538 /* Pixbuf magic (0x47646b50) */
4540 /* length: header (24) + pixel_data (2304) */
4542 /* pixdata_type (0x1010002) */
4544 /* rowstride (96) */
4551 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4552 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4553 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4554 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4555 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
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\26\24"
4558 "\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"
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`m"
4560 "[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"
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`l[Blza\373s\202d\354w\206g\372p~c"
4563 "\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"
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\0"
4565 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
4566 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
4567 "\0\0\0\0\0\0\0\0\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"
4568 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
4569 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
4570 "\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["
4571 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
4572 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
4573 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
4574 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
4575 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
4576 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
4577 "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"
4578 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
4579 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
4580 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
4581 "\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"
4582 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
4583 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
4584 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
4585 "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"
4586 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
4587 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
4588 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
4589 "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"
4590 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
4591 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
4592 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4593 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4594 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4595 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4596 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4597 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4598 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4599 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4600 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4601 "\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>"
4602 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4603 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4604 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4605 "\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"
4606 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4607 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4608 "\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"
4609 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4610 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4611 "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"
4612 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4613 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4614 "\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"
4615 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4616 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4617 "\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"
4618 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4619 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4620 "\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"
4621 "\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"
4622 "\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"
4623 "\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"
4624 "\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"
4625 "\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"
4626 "\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"
4627 "\0\0\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"
4628 "\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"
4629 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4633 dump_accels (gpointer callback_data,
4634 guint callback_action,
4637 gtk_accel_map_save_fd (1 /* stdout */);
4640 static GtkItemFactoryEntry menu_items[] =
4642 { "/_File", NULL, NULL, 0, "<Branch>" },
4643 { "/File/tearoff1", NULL, gtk_ifactory_cb, 0, "<Tearoff>" },
4644 { "/File/_New", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_NEW },
4645 { "/File/_Open", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
4646 { "/File/_Save", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4647 { "/File/Save _As...", "<control>A", gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4648 { "/File/_Dump \"_Accels\"", NULL, dump_accels, 0 },
4649 { "/File/\\/Test__Escaping/And\\/\n\tWei\\\\rdly",
4650 NULL, gtk_ifactory_cb, 0 },
4651 { "/File/sep1", NULL, gtk_ifactory_cb, 0, "<Separator>" },
4652 { "/File/_Quit", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
4654 { "/_Preferences", NULL, 0, 0, "<Branch>" },
4655 { "/_Preferences/_Color", NULL, 0, 0, "<Branch>" },
4656 { "/_Preferences/Color/_Red", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4657 { "/_Preferences/Color/_Green", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4658 { "/_Preferences/Color/_Blue", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4659 { "/_Preferences/_Shape", NULL, 0, 0, "<Branch>" },
4660 { "/_Preferences/Shape/_Square", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4661 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
4662 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
4663 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
4664 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
4665 { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple },
4666 { "/_Preferences/Coffee", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4667 { "/_Preferences/Toast", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4668 { "/_Preferences/Marshmallow Froot Loops", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4670 /* For testing deletion of menus */
4671 { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
4672 { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
4673 { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
4675 { "/_Help", NULL, 0, 0, "<LastBranch>" },
4676 { "/Help/_Help", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_HELP},
4677 { "/Help/_About", NULL, gtk_ifactory_cb, 0 },
4681 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
4684 create_item_factory (GtkWidget *widget)
4686 static GtkWidget *window = NULL;
4692 GtkWidget *separator;
4695 GtkAccelGroup *accel_group;
4696 GtkItemFactory *item_factory;
4697 GtkTooltips *tooltips;
4699 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4701 gtk_window_set_screen (GTK_WINDOW (window),
4702 gtk_widget_get_screen (widget));
4704 g_signal_connect (window, "destroy",
4705 G_CALLBACK(gtk_widget_destroyed),
4707 g_signal_connect (window, "delete-event",
4708 G_CALLBACK (gtk_true),
4711 accel_group = gtk_accel_group_new ();
4712 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
4713 g_object_set_data_full (G_OBJECT (window),
4717 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4718 gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
4719 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4720 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
4722 /* preselect /Preferences/Shape/Oval over the other radios
4724 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4725 "/Preferences/Shape/Oval")),
4728 /* preselect /Preferences/Coffee
4730 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4731 "/Preferences/Coffee")),
4734 /* preselect /Preferences/Marshmallow Froot Loops and set it insensitive
4736 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4737 "/Preferences/Marshmallow Froot Loops")),
4739 gtk_widget_set_sensitive (GTK_WIDGET (gtk_item_factory_get_item (item_factory,
4740 "/Preferences/Marshmallow Froot Loops")),
4743 /* Test how tooltips (ugh) work on menu items
4745 tooltips = gtk_tooltips_new ();
4746 g_object_ref (tooltips);
4747 gtk_object_sink (GTK_OBJECT (tooltips));
4748 g_object_set_data_full (G_OBJECT (window), "testgtk-tooltips",
4749 tooltips, (GDestroyNotify)g_object_unref);
4751 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/New"),
4752 "Create a new file", NULL);
4753 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Open"),
4754 "Open a file", NULL);
4755 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Save"),
4757 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/Preferences/Color"),
4758 "Modify color", NULL);
4760 box1 = gtk_vbox_new (FALSE, 0);
4761 gtk_container_add (GTK_CONTAINER (window), box1);
4763 gtk_box_pack_start (GTK_BOX (box1),
4764 gtk_item_factory_get_widget (item_factory, "<main>"),
4767 label = gtk_label_new ("Type\n<alt>\nto start");
4768 gtk_widget_set_size_request (label, 200, 200);
4769 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
4770 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
4773 separator = gtk_hseparator_new ();
4774 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4777 box2 = gtk_vbox_new (FALSE, 10);
4778 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4779 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4781 button = gtk_button_new_with_label ("close");
4782 g_signal_connect_swapped (button, "clicked",
4783 G_CALLBACK (gtk_widget_destroy),
4785 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4786 gtk_widget_set_can_default (button, TRUE);
4787 gtk_widget_grab_default (button);
4789 gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
4791 gtk_widget_show_all (window);
4794 gtk_widget_destroy (window);
4798 accel_button_new (GtkAccelGroup *accel_group,
4803 GdkModifierType modifiers;
4807 gtk_accelerator_parse (accel, &keyval, &modifiers);
4810 button = gtk_button_new ();
4811 gtk_widget_add_accelerator (button, "activate", accel_group,
4812 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4814 label = gtk_accel_label_new (text);
4815 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4816 gtk_widget_show (label);
4818 gtk_container_add (GTK_CONTAINER (button), label);
4824 create_key_lookup (GtkWidget *widget)
4826 static GtkWidget *window = NULL;
4827 gpointer window_ptr;
4831 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4834 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4835 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4838 gtk_window_set_screen (GTK_WINDOW (window),
4839 gtk_widget_get_screen (widget));
4841 /* We have to expand it so the accel labels will draw their labels
4843 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4845 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4847 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4848 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4849 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4850 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4851 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4852 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4853 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4854 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4855 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4856 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4857 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4858 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4859 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4860 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4861 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4862 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4863 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4864 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4865 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4866 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4867 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4868 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4869 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4870 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4871 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4872 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4873 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4874 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4876 window_ptr = &window;
4877 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
4878 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4880 gtk_widget_show_all (window);
4883 gtk_widget_destroy (window);
4892 cmw_destroy_cb(GtkWidget *widget)
4894 /* This is needed to get out of gtk_main */
4901 cmw_color (GtkWidget *widget, GtkWidget *parent)
4905 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4907 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4909 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4913 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4915 /* And mark it as a transient dialog */
4916 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4918 g_signal_connect (csd, "destroy",
4919 G_CALLBACK (cmw_destroy_cb), NULL);
4921 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4922 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4923 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4924 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4926 /* wait until destroy calls gtk_main_quit */
4927 gtk_widget_show (csd);
4932 cmw_file (GtkWidget *widget, GtkWidget *parent)
4936 fs = gtk_file_selection_new("This is a modal file selection dialog");
4938 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4941 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4943 /* And mark it as a transient dialog */
4944 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4946 g_signal_connect (fs, "destroy",
4947 G_CALLBACK (cmw_destroy_cb), NULL);
4949 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4950 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4951 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4952 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4954 /* wait until destroy calls gtk_main_quit */
4955 gtk_widget_show (fs);
4962 create_modal_window (GtkWidget *widget)
4964 GtkWidget *window = NULL;
4965 GtkWidget *box1,*box2;
4967 GtkWidget *btnColor,*btnFile,*btnClose;
4969 /* Create modal window (Here you can use any window descendent )*/
4970 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4971 gtk_window_set_screen (GTK_WINDOW (window),
4972 gtk_widget_get_screen (widget));
4974 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4976 /* Set window as modal */
4977 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4979 /* Create widgets */
4980 box1 = gtk_vbox_new (FALSE,5);
4981 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4982 box2 = gtk_vbox_new (TRUE,5);
4983 btnColor = gtk_button_new_with_label ("Color");
4984 btnFile = gtk_button_new_with_label ("File Selection");
4985 btnClose = gtk_button_new_with_label ("Close");
4988 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4989 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4992 gtk_container_add (GTK_CONTAINER (window), box1);
4993 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4994 gtk_container_add (GTK_CONTAINER (frame1), box2);
4995 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4996 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4997 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4998 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
5000 /* connect signals */
5001 g_signal_connect_swapped (btnClose, "clicked",
5002 G_CALLBACK (gtk_widget_destroy), window);
5004 g_signal_connect (window, "destroy",
5005 G_CALLBACK (cmw_destroy_cb), NULL);
5007 g_signal_connect (btnColor, "clicked",
5008 G_CALLBACK (cmw_color), window);
5009 g_signal_connect (btnFile, "clicked",
5010 G_CALLBACK (cmw_file), window);
5013 gtk_widget_show_all (window);
5015 /* wait until dialog get destroyed */
5024 make_message_dialog (GdkScreen *screen,
5026 GtkMessageType type,
5027 GtkButtonsType buttons,
5028 guint default_response)
5032 gtk_widget_destroy (*dialog);
5037 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
5038 "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.)");
5040 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
5042 g_signal_connect_swapped (*dialog,
5044 G_CALLBACK (gtk_widget_destroy),
5047 g_signal_connect (*dialog,
5049 G_CALLBACK (gtk_widget_destroyed),
5052 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
5054 gtk_widget_show (*dialog);
5058 create_message_dialog (GtkWidget *widget)
5060 static GtkWidget *info = NULL;
5061 static GtkWidget *warning = NULL;
5062 static GtkWidget *error = NULL;
5063 static GtkWidget *question = NULL;
5064 GdkScreen *screen = gtk_widget_get_screen (widget);
5066 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
5067 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
5068 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
5069 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
5076 static GtkWidget *sw_parent = NULL;
5077 static GtkWidget *sw_float_parent;
5078 static guint sw_destroyed_handler = 0;
5081 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
5083 gtk_widget_reparent (scrollwin, sw_parent);
5085 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5086 sw_float_parent = NULL;
5088 sw_destroyed_handler = 0;
5094 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
5096 gtk_widget_destroy (sw_float_parent);
5098 sw_float_parent = NULL;
5100 sw_destroyed_handler = 0;
5104 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
5108 gtk_widget_reparent (scrollwin, sw_parent);
5109 gtk_widget_destroy (sw_float_parent);
5111 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5112 sw_float_parent = NULL;
5114 sw_destroyed_handler = 0;
5118 sw_parent = scrollwin->parent;
5119 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5120 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
5121 gtk_widget_get_screen (widget));
5123 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
5125 gtk_widget_reparent (scrollwin, sw_float_parent);
5126 gtk_widget_show (sw_float_parent);
5128 sw_destroyed_handler =
5129 g_signal_connect (sw_parent, "destroy",
5130 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
5131 g_signal_connect (sw_float_parent, "delete_event",
5132 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
5137 create_scrolled_windows (GtkWidget *widget)
5139 static GtkWidget *window;
5140 GtkWidget *scrolled_window;
5148 window = gtk_dialog_new ();
5150 gtk_window_set_screen (GTK_WINDOW (window),
5151 gtk_widget_get_screen (widget));
5153 g_signal_connect (window, "destroy",
5154 G_CALLBACK (gtk_widget_destroyed),
5157 gtk_window_set_title (GTK_WINDOW (window), "dialog");
5158 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5161 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
5162 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
5163 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
5164 GTK_POLICY_AUTOMATIC,
5165 GTK_POLICY_AUTOMATIC);
5166 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5167 scrolled_window, TRUE, TRUE, 0);
5168 gtk_widget_show (scrolled_window);
5170 table = gtk_table_new (20, 20, FALSE);
5171 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
5172 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
5173 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
5174 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
5175 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5176 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
5177 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5178 gtk_widget_show (table);
5180 for (i = 0; i < 20; i++)
5181 for (j = 0; j < 20; j++)
5183 sprintf (buffer, "button (%d,%d)\n", i, j);
5184 button = gtk_toggle_button_new_with_label (buffer);
5185 gtk_table_attach_defaults (GTK_TABLE (table), button,
5187 gtk_widget_show (button);
5191 button = gtk_button_new_with_label ("Close");
5192 g_signal_connect_swapped (button, "clicked",
5193 G_CALLBACK (gtk_widget_destroy),
5195 gtk_widget_set_can_default (button, TRUE);
5196 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5197 button, TRUE, TRUE, 0);
5198 gtk_widget_grab_default (button);
5199 gtk_widget_show (button);
5201 button = gtk_button_new_with_label ("Reparent Out");
5202 g_signal_connect (button, "clicked",
5203 G_CALLBACK (scrolled_windows_remove),
5205 gtk_widget_set_can_default (button, TRUE);
5206 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5207 button, TRUE, TRUE, 0);
5208 gtk_widget_grab_default (button);
5209 gtk_widget_show (button);
5211 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
5214 if (!gtk_widget_get_visible (window))
5215 gtk_widget_show (window);
5217 gtk_widget_destroy (window);
5225 entry_toggle_frame (GtkWidget *checkbutton,
5228 gtk_entry_set_has_frame (GTK_ENTRY(entry),
5229 GTK_TOGGLE_BUTTON(checkbutton)->active);
5233 entry_toggle_sensitive (GtkWidget *checkbutton,
5236 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
5240 entry_progress_timeout (gpointer data)
5242 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
5244 gtk_entry_progress_pulse (GTK_ENTRY (data));
5250 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
5253 if (fraction > 1.0001)
5256 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
5263 entry_remove_timeout (gpointer data)
5265 g_source_remove (GPOINTER_TO_UINT (data));
5269 entry_toggle_progress (GtkWidget *checkbutton,
5272 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
5274 guint timeout = gdk_threads_add_timeout (100,
5275 entry_progress_timeout,
5277 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
5278 GUINT_TO_POINTER (timeout),
5279 entry_remove_timeout);
5283 g_object_set_data (G_OBJECT (entry), "timeout-id",
5284 GUINT_TO_POINTER (0));
5286 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
5291 entry_toggle_pulse (GtkWidget *checkbutton,
5294 g_object_set_data (G_OBJECT (entry), "progress-pulse",
5295 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
5299 props_clicked (GtkWidget *button,
5302 GtkWidget *window = create_prop_editor (object, 0);
5304 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
5308 create_entry (GtkWidget *widget)
5310 static GtkWidget *window = NULL;
5314 GtkWidget *has_frame_check;
5315 GtkWidget *sensitive_check;
5316 GtkWidget *progress_check;
5317 GtkWidget *entry, *cb;
5319 GtkWidget *separator;
5320 GList *cbitems = NULL;
5324 cbitems = g_list_append(cbitems, "item0");
5325 cbitems = g_list_append(cbitems, "item1 item1");
5326 cbitems = g_list_append(cbitems, "item2 item2 item2");
5327 cbitems = g_list_append(cbitems, "item3 item3 item3 item3");
5328 cbitems = g_list_append(cbitems, "item4 item4 item4 item4 item4");
5329 cbitems = g_list_append(cbitems, "item5 item5 item5 item5 item5 item5");
5330 cbitems = g_list_append(cbitems, "item6 item6 item6 item6 item6");
5331 cbitems = g_list_append(cbitems, "item7 item7 item7 item7");
5332 cbitems = g_list_append(cbitems, "item8 item8 item8");
5333 cbitems = g_list_append(cbitems, "item9 item9");
5335 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5336 gtk_window_set_screen (GTK_WINDOW (window),
5337 gtk_widget_get_screen (widget));
5339 g_signal_connect (window, "destroy",
5340 G_CALLBACK (gtk_widget_destroyed),
5343 gtk_window_set_title (GTK_WINDOW (window), "entry");
5344 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5347 box1 = gtk_vbox_new (FALSE, 0);
5348 gtk_container_add (GTK_CONTAINER (window), box1);
5351 box2 = gtk_vbox_new (FALSE, 10);
5352 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5353 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5355 hbox = gtk_hbox_new (FALSE, 5);
5356 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5358 entry = gtk_entry_new ();
5359 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");
5360 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
5361 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
5363 button = gtk_button_new_with_mnemonic ("_Props");
5364 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5365 g_signal_connect (button, "clicked",
5366 G_CALLBACK (props_clicked),
5369 cb = gtk_combo_new ();
5370 gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
5371 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO(cb)->entry), "hello world \n\n\n foo");
5372 gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry),
5374 gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0);
5376 sensitive_check = gtk_check_button_new_with_label("Sensitive");
5377 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
5378 g_signal_connect (sensitive_check, "toggled",
5379 G_CALLBACK (entry_toggle_sensitive), entry);
5380 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
5382 has_frame_check = gtk_check_button_new_with_label("Has Frame");
5383 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
5384 g_signal_connect (has_frame_check, "toggled",
5385 G_CALLBACK (entry_toggle_frame), entry);
5386 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
5388 progress_check = gtk_check_button_new_with_label("Show Progress");
5389 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
5390 g_signal_connect (progress_check, "toggled",
5391 G_CALLBACK (entry_toggle_progress), entry);
5393 progress_check = gtk_check_button_new_with_label("Pulse 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_pulse), entry);
5398 separator = gtk_hseparator_new ();
5399 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5401 box2 = gtk_vbox_new (FALSE, 10);
5402 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5403 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5405 button = gtk_button_new_with_label ("close");
5406 g_signal_connect_swapped (button, "clicked",
5407 G_CALLBACK (gtk_widget_destroy),
5409 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5410 gtk_widget_set_can_default (button, TRUE);
5411 gtk_widget_grab_default (button);
5414 if (!gtk_widget_get_visible (window))
5415 gtk_widget_show_all (window);
5417 gtk_widget_destroy (window);
5421 create_expander (GtkWidget *widget)
5424 GtkWidget *expander;
5426 static GtkWidget *window = NULL;
5430 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5431 gtk_window_set_screen (GTK_WINDOW (window),
5432 gtk_widget_get_screen (widget));
5434 g_signal_connect (window, "destroy",
5435 G_CALLBACK (gtk_widget_destroyed),
5438 gtk_window_set_title (GTK_WINDOW (window), "expander");
5439 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5441 box1 = gtk_vbox_new (FALSE, 0);
5442 gtk_container_add (GTK_CONTAINER (window), box1);
5444 expander = gtk_expander_new ("The Hidden");
5446 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
5448 hidden = gtk_label_new ("Revealed!");
5450 gtk_container_add (GTK_CONTAINER (expander), hidden);
5453 if (!gtk_widget_get_visible (window))
5454 gtk_widget_show_all (window);
5456 gtk_widget_destroy (window);
5464 event_box_label_pressed (GtkWidget *widget,
5465 GdkEventButton *event,
5468 g_print ("clicked on event box\n");
5472 event_box_button_clicked (GtkWidget *widget,
5476 g_print ("pushed button\n");
5480 event_box_toggle_visible_window (GtkWidget *checkbutton,
5481 GtkEventBox *event_box)
5483 gtk_event_box_set_visible_window (event_box,
5484 GTK_TOGGLE_BUTTON(checkbutton)->active);
5488 event_box_toggle_above_child (GtkWidget *checkbutton,
5489 GtkEventBox *event_box)
5491 gtk_event_box_set_above_child (event_box,
5492 GTK_TOGGLE_BUTTON(checkbutton)->active);
5496 create_event_box (GtkWidget *widget)
5498 static GtkWidget *window = NULL;
5504 GtkWidget *separator;
5505 GtkWidget *event_box;
5507 GtkWidget *visible_window_check;
5508 GtkWidget *above_child_check;
5517 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5518 gtk_window_set_screen (GTK_WINDOW (window),
5519 gtk_widget_get_screen (widget));
5521 g_signal_connect (window, "destroy",
5522 G_CALLBACK (gtk_widget_destroyed),
5525 gtk_window_set_title (GTK_WINDOW (window), "event box");
5526 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5528 box1 = gtk_vbox_new (FALSE, 0);
5529 gtk_container_add (GTK_CONTAINER (window), box1);
5530 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
5532 hbox = gtk_hbox_new (FALSE, 0);
5533 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
5535 event_box = gtk_event_box_new ();
5536 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
5538 vbox = gtk_vbox_new (FALSE, 0);
5539 gtk_container_add (GTK_CONTAINER (event_box), vbox);
5540 g_signal_connect (event_box, "button_press_event",
5541 G_CALLBACK (event_box_label_pressed),
5544 label = gtk_label_new ("Click on this label");
5545 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
5547 button = gtk_button_new_with_label ("button in eventbox");
5548 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
5549 g_signal_connect (button, "clicked",
5550 G_CALLBACK (event_box_button_clicked),
5554 visible_window_check = gtk_check_button_new_with_label("Visible Window");
5555 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
5556 g_signal_connect (visible_window_check, "toggled",
5557 G_CALLBACK (event_box_toggle_visible_window), event_box);
5558 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
5560 above_child_check = gtk_check_button_new_with_label("Above Child");
5561 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
5562 g_signal_connect (above_child_check, "toggled",
5563 G_CALLBACK (event_box_toggle_above_child), event_box);
5564 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
5566 separator = gtk_hseparator_new ();
5567 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5569 box2 = gtk_vbox_new (FALSE, 10);
5570 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5571 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5573 button = gtk_button_new_with_label ("close");
5574 g_signal_connect_swapped (button, "clicked",
5575 G_CALLBACK (gtk_widget_destroy),
5577 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5578 gtk_widget_set_can_default (button, TRUE);
5579 gtk_widget_grab_default (button);
5582 if (!gtk_widget_get_visible (window))
5583 gtk_widget_show_all (window);
5585 gtk_widget_destroy (window);
5593 #define SIZE_GROUP_INITIAL_SIZE 50
5596 size_group_hsize_changed (GtkSpinButton *spin_button,
5599 gtk_widget_set_size_request (GTK_BIN (button)->child,
5600 gtk_spin_button_get_value_as_int (spin_button),
5605 size_group_vsize_changed (GtkSpinButton *spin_button,
5608 gtk_widget_set_size_request (GTK_BIN (button)->child,
5610 gtk_spin_button_get_value_as_int (spin_button));
5614 create_size_group_window (GdkScreen *screen,
5615 GtkSizeGroup *master_size_group)
5619 GtkWidget *main_button;
5621 GtkWidget *spin_button;
5623 GtkSizeGroup *hgroup1;
5624 GtkSizeGroup *hgroup2;
5625 GtkSizeGroup *vgroup1;
5626 GtkSizeGroup *vgroup2;
5628 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
5634 gtk_window_set_screen (GTK_WINDOW (window), screen);
5636 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
5638 g_signal_connect (window, "response",
5639 G_CALLBACK (gtk_widget_destroy),
5642 table = gtk_table_new (2, 2, FALSE);
5643 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
5645 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
5646 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
5647 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
5648 gtk_widget_set_size_request (table, 250, 250);
5650 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5651 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5652 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5653 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5655 main_button = gtk_button_new_with_label ("X");
5657 gtk_table_attach (GTK_TABLE (table), main_button,
5659 GTK_EXPAND, GTK_EXPAND,
5661 gtk_size_group_add_widget (master_size_group, main_button);
5662 gtk_size_group_add_widget (hgroup1, main_button);
5663 gtk_size_group_add_widget (vgroup1, main_button);
5664 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
5665 SIZE_GROUP_INITIAL_SIZE,
5666 SIZE_GROUP_INITIAL_SIZE);
5668 button = gtk_button_new ();
5669 gtk_table_attach (GTK_TABLE (table), button,
5671 GTK_EXPAND, GTK_EXPAND,
5673 gtk_size_group_add_widget (vgroup1, button);
5674 gtk_size_group_add_widget (vgroup2, button);
5676 button = gtk_button_new ();
5677 gtk_table_attach (GTK_TABLE (table), button,
5679 GTK_EXPAND, GTK_EXPAND,
5681 gtk_size_group_add_widget (hgroup1, button);
5682 gtk_size_group_add_widget (hgroup2, button);
5684 button = gtk_button_new ();
5685 gtk_table_attach (GTK_TABLE (table), button,
5687 GTK_EXPAND, GTK_EXPAND,
5689 gtk_size_group_add_widget (hgroup2, button);
5690 gtk_size_group_add_widget (vgroup2, button);
5692 g_object_unref (hgroup1);
5693 g_object_unref (hgroup2);
5694 g_object_unref (vgroup1);
5695 g_object_unref (vgroup2);
5697 hbox = gtk_hbox_new (FALSE, 5);
5698 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
5700 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5701 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5702 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5703 g_signal_connect (spin_button, "value_changed",
5704 G_CALLBACK (size_group_hsize_changed), main_button);
5706 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5707 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5708 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5709 g_signal_connect (spin_button, "value_changed",
5710 G_CALLBACK (size_group_vsize_changed), main_button);
5716 create_size_groups (GtkWidget *widget)
5718 static GtkWidget *window1 = NULL;
5719 static GtkWidget *window2 = NULL;
5720 static GtkSizeGroup *master_size_group;
5722 if (!master_size_group)
5723 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
5727 window1 = create_size_group_window (gtk_widget_get_screen (widget),
5730 g_signal_connect (window1, "destroy",
5731 G_CALLBACK (gtk_widget_destroyed),
5737 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5740 g_signal_connect (window2, "destroy",
5741 G_CALLBACK (gtk_widget_destroyed),
5745 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
5747 gtk_widget_destroy (window1);
5748 gtk_widget_destroy (window2);
5752 if (!gtk_widget_get_visible (window1))
5753 gtk_widget_show_all (window1);
5754 if (!gtk_widget_get_visible (window2))
5755 gtk_widget_show_all (window2);
5763 static GtkWidget *spinner1;
5766 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5768 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5772 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5774 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5778 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5780 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5781 gtk_spin_button_get_value_as_int (spin));
5785 get_value (GtkWidget *widget, gpointer data)
5789 GtkSpinButton *spin;
5791 spin = GTK_SPIN_BUTTON (spinner1);
5792 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5793 if (GPOINTER_TO_INT (data) == 1)
5794 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5796 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5797 gtk_label_set_text (label, buf);
5801 get_spin_value (GtkWidget *widget, gpointer data)
5805 GtkSpinButton *spin;
5807 spin = GTK_SPIN_BUTTON (widget);
5808 label = GTK_LABEL (data);
5810 buffer = g_strdup_printf ("%0.*f", spin->digits,
5811 gtk_spin_button_get_value (spin));
5812 gtk_label_set_text (label, buffer);
5818 spin_button_time_output_func (GtkSpinButton *spin_button)
5820 static gchar buf[6];
5824 hours = spin_button->adjustment->value / 60.0;
5825 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5826 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5827 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5828 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5833 spin_button_month_input_func (GtkSpinButton *spin_button,
5837 static gchar *month[12] = { "January", "February", "March", "April",
5838 "May", "June", "July", "August",
5839 "September", "October", "November", "December" };
5841 gboolean found = FALSE;
5843 for (i = 1; i <= 12; i++)
5845 tmp1 = g_ascii_strup (month[i - 1], -1);
5846 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5847 if (strstr (tmp1, tmp2) == tmp1)
5857 return GTK_INPUT_ERROR;
5859 *new_val = (gdouble) i;
5864 spin_button_month_output_func (GtkSpinButton *spin_button)
5867 static gchar *month[12] = { "January", "February", "March", "April",
5868 "May", "June", "July", "August", "September",
5869 "October", "November", "December" };
5871 for (i = 1; i <= 12; i++)
5872 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5874 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5875 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5881 spin_button_hex_input_func (GtkSpinButton *spin_button,
5888 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5889 res = strtol(buf, &err, 16);
5892 return GTK_INPUT_ERROR;
5898 spin_button_hex_output_func (GtkSpinButton *spin_button)
5900 static gchar buf[7];
5903 val = (gint) spin_button->adjustment->value;
5904 if (fabs (val) < 1e-5)
5905 sprintf (buf, "0x00");
5907 sprintf (buf, "0x%.2X", val);
5908 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5909 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5914 create_spins (GtkWidget *widget)
5916 static GtkWidget *window = NULL;
5919 GtkWidget *main_vbox;
5922 GtkWidget *spinner2;
5926 GtkWidget *val_label;
5931 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5932 gtk_window_set_screen (GTK_WINDOW (window),
5933 gtk_widget_get_screen (widget));
5935 g_signal_connect (window, "destroy",
5936 G_CALLBACK (gtk_widget_destroyed),
5939 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5941 main_vbox = gtk_vbox_new (FALSE, 5);
5942 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5943 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5945 frame = gtk_frame_new ("Not accelerated");
5946 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5948 vbox = gtk_vbox_new (FALSE, 0);
5949 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5950 gtk_container_add (GTK_CONTAINER (frame), vbox);
5952 /* Time, month, hex spinners */
5954 hbox = gtk_hbox_new (FALSE, 0);
5955 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5957 vbox2 = gtk_vbox_new (FALSE, 0);
5958 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5960 label = gtk_label_new ("Time :");
5961 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5962 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5964 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5965 spinner = gtk_spin_button_new (adj, 0, 0);
5966 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5967 g_signal_connect (spinner,
5969 G_CALLBACK (spin_button_time_output_func),
5971 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5972 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5973 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5975 vbox2 = gtk_vbox_new (FALSE, 0);
5976 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5978 label = gtk_label_new ("Month :");
5979 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5980 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5982 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5984 spinner = gtk_spin_button_new (adj, 0, 0);
5985 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5986 GTK_UPDATE_IF_VALID);
5987 g_signal_connect (spinner,
5989 G_CALLBACK (spin_button_month_input_func),
5991 g_signal_connect (spinner,
5993 G_CALLBACK (spin_button_month_output_func),
5995 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5996 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5997 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5999 vbox2 = gtk_vbox_new (FALSE, 0);
6000 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
6002 label = gtk_label_new ("Hex :");
6003 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6004 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
6006 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
6007 spinner = gtk_spin_button_new (adj, 0, 0);
6008 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
6009 g_signal_connect (spinner,
6011 G_CALLBACK (spin_button_hex_input_func),
6013 g_signal_connect (spinner,
6015 G_CALLBACK (spin_button_hex_output_func),
6017 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
6018 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
6019 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
6021 frame = gtk_frame_new ("Accelerated");
6022 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
6024 vbox = gtk_vbox_new (FALSE, 0);
6025 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
6026 gtk_container_add (GTK_CONTAINER (frame), vbox);
6028 hbox = gtk_hbox_new (FALSE, 0);
6029 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6031 vbox2 = gtk_vbox_new (FALSE, 0);
6032 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
6034 label = gtk_label_new ("Value :");
6035 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6036 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
6038 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
6040 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
6041 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
6042 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
6044 vbox2 = gtk_vbox_new (FALSE, 0);
6045 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
6047 label = gtk_label_new ("Digits :");
6048 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6049 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
6051 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
6052 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
6053 g_signal_connect (adj, "value_changed",
6054 G_CALLBACK (change_digits),
6056 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
6058 hbox = gtk_hbox_new (FALSE, 0);
6059 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
6061 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
6062 g_signal_connect (button, "clicked",
6063 G_CALLBACK (toggle_snap),
6065 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
6066 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6068 button = gtk_check_button_new_with_label ("Numeric only input mode");
6069 g_signal_connect (button, "clicked",
6070 G_CALLBACK (toggle_numeric),
6072 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
6073 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6075 val_label = gtk_label_new ("");
6077 hbox = gtk_hbox_new (FALSE, 0);
6078 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6080 button = gtk_button_new_with_label ("Value as Int");
6081 g_object_set_data (G_OBJECT (button), "user_data", val_label);
6082 g_signal_connect (button, "clicked",
6083 G_CALLBACK (get_value),
6084 GINT_TO_POINTER (1));
6085 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6087 button = gtk_button_new_with_label ("Value as Float");
6088 g_object_set_data (G_OBJECT (button), "user_data", val_label);
6089 g_signal_connect (button, "clicked",
6090 G_CALLBACK (get_value),
6091 GINT_TO_POINTER (2));
6092 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6094 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
6095 gtk_label_set_text (GTK_LABEL (val_label), "0");
6097 frame = gtk_frame_new ("Using Convenience Constructor");
6098 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
6100 hbox = gtk_hbox_new (FALSE, 0);
6101 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6102 gtk_container_add (GTK_CONTAINER (frame), hbox);
6104 val_label = gtk_label_new ("0.0");
6106 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
6107 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
6108 g_signal_connect (spinner, "value_changed",
6109 G_CALLBACK (get_spin_value), val_label);
6110 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
6111 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
6113 hbox = gtk_hbox_new (FALSE, 0);
6114 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
6116 button = gtk_button_new_with_label ("Close");
6117 g_signal_connect_swapped (button, "clicked",
6118 G_CALLBACK (gtk_widget_destroy),
6120 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6123 if (!gtk_widget_get_visible (window))
6124 gtk_widget_show_all (window);
6126 gtk_widget_destroy (window);
6135 cursor_expose_event (GtkWidget *widget,
6139 GtkDrawingArea *darea;
6140 GdkDrawable *drawable;
6147 g_return_val_if_fail (widget != NULL, TRUE);
6148 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
6150 darea = GTK_DRAWING_AREA (widget);
6151 drawable = widget->window;
6152 white_gc = widget->style->white_gc;
6153 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
6154 black_gc = widget->style->black_gc;
6155 max_width = widget->allocation.width;
6156 max_height = widget->allocation.height;
6158 gdk_draw_rectangle (drawable, white_gc,
6165 gdk_draw_rectangle (drawable, black_gc,
6172 gdk_draw_rectangle (drawable, gray_gc,
6183 set_cursor (GtkWidget *spinner,
6192 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
6195 label = g_object_get_data (G_OBJECT (spinner), "user_data");
6197 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
6198 vals = class->values;
6200 while (vals && vals->value != c)
6203 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
6205 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
6207 g_type_class_unref (class);
6209 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
6210 gdk_window_set_cursor (widget->window, cursor);
6211 gdk_cursor_unref (cursor);
6215 cursor_event (GtkWidget *widget,
6217 GtkSpinButton *spinner)
6219 if ((event->type == GDK_BUTTON_PRESS) &&
6220 ((event->button.button == 1) ||
6221 (event->button.button == 3)))
6223 gtk_spin_button_spin (spinner, event->button.button == 1 ?
6224 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
6231 #ifdef GDK_WINDOWING_X11
6232 #include "x11/gdkx.h"
6235 change_cursor_theme (GtkWidget *widget,
6242 children = gtk_container_get_children (GTK_CONTAINER (data));
6244 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
6245 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
6247 g_list_free (children);
6249 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
6256 create_cursors (GtkWidget *widget)
6258 static GtkWidget *window = NULL;
6261 GtkWidget *main_vbox;
6274 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6275 gtk_window_set_screen (GTK_WINDOW (window),
6276 gtk_widget_get_screen (widget));
6278 g_signal_connect (window, "destroy",
6279 G_CALLBACK (gtk_widget_destroyed),
6282 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
6284 main_vbox = gtk_vbox_new (FALSE, 5);
6285 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
6286 gtk_container_add (GTK_CONTAINER (window), main_vbox);
6289 g_object_new (gtk_vbox_get_type (),
6290 "GtkBox::homogeneous", FALSE,
6291 "GtkBox::spacing", 5,
6292 "GtkContainer::border_width", 10,
6293 "GtkWidget::parent", main_vbox,
6294 "GtkWidget::visible", TRUE,
6297 #ifdef GDK_WINDOWING_X11
6298 hbox = gtk_hbox_new (FALSE, 0);
6299 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6300 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6302 label = gtk_label_new ("Cursor Theme : ");
6303 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6304 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6306 entry = gtk_entry_new ();
6307 gtk_entry_set_text (GTK_ENTRY (entry), "default");
6308 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
6310 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
6311 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
6312 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
6314 g_signal_connect (entry, "changed",
6315 G_CALLBACK (change_cursor_theme), hbox);
6316 g_signal_connect (size, "changed",
6317 G_CALLBACK (change_cursor_theme), hbox);
6320 hbox = gtk_hbox_new (FALSE, 0);
6321 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6322 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6324 label = gtk_label_new ("Cursor Value : ");
6325 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6326 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6328 adj = (GtkAdjustment *) gtk_adjustment_new (0,
6332 spinner = gtk_spin_button_new (adj, 0, 0);
6333 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
6336 g_object_new (gtk_frame_get_type (),
6337 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
6338 "GtkFrame::label_xalign", 0.5,
6339 "GtkFrame::label", "Cursor Area",
6340 "GtkContainer::border_width", 10,
6341 "GtkWidget::parent", vbox,
6342 "GtkWidget::visible", TRUE,
6345 darea = gtk_drawing_area_new ();
6346 gtk_widget_set_size_request (darea, 80, 80);
6347 gtk_container_add (GTK_CONTAINER (frame), darea);
6348 g_signal_connect (darea,
6350 G_CALLBACK (cursor_expose_event),
6352 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
6353 g_signal_connect (darea,
6354 "button_press_event",
6355 G_CALLBACK (cursor_event),
6357 gtk_widget_show (darea);
6359 g_signal_connect (spinner, "changed",
6360 G_CALLBACK (set_cursor),
6363 label = g_object_new (GTK_TYPE_LABEL,
6368 gtk_container_child_set (GTK_CONTAINER (vbox), label,
6371 g_object_set_data (G_OBJECT (spinner), "user_data", label);
6374 g_object_new (gtk_hseparator_get_type (),
6375 "GtkWidget::visible", TRUE,
6377 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
6379 hbox = gtk_hbox_new (FALSE, 0);
6380 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
6381 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
6383 button = gtk_button_new_with_label ("Close");
6384 g_signal_connect_swapped (button, "clicked",
6385 G_CALLBACK (gtk_widget_destroy),
6387 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6389 gtk_widget_show_all (window);
6391 set_cursor (spinner, darea);
6394 gtk_widget_destroy (window);
6402 color_selection_ok (GtkWidget *w,
6403 GtkColorSelectionDialog *cs)
6405 GtkColorSelection *colorsel;
6408 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6410 gtk_color_selection_get_color(colorsel,color);
6411 gtk_color_selection_set_color(colorsel,color);
6415 color_selection_changed (GtkWidget *w,
6416 GtkColorSelectionDialog *cs)
6418 GtkColorSelection *colorsel;
6421 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6422 gtk_color_selection_get_color(colorsel,color);
6427 opacity_toggled_cb (GtkWidget *w,
6428 GtkColorSelectionDialog *cs)
6430 GtkColorSelection *colorsel;
6432 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6433 gtk_color_selection_set_has_opacity_control (colorsel,
6434 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
6438 palette_toggled_cb (GtkWidget *w,
6439 GtkColorSelectionDialog *cs)
6441 GtkColorSelection *colorsel;
6443 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6444 gtk_color_selection_set_has_palette (colorsel,
6445 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
6450 create_color_selection (GtkWidget *widget)
6452 static GtkWidget *window = NULL;
6461 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6462 gtk_window_set_screen (GTK_WINDOW (window),
6463 gtk_widget_get_screen (widget));
6465 g_signal_connect (window, "destroy",
6466 G_CALLBACK (gtk_widget_destroyed),
6469 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
6470 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6472 hbox = gtk_hbox_new (FALSE, 8);
6473 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6474 gtk_container_add (GTK_CONTAINER (window), hbox);
6476 label = gtk_label_new ("Pick a color");
6477 gtk_container_add (GTK_CONTAINER (hbox), label);
6479 picker = gtk_color_button_new ();
6480 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
6481 gtk_container_add (GTK_CONTAINER (hbox), picker);
6483 button = gtk_button_new_with_mnemonic ("_Props");
6484 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6485 g_signal_connect (button, "clicked",
6486 G_CALLBACK (props_clicked),
6490 if (!gtk_widget_get_visible (window))
6491 gtk_widget_show_all (window);
6493 gtk_widget_destroy (window);
6497 flipping_toggled_cb (GtkWidget *widget, gpointer data)
6499 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
6500 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
6502 gtk_widget_set_default_direction (new_direction);
6506 orientable_toggle_orientation (GtkOrientable *orientable)
6508 GtkOrientation orientation;
6510 orientation = gtk_orientable_get_orientation (orientable);
6511 gtk_orientable_set_orientation (orientable,
6512 orientation == GTK_ORIENTATION_HORIZONTAL ?
6513 GTK_ORIENTATION_VERTICAL :
6514 GTK_ORIENTATION_HORIZONTAL);
6516 if (GTK_IS_CONTAINER (orientable))
6521 children = gtk_container_get_children (GTK_CONTAINER (orientable));
6523 for (child = children; child; child = child->next)
6525 if (GTK_IS_ORIENTABLE (child->data))
6526 orientable_toggle_orientation (child->data);
6529 g_list_free (children);
6534 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
6536 orientable_toggle_orientation (GTK_ORIENTABLE (GTK_DIALOG (gtk_widget_get_toplevel (widget))->vbox));
6540 set_direction_recurse (GtkWidget *widget,
6543 GtkTextDirection *dir = data;
6545 gtk_widget_set_direction (widget, *dir);
6546 if (GTK_IS_CONTAINER (widget))
6547 gtk_container_foreach (GTK_CONTAINER (widget),
6548 set_direction_recurse,
6553 create_forward_back (const char *title,
6554 GtkTextDirection text_dir)
6556 GtkWidget *frame = gtk_frame_new (title);
6557 GtkWidget *bbox = gtk_hbutton_box_new ();
6558 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
6559 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
6561 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
6563 gtk_container_add (GTK_CONTAINER (frame), bbox);
6564 gtk_container_add (GTK_CONTAINER (bbox), back_button);
6565 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
6567 set_direction_recurse (frame, &text_dir);
6573 create_flipping (GtkWidget *widget)
6575 static GtkWidget *window = NULL;
6576 GtkWidget *check_button, *button;
6580 window = gtk_dialog_new ();
6582 gtk_window_set_screen (GTK_WINDOW (window),
6583 gtk_widget_get_screen (widget));
6585 g_signal_connect (window, "destroy",
6586 G_CALLBACK (gtk_widget_destroyed),
6589 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
6591 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
6592 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
6593 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6594 check_button, TRUE, TRUE, 0);
6596 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
6597 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
6599 g_signal_connect (check_button, "toggled",
6600 G_CALLBACK (flipping_toggled_cb), NULL);
6602 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
6603 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
6604 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6605 check_button, TRUE, TRUE, 0);
6607 g_signal_connect (check_button, "toggled",
6608 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
6610 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6611 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
6614 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6615 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
6618 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6619 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
6622 button = gtk_button_new_with_label ("Close");
6623 g_signal_connect_swapped (button, "clicked",
6624 G_CALLBACK (gtk_widget_destroy), window);
6625 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
6626 button, TRUE, TRUE, 0);
6629 if (!gtk_widget_get_visible (window))
6630 gtk_widget_show_all (window);
6632 gtk_widget_destroy (window);
6640 make_focus_table (GList **list)
6645 table = gtk_table_new (5, 5, FALSE);
6658 widget = gtk_entry_new ();
6660 widget = gtk_button_new_with_label ("Foo");
6662 *list = g_list_prepend (*list, widget);
6664 gtk_table_attach (GTK_TABLE (table),
6668 GTK_EXPAND | GTK_FILL,
6669 GTK_EXPAND | GTK_FILL,
6678 *list = g_list_reverse (*list);
6684 create_focus (GtkWidget *widget)
6686 static GtkWidget *window = NULL;
6694 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
6700 gtk_window_set_screen (GTK_WINDOW (window),
6701 gtk_widget_get_screen (widget));
6703 g_signal_connect (window, "destroy",
6704 G_CALLBACK (gtk_widget_destroyed),
6707 g_signal_connect (window, "response",
6708 G_CALLBACK (gtk_widget_destroy),
6711 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
6713 frame = gtk_frame_new ("Weird tab focus chain");
6715 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6716 frame, TRUE, TRUE, 0);
6718 table = make_focus_table (&list);
6720 gtk_container_add (GTK_CONTAINER (frame), table);
6722 gtk_container_set_focus_chain (GTK_CONTAINER (table),
6727 frame = gtk_frame_new ("Default tab focus chain");
6729 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6730 frame, TRUE, TRUE, 0);
6733 table = make_focus_table (&list);
6737 gtk_container_add (GTK_CONTAINER (frame), table);
6740 if (!gtk_widget_get_visible (window))
6741 gtk_widget_show_all (window);
6743 gtk_widget_destroy (window);
6751 font_selection_ok (GtkWidget *w,
6752 GtkFontSelectionDialog *fs)
6754 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
6756 g_print ("%s\n", s);
6758 gtk_widget_destroy (GTK_WIDGET (fs));
6762 create_font_selection (GtkWidget *widget)
6764 static GtkWidget *window = NULL;
6772 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6773 gtk_window_set_screen (GTK_WINDOW (window),
6774 gtk_widget_get_screen (widget));
6776 g_signal_connect (window, "destroy",
6777 G_CALLBACK (gtk_widget_destroyed),
6780 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
6781 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6783 hbox = gtk_hbox_new (FALSE, 8);
6784 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6785 gtk_container_add (GTK_CONTAINER (window), hbox);
6787 label = gtk_label_new ("Pick a font");
6788 gtk_container_add (GTK_CONTAINER (hbox), label);
6790 picker = gtk_font_button_new ();
6791 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
6792 gtk_container_add (GTK_CONTAINER (hbox), picker);
6795 if (!gtk_widget_get_visible (window))
6796 gtk_widget_show_all (window);
6798 gtk_widget_destroy (window);
6805 static GtkWidget *dialog_window = NULL;
6808 label_toggle (GtkWidget *widget,
6813 *label = gtk_label_new ("Dialog Test");
6814 g_signal_connect (*label,
6816 G_CALLBACK (gtk_widget_destroyed),
6818 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
6819 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6820 *label, TRUE, TRUE, 0);
6821 gtk_widget_show (*label);
6824 gtk_widget_destroy (*label);
6827 #define RESPONSE_TOGGLE_SEPARATOR 1
6830 print_response (GtkWidget *dialog,
6834 g_print ("response signal received (%d)\n", response_id);
6836 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
6838 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
6839 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
6844 create_dialog (GtkWidget *widget)
6846 static GtkWidget *label;
6851 /* This is a terrible example; it's much simpler to create
6852 * dialogs than this. Don't use testgtk for example code,
6856 dialog_window = gtk_dialog_new ();
6857 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6858 gtk_widget_get_screen (widget));
6860 g_signal_connect (dialog_window,
6862 G_CALLBACK (print_response),
6865 g_signal_connect (dialog_window, "destroy",
6866 G_CALLBACK (gtk_widget_destroyed),
6869 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
6870 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6872 button = gtk_button_new_with_label ("OK");
6873 gtk_widget_set_can_default (button, TRUE);
6874 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6875 button, TRUE, TRUE, 0);
6876 gtk_widget_grab_default (button);
6877 gtk_widget_show (button);
6879 button = gtk_button_new_with_label ("Toggle");
6880 g_signal_connect (button, "clicked",
6881 G_CALLBACK (label_toggle),
6883 gtk_widget_set_can_default (button, TRUE);
6884 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6885 button, TRUE, TRUE, 0);
6886 gtk_widget_show (button);
6890 button = gtk_button_new_with_label ("Separator");
6892 gtk_widget_set_can_default (button, TRUE);
6894 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
6896 RESPONSE_TOGGLE_SEPARATOR);
6897 gtk_widget_show (button);
6900 if (!gtk_widget_get_visible (dialog_window))
6901 gtk_widget_show (dialog_window);
6903 gtk_widget_destroy (dialog_window);
6906 /* Display & Screen test
6912 GtkWidget *radio_dpy;
6913 GtkWidget *toplevel;
6914 GtkWidget *dialog_window;
6915 GList *valid_display_list;
6916 } ScreenDisplaySelection;
6919 display_name_cmp (gconstpointer a,
6922 return g_ascii_strcasecmp (a,b);
6926 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
6929 GdkDisplay *display = gtk_widget_get_display (widget);
6931 GdkScreen *new_screen = NULL;
6932 GdkScreen *current_screen = gtk_widget_get_screen (widget);
6934 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
6936 display_name = g_strdup (gtk_entry_get_text (data->entry));
6937 display = gdk_display_open (display_name);
6941 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
6942 GTK_DIALOG_DESTROY_WITH_PARENT,
6945 "The display :\n%s\ncannot be opened",
6947 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
6948 gtk_widget_show (dialog);
6949 g_signal_connect (dialog, "response",
6950 G_CALLBACK (gtk_widget_destroy),
6955 if (!g_list_find_custom (data->valid_display_list,
6958 data->valid_display_list = g_list_append (data->valid_display_list,
6961 new_screen = gdk_display_get_default_screen (display);
6966 gint number_of_screens = gdk_display_get_n_screens (display);
6967 gint screen_num = gdk_screen_get_number (current_screen);
6968 if ((screen_num +1) < number_of_screens)
6969 new_screen = gdk_display_get_screen (display, screen_num + 1);
6971 new_screen = gdk_display_get_screen (display, 0);
6976 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
6977 gtk_widget_destroy (data->dialog_window);
6982 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
6984 gtk_widget_destroy (data);
6988 create_display_screen (GtkWidget *widget)
6990 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
6991 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
6993 ScreenDisplaySelection *scr_dpy_data;
6994 GdkScreen *screen = gtk_widget_get_screen (widget);
6995 static GList *valid_display_list = NULL;
6997 GdkDisplay *display = gdk_screen_get_display (screen);
6999 window = g_object_new (gtk_window_get_type (),
7002 "type", GTK_WINDOW_TOPLEVEL,
7004 "Screen or Display selection",
7005 "border_width", 10, NULL);
7006 g_signal_connect (window, "destroy",
7007 G_CALLBACK (gtk_widget_destroy), NULL);
7009 vbox = gtk_vbox_new (FALSE, 3);
7010 gtk_container_add (GTK_CONTAINER (window), vbox);
7012 frame = gtk_frame_new ("Select screen or display");
7013 gtk_container_add (GTK_CONTAINER (vbox), frame);
7015 table = gtk_table_new (2, 2, TRUE);
7016 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
7017 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
7019 gtk_container_add (GTK_CONTAINER (frame), table);
7021 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
7022 if (gdk_display_get_n_screens(display) > 1)
7023 radio_scr = gtk_radio_button_new_with_label
7024 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
7027 radio_scr = gtk_radio_button_new_with_label
7028 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
7029 "only one screen on the current display");
7030 gtk_widget_set_sensitive (radio_scr, FALSE);
7032 combo_dpy = gtk_combo_new ();
7033 if (!valid_display_list)
7034 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
7036 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
7038 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
7039 "<hostname>:<X Server Num>.<Screen Num>");
7041 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
7042 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
7043 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
7045 bbox = gtk_hbutton_box_new ();
7046 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
7047 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
7049 gtk_container_add (GTK_CONTAINER (vbox), bbox);
7051 gtk_container_add (GTK_CONTAINER (bbox), applyb);
7052 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
7054 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
7056 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
7057 scr_dpy_data->radio_dpy = radio_dpy;
7058 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
7059 scr_dpy_data->dialog_window = window;
7060 scr_dpy_data->valid_display_list = valid_display_list;
7062 g_signal_connect (cancelb, "clicked",
7063 G_CALLBACK (screen_display_destroy_diag), window);
7064 g_signal_connect (applyb, "clicked",
7065 G_CALLBACK (screen_display_check), scr_dpy_data);
7066 gtk_widget_show_all (window);
7071 static gboolean event_watcher_enter_id = 0;
7072 static gboolean event_watcher_leave_id = 0;
7075 event_watcher (GSignalInvocationHint *ihint,
7076 guint n_param_values,
7077 const GValue *param_values,
7080 g_print ("Watch: \"%s\" emitted for %s\n",
7081 g_signal_name (ihint->signal_id),
7082 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
7088 event_watcher_down (void)
7090 if (event_watcher_enter_id)
7094 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7095 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
7096 event_watcher_enter_id = 0;
7097 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7098 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
7099 event_watcher_leave_id = 0;
7104 event_watcher_toggle (void)
7106 if (event_watcher_enter_id)
7107 event_watcher_down ();
7112 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7113 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7114 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7115 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7120 create_event_watcher (GtkWidget *widget)
7126 dialog_window = gtk_dialog_new ();
7127 gtk_window_set_screen (GTK_WINDOW (dialog_window),
7128 gtk_widget_get_screen (widget));
7130 g_signal_connect (dialog_window, "destroy",
7131 G_CALLBACK (gtk_widget_destroyed),
7133 g_signal_connect (dialog_window, "destroy",
7134 G_CALLBACK (event_watcher_down),
7137 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
7138 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
7139 gtk_widget_set_size_request (dialog_window, 200, 110);
7141 button = gtk_toggle_button_new_with_label ("Activate Watch");
7142 g_signal_connect (button, "clicked",
7143 G_CALLBACK (event_watcher_toggle),
7145 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
7146 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
7147 button, TRUE, TRUE, 0);
7148 gtk_widget_show (button);
7150 button = gtk_button_new_with_label ("Close");
7151 g_signal_connect_swapped (button, "clicked",
7152 G_CALLBACK (gtk_widget_destroy),
7154 gtk_widget_set_can_default (button, TRUE);
7155 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7156 button, TRUE, TRUE, 0);
7157 gtk_widget_grab_default (button);
7158 gtk_widget_show (button);
7161 if (!gtk_widget_get_visible (dialog_window))
7162 gtk_widget_show (dialog_window);
7164 gtk_widget_destroy (dialog_window);
7172 reformat_value (GtkScale *scale,
7175 return g_strdup_printf ("-->%0.*g<--",
7176 gtk_scale_get_digits (scale), value);
7180 create_range_controls (GtkWidget *widget)
7182 static GtkWidget *window = NULL;
7186 GtkWidget *scrollbar;
7188 GtkWidget *separator;
7189 GtkObject *adjustment;
7194 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7196 gtk_window_set_screen (GTK_WINDOW (window),
7197 gtk_widget_get_screen (widget));
7199 g_signal_connect (window, "destroy",
7200 G_CALLBACK (gtk_widget_destroyed),
7203 gtk_window_set_title (GTK_WINDOW (window), "range controls");
7204 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7207 box1 = gtk_vbox_new (FALSE, 0);
7208 gtk_container_add (GTK_CONTAINER (window), box1);
7209 gtk_widget_show (box1);
7212 box2 = gtk_vbox_new (FALSE, 10);
7213 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7214 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
7215 gtk_widget_show (box2);
7218 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
7220 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7221 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
7222 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
7223 gtk_scale_set_digits (GTK_SCALE (scale), 1);
7224 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7225 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7226 gtk_widget_show (scale);
7228 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
7229 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
7230 GTK_UPDATE_CONTINUOUS);
7231 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
7232 gtk_widget_show (scrollbar);
7234 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7235 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7236 g_signal_connect (scale,
7238 G_CALLBACK (reformat_value),
7240 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7241 gtk_widget_show (scale);
7243 hbox = gtk_hbox_new (FALSE, 0);
7245 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7246 gtk_widget_set_size_request (scale, -1, 200);
7247 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7248 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7249 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7250 gtk_widget_show (scale);
7252 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7253 gtk_widget_set_size_request (scale, -1, 200);
7254 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7255 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7256 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
7257 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7258 gtk_widget_show (scale);
7260 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7261 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7262 g_signal_connect (scale,
7264 G_CALLBACK (reformat_value),
7266 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7267 gtk_widget_show (scale);
7270 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
7271 gtk_widget_show (hbox);
7273 separator = gtk_hseparator_new ();
7274 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7275 gtk_widget_show (separator);
7278 box2 = gtk_vbox_new (FALSE, 10);
7279 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7280 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7281 gtk_widget_show (box2);
7284 button = gtk_button_new_with_label ("close");
7285 g_signal_connect_swapped (button, "clicked",
7286 G_CALLBACK (gtk_widget_destroy),
7288 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7289 gtk_widget_set_can_default (button, TRUE);
7290 gtk_widget_grab_default (button);
7291 gtk_widget_show (button);
7294 if (!gtk_widget_get_visible (window))
7295 gtk_widget_show (window);
7297 gtk_widget_destroy (window);
7305 create_rulers (GtkWidget *widget)
7307 static GtkWidget *window = NULL;
7313 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7315 gtk_window_set_screen (GTK_WINDOW (window),
7316 gtk_widget_get_screen (widget));
7318 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
7320 g_signal_connect (window, "destroy",
7321 G_CALLBACK (gtk_widget_destroyed),
7324 gtk_window_set_title (GTK_WINDOW (window), "rulers");
7325 gtk_widget_set_size_request (window, 300, 300);
7326 gtk_widget_set_events (window,
7327 GDK_POINTER_MOTION_MASK
7328 | GDK_POINTER_MOTION_HINT_MASK);
7329 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7331 table = gtk_table_new (2, 2, FALSE);
7332 gtk_container_add (GTK_CONTAINER (window), table);
7333 gtk_widget_show (table);
7335 ruler = gtk_hruler_new ();
7336 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
7337 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
7339 g_signal_connect_swapped (window,
7340 "motion_notify_event",
7341 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7344 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
7345 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
7346 gtk_widget_show (ruler);
7349 ruler = gtk_vruler_new ();
7350 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
7352 g_signal_connect_swapped (window,
7353 "motion_notify_event",
7354 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7357 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
7358 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
7359 gtk_widget_show (ruler);
7362 if (!gtk_widget_get_visible (window))
7363 gtk_widget_show (window);
7365 gtk_widget_destroy (window);
7369 text_toggle_editable (GtkWidget *checkbutton,
7372 gtk_text_set_editable(GTK_TEXT(text),
7373 GTK_TOGGLE_BUTTON(checkbutton)->active);
7377 text_toggle_word_wrap (GtkWidget *checkbutton,
7380 gtk_text_set_word_wrap(GTK_TEXT(text),
7381 GTK_TOGGLE_BUTTON(checkbutton)->active);
7388 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
7389 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
7390 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
7391 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
7392 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
7393 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
7394 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
7395 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
7398 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
7404 text_insert_random (GtkWidget *w, GtkText *text)
7408 for (i=0; i<10; i++)
7410 c = 'A' + rand() % ('Z' - 'A');
7411 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
7412 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
7417 create_text (GtkWidget *widget)
7421 static GtkWidget *window = NULL;
7427 GtkWidget *separator;
7428 GtkWidget *scrolled_window;
7435 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7436 gtk_window_set_screen (GTK_WINDOW (window),
7437 gtk_widget_get_screen (widget));
7439 gtk_widget_set_name (window, "text window");
7440 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
7441 gtk_widget_set_size_request (window, 500, 500);
7443 g_signal_connect (window, "destroy",
7444 G_CALLBACK (gtk_widget_destroyed),
7447 gtk_window_set_title (GTK_WINDOW (window), "test");
7448 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7451 box1 = gtk_vbox_new (FALSE, 0);
7452 gtk_container_add (GTK_CONTAINER (window), box1);
7453 gtk_widget_show (box1);
7456 box2 = gtk_vbox_new (FALSE, 10);
7457 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7458 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
7459 gtk_widget_show (box2);
7462 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
7463 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
7464 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
7467 gtk_widget_show (scrolled_window);
7469 text = gtk_text_new (NULL, NULL);
7470 gtk_text_set_editable (GTK_TEXT (text), TRUE);
7471 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
7472 gtk_widget_grab_focus (text);
7473 gtk_widget_show (text);
7476 gtk_text_freeze (GTK_TEXT (text));
7478 for (i=0; i<ntext_colors; i++)
7480 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
7481 text_colors[i].name, -1);
7482 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
7484 for (j=0; j<ntext_colors; j++)
7486 gtk_text_insert (GTK_TEXT (text), NULL,
7487 &text_colors[j].color, &text_colors[i].color,
7490 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
7493 infile = fopen("testgtk.c", "r");
7498 int nbytes_read, nbytes_alloc;
7501 nbytes_alloc = 1024;
7502 buffer = g_new (char, nbytes_alloc);
7506 if (nbytes_alloc < nbytes_read + 1024)
7509 buffer = g_realloc (buffer, nbytes_alloc);
7511 len = fread (buffer + nbytes_read, 1, 1024, infile);
7517 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
7518 NULL, buffer, nbytes_read);
7523 gtk_text_thaw (GTK_TEXT (text));
7525 hbox = gtk_hbutton_box_new ();
7526 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
7527 gtk_widget_show (hbox);
7529 check = gtk_check_button_new_with_label("Editable");
7530 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
7531 g_signal_connect (check, "toggled",
7532 G_CALLBACK (text_toggle_editable), text);
7533 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
7534 gtk_widget_show (check);
7536 check = gtk_check_button_new_with_label("Wrap Words");
7537 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
7538 g_signal_connect (check, "toggled",
7539 G_CALLBACK (text_toggle_word_wrap), text);
7540 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
7541 gtk_widget_show (check);
7543 separator = gtk_hseparator_new ();
7544 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7545 gtk_widget_show (separator);
7548 box2 = gtk_vbox_new (FALSE, 10);
7549 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7550 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7551 gtk_widget_show (box2);
7554 button = gtk_button_new_with_label ("insert random");
7555 g_signal_connect (button, "clicked",
7556 G_CALLBACK (text_insert_random),
7558 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7559 gtk_widget_show (button);
7561 button = gtk_button_new_with_label ("close");
7562 g_signal_connect_swapped (button, "clicked",
7563 G_CALLBACK (gtk_widget_destroy),
7565 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7566 gtk_widget_set_can_default (button, TRUE);
7567 gtk_widget_grab_default (button);
7568 gtk_widget_show (button);
7571 if (!gtk_widget_get_visible (window))
7572 gtk_widget_show (window);
7574 gtk_widget_destroy (window);
7581 GdkPixbuf *book_open;
7582 GdkPixbuf *book_closed;
7583 GtkWidget *sample_notebook;
7586 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
7588 GtkWidget *page_widget;
7591 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
7593 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
7594 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
7596 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
7597 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
7601 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
7603 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
7604 gint old_page_num = gtk_notebook_get_current_page (notebook);
7606 if (page_num == old_page_num)
7609 set_page_image (notebook, page_num, book_open);
7611 if (old_page_num != -1)
7612 set_page_image (notebook, old_page_num, book_closed);
7616 tab_fill (GtkToggleButton *button, GtkWidget *child)
7619 GtkPackType pack_type;
7621 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7622 &expand, NULL, &pack_type);
7623 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7624 expand, button->active, pack_type);
7628 tab_expand (GtkToggleButton *button, GtkWidget *child)
7631 GtkPackType pack_type;
7633 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7634 NULL, &fill, &pack_type);
7635 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7636 button->active, fill, pack_type);
7640 tab_pack (GtkToggleButton *button, GtkWidget *child)
7646 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7647 &expand, &fill, NULL);
7648 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
7649 expand, fill, button->active);
7653 create_pages (GtkNotebook *notebook, gint start, gint end)
7655 GtkWidget *child = NULL;
7660 GtkWidget *label_box;
7661 GtkWidget *menu_box;
7665 char accel_buffer[32];
7667 for (i = start; i <= end; i++)
7669 sprintf (buffer, "Page %d", i);
7670 sprintf (accel_buffer, "Page _%d", i);
7672 child = gtk_frame_new (buffer);
7673 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
7675 vbox = gtk_vbox_new (TRUE,0);
7676 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
7677 gtk_container_add (GTK_CONTAINER (child), vbox);
7679 hbox = gtk_hbox_new (TRUE,0);
7680 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
7682 button = gtk_check_button_new_with_label ("Fill Tab");
7683 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
7684 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
7685 g_signal_connect (button, "toggled",
7686 G_CALLBACK (tab_fill), child);
7688 button = gtk_check_button_new_with_label ("Expand Tab");
7689 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
7690 g_signal_connect (button, "toggled",
7691 G_CALLBACK (tab_expand), child);
7693 button = gtk_check_button_new_with_label ("Pack end");
7694 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
7695 g_signal_connect (button, "toggled",
7696 G_CALLBACK (tab_pack), child);
7698 button = gtk_button_new_with_label ("Hide Page");
7699 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
7700 g_signal_connect_swapped (button, "clicked",
7701 G_CALLBACK (gtk_widget_hide),
7704 gtk_widget_show_all (child);
7706 label_box = gtk_hbox_new (FALSE, 0);
7707 pixwid = gtk_image_new_from_pixbuf (book_closed);
7708 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
7710 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
7711 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
7712 label = gtk_label_new_with_mnemonic (accel_buffer);
7713 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
7714 gtk_widget_show_all (label_box);
7717 menu_box = gtk_hbox_new (FALSE, 0);
7718 pixwid = gtk_image_new_from_pixbuf (book_closed);
7719 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
7721 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
7722 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
7723 label = gtk_label_new (buffer);
7724 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
7725 gtk_widget_show_all (menu_box);
7727 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
7732 rotate_notebook (GtkButton *button,
7733 GtkNotebook *notebook)
7735 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
7739 show_all_pages (GtkButton *button,
7740 GtkNotebook *notebook)
7742 gtk_container_foreach (GTK_CONTAINER (notebook),
7743 (GtkCallback) gtk_widget_show, NULL);
7747 notebook_type_changed (GtkWidget *optionmenu,
7750 GtkNotebook *notebook;
7760 notebook = GTK_NOTEBOOK (data);
7762 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
7767 /* standard notebook */
7768 gtk_notebook_set_show_tabs (notebook, TRUE);
7769 gtk_notebook_set_show_border (notebook, TRUE);
7770 gtk_notebook_set_scrollable (notebook, FALSE);
7774 /* notabs notebook */
7775 gtk_notebook_set_show_tabs (notebook, FALSE);
7776 gtk_notebook_set_show_border (notebook, TRUE);
7781 gtk_notebook_set_show_tabs (notebook, FALSE);
7782 gtk_notebook_set_show_border (notebook, FALSE);
7787 gtk_notebook_set_show_tabs (notebook, TRUE);
7788 gtk_notebook_set_show_border (notebook, TRUE);
7789 gtk_notebook_set_scrollable (notebook, TRUE);
7790 if (g_list_length (notebook->children) == 5)
7791 create_pages (notebook, 6, 15);
7797 if (g_list_length (notebook->children) == 15)
7798 for (i = 0; i < 10; i++)
7799 gtk_notebook_remove_page (notebook, 5);
7803 notebook_popup (GtkToggleButton *button,
7804 GtkNotebook *notebook)
7807 gtk_notebook_popup_enable (notebook);
7809 gtk_notebook_popup_disable (notebook);
7813 notebook_homogeneous (GtkToggleButton *button,
7814 GtkNotebook *notebook)
7816 g_object_set (notebook, "homogeneous", button->active, NULL);
7820 create_notebook (GtkWidget *widget)
7822 static GtkWidget *window = NULL;
7826 GtkWidget *separator;
7830 static gchar *items[] =
7840 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7841 gtk_window_set_screen (GTK_WINDOW (window),
7842 gtk_widget_get_screen (widget));
7844 g_signal_connect (window, "destroy",
7845 G_CALLBACK (gtk_widget_destroyed),
7848 gtk_window_set_title (GTK_WINDOW (window), "notebook");
7849 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7851 box1 = gtk_vbox_new (FALSE, 0);
7852 gtk_container_add (GTK_CONTAINER (window), box1);
7854 sample_notebook = gtk_notebook_new ();
7855 g_signal_connect (sample_notebook, "switch_page",
7856 G_CALLBACK (page_switch), NULL);
7857 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
7858 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
7859 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
7861 gtk_widget_realize (sample_notebook);
7864 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
7867 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
7869 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
7871 separator = gtk_hseparator_new ();
7872 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
7874 box2 = gtk_hbox_new (FALSE, 5);
7875 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7876 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7878 button = gtk_check_button_new_with_label ("popup menu");
7879 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
7880 g_signal_connect (button, "clicked",
7881 G_CALLBACK (notebook_popup),
7884 button = gtk_check_button_new_with_label ("homogeneous tabs");
7885 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
7886 g_signal_connect (button, "clicked",
7887 G_CALLBACK (notebook_homogeneous),
7890 box2 = gtk_hbox_new (FALSE, 5);
7891 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7892 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7894 label = gtk_label_new ("Notebook Style :");
7895 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
7897 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
7898 notebook_type_changed,
7900 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
7902 button = gtk_button_new_with_label ("Show all Pages");
7903 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
7904 g_signal_connect (button, "clicked",
7905 G_CALLBACK (show_all_pages), sample_notebook);
7907 box2 = gtk_hbox_new (TRUE, 10);
7908 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7909 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7911 button = gtk_button_new_with_label ("prev");
7912 g_signal_connect_swapped (button, "clicked",
7913 G_CALLBACK (gtk_notebook_prev_page),
7915 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7917 button = gtk_button_new_with_label ("next");
7918 g_signal_connect_swapped (button, "clicked",
7919 G_CALLBACK (gtk_notebook_next_page),
7921 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7923 button = gtk_button_new_with_label ("rotate");
7924 g_signal_connect (button, "clicked",
7925 G_CALLBACK (rotate_notebook), sample_notebook);
7926 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7928 separator = gtk_hseparator_new ();
7929 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
7931 button = gtk_button_new_with_label ("close");
7932 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
7933 g_signal_connect_swapped (button, "clicked",
7934 G_CALLBACK (gtk_widget_destroy),
7936 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
7937 gtk_widget_set_can_default (button, TRUE);
7938 gtk_widget_grab_default (button);
7941 if (!gtk_widget_get_visible (window))
7942 gtk_widget_show_all (window);
7944 gtk_widget_destroy (window);
7952 toggle_resize (GtkWidget *widget, GtkWidget *child)
7954 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7955 GValue value = { 0, };
7956 g_value_init (&value, G_TYPE_BOOLEAN);
7957 gtk_container_child_get_property (container, child, "resize", &value);
7958 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7959 gtk_container_child_set_property (container, child, "resize", &value);
7963 toggle_shrink (GtkWidget *widget, GtkWidget *child)
7965 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7966 GValue value = { 0, };
7967 g_value_init (&value, G_TYPE_BOOLEAN);
7968 gtk_container_child_get_property (container, child, "shrink", &value);
7969 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7970 gtk_container_child_set_property (container, child, "shrink", &value);
7974 paned_props_clicked (GtkWidget *button,
7977 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
7979 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
7983 create_pane_options (GtkPaned *paned,
7984 const gchar *frame_label,
7985 const gchar *label1,
7986 const gchar *label2)
7992 GtkWidget *check_button;
7994 frame = gtk_frame_new (frame_label);
7995 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
7997 table = gtk_table_new (4, 2, 4);
7998 gtk_container_add (GTK_CONTAINER (frame), table);
8000 label = gtk_label_new (label1);
8001 gtk_table_attach_defaults (GTK_TABLE (table), label,
8004 check_button = gtk_check_button_new_with_label ("Resize");
8005 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8007 g_signal_connect (check_button, "toggled",
8008 G_CALLBACK (toggle_resize),
8011 check_button = gtk_check_button_new_with_label ("Shrink");
8012 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8014 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8016 g_signal_connect (check_button, "toggled",
8017 G_CALLBACK (toggle_shrink),
8020 label = gtk_label_new (label2);
8021 gtk_table_attach_defaults (GTK_TABLE (table), label,
8024 check_button = gtk_check_button_new_with_label ("Resize");
8025 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8027 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8029 g_signal_connect (check_button, "toggled",
8030 G_CALLBACK (toggle_resize),
8033 check_button = gtk_check_button_new_with_label ("Shrink");
8034 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8036 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8038 g_signal_connect (check_button, "toggled",
8039 G_CALLBACK (toggle_shrink),
8042 button = gtk_button_new_with_mnemonic ("_Properties");
8043 gtk_table_attach_defaults (GTK_TABLE (table), button,
8045 g_signal_connect (button, "clicked",
8046 G_CALLBACK (paned_props_clicked),
8053 create_panes (GtkWidget *widget)
8055 static GtkWidget *window = NULL;
8064 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8066 gtk_window_set_screen (GTK_WINDOW (window),
8067 gtk_widget_get_screen (widget));
8069 g_signal_connect (window, "destroy",
8070 G_CALLBACK (gtk_widget_destroyed),
8073 gtk_window_set_title (GTK_WINDOW (window), "Panes");
8074 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8076 vbox = gtk_vbox_new (FALSE, 0);
8077 gtk_container_add (GTK_CONTAINER (window), vbox);
8079 vpaned = gtk_vpaned_new ();
8080 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
8081 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
8083 hpaned = gtk_hpaned_new ();
8084 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
8086 frame = gtk_frame_new (NULL);
8087 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8088 gtk_widget_set_size_request (frame, 60, 60);
8089 gtk_paned_add1 (GTK_PANED (hpaned), frame);
8091 button = gtk_button_new_with_label ("Hi there");
8092 gtk_container_add (GTK_CONTAINER(frame), button);
8094 frame = gtk_frame_new (NULL);
8095 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8096 gtk_widget_set_size_request (frame, 80, 60);
8097 gtk_paned_add2 (GTK_PANED (hpaned), frame);
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, 60, 80);
8102 gtk_paned_add2 (GTK_PANED (vpaned), frame);
8104 /* Now create toggle buttons to control sizing */
8106 gtk_box_pack_start (GTK_BOX (vbox),
8107 create_pane_options (GTK_PANED (hpaned),
8113 gtk_box_pack_start (GTK_BOX (vbox),
8114 create_pane_options (GTK_PANED (vpaned),
8120 gtk_widget_show_all (vbox);
8123 if (!gtk_widget_get_visible (window))
8124 gtk_widget_show (window);
8126 gtk_widget_destroy (window);
8130 * Paned keyboard navigation
8134 paned_keyboard_window1 (GtkWidget *widget)
8157 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8158 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
8159 gtk_window_set_screen (GTK_WINDOW (window1),
8160 gtk_widget_get_screen (widget));
8162 hpaned1 = gtk_hpaned_new ();
8163 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
8165 frame1 = gtk_frame_new (NULL);
8166 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
8167 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
8169 vbox1 = gtk_vbox_new (FALSE, 0);
8170 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
8172 button7 = gtk_button_new_with_label ("button7");
8173 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
8175 button8 = gtk_button_new_with_label ("button8");
8176 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
8178 button9 = gtk_button_new_with_label ("button9");
8179 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
8181 vpaned1 = gtk_vpaned_new ();
8182 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
8184 frame2 = gtk_frame_new (NULL);
8185 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
8186 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
8188 frame5 = gtk_frame_new (NULL);
8189 gtk_container_add (GTK_CONTAINER (frame2), frame5);
8191 hbox1 = gtk_hbox_new (FALSE, 0);
8192 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
8194 button5 = gtk_button_new_with_label ("button5");
8195 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
8197 button6 = gtk_button_new_with_label ("button6");
8198 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
8200 frame3 = gtk_frame_new (NULL);
8201 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
8202 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
8204 frame4 = gtk_frame_new ("Buttons");
8205 gtk_container_add (GTK_CONTAINER (frame3), frame4);
8206 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
8208 table1 = gtk_table_new (2, 2, FALSE);
8209 gtk_container_add (GTK_CONTAINER (frame4), table1);
8210 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
8212 button1 = gtk_button_new_with_label ("button1");
8213 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
8214 (GtkAttachOptions) (GTK_FILL),
8215 (GtkAttachOptions) (0), 0, 0);
8217 button2 = gtk_button_new_with_label ("button2");
8218 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
8219 (GtkAttachOptions) (GTK_FILL),
8220 (GtkAttachOptions) (0), 0, 0);
8222 button3 = gtk_button_new_with_label ("button3");
8223 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
8224 (GtkAttachOptions) (GTK_FILL),
8225 (GtkAttachOptions) (0), 0, 0);
8227 button4 = gtk_button_new_with_label ("button4");
8228 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
8229 (GtkAttachOptions) (GTK_FILL),
8230 (GtkAttachOptions) (0), 0, 0);
8236 paned_keyboard_window2 (GtkWidget *widget)
8241 GtkWidget *button13;
8245 GtkWidget *button12;
8247 GtkWidget *button11;
8248 GtkWidget *button10;
8250 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8251 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
8253 gtk_window_set_screen (GTK_WINDOW (window2),
8254 gtk_widget_get_screen (widget));
8256 hpaned2 = gtk_hpaned_new ();
8257 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
8259 frame6 = gtk_frame_new (NULL);
8260 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
8261 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
8263 button13 = gtk_button_new_with_label ("button13");
8264 gtk_container_add (GTK_CONTAINER (frame6), button13);
8266 hbox2 = gtk_hbox_new (FALSE, 0);
8267 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
8269 vpaned2 = gtk_vpaned_new ();
8270 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
8272 frame7 = gtk_frame_new (NULL);
8273 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
8274 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
8276 button12 = gtk_button_new_with_label ("button12");
8277 gtk_container_add (GTK_CONTAINER (frame7), button12);
8279 frame8 = gtk_frame_new (NULL);
8280 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
8281 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
8283 button11 = gtk_button_new_with_label ("button11");
8284 gtk_container_add (GTK_CONTAINER (frame8), button11);
8286 button10 = gtk_button_new_with_label ("button10");
8287 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
8293 paned_keyboard_window3 (GtkWidget *widget)
8300 GtkWidget *button14;
8303 GtkWidget *button15;
8306 GtkWidget *button16;
8308 GtkWidget *button17;
8310 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8311 g_object_set_data (G_OBJECT (window3), "window3", window3);
8312 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
8314 gtk_window_set_screen (GTK_WINDOW (window3),
8315 gtk_widget_get_screen (widget));
8318 vbox2 = gtk_vbox_new (FALSE, 0);
8319 gtk_container_add (GTK_CONTAINER (window3), vbox2);
8321 label1 = gtk_label_new ("Three panes nested inside each other");
8322 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
8324 hpaned3 = gtk_hpaned_new ();
8325 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
8327 frame9 = gtk_frame_new (NULL);
8328 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
8329 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
8331 button14 = gtk_button_new_with_label ("button14");
8332 gtk_container_add (GTK_CONTAINER (frame9), button14);
8334 hpaned4 = gtk_hpaned_new ();
8335 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
8337 frame10 = gtk_frame_new (NULL);
8338 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
8339 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
8341 button15 = gtk_button_new_with_label ("button15");
8342 gtk_container_add (GTK_CONTAINER (frame10), button15);
8344 hpaned5 = gtk_hpaned_new ();
8345 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
8347 frame11 = gtk_frame_new (NULL);
8348 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
8349 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
8351 button16 = gtk_button_new_with_label ("button16");
8352 gtk_container_add (GTK_CONTAINER (frame11), button16);
8354 frame12 = gtk_frame_new (NULL);
8355 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
8356 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
8358 button17 = gtk_button_new_with_label ("button17");
8359 gtk_container_add (GTK_CONTAINER (frame12), button17);
8365 paned_keyboard_window4 (GtkWidget *widget)
8372 GtkWidget *button19;
8373 GtkWidget *button18;
8376 GtkWidget *button21;
8377 GtkWidget *button20;
8379 GtkWidget *button23;
8380 GtkWidget *button22;
8382 GtkWidget *button25;
8383 GtkWidget *button24;
8385 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8386 g_object_set_data (G_OBJECT (window4), "window4", window4);
8387 gtk_window_set_title (GTK_WINDOW (window4), "window4");
8389 gtk_window_set_screen (GTK_WINDOW (window4),
8390 gtk_widget_get_screen (widget));
8392 vbox3 = gtk_vbox_new (FALSE, 0);
8393 gtk_container_add (GTK_CONTAINER (window4), vbox3);
8395 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
8396 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
8397 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
8399 hpaned6 = gtk_hpaned_new ();
8400 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
8402 vpaned3 = gtk_vpaned_new ();
8403 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
8405 button19 = gtk_button_new_with_label ("button19");
8406 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
8408 button18 = gtk_button_new_with_label ("button18");
8409 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
8411 hbox3 = gtk_hbox_new (FALSE, 0);
8412 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
8414 vpaned4 = gtk_vpaned_new ();
8415 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
8417 button21 = gtk_button_new_with_label ("button21");
8418 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
8420 button20 = gtk_button_new_with_label ("button20");
8421 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
8423 vpaned5 = gtk_vpaned_new ();
8424 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
8426 button23 = gtk_button_new_with_label ("button23");
8427 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
8429 button22 = gtk_button_new_with_label ("button22");
8430 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
8432 vpaned6 = gtk_vpaned_new ();
8433 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
8435 button25 = gtk_button_new_with_label ("button25");
8436 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
8438 button24 = gtk_button_new_with_label ("button24");
8439 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
8445 create_paned_keyboard_navigation (GtkWidget *widget)
8447 static GtkWidget *window1 = NULL;
8448 static GtkWidget *window2 = NULL;
8449 static GtkWidget *window3 = NULL;
8450 static GtkWidget *window4 = NULL;
8453 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
8455 gtk_widget_destroy (window1);
8456 gtk_widget_destroy (window2);
8457 gtk_widget_destroy (window3);
8458 gtk_widget_destroy (window4);
8463 window1 = paned_keyboard_window1 (widget);
8464 g_signal_connect (window1, "destroy",
8465 G_CALLBACK (gtk_widget_destroyed),
8471 window2 = paned_keyboard_window2 (widget);
8472 g_signal_connect (window2, "destroy",
8473 G_CALLBACK (gtk_widget_destroyed),
8479 window3 = paned_keyboard_window3 (widget);
8480 g_signal_connect (window3, "destroy",
8481 G_CALLBACK (gtk_widget_destroyed),
8487 window4 = paned_keyboard_window4 (widget);
8488 g_signal_connect (window4, "destroy",
8489 G_CALLBACK (gtk_widget_destroyed),
8493 if (gtk_widget_get_visible (window1))
8494 gtk_widget_destroy (GTK_WIDGET (window1));
8496 gtk_widget_show_all (GTK_WIDGET (window1));
8498 if (gtk_widget_get_visible (window2))
8499 gtk_widget_destroy (GTK_WIDGET (window2));
8501 gtk_widget_show_all (GTK_WIDGET (window2));
8503 if (gtk_widget_get_visible (window3))
8504 gtk_widget_destroy (GTK_WIDGET (window3));
8506 gtk_widget_show_all (GTK_WIDGET (window3));
8508 if (gtk_widget_get_visible (window4))
8509 gtk_widget_destroy (GTK_WIDGET (window4));
8511 gtk_widget_show_all (GTK_WIDGET (window4));
8519 typedef struct _cursoroffset {gint x,y;} CursorOffset;
8522 shape_pressed (GtkWidget *widget, GdkEventButton *event)
8526 /* ignore double and triple click */
8527 if (event->type != GDK_BUTTON_PRESS)
8530 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
8531 p->x = (int) event->x;
8532 p->y = (int) event->y;
8534 gtk_grab_add (widget);
8535 gdk_pointer_grab (widget->window, TRUE,
8536 GDK_BUTTON_RELEASE_MASK |
8537 GDK_BUTTON_MOTION_MASK |
8538 GDK_POINTER_MOTION_HINT_MASK,
8543 shape_released (GtkWidget *widget)
8545 gtk_grab_remove (widget);
8546 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8551 shape_motion (GtkWidget *widget,
8552 GdkEventMotion *event)
8556 GdkModifierType mask;
8558 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
8561 * Can't use event->x / event->y here
8562 * because I need absolute coordinates.
8564 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
8565 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
8569 shape_create_icon (GdkScreen *screen,
8580 CursorOffset* icon_pos;
8582 GdkBitmap *gdk_pixmap_mask;
8583 GdkPixmap *gdk_pixmap;
8586 style = gtk_widget_get_default_style ();
8587 gc = style->black_gc;
8590 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
8592 window = gtk_window_new (window_type);
8593 gtk_window_set_screen (GTK_WINDOW (window), screen);
8595 fixed = gtk_fixed_new ();
8596 gtk_widget_set_size_request (fixed, 100, 100);
8597 gtk_container_add (GTK_CONTAINER (window), fixed);
8598 gtk_widget_show (fixed);
8600 gtk_widget_set_events (window,
8601 gtk_widget_get_events (window) |
8602 GDK_BUTTON_MOTION_MASK |
8603 GDK_POINTER_MOTION_HINT_MASK |
8604 GDK_BUTTON_PRESS_MASK);
8606 gtk_widget_realize (window);
8607 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
8608 &style->bg[GTK_STATE_NORMAL],
8611 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
8612 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
8613 gtk_widget_show (pixmap);
8615 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
8617 g_object_unref (gdk_pixmap_mask);
8618 g_object_unref (gdk_pixmap);
8620 g_signal_connect (window, "button_press_event",
8621 G_CALLBACK (shape_pressed), NULL);
8622 g_signal_connect (window, "button_release_event",
8623 G_CALLBACK (shape_released), NULL);
8624 g_signal_connect (window, "motion_notify_event",
8625 G_CALLBACK (shape_motion), NULL);
8627 icon_pos = g_new (CursorOffset, 1);
8628 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
8630 gtk_widget_set_uposition (window, x, y);
8631 gtk_widget_show (window);
8637 create_shapes (GtkWidget *widget)
8639 /* Variables used by the Drag/Drop and Shape Window demos */
8640 static GtkWidget *modeller = NULL;
8641 static GtkWidget *sheets = NULL;
8642 static GtkWidget *rings = NULL;
8643 static GtkWidget *with_region = NULL;
8644 GdkScreen *screen = gtk_widget_get_screen (widget);
8646 if (!(file_exists ("Modeller.xpm") &&
8647 file_exists ("FilesQueue.xpm") &&
8648 file_exists ("3DRings.xpm")))
8654 modeller = shape_create_icon (screen, "Modeller.xpm",
8655 440, 140, 0,0, GTK_WINDOW_POPUP);
8657 g_signal_connect (modeller, "destroy",
8658 G_CALLBACK (gtk_widget_destroyed),
8662 gtk_widget_destroy (modeller);
8666 sheets = shape_create_icon (screen, "FilesQueue.xpm",
8667 580, 170, 0,0, GTK_WINDOW_POPUP);
8669 g_signal_connect (sheets, "destroy",
8670 G_CALLBACK (gtk_widget_destroyed),
8675 gtk_widget_destroy (sheets);
8679 rings = shape_create_icon (screen, "3DRings.xpm",
8680 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
8682 g_signal_connect (rings, "destroy",
8683 G_CALLBACK (gtk_widget_destroyed),
8687 gtk_widget_destroy (rings);
8694 with_region = shape_create_icon (screen, "3DRings.xpm",
8695 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
8697 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
8699 g_signal_connect (with_region, "destroy",
8700 G_CALLBACK (gtk_widget_destroyed),
8703 /* reset shape from mask to a region */
8706 region = gdk_region_new ();
8718 gdk_region_union_with_rect (region, &rect);
8726 gdk_window_shape_combine_region (with_region->window,
8731 gtk_widget_destroy (with_region);
8739 create_wmhints (GtkWidget *widget)
8741 static GtkWidget *window = NULL;
8743 GtkWidget *separator;
8752 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8754 gtk_window_set_screen (GTK_WINDOW (window),
8755 gtk_widget_get_screen (widget));
8757 g_signal_connect (window, "destroy",
8758 G_CALLBACK (gtk_widget_destroyed),
8761 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
8762 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8764 gtk_widget_realize (window);
8766 circles = gdk_bitmap_create_from_data (window->window,
8767 (gchar *) circles_bits,
8770 gdk_window_set_icon (window->window, NULL,
8773 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
8775 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
8776 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
8778 box1 = gtk_vbox_new (FALSE, 0);
8779 gtk_container_add (GTK_CONTAINER (window), box1);
8780 gtk_widget_show (box1);
8782 label = gtk_label_new ("Try iconizing me!");
8783 gtk_widget_set_size_request (label, 150, 50);
8784 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
8785 gtk_widget_show (label);
8788 separator = gtk_hseparator_new ();
8789 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
8790 gtk_widget_show (separator);
8793 box2 = gtk_vbox_new (FALSE, 10);
8794 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8795 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8796 gtk_widget_show (box2);
8799 button = gtk_button_new_with_label ("close");
8801 g_signal_connect_swapped (button, "clicked",
8802 G_CALLBACK (gtk_widget_destroy),
8805 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8806 gtk_widget_set_can_default (button, TRUE);
8807 gtk_widget_grab_default (button);
8808 gtk_widget_show (button);
8811 if (!gtk_widget_get_visible (window))
8812 gtk_widget_show (window);
8814 gtk_widget_destroy (window);
8819 * Window state tracking
8823 window_state_callback (GtkWidget *widget,
8824 GdkEventWindowState *event,
8827 GtkWidget *label = data;
8830 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
8831 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
8832 "withdrawn" : "not withdrawn", ", ",
8833 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
8834 "iconified" : "not iconified", ", ",
8835 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
8836 "sticky" : "not sticky", ", ",
8837 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
8838 "maximized" : "not maximized", ", ",
8839 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
8840 "fullscreen" : "not fullscreen",
8841 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
8842 "above" : "not above", ", ",
8843 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
8844 "below" : "not below", ", ",
8847 gtk_label_set_text (GTK_LABEL (label), msg);
8855 tracking_label (GtkWidget *window)
8861 hbox = gtk_hbox_new (FALSE, 5);
8863 g_signal_connect_object (hbox,
8865 G_CALLBACK (gtk_widget_destroy),
8869 label = gtk_label_new ("<no window state events received>");
8870 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
8871 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
8873 g_signal_connect (window,
8874 "window_state_event",
8875 G_CALLBACK (window_state_callback),
8878 button = gtk_button_new_with_label ("Deiconify");
8879 g_signal_connect_object (button,
8881 G_CALLBACK (gtk_window_deiconify),
8884 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8886 button = gtk_button_new_with_label ("Iconify");
8887 g_signal_connect_object (button,
8889 G_CALLBACK (gtk_window_iconify),
8892 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8894 button = gtk_button_new_with_label ("Fullscreen");
8895 g_signal_connect_object (button,
8897 G_CALLBACK (gtk_window_fullscreen),
8900 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8902 button = gtk_button_new_with_label ("Unfullscreen");
8903 g_signal_connect_object (button,
8905 G_CALLBACK (gtk_window_unfullscreen),
8908 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8910 button = gtk_button_new_with_label ("Present");
8911 g_signal_connect_object (button,
8913 G_CALLBACK (gtk_window_present),
8916 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8918 button = gtk_button_new_with_label ("Show");
8919 g_signal_connect_object (button,
8921 G_CALLBACK (gtk_widget_show),
8924 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8926 gtk_widget_show_all (hbox);
8932 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
8934 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8936 gtk_window_set_keep_above (GTK_WINDOW (data),
8937 gtk_toggle_button_get_active (togglebutton));
8939 if (gtk_toggle_button_get_active (togglebutton))
8940 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8944 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
8946 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8948 gtk_window_set_keep_below (GTK_WINDOW (data),
8949 gtk_toggle_button_get_active (togglebutton));
8951 if (gtk_toggle_button_get_active (togglebutton))
8952 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8957 get_state_controls (GtkWidget *window)
8961 GtkWidget *button_above;
8962 GtkWidget *button_below;
8964 vbox = gtk_vbox_new (FALSE, 0);
8966 button = gtk_button_new_with_label ("Stick");
8967 g_signal_connect_object (button,
8969 G_CALLBACK (gtk_window_stick),
8972 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8974 button = gtk_button_new_with_label ("Unstick");
8975 g_signal_connect_object (button,
8977 G_CALLBACK (gtk_window_unstick),
8980 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8982 button = gtk_button_new_with_label ("Maximize");
8983 g_signal_connect_object (button,
8985 G_CALLBACK (gtk_window_maximize),
8988 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8990 button = gtk_button_new_with_label ("Unmaximize");
8991 g_signal_connect_object (button,
8993 G_CALLBACK (gtk_window_unmaximize),
8996 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8998 button = gtk_button_new_with_label ("Iconify");
8999 g_signal_connect_object (button,
9001 G_CALLBACK (gtk_window_iconify),
9004 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9006 button = gtk_button_new_with_label ("Fullscreen");
9007 g_signal_connect_object (button,
9009 G_CALLBACK (gtk_window_fullscreen),
9012 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9014 button = gtk_button_new_with_label ("Unfullscreen");
9015 g_signal_connect_object (button,
9017 G_CALLBACK (gtk_window_unfullscreen),
9020 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9022 button_above = gtk_toggle_button_new_with_label ("Keep above");
9023 g_signal_connect (button_above,
9025 G_CALLBACK (keep_window_above),
9027 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
9029 button_below = gtk_toggle_button_new_with_label ("Keep below");
9030 g_signal_connect (button_below,
9032 G_CALLBACK (keep_window_below),
9034 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
9036 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
9037 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
9039 button = gtk_button_new_with_label ("Hide (withdraw)");
9040 g_signal_connect_object (button,
9042 G_CALLBACK (gtk_widget_hide),
9045 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9047 gtk_widget_show_all (vbox);
9053 create_window_states (GtkWidget *widget)
9055 static GtkWidget *window = NULL;
9058 GtkWidget *iconified;
9060 GtkWidget *controls;
9064 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9065 gtk_window_set_screen (GTK_WINDOW (window),
9066 gtk_widget_get_screen (widget));
9068 g_signal_connect (window, "destroy",
9069 G_CALLBACK (gtk_widget_destroyed),
9072 gtk_window_set_title (GTK_WINDOW (window), "Window states");
9074 box1 = gtk_vbox_new (FALSE, 0);
9075 gtk_container_add (GTK_CONTAINER (window), box1);
9077 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9079 gtk_window_set_screen (GTK_WINDOW (iconified),
9080 gtk_widget_get_screen (widget));
9082 g_signal_connect_object (iconified, "destroy",
9083 G_CALLBACK (gtk_widget_destroy),
9086 gtk_window_iconify (GTK_WINDOW (iconified));
9087 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
9088 controls = get_state_controls (iconified);
9089 gtk_container_add (GTK_CONTAINER (iconified), controls);
9091 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9093 gtk_window_set_screen (GTK_WINDOW (normal),
9094 gtk_widget_get_screen (widget));
9096 g_signal_connect_object (normal, "destroy",
9097 G_CALLBACK (gtk_widget_destroy),
9101 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
9102 controls = get_state_controls (normal);
9103 gtk_container_add (GTK_CONTAINER (normal), controls);
9105 label = tracking_label (iconified);
9106 gtk_container_add (GTK_CONTAINER (box1), label);
9108 label = tracking_label (normal);
9109 gtk_container_add (GTK_CONTAINER (box1), label);
9111 gtk_widget_show_all (iconified);
9112 gtk_widget_show_all (normal);
9113 gtk_widget_show_all (box1);
9116 if (!gtk_widget_get_visible (window))
9117 gtk_widget_show (window);
9119 gtk_widget_destroy (window);
9127 configure_event_callback (GtkWidget *widget,
9128 GdkEventConfigure *event,
9131 GtkWidget *label = data;
9135 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
9137 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
9139 event->x, event->y, event->width, event->height,
9142 gtk_label_set_text (GTK_LABEL (label), msg);
9150 get_ints (GtkWidget *window,
9157 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
9158 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
9160 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
9161 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
9165 set_size_callback (GtkWidget *widget,
9170 get_ints (data, &w, &h);
9172 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
9176 unset_default_size_callback (GtkWidget *widget,
9179 gtk_window_set_default_size (g_object_get_data (data, "target"),
9184 set_default_size_callback (GtkWidget *widget,
9189 get_ints (data, &w, &h);
9191 gtk_window_set_default_size (g_object_get_data (data, "target"),
9196 unset_size_request_callback (GtkWidget *widget,
9199 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9204 set_size_request_callback (GtkWidget *widget,
9209 get_ints (data, &w, &h);
9211 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9216 set_location_callback (GtkWidget *widget,
9221 get_ints (data, &x, &y);
9223 gtk_window_move (g_object_get_data (data, "target"), x, y);
9227 move_to_position_callback (GtkWidget *widget,
9233 window = g_object_get_data (data, "target");
9235 gtk_window_get_position (window, &x, &y);
9237 gtk_window_move (window, x, y);
9241 set_geometry_callback (GtkWidget *entry,
9247 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
9249 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
9251 if (!gtk_window_parse_geometry (target, text))
9252 g_print ("Bad geometry string '%s'\n", text);
9258 allow_shrink_callback (GtkWidget *widget,
9261 g_object_set (g_object_get_data (data, "target"),
9263 GTK_TOGGLE_BUTTON (widget)->active,
9268 allow_grow_callback (GtkWidget *widget,
9271 g_object_set (g_object_get_data (data, "target"),
9273 GTK_TOGGLE_BUTTON (widget)->active,
9278 gravity_selected (GtkWidget *widget,
9281 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
9282 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
9286 pos_selected (GtkWidget *widget,
9289 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
9290 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
9294 move_gravity_window_to_current_position (GtkWidget *widget,
9300 window = GTK_WINDOW (data);
9302 gtk_window_get_position (window, &x, &y);
9304 gtk_window_move (window, x, y);
9308 get_screen_corner (GtkWindow *window,
9313 GdkScreen * screen = gtk_window_get_screen (window);
9315 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
9317 switch (gtk_window_get_gravity (window))
9319 case GDK_GRAVITY_SOUTH_EAST:
9320 *x = gdk_screen_get_width (screen) - w;
9321 *y = gdk_screen_get_height (screen) - h;
9324 case GDK_GRAVITY_NORTH_EAST:
9325 *x = gdk_screen_get_width (screen) - w;
9329 case GDK_GRAVITY_SOUTH_WEST:
9331 *y = gdk_screen_get_height (screen) - h;
9334 case GDK_GRAVITY_NORTH_WEST:
9339 case GDK_GRAVITY_SOUTH:
9340 *x = (gdk_screen_get_width (screen) - w) / 2;
9341 *y = gdk_screen_get_height (screen) - h;
9344 case GDK_GRAVITY_NORTH:
9345 *x = (gdk_screen_get_width (screen) - w) / 2;
9349 case GDK_GRAVITY_WEST:
9351 *y = (gdk_screen_get_height (screen) - h) / 2;
9354 case GDK_GRAVITY_EAST:
9355 *x = gdk_screen_get_width (screen) - w;
9356 *y = (gdk_screen_get_height (screen) - h) / 2;
9359 case GDK_GRAVITY_CENTER:
9360 *x = (gdk_screen_get_width (screen) - w) / 2;
9361 *y = (gdk_screen_get_height (screen) - h) / 2;
9364 case GDK_GRAVITY_STATIC:
9365 /* pick some random numbers */
9371 g_assert_not_reached ();
9377 move_gravity_window_to_starting_position (GtkWidget *widget,
9383 window = GTK_WINDOW (data);
9385 get_screen_corner (window,
9388 gtk_window_move (window, x, y);
9392 make_gravity_window (GtkWidget *destroy_with,
9401 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9403 gtk_window_set_screen (GTK_WINDOW (window),
9404 gtk_widget_get_screen (destroy_with));
9406 vbox = gtk_vbox_new (FALSE, 0);
9407 gtk_widget_show (vbox);
9409 gtk_container_add (GTK_CONTAINER (window), vbox);
9410 gtk_window_set_title (GTK_WINDOW (window), title);
9411 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
9413 g_signal_connect_object (destroy_with,
9415 G_CALLBACK (gtk_widget_destroy),
9420 button = gtk_button_new_with_mnemonic ("_Move to current position");
9422 g_signal_connect (button, "clicked",
9423 G_CALLBACK (move_gravity_window_to_current_position),
9426 gtk_container_add (GTK_CONTAINER (vbox), button);
9427 gtk_widget_show (button);
9429 button = gtk_button_new_with_mnemonic ("Move to _starting position");
9431 g_signal_connect (button, "clicked",
9432 G_CALLBACK (move_gravity_window_to_starting_position),
9435 gtk_container_add (GTK_CONTAINER (vbox), button);
9436 gtk_widget_show (button);
9438 /* Pretend this is the result of --geometry.
9439 * DO NOT COPY THIS CODE unless you are setting --geometry results,
9440 * and in that case you probably should just use gtk_window_parse_geometry().
9441 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
9442 * you are parsing --geometry or equivalent.
9444 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9448 gtk_window_set_default_size (GTK_WINDOW (window),
9451 get_screen_corner (GTK_WINDOW (window), &x, &y);
9453 gtk_window_move (GTK_WINDOW (window),
9460 do_gravity_test (GtkWidget *widget,
9463 GtkWidget *destroy_with = data;
9466 /* We put a window at each gravity point on the screen. */
9467 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
9469 gtk_widget_show (window);
9471 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
9473 gtk_widget_show (window);
9475 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
9477 gtk_widget_show (window);
9479 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
9481 gtk_widget_show (window);
9483 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
9485 gtk_widget_show (window);
9487 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
9489 gtk_widget_show (window);
9492 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
9494 gtk_widget_show (window);
9497 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
9499 gtk_widget_show (window);
9501 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
9503 gtk_widget_show (window);
9505 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
9507 gtk_widget_show (window);
9511 window_controls (GtkWidget *window)
9513 GtkWidget *control_window;
9524 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9526 gtk_window_set_screen (GTK_WINDOW (control_window),
9527 gtk_widget_get_screen (window));
9529 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
9531 g_object_set_data (G_OBJECT (control_window),
9535 g_signal_connect_object (control_window,
9537 G_CALLBACK (gtk_widget_destroy),
9541 vbox = gtk_vbox_new (FALSE, 5);
9543 gtk_container_add (GTK_CONTAINER (control_window), vbox);
9545 label = gtk_label_new ("<no configure events>");
9546 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9548 g_signal_connect (window,
9550 G_CALLBACK (configure_event_callback),
9553 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
9555 spin = gtk_spin_button_new (adj, 0, 0);
9557 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
9559 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
9561 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
9563 spin = gtk_spin_button_new (adj, 0, 0);
9565 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
9567 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
9569 entry = gtk_entry_new ();
9570 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9572 g_signal_connect (entry, "changed",
9573 G_CALLBACK (set_geometry_callback),
9576 button = gtk_button_new_with_label ("Show gravity test windows");
9577 g_signal_connect_swapped (button,
9579 G_CALLBACK (do_gravity_test),
9581 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9583 button = gtk_button_new_with_label ("Reshow with initial size");
9584 g_signal_connect_object (button,
9586 G_CALLBACK (gtk_window_reshow_with_initial_size),
9589 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9591 button = gtk_button_new_with_label ("Queue resize");
9592 g_signal_connect_object (button,
9594 G_CALLBACK (gtk_widget_queue_resize),
9597 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9599 button = gtk_button_new_with_label ("Resize");
9600 g_signal_connect (button,
9602 G_CALLBACK (set_size_callback),
9604 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9606 button = gtk_button_new_with_label ("Set default size");
9607 g_signal_connect (button,
9609 G_CALLBACK (set_default_size_callback),
9611 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9613 button = gtk_button_new_with_label ("Unset default size");
9614 g_signal_connect (button,
9616 G_CALLBACK (unset_default_size_callback),
9618 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9620 button = gtk_button_new_with_label ("Set size request");
9621 g_signal_connect (button,
9623 G_CALLBACK (set_size_request_callback),
9625 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9627 button = gtk_button_new_with_label ("Unset size request");
9628 g_signal_connect (button,
9630 G_CALLBACK (unset_size_request_callback),
9632 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9634 button = gtk_button_new_with_label ("Move");
9635 g_signal_connect (button,
9637 G_CALLBACK (set_location_callback),
9639 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9641 button = gtk_button_new_with_label ("Move to current position");
9642 g_signal_connect (button,
9644 G_CALLBACK (move_to_position_callback),
9646 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9648 button = gtk_check_button_new_with_label ("Allow shrink");
9649 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
9650 g_signal_connect (button,
9652 G_CALLBACK (allow_shrink_callback),
9654 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9656 button = gtk_check_button_new_with_label ("Allow grow");
9657 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
9658 g_signal_connect (button,
9660 G_CALLBACK (allow_grow_callback),
9662 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9664 button = gtk_button_new_with_mnemonic ("_Show");
9665 g_signal_connect_object (button,
9667 G_CALLBACK (gtk_widget_show),
9670 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9672 button = gtk_button_new_with_mnemonic ("_Hide");
9673 g_signal_connect_object (button,
9675 G_CALLBACK (gtk_widget_hide),
9678 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9680 menu = gtk_menu_new ();
9686 static gchar *names[] = {
9687 "GDK_GRAVITY_NORTH_WEST",
9688 "GDK_GRAVITY_NORTH",
9689 "GDK_GRAVITY_NORTH_EAST",
9691 "GDK_GRAVITY_CENTER",
9693 "GDK_GRAVITY_SOUTH_WEST",
9694 "GDK_GRAVITY_SOUTH",
9695 "GDK_GRAVITY_SOUTH_EAST",
9696 "GDK_GRAVITY_STATIC",
9700 g_assert (names[i]);
9702 mi = gtk_menu_item_new_with_label (names[i]);
9704 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
9709 gtk_widget_show_all (menu);
9711 om = gtk_option_menu_new ();
9712 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
9715 g_signal_connect (om,
9717 G_CALLBACK (gravity_selected),
9720 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
9723 menu = gtk_menu_new ();
9729 static gchar *names[] = {
9731 "GTK_WIN_POS_CENTER",
9732 "GTK_WIN_POS_MOUSE",
9733 "GTK_WIN_POS_CENTER_ALWAYS",
9734 "GTK_WIN_POS_CENTER_ON_PARENT",
9738 g_assert (names[i]);
9740 mi = gtk_menu_item_new_with_label (names[i]);
9742 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
9747 gtk_widget_show_all (menu);
9749 om = gtk_option_menu_new ();
9750 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
9753 g_signal_connect (om,
9755 G_CALLBACK (pos_selected),
9758 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
9760 gtk_widget_show_all (vbox);
9762 return control_window;
9766 create_window_sizing (GtkWidget *widget)
9768 static GtkWidget *window = NULL;
9769 static GtkWidget *target_window = NULL;
9775 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9776 gtk_window_set_screen (GTK_WINDOW (target_window),
9777 gtk_widget_get_screen (widget));
9778 label = gtk_label_new (NULL);
9779 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");
9780 gtk_container_add (GTK_CONTAINER (target_window), label);
9781 gtk_widget_show (label);
9783 g_signal_connect (target_window, "destroy",
9784 G_CALLBACK (gtk_widget_destroyed),
9787 window = window_controls (target_window);
9789 g_signal_connect (window, "destroy",
9790 G_CALLBACK (gtk_widget_destroyed),
9793 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
9796 /* don't show target window by default, we want to allow testing
9797 * of behavior on first show.
9800 if (!gtk_widget_get_visible (window))
9801 gtk_widget_show (window);
9803 gtk_widget_destroy (window);
9810 typedef struct _ProgressData {
9813 GtkWidget *block_spin;
9814 GtkWidget *x_align_spin;
9815 GtkWidget *y_align_spin;
9816 GtkWidget *step_spin;
9817 GtkWidget *act_blocks_spin;
9827 progress_timeout (gpointer data)
9832 adj = GTK_PROGRESS (data)->adjustment;
9834 new_val = adj->value + 1;
9835 if (new_val > adj->upper)
9836 new_val = adj->lower;
9838 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
9844 destroy_progress (GtkWidget *widget,
9845 ProgressData **pdata)
9847 gtk_timeout_remove ((*pdata)->timer);
9848 (*pdata)->timer = 0;
9849 (*pdata)->window = NULL;
9855 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
9857 ProgressData *pdata;
9860 pdata = (ProgressData *) data;
9862 if (!gtk_widget_get_mapped (widget))
9865 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
9867 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
9868 (GtkProgressBarOrientation) i);
9872 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
9874 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
9875 GTK_TOGGLE_BUTTON (widget)->active);
9876 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
9877 gtk_widget_set_sensitive (pdata->x_align_spin,
9878 GTK_TOGGLE_BUTTON (widget)->active);
9879 gtk_widget_set_sensitive (pdata->y_align_spin,
9880 GTK_TOGGLE_BUTTON (widget)->active);
9884 progressbar_toggle_ellipsize (GtkWidget *widget,
9887 ProgressData *pdata = data;
9888 if (gtk_widget_is_drawable (widget))
9890 gint i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
9891 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
9896 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
9898 ProgressData *pdata;
9901 pdata = (ProgressData *) data;
9903 if (!gtk_widget_get_mapped (widget))
9906 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
9909 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
9911 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
9913 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
9914 (GtkProgressBarStyle) i);
9918 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
9922 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
9923 sprintf (buf, "???");
9925 sprintf (buf, "%.0f%%", 100 *
9926 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
9927 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
9931 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
9933 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
9934 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
9935 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
9939 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
9941 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
9942 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
9946 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
9948 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
9949 gtk_spin_button_get_value_as_int
9950 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
9954 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
9956 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
9957 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
9958 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
9962 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
9964 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
9965 GTK_TOGGLE_BUTTON (widget)->active);
9966 gtk_widget_set_sensitive (pdata->step_spin,
9967 GTK_TOGGLE_BUTTON (widget)->active);
9968 gtk_widget_set_sensitive (pdata->act_blocks_spin,
9969 GTK_TOGGLE_BUTTON (widget)->active);
9973 entry_changed (GtkWidget *widget, ProgressData *pdata)
9975 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
9976 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
9980 create_progress_bar (GtkWidget *widget)
9992 static ProgressData *pdata = NULL;
9994 static gchar *items1[] =
10002 static gchar *items2[] =
10008 static char *ellipsize_items[] = {
10009 "None", // PANGO_ELLIPSIZE_NONE,
10010 "Start", // PANGO_ELLIPSIZE_START,
10011 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
10012 "End", // PANGO_ELLIPSIZE_END
10016 pdata = g_new0 (ProgressData, 1);
10018 if (!pdata->window)
10020 pdata->window = gtk_dialog_new ();
10022 gtk_window_set_screen (GTK_WINDOW (pdata->window),
10023 gtk_widget_get_screen (widget));
10025 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
10027 g_signal_connect (pdata->window, "destroy",
10028 G_CALLBACK (destroy_progress),
10033 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
10034 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
10036 vbox = gtk_vbox_new (FALSE, 5);
10037 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10038 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
10039 vbox, FALSE, TRUE, 0);
10041 frame = gtk_frame_new ("Progress");
10042 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10044 vbox2 = gtk_vbox_new (FALSE, 5);
10045 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10047 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10048 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10050 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
10051 g_signal_connect (adj, "value_changed",
10052 G_CALLBACK (progress_value_changed), pdata);
10054 pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
10056 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
10058 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10059 "%v from [%l,%u] (=%p%%)");
10060 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
10061 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
10063 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10064 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10066 hbox = gtk_hbox_new (FALSE, 5);
10067 gtk_container_add (GTK_CONTAINER (align), hbox);
10068 label = gtk_label_new ("Label updated by user :");
10069 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10070 pdata->label = gtk_label_new ("");
10071 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
10073 frame = gtk_frame_new ("Options");
10074 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10076 vbox2 = gtk_vbox_new (FALSE, 5);
10077 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10079 tab = gtk_table_new (7, 2, FALSE);
10080 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
10082 label = gtk_label_new ("Orientation :");
10083 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
10084 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10086 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10088 pdata->omenu1 = build_option_menu (items1, 4, 0,
10089 progressbar_toggle_orientation,
10091 hbox = gtk_hbox_new (FALSE, 0);
10092 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
10093 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10095 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
10097 check = gtk_check_button_new_with_label ("Show text");
10098 g_signal_connect (check, "clicked",
10099 G_CALLBACK (toggle_show_text),
10101 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
10102 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10105 hbox = gtk_hbox_new (FALSE, 0);
10106 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
10107 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10110 label = gtk_label_new ("Format : ");
10111 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10113 pdata->entry = gtk_entry_new ();
10114 g_signal_connect (pdata->entry, "changed",
10115 G_CALLBACK (entry_changed),
10117 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
10118 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
10119 gtk_widget_set_size_request (pdata->entry, 100, -1);
10120 gtk_widget_set_sensitive (pdata->entry, FALSE);
10122 label = gtk_label_new ("Text align :");
10123 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
10124 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10126 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10128 hbox = gtk_hbox_new (FALSE, 0);
10129 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
10130 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10133 label = gtk_label_new ("x :");
10134 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10136 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10137 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
10138 g_signal_connect (adj, "value_changed",
10139 G_CALLBACK (adjust_align), pdata);
10140 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
10141 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
10143 label = gtk_label_new ("y :");
10144 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10146 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10147 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
10148 g_signal_connect (adj, "value_changed",
10149 G_CALLBACK (adjust_align), pdata);
10150 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
10151 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
10153 label = gtk_label_new ("Ellipsize text :");
10154 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
10155 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10157 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10158 pdata->elmenu = build_option_menu (ellipsize_items,
10159 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
10160 2, // PANGO_ELLIPSIZE_MIDDLE
10161 progressbar_toggle_ellipsize,
10163 hbox = gtk_hbox_new (FALSE, 0);
10164 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
10165 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10167 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
10169 label = gtk_label_new ("Bar Style :");
10170 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 13, 14,
10171 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10173 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10175 pdata->omenu2 = build_option_menu (items2, 2, 0,
10176 progressbar_toggle_bar_style,
10178 hbox = gtk_hbox_new (FALSE, 0);
10179 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 13, 14,
10180 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10182 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
10184 label = gtk_label_new ("Block count :");
10185 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 14, 15,
10186 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10188 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10190 hbox = gtk_hbox_new (FALSE, 0);
10191 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 14, 15,
10192 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10194 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
10195 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
10196 g_signal_connect (adj, "value_changed",
10197 G_CALLBACK (adjust_blocks), pdata);
10198 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
10199 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10201 check = gtk_check_button_new_with_label ("Activity mode");
10202 g_signal_connect (check, "clicked",
10203 G_CALLBACK (toggle_activity_mode), pdata);
10204 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
10205 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10208 hbox = gtk_hbox_new (FALSE, 0);
10209 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 15, 16,
10210 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10212 label = gtk_label_new ("Step size : ");
10213 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10214 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
10215 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
10216 g_signal_connect (adj, "value_changed",
10217 G_CALLBACK (adjust_step), pdata);
10218 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
10219 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
10221 hbox = gtk_hbox_new (FALSE, 0);
10222 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 16, 17,
10223 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10225 label = gtk_label_new ("Blocks : ");
10226 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10227 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
10228 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
10229 g_signal_connect (adj, "value_changed",
10230 G_CALLBACK (adjust_act_blocks), pdata);
10231 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
10233 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
10235 button = gtk_button_new_with_label ("close");
10236 g_signal_connect_swapped (button, "clicked",
10237 G_CALLBACK (gtk_widget_destroy),
10239 gtk_widget_set_can_default (button, TRUE);
10240 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
10241 button, TRUE, TRUE, 0);
10242 gtk_widget_grab_default (button);
10245 if (!gtk_widget_get_visible (pdata->window))
10246 gtk_widget_show_all (pdata->window);
10248 gtk_widget_destroy (pdata->window);
10260 GtkWidget *res_widget;
10264 find_widget (GtkWidget *widget, FindWidgetData *data)
10266 GtkAllocation new_allocation;
10270 new_allocation = widget->allocation;
10272 if (data->found || !gtk_widget_get_mapped (widget))
10275 /* Note that in the following code, we only count the
10276 * position as being inside a WINDOW widget if it is inside
10277 * widget->window; points that are outside of widget->window
10278 * but within the allocation are not counted. This is consistent
10279 * with the way we highlight drag targets.
10281 if (gtk_widget_get_has_window (widget))
10283 new_allocation.x = 0;
10284 new_allocation.y = 0;
10287 if (widget->parent && !data->first)
10289 GdkWindow *window = widget->window;
10290 while (window != widget->parent->window)
10292 gint tx, ty, twidth, theight;
10293 gdk_drawable_get_size (window, &twidth, &theight);
10295 if (new_allocation.x < 0)
10297 new_allocation.width += new_allocation.x;
10298 new_allocation.x = 0;
10300 if (new_allocation.y < 0)
10302 new_allocation.height += new_allocation.y;
10303 new_allocation.y = 0;
10305 if (new_allocation.x + new_allocation.width > twidth)
10306 new_allocation.width = twidth - new_allocation.x;
10307 if (new_allocation.y + new_allocation.height > theight)
10308 new_allocation.height = theight - new_allocation.y;
10310 gdk_window_get_position (window, &tx, &ty);
10311 new_allocation.x += tx;
10313 new_allocation.y += ty;
10316 window = gdk_window_get_parent (window);
10320 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
10321 (data->x < new_allocation.x + new_allocation.width) &&
10322 (data->y < new_allocation.y + new_allocation.height))
10324 /* First, check if the drag is in a valid drop site in
10325 * one of our children
10327 if (GTK_IS_CONTAINER (widget))
10329 FindWidgetData new_data = *data;
10331 new_data.x -= x_offset;
10332 new_data.y -= y_offset;
10333 new_data.found = FALSE;
10334 new_data.first = FALSE;
10336 gtk_container_forall (GTK_CONTAINER (widget),
10337 (GtkCallback)find_widget,
10340 data->found = new_data.found;
10342 data->res_widget = new_data.res_widget;
10345 /* If not, and this widget is registered as a drop site, check to
10346 * emit "drag_motion" to check if we are actually in
10351 data->found = TRUE;
10352 data->res_widget = widget;
10358 find_widget_at_pointer (GdkDisplay *display)
10360 GtkWidget *widget = NULL;
10361 GdkWindow *pointer_window;
10363 FindWidgetData data;
10365 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
10367 if (pointer_window)
10369 gpointer widget_ptr;
10371 gdk_window_get_user_data (pointer_window, &widget_ptr);
10372 widget = widget_ptr;
10377 gdk_window_get_pointer (widget->window,
10382 data.found = FALSE;
10385 find_widget (widget, &data);
10387 return data.res_widget;
10393 struct PropertiesData {
10394 GtkWidget **window;
10401 destroy_properties (GtkWidget *widget,
10402 struct PropertiesData *data)
10406 *data->window = NULL;
10407 data->window = NULL;
10412 gdk_cursor_unref (data->cursor);
10413 data->cursor = NULL;
10418 g_signal_handler_disconnect (widget, data->handler);
10426 property_query_event (GtkWidget *widget,
10428 struct PropertiesData *data)
10430 GtkWidget *res_widget = NULL;
10432 if (!data->in_query)
10435 if (event->type == GDK_BUTTON_RELEASE)
10437 gtk_grab_remove (widget);
10438 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10441 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
10444 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
10445 gtk_widget_get_screen (widget));
10446 create_prop_editor (G_OBJECT (res_widget), 0);
10449 data->in_query = FALSE;
10456 query_properties (GtkButton *button,
10457 struct PropertiesData *data)
10461 g_signal_connect (button, "event",
10462 G_CALLBACK (property_query_event), data);
10466 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
10469 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
10471 GDK_BUTTON_RELEASE_MASK,
10476 gtk_grab_add (GTK_WIDGET (button));
10478 data->in_query = TRUE;
10482 create_properties (GtkWidget *widget)
10484 static GtkWidget *window = NULL;
10488 struct PropertiesData *data;
10490 data = g_new (struct PropertiesData, 1);
10491 data->window = &window;
10492 data->in_query = FALSE;
10493 data->cursor = NULL;
10498 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10500 gtk_window_set_screen (GTK_WINDOW (window),
10501 gtk_widget_get_screen (widget));
10503 data->handler = g_signal_connect (window, "destroy",
10504 G_CALLBACK (destroy_properties),
10507 gtk_window_set_title (GTK_WINDOW (window), "test properties");
10508 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
10510 vbox = gtk_vbox_new (FALSE, 1);
10511 gtk_container_add (GTK_CONTAINER (window), vbox);
10513 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
10514 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
10516 button = gtk_button_new_with_label ("Query properties");
10517 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
10518 g_signal_connect (button, "clicked",
10519 G_CALLBACK (query_properties),
10523 if (!gtk_widget_get_visible (window))
10524 gtk_widget_show_all (window);
10526 gtk_widget_destroy (window);
10530 struct SnapshotData {
10531 GtkWidget *toplevel_button;
10532 GtkWidget **window;
10535 gboolean is_toplevel;
10540 destroy_snapshot_data (GtkWidget *widget,
10541 struct SnapshotData *data)
10544 *data->window = NULL;
10548 gdk_cursor_unref (data->cursor);
10549 data->cursor = NULL;
10554 g_signal_handler_disconnect (widget, data->handler);
10562 snapshot_widget_event (GtkWidget *widget,
10564 struct SnapshotData *data)
10566 GtkWidget *res_widget = NULL;
10568 if (!data->in_query)
10571 if (event->type == GDK_BUTTON_RELEASE)
10573 gtk_grab_remove (widget);
10574 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10577 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
10578 if (data->is_toplevel && res_widget)
10579 res_widget = gtk_widget_get_toplevel (res_widget);
10583 GtkWidget *window, *image;
10585 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10586 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
10587 gtk_widget_realize (window);
10588 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
10590 /* this branch is needed to convert ARGB -> RGB */
10593 gdk_drawable_get_size (pixmap, &width, &height);
10594 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
10595 gtk_widget_get_colormap (res_widget),
10599 image = gtk_image_new_from_pixbuf (pixbuf);
10600 g_object_unref (pixbuf);
10603 image = gtk_image_new_from_pixmap (pixmap, NULL);
10604 gtk_container_add (GTK_CONTAINER (window), image);
10605 g_object_unref (pixmap);
10606 gtk_widget_show_all (window);
10609 data->in_query = FALSE;
10616 snapshot_widget (GtkButton *button,
10617 struct SnapshotData *data)
10621 g_signal_connect (button, "event",
10622 G_CALLBACK (snapshot_widget_event), data);
10624 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
10627 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
10630 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
10632 GDK_BUTTON_RELEASE_MASK,
10637 gtk_grab_add (GTK_WIDGET (button));
10639 data->in_query = TRUE;
10643 create_snapshot (GtkWidget *widget)
10645 static GtkWidget *window = NULL;
10648 struct SnapshotData *data;
10650 data = g_new (struct SnapshotData, 1);
10651 data->window = &window;
10652 data->in_query = FALSE;
10653 data->cursor = NULL;
10658 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10660 gtk_window_set_screen (GTK_WINDOW (window),
10661 gtk_widget_get_screen (widget));
10663 data->handler = g_signal_connect (window, "destroy",
10664 G_CALLBACK (destroy_snapshot_data),
10667 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
10668 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
10670 vbox = gtk_vbox_new (FALSE, 1);
10671 gtk_container_add (GTK_CONTAINER (window), vbox);
10673 button = gtk_button_new_with_label ("Snapshot widget");
10674 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
10675 g_signal_connect (button, "clicked",
10676 G_CALLBACK (snapshot_widget),
10679 button = gtk_button_new_with_label ("Snapshot toplevel");
10680 data->toplevel_button = button;
10681 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
10682 g_signal_connect (button, "clicked",
10683 G_CALLBACK (snapshot_widget),
10687 if (!gtk_widget_get_visible (window))
10688 gtk_widget_show_all (window);
10690 gtk_widget_destroy (window);
10699 selection_test_received (GtkWidget *list, GtkSelectionData *data)
10702 GtkWidget *list_item;
10706 if (data->length < 0)
10708 g_print ("Selection retrieval failed\n");
10711 if (data->type != GDK_SELECTION_TYPE_ATOM)
10713 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
10717 /* Clear out any current list items */
10719 gtk_list_clear_items (GTK_LIST(list), 0, -1);
10721 /* Add new items to list */
10723 atoms = (GdkAtom *)data->data;
10726 l = data->length / sizeof (GdkAtom);
10727 for (i = 0; i < l; i++)
10730 name = gdk_atom_name (atoms[i]);
10733 list_item = gtk_list_item_new_with_label (name);
10737 list_item = gtk_list_item_new_with_label ("(bad atom)");
10739 gtk_widget_show (list_item);
10740 item_list = g_list_append (item_list, list_item);
10743 gtk_list_append_items (GTK_LIST (list), item_list);
10749 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
10751 static GdkAtom targets_atom = GDK_NONE;
10753 if (targets_atom == GDK_NONE)
10754 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
10756 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
10761 create_selection_test (GtkWidget *widget)
10763 static GtkWidget *window = NULL;
10766 GtkWidget *scrolled_win;
10772 window = gtk_dialog_new ();
10774 gtk_window_set_screen (GTK_WINDOW (window),
10775 gtk_widget_get_screen (widget));
10777 g_signal_connect (window, "destroy",
10778 G_CALLBACK (gtk_widget_destroyed),
10781 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
10782 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10784 /* Create the list */
10786 vbox = gtk_vbox_new (FALSE, 5);
10787 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10788 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
10791 label = gtk_label_new ("Gets available targets for current selection");
10792 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10794 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
10795 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
10796 GTK_POLICY_AUTOMATIC,
10797 GTK_POLICY_AUTOMATIC);
10798 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
10799 gtk_widget_set_size_request (scrolled_win, 100, 200);
10801 list = gtk_list_new ();
10802 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
10804 g_signal_connect (list, "selection_received",
10805 G_CALLBACK (selection_test_received), NULL);
10807 /* .. And create some buttons */
10808 button = gtk_button_new_with_label ("Get Targets");
10809 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10810 button, TRUE, TRUE, 0);
10812 g_signal_connect (button, "clicked",
10813 G_CALLBACK (selection_test_get_targets), list);
10815 button = gtk_button_new_with_label ("Quit");
10816 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10817 button, TRUE, TRUE, 0);
10819 g_signal_connect_swapped (button, "clicked",
10820 G_CALLBACK (gtk_widget_destroy),
10824 if (!gtk_widget_get_visible (window))
10825 gtk_widget_show_all (window);
10827 gtk_widget_destroy (window);
10835 create_gamma_curve (GtkWidget *widget)
10837 static GtkWidget *window = NULL, *curve;
10838 static int count = 0;
10845 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10846 gtk_window_set_screen (GTK_WINDOW (window),
10847 gtk_widget_get_screen (widget));
10849 gtk_window_set_title (GTK_WINDOW (window), "test");
10850 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
10852 g_signal_connect (window, "destroy",
10853 G_CALLBACK(gtk_widget_destroyed),
10856 curve = gtk_gamma_curve_new ();
10857 gtk_container_add (GTK_CONTAINER (window), curve);
10858 gtk_widget_show (curve);
10861 max = 127 + (count % 2)*128;
10862 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
10864 for (i = 0; i < max; ++i)
10865 vec[i] = (127 / sqrt (max)) * sqrt (i);
10866 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
10869 if (!gtk_widget_get_visible (window))
10870 gtk_widget_show (window);
10871 else if (count % 4 == 3)
10873 gtk_widget_destroy (window);
10884 static int scroll_test_pos = 0.0;
10887 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
10888 GtkAdjustment *adj)
10891 gint imin, imax, jmin, jmax;
10893 imin = (event->area.x) / 10;
10894 imax = (event->area.x + event->area.width + 9) / 10;
10896 jmin = ((int)adj->value + event->area.y) / 10;
10897 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
10899 gdk_window_clear_area (widget->window,
10900 event->area.x, event->area.y,
10901 event->area.width, event->area.height);
10903 for (i=imin; i<imax; i++)
10904 for (j=jmin; j<jmax; j++)
10906 gdk_draw_rectangle (widget->window,
10907 widget->style->black_gc,
10909 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
10915 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
10916 GtkAdjustment *adj)
10918 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
10919 -adj->page_increment / 2:
10920 adj->page_increment / 2);
10921 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
10922 gtk_adjustment_set_value (adj, new_value);
10928 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
10929 GtkAdjustment *adj)
10931 adj->page_increment = 0.9 * widget->allocation.height;
10932 adj->page_size = widget->allocation.height;
10934 g_signal_emit_by_name (adj, "changed");
10938 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
10940 /* gint source_min = (int)adj->value - scroll_test_pos; */
10943 dy = scroll_test_pos - (int)adj->value;
10944 scroll_test_pos = adj->value;
10946 if (!gtk_widget_is_drawable (widget))
10948 gdk_window_scroll (widget->window, 0, dy);
10949 gdk_window_process_updates (widget->window, FALSE);
10954 create_scroll_test (GtkWidget *widget)
10956 static GtkWidget *window = NULL;
10958 GtkWidget *drawing_area;
10959 GtkWidget *scrollbar;
10961 GtkAdjustment *adj;
10962 GdkGeometry geometry;
10963 GdkWindowHints geometry_mask;
10967 window = gtk_dialog_new ();
10969 gtk_window_set_screen (GTK_WINDOW (window),
10970 gtk_widget_get_screen (widget));
10972 g_signal_connect (window, "destroy",
10973 G_CALLBACK (gtk_widget_destroyed),
10976 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
10977 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10979 hbox = gtk_hbox_new (FALSE, 0);
10980 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
10982 gtk_widget_show (hbox);
10984 drawing_area = gtk_drawing_area_new ();
10985 gtk_widget_set_size_request (drawing_area, 200, 200);
10986 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
10987 gtk_widget_show (drawing_area);
10989 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
10991 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
10992 scroll_test_pos = 0.0;
10994 scrollbar = gtk_vscrollbar_new (adj);
10995 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
10996 gtk_widget_show (scrollbar);
10998 g_signal_connect (drawing_area, "expose_event",
10999 G_CALLBACK (scroll_test_expose), adj);
11000 g_signal_connect (drawing_area, "configure_event",
11001 G_CALLBACK (scroll_test_configure), adj);
11002 g_signal_connect (drawing_area, "scroll_event",
11003 G_CALLBACK (scroll_test_scroll), adj);
11005 g_signal_connect (adj, "value_changed",
11006 G_CALLBACK (scroll_test_adjustment_changed),
11009 /* .. And create some buttons */
11011 button = gtk_button_new_with_label ("Quit");
11012 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11013 button, TRUE, TRUE, 0);
11015 g_signal_connect_swapped (button, "clicked",
11016 G_CALLBACK (gtk_widget_destroy),
11018 gtk_widget_show (button);
11020 /* Set up gridded geometry */
11022 geometry_mask = GDK_HINT_MIN_SIZE |
11023 GDK_HINT_BASE_SIZE |
11024 GDK_HINT_RESIZE_INC;
11026 geometry.min_width = 20;
11027 geometry.min_height = 20;
11028 geometry.base_width = 0;
11029 geometry.base_height = 0;
11030 geometry.width_inc = 10;
11031 geometry.height_inc = 10;
11033 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11034 drawing_area, &geometry, geometry_mask);
11037 if (!gtk_widget_get_visible (window))
11038 gtk_widget_show (window);
11040 gtk_widget_destroy (window);
11047 static int timer = 0;
11050 timeout_test (GtkWidget *label)
11052 static int count = 0;
11053 static char buffer[32];
11055 sprintf (buffer, "count: %d", ++count);
11056 gtk_label_set_text (GTK_LABEL (label), buffer);
11062 start_timeout_test (GtkWidget *widget,
11067 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
11072 stop_timeout_test (GtkWidget *widget,
11077 gtk_timeout_remove (timer);
11083 destroy_timeout_test (GtkWidget *widget,
11084 GtkWidget **window)
11086 stop_timeout_test (NULL, NULL);
11092 create_timeout_test (GtkWidget *widget)
11094 static GtkWidget *window = NULL;
11100 window = gtk_dialog_new ();
11102 gtk_window_set_screen (GTK_WINDOW (window),
11103 gtk_widget_get_screen (widget));
11105 g_signal_connect (window, "destroy",
11106 G_CALLBACK (destroy_timeout_test),
11109 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
11110 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11112 label = gtk_label_new ("count: 0");
11113 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11114 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11115 label, TRUE, TRUE, 0);
11116 gtk_widget_show (label);
11118 button = gtk_button_new_with_label ("close");
11119 g_signal_connect_swapped (button, "clicked",
11120 G_CALLBACK (gtk_widget_destroy),
11122 gtk_widget_set_can_default (button, TRUE);
11123 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11124 button, TRUE, TRUE, 0);
11125 gtk_widget_grab_default (button);
11126 gtk_widget_show (button);
11128 button = gtk_button_new_with_label ("start");
11129 g_signal_connect (button, "clicked",
11130 G_CALLBACK(start_timeout_test),
11132 gtk_widget_set_can_default (button, TRUE);
11133 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11134 button, TRUE, TRUE, 0);
11135 gtk_widget_show (button);
11137 button = gtk_button_new_with_label ("stop");
11138 g_signal_connect (button, "clicked",
11139 G_CALLBACK (stop_timeout_test),
11141 gtk_widget_set_can_default (button, TRUE);
11142 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11143 button, TRUE, TRUE, 0);
11144 gtk_widget_show (button);
11147 if (!gtk_widget_get_visible (window))
11148 gtk_widget_show (window);
11150 gtk_widget_destroy (window);
11157 static int idle_id = 0;
11160 idle_test (GtkWidget *label)
11162 static int count = 0;
11163 static char buffer[32];
11165 sprintf (buffer, "count: %d", ++count);
11166 gtk_label_set_text (GTK_LABEL (label), buffer);
11172 start_idle_test (GtkWidget *widget,
11177 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
11182 stop_idle_test (GtkWidget *widget,
11187 gtk_idle_remove (idle_id);
11193 destroy_idle_test (GtkWidget *widget,
11194 GtkWidget **window)
11196 stop_idle_test (NULL, NULL);
11202 toggle_idle_container (GObject *button,
11203 GtkContainer *container)
11205 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
11209 create_idle_test (GtkWidget *widget)
11211 static GtkWidget *window = NULL;
11214 GtkWidget *container;
11218 GtkWidget *button2;
11222 window = gtk_dialog_new ();
11224 gtk_window_set_screen (GTK_WINDOW (window),
11225 gtk_widget_get_screen (widget));
11227 g_signal_connect (window, "destroy",
11228 G_CALLBACK (destroy_idle_test),
11231 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
11232 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11234 label = gtk_label_new ("count: 0");
11235 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11236 gtk_widget_show (label);
11239 g_object_new (GTK_TYPE_HBOX,
11241 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
11242 * "GtkWidget::visible", TRUE,
11247 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11248 container, TRUE, TRUE, 0);
11251 g_object_new (GTK_TYPE_FRAME,
11253 "label", "Label Container",
11255 "parent", GTK_DIALOG (window)->vbox,
11258 g_object_new (GTK_TYPE_VBOX,
11263 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
11264 "label", "Resize-Parent",
11265 "user_data", (void*)GTK_RESIZE_PARENT,
11269 "signal::clicked", toggle_idle_container, container,
11271 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
11272 "label", "Resize-Queue",
11273 "user_data", (void*)GTK_RESIZE_QUEUE,
11278 g_object_connect (button,
11279 "signal::clicked", toggle_idle_container, container,
11281 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
11282 "label", "Resize-Immediate",
11283 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
11285 g_object_connect (button2,
11286 "signal::clicked", toggle_idle_container, container,
11288 g_object_set (button2,
11294 button = gtk_button_new_with_label ("close");
11295 g_signal_connect_swapped (button, "clicked",
11296 G_CALLBACK (gtk_widget_destroy),
11298 gtk_widget_set_can_default (button, TRUE);
11299 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11300 button, TRUE, TRUE, 0);
11301 gtk_widget_grab_default (button);
11302 gtk_widget_show (button);
11304 button = gtk_button_new_with_label ("start");
11305 g_signal_connect (button, "clicked",
11306 G_CALLBACK (start_idle_test),
11308 gtk_widget_set_can_default (button, TRUE);
11309 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11310 button, TRUE, TRUE, 0);
11311 gtk_widget_show (button);
11313 button = gtk_button_new_with_label ("stop");
11314 g_signal_connect (button, "clicked",
11315 G_CALLBACK (stop_idle_test),
11317 gtk_widget_set_can_default (button, TRUE);
11318 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11319 button, TRUE, TRUE, 0);
11320 gtk_widget_show (button);
11323 if (!gtk_widget_get_visible (window))
11324 gtk_widget_show (window);
11326 gtk_widget_destroy (window);
11334 reload_all_rc_files (void)
11336 static GdkAtom atom_rcfiles = GDK_NONE;
11338 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
11342 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
11344 for(i = 0; i < 5; i++)
11345 send_event->client.data.l[i] = 0;
11346 send_event->client.data_format = 32;
11347 send_event->client.message_type = atom_rcfiles;
11348 gdk_event_send_clientmessage_toall (send_event);
11350 gdk_event_free (send_event);
11354 create_rc_file (GtkWidget *widget)
11356 static GtkWidget *window = NULL;
11364 window = gtk_dialog_new ();
11366 gtk_window_set_screen (GTK_WINDOW (window),
11367 gtk_widget_get_screen (widget));
11369 g_signal_connect (window, "destroy",
11370 G_CALLBACK (gtk_widget_destroyed),
11373 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
11374 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
11376 vbox = gtk_vbox_new (FALSE, 0);
11377 gtk_container_add (GTK_CONTAINER (frame), vbox);
11379 label = gtk_label_new ("This label should be red");
11380 gtk_widget_set_name (label, "testgtk-red-label");
11381 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11383 label = gtk_label_new ("This label should be green");
11384 gtk_widget_set_name (label, "testgtk-green-label");
11385 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11387 label = gtk_label_new ("This label should be blue");
11388 gtk_widget_set_name (label, "testgtk-blue-label");
11389 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11391 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
11392 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11394 button = gtk_button_new_with_label ("Reload");
11395 g_signal_connect (button, "clicked",
11396 G_CALLBACK (gtk_rc_reparse_all), NULL);
11397 gtk_widget_set_can_default (button, TRUE);
11398 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11399 button, TRUE, TRUE, 0);
11400 gtk_widget_grab_default (button);
11402 button = gtk_button_new_with_label ("Reload All");
11403 g_signal_connect (button, "clicked",
11404 G_CALLBACK (reload_all_rc_files), NULL);
11405 gtk_widget_set_can_default (button, TRUE);
11406 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11407 button, TRUE, TRUE, 0);
11409 button = gtk_button_new_with_label ("Close");
11410 g_signal_connect_swapped (button, "clicked",
11411 G_CALLBACK (gtk_widget_destroy),
11413 gtk_widget_set_can_default (button, TRUE);
11414 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11415 button, TRUE, TRUE, 0);
11418 if (!gtk_widget_get_visible (window))
11419 gtk_widget_show_all (window);
11421 gtk_widget_destroy (window);
11425 * Test of recursive mainloop
11429 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
11436 create_mainloop (GtkWidget *widget)
11438 static GtkWidget *window = NULL;
11444 window = gtk_dialog_new ();
11446 gtk_window_set_screen (GTK_WINDOW (window),
11447 gtk_widget_get_screen (widget));
11449 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
11451 g_signal_connect (window, "destroy",
11452 G_CALLBACK (mainloop_destroyed),
11455 label = gtk_label_new ("In recursive main loop...");
11456 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
11458 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
11460 gtk_widget_show (label);
11462 button = gtk_button_new_with_label ("Leave");
11463 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
11466 g_signal_connect_swapped (button, "clicked",
11467 G_CALLBACK (gtk_widget_destroy),
11470 gtk_widget_set_can_default (button, TRUE);
11471 gtk_widget_grab_default (button);
11473 gtk_widget_show (button);
11476 if (!gtk_widget_get_visible (window))
11478 gtk_widget_show (window);
11480 g_print ("create_mainloop: start\n");
11482 g_print ("create_mainloop: done\n");
11485 gtk_widget_destroy (window);
11489 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
11494 gint imin, imax, jmin, jmax;
11496 layout = GTK_LAYOUT (widget);
11498 if (event->window != layout->bin_window)
11501 imin = (event->area.x) / 10;
11502 imax = (event->area.x + event->area.width + 9) / 10;
11504 jmin = (event->area.y) / 10;
11505 jmax = (event->area.y + event->area.height + 9) / 10;
11507 for (i=imin; i<imax; i++)
11508 for (j=jmin; j<jmax; j++)
11510 gdk_draw_rectangle (layout->bin_window,
11511 widget->style->black_gc,
11519 void create_layout (GtkWidget *widget)
11521 static GtkWidget *window = NULL;
11523 GtkWidget *scrolledwindow;
11532 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11533 gtk_window_set_screen (GTK_WINDOW (window),
11534 gtk_widget_get_screen (widget));
11536 g_signal_connect (window, "destroy",
11537 G_CALLBACK (gtk_widget_destroyed),
11540 gtk_window_set_title (GTK_WINDOW (window), "Layout");
11541 gtk_widget_set_size_request (window, 200, 200);
11543 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
11544 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
11546 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
11547 GTK_CORNER_TOP_RIGHT);
11549 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
11551 layout = gtk_layout_new (NULL, NULL);
11552 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
11554 /* We set step sizes here since GtkLayout does not set
11557 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
11558 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
11560 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
11561 g_signal_connect (layout, "expose_event",
11562 G_CALLBACK (layout_expose_handler), NULL);
11564 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
11566 for (i=0 ; i < 16 ; i++)
11567 for (j=0 ; j < 16 ; j++)
11569 sprintf(buf, "Button %d, %d", i, j);
11571 button = gtk_button_new_with_label (buf);
11573 button = gtk_label_new (buf);
11575 gtk_layout_put (GTK_LAYOUT (layout), button,
11579 for (i=16; i < 1280; i++)
11581 sprintf(buf, "Button %d, %d", i, 0);
11583 button = gtk_button_new_with_label (buf);
11585 button = gtk_label_new (buf);
11587 gtk_layout_put (GTK_LAYOUT (layout), button,
11592 if (!gtk_widget_get_visible (window))
11593 gtk_widget_show_all (window);
11595 gtk_widget_destroy (window);
11599 create_styles (GtkWidget *widget)
11601 static GtkWidget *window = NULL;
11606 static GdkColor red = { 0, 0xffff, 0, 0 };
11607 static GdkColor green = { 0, 0, 0xffff, 0 };
11608 static GdkColor blue = { 0, 0, 0, 0xffff };
11609 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
11610 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
11611 PangoFontDescription *font_desc;
11613 GtkRcStyle *rc_style;
11617 window = gtk_dialog_new ();
11618 gtk_window_set_screen (GTK_WINDOW (window),
11619 gtk_widget_get_screen (widget));
11621 g_signal_connect (window, "destroy",
11622 G_CALLBACK (gtk_widget_destroyed),
11626 button = gtk_button_new_with_label ("Close");
11627 g_signal_connect_swapped (button, "clicked",
11628 G_CALLBACK (gtk_widget_destroy),
11630 gtk_widget_set_can_default (button, TRUE);
11631 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11632 button, TRUE, TRUE, 0);
11633 gtk_widget_show (button);
11635 vbox = gtk_vbox_new (FALSE, 5);
11636 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11637 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
11639 label = gtk_label_new ("Font:");
11640 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11641 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11643 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
11645 button = gtk_button_new_with_label ("Some Text");
11646 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
11647 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11649 label = gtk_label_new ("Foreground:");
11650 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11651 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11653 button = gtk_button_new_with_label ("Some Text");
11654 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
11655 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11657 label = gtk_label_new ("Background:");
11658 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11659 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11661 button = gtk_button_new_with_label ("Some Text");
11662 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
11663 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11665 label = gtk_label_new ("Text:");
11666 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11667 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11669 entry = gtk_entry_new ();
11670 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
11671 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
11672 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11674 label = gtk_label_new ("Base:");
11675 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11676 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11678 entry = gtk_entry_new ();
11679 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
11680 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
11681 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11683 label = gtk_label_new ("Cursor:");
11684 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11685 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11687 entry = gtk_entry_new ();
11688 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
11689 gtk_widget_modify_cursor (entry, &red, &red);
11690 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11692 label = gtk_label_new ("Multiple:");
11693 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
11694 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11696 button = gtk_button_new_with_label ("Some Text");
11698 rc_style = gtk_rc_style_new ();
11700 rc_style->font_desc = pango_font_description_copy (font_desc);
11701 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
11702 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
11703 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
11704 rc_style->fg[GTK_STATE_NORMAL] = yellow;
11705 rc_style->bg[GTK_STATE_NORMAL] = blue;
11706 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
11707 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
11708 rc_style->fg[GTK_STATE_ACTIVE] = red;
11709 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
11710 rc_style->xthickness = 5;
11711 rc_style->ythickness = 5;
11713 gtk_widget_modify_style (button, rc_style);
11714 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
11716 g_object_unref (rc_style);
11718 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11721 if (!gtk_widget_get_visible (window))
11722 gtk_widget_show_all (window);
11724 gtk_widget_destroy (window);
11728 * Main Window and Exit
11732 do_exit (GtkWidget *widget, GtkWidget *window)
11734 gtk_widget_destroy (window);
11740 void (*func) (GtkWidget *widget);
11741 gboolean do_not_benchmark;
11744 { "alpha window", create_alpha_window },
11745 { "big windows", create_big_windows },
11746 { "button box", create_button_box },
11747 { "buttons", create_buttons },
11748 { "check buttons", create_check_buttons },
11749 { "color selection", create_color_selection },
11750 { "composited window", create_composited_window },
11751 { "cursors", create_cursors },
11752 { "dialog", create_dialog },
11753 { "display & screen", create_display_screen, TRUE },
11754 { "entry", create_entry },
11755 { "event box", create_event_box },
11756 { "event watcher", create_event_watcher },
11757 { "expander", create_expander },
11758 { "flipping", create_flipping },
11759 { "focus", create_focus },
11760 { "font selection", create_font_selection },
11761 { "gamma curve", create_gamma_curve, TRUE },
11762 { "gridded geometry", create_gridded_geometry },
11763 { "handle box", create_handle_box },
11764 { "image from drawable", create_get_image },
11765 { "image", create_image },
11766 { "item factory", create_item_factory },
11767 { "key lookup", create_key_lookup },
11768 { "labels", create_labels },
11769 { "layout", create_layout },
11770 { "list", create_list },
11771 { "menus", create_menus },
11772 { "message dialog", create_message_dialog },
11773 { "modal window", create_modal_window, TRUE },
11774 { "notebook", create_notebook },
11775 { "panes", create_panes },
11776 { "paned keyboard", create_paned_keyboard_navigation },
11777 { "pixmap", create_pixmap },
11778 { "progress bar", create_progress_bar },
11779 { "properties", create_properties },
11780 { "radio buttons", create_radio_buttons },
11781 { "range controls", create_range_controls },
11782 { "rc file", create_rc_file },
11783 { "reparent", create_reparent },
11784 { "resize grips", create_resize_grips },
11785 { "rotated label", create_rotated_label },
11786 { "rotated text", create_rotated_text },
11787 { "rulers", create_rulers },
11788 { "saved position", create_saved_position },
11789 { "scrolled windows", create_scrolled_windows },
11790 { "shapes", create_shapes },
11791 { "size groups", create_size_groups },
11792 { "snapshot", create_snapshot },
11793 { "spinbutton", create_spins },
11794 { "statusbar", create_statusbar },
11795 { "styles", create_styles },
11796 { "test idle", create_idle_test },
11797 { "test mainloop", create_mainloop, TRUE },
11798 { "test scrolling", create_scroll_test },
11799 { "test selection", create_selection_test },
11800 { "test timeout", create_timeout_test },
11801 { "text", create_text },
11802 { "toggle buttons", create_toggle_buttons },
11803 { "toolbar", create_toolbar },
11804 { "tooltips", create_tooltips },
11805 { "tree", create_tree_mode_window},
11806 { "WM hints", create_wmhints },
11807 { "window sizing", create_window_sizing },
11808 { "window states", create_window_states }
11810 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
11813 create_main_window (void)
11818 GtkWidget *scrolled_window;
11822 GtkWidget *separator;
11823 GdkGeometry geometry;
11826 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11827 gtk_widget_set_name (window, "main window");
11828 gtk_widget_set_uposition (window, 50, 20);
11829 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
11831 geometry.min_width = -1;
11832 geometry.min_height = -1;
11833 geometry.max_width = -1;
11834 geometry.max_height = G_MAXSHORT;
11835 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
11837 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
11839 g_signal_connect (window, "destroy",
11840 G_CALLBACK (gtk_main_quit),
11842 g_signal_connect (window, "delete-event",
11843 G_CALLBACK (gtk_false),
11846 box1 = gtk_vbox_new (FALSE, 0);
11847 gtk_container_add (GTK_CONTAINER (window), box1);
11849 if (gtk_micro_version > 0)
11854 gtk_micro_version);
11859 gtk_minor_version);
11861 label = gtk_label_new (buffer);
11862 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
11863 gtk_widget_set_name (label, "testgtk-version-label");
11865 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
11866 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
11867 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
11869 GTK_POLICY_AUTOMATIC);
11870 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
11872 box2 = gtk_vbox_new (FALSE, 0);
11873 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
11874 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
11875 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
11876 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
11877 gtk_widget_show (box2);
11879 for (i = 0; i < nbuttons; i++)
11881 button = gtk_button_new_with_label (buttons[i].label);
11882 if (buttons[i].func)
11883 g_signal_connect (button,
11885 G_CALLBACK(buttons[i].func),
11888 gtk_widget_set_sensitive (button, FALSE);
11889 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
11892 separator = gtk_hseparator_new ();
11893 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
11895 box2 = gtk_vbox_new (FALSE, 10);
11896 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
11897 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
11899 button = gtk_button_new_with_mnemonic ("_Close");
11900 g_signal_connect (button, "clicked",
11901 G_CALLBACK (do_exit),
11903 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
11904 gtk_widget_set_can_default (button, TRUE);
11905 gtk_widget_grab_default (button);
11907 gtk_widget_show_all (window);
11913 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
11914 G_FILE_TEST_EXISTS))
11916 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
11917 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
11922 pad (const char *str, int to)
11924 static char buf[256];
11925 int len = strlen (str);
11928 for (i = 0; i < to; i++)
11933 memcpy (buf, str, len);
11939 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
11941 fn (widget); /* on */
11942 while (g_main_context_iteration (NULL, FALSE));
11943 fn (widget); /* off */
11944 while (g_main_context_iteration (NULL, FALSE));
11948 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
11954 static gboolean printed_headers = FALSE;
11956 if (!printed_headers) {
11957 g_print ("Test Iters First Other\n");
11958 g_print ("-------------------- ----- ---------- ----------\n");
11959 printed_headers = TRUE;
11962 g_get_current_time (&tv0);
11963 bench_iteration (widget, fn);
11964 g_get_current_time (&tv1);
11966 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
11967 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
11969 g_get_current_time (&tv0);
11970 for (n = 0; n < num - 1; n++)
11971 bench_iteration (widget, fn);
11972 g_get_current_time (&tv1);
11973 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
11974 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
11976 g_print ("%s %5d ", pad (name, 20), num);
11978 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
11980 g_print ("%10.1f\n", dt_first);
11984 do_bench (char* what, int num)
11988 void (* fn) (GtkWidget *widget);
11990 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11992 if (g_ascii_strcasecmp (what, "ALL") == 0)
11994 for (i = 0; i < nbuttons; i++)
11996 if (!buttons[i].do_not_benchmark)
11997 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
12004 for (i = 0; i < nbuttons; i++)
12006 if (strcmp (buttons[i].label, what) == 0)
12008 fn = buttons[i].func;
12014 g_print ("Can't bench: \"%s\" not found.\n", what);
12016 do_real_bench (widget, fn, buttons[i].label, num);
12023 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
12028 main (int argc, char *argv[])
12030 GtkBindingSet *binding_set;
12032 gboolean done_benchmarks = FALSE;
12034 srand (time (NULL));
12038 /* Check to see if we are being run from the correct
12041 if (file_exists ("testgtkrc"))
12042 gtk_rc_add_default_file ("testgtkrc");
12043 else if (file_exists ("tests/testgtkrc"))
12044 gtk_rc_add_default_file ("tests/testgtkrc");
12046 g_warning ("Couldn't find file \"testgtkrc\".");
12048 g_set_application_name ("GTK+ Test Program");
12050 gtk_init (&argc, &argv);
12052 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
12061 for (i = 1; i < argc; i++)
12063 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
12070 nextarg = strchr (argv[i], '=');
12081 count = strchr (nextarg, ':');
12084 what = g_strndup (nextarg, count - nextarg);
12086 num = atoi (count);
12091 what = g_strdup (nextarg);
12093 do_bench (what, num ? num : 1);
12094 done_benchmarks = TRUE;
12099 if (done_benchmarks)
12104 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
12105 gtk_binding_entry_add_signal (binding_set,
12106 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
12109 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
12111 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
12115 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
12116 " fg[NORMAL] = \"#ff0000\"\n"
12117 " font = \"Sans 18\"\n"
12119 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
12121 create_main_window ();
12127 while (g_main_context_pending (NULL))
12128 g_main_context_iteration (NULL, FALSE);
12131 while (g_main_context_pending (NULL))
12132 g_main_context_iteration (NULL, FALSE);