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_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_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_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_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_VISIBLE (window))
783 gtk_widget_show_all (window);
785 gtk_widget_hide (window);
793 button_window (GtkWidget *widget,
796 if (!GTK_WIDGET_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_FLAGS (button[9], GTK_CAN_DEFAULT);
913 gtk_widget_grab_default (button[9]);
916 if (!GTK_WIDGET_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_FLAGS (button, GTK_CAN_DEFAULT);
981 gtk_widget_grab_default (button);
984 if (!GTK_WIDGET_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_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_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_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_VISIBLE (window))
1548 gtk_widget_show_all (window);
1550 gtk_widget_destroy (window);
1554 make_toolbar (GtkWidget *window)
1558 if (!GTK_WIDGET_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_FLAGS (button, GTK_CAN_DEFAULT);
1796 gtk_widget_grab_default (button);
1799 if (!GTK_WIDGET_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_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_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);
2964 void create_labels (GtkWidget *widget)
2966 static GtkWidget *window = NULL;
2975 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2977 gtk_window_set_screen (GTK_WINDOW (window),
2978 gtk_widget_get_screen (widget));
2980 g_signal_connect (window, "destroy",
2981 G_CALLBACK (gtk_widget_destroyed),
2984 gtk_window_set_title (GTK_WINDOW (window), "Label");
2986 vbox = gtk_vbox_new (FALSE, 5);
2988 hbox = gtk_hbox_new (FALSE, 5);
2989 gtk_container_add (GTK_CONTAINER (window), vbox);
2991 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2993 button = create_sensitivity_control (hbox);
2995 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2997 button = create_selectable_control (hbox);
2999 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
3001 vbox = gtk_vbox_new (FALSE, 5);
3003 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3004 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
3006 frame = gtk_frame_new ("Normal Label");
3007 label = gtk_label_new ("This is a Normal label");
3008 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
3009 gtk_container_add (GTK_CONTAINER (frame), label);
3010 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3012 frame = gtk_frame_new ("Multi-line Label");
3013 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
3014 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
3015 gtk_container_add (GTK_CONTAINER (frame), label);
3016 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3018 frame = gtk_frame_new ("Left Justified Label");
3019 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
3020 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
3021 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3022 gtk_container_add (GTK_CONTAINER (frame), label);
3023 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3025 frame = gtk_frame_new ("Right Justified Label");
3026 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
3027 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
3028 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
3029 gtk_container_add (GTK_CONTAINER (frame), label);
3030 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3032 frame = gtk_frame_new ("Internationalized Label");
3033 label = gtk_label_new (NULL);
3034 gtk_label_set_markup (GTK_LABEL (label),
3035 "French (Fran\303\247ais) Bonjour, Salut\n"
3036 "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"
3037 "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"
3038 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
3039 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
3040 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
3041 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3042 gtk_container_add (GTK_CONTAINER (frame), label);
3043 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3045 frame = gtk_frame_new ("Bidirection Label");
3046 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"
3047 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
3048 gtk_container_add (GTK_CONTAINER (frame), label);
3049 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3051 vbox = gtk_vbox_new (FALSE, 5);
3052 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3053 frame = gtk_frame_new ("Line wrapped label");
3054 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
3055 "up the entire "/* big space to test spacing */\
3056 "width allocated to it, but automatically wraps the words to fit. "\
3057 "The time has come, for all good men, to come to the aid of their party. "\
3058 "The sixth sheik's six sheep's sick.\n"\
3059 " It supports multiple paragraphs correctly, and correctly adds "\
3060 "many extra spaces. ");
3062 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
3063 gtk_container_add (GTK_CONTAINER (frame), label);
3064 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3066 frame = gtk_frame_new ("Filled, wrapped label");
3067 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
3068 "up the entire width allocated to it. Here is a seneance to prove "\
3069 "my point. Here is another sentence. "\
3070 "Here comes the sun, do de do de do.\n"\
3071 " This is a new paragraph.\n"\
3072 " This is another newer, longer, better paragraph. It is coming to an end, "\
3074 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
3075 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
3076 gtk_container_add (GTK_CONTAINER (frame), label);
3077 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3079 frame = gtk_frame_new ("Underlined label");
3080 label = gtk_label_new ("This label is underlined!\n"
3081 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
3082 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3083 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
3084 gtk_container_add (GTK_CONTAINER (frame), label);
3085 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3087 frame = gtk_frame_new ("Markup label");
3088 label = gtk_label_new (NULL);
3090 /* There's also a gtk_label_set_markup() without accel if you
3091 * don't have an accelerator key
3093 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
3094 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
3095 "<b>markup</b> _such as "
3096 "<big><i>Big Italics</i></big>\n"
3097 "<tt>Monospace font</tt>\n"
3098 "<u>Underline!</u>\n"
3100 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
3101 "and nothing on this line,\n"
3104 "or even on this one\n"
3105 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
3106 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
3107 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
3109 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
3111 gtk_container_add (GTK_CONTAINER (frame), label);
3112 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3115 if (!GTK_WIDGET_VISIBLE (window))
3116 gtk_widget_show_all (window);
3118 gtk_widget_destroy (window);
3122 on_angle_scale_changed (GtkRange *range,
3125 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
3129 create_rotated_label (GtkWidget *widget)
3131 static GtkWidget *window = NULL;
3135 GtkWidget *scale_label;
3136 GtkWidget *scale_hbox;
3140 window = gtk_dialog_new_with_buttons ("Rotated Label",
3141 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
3142 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3145 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3147 gtk_window_set_screen (GTK_WINDOW (window),
3148 gtk_widget_get_screen (widget));
3150 g_signal_connect (window, "response",
3151 G_CALLBACK (gtk_object_destroy), NULL);
3152 g_signal_connect (window, "destroy",
3153 G_CALLBACK (gtk_widget_destroyed), &window);
3155 vbox = gtk_vbox_new (FALSE, 5);
3156 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0);
3157 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
3159 label = gtk_label_new (NULL);
3160 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
3161 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
3163 scale_hbox = gtk_hbox_new (FALSE, 0);
3164 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
3166 scale_label = gtk_label_new (NULL);
3167 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
3168 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
3170 hscale = gtk_hscale_new_with_range (0, 360, 5);
3171 g_signal_connect (hscale, "value-changed",
3172 G_CALLBACK (on_angle_scale_changed), label);
3174 gtk_range_set_value (GTK_RANGE (hscale), 45);
3175 gtk_widget_set_usize (hscale, 200, -1);
3176 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
3179 if (!GTK_WIDGET_VISIBLE (window))
3180 gtk_widget_show_all (window);
3182 gtk_widget_destroy (window);
3185 #define DEFAULT_TEXT_RADIUS 200
3188 on_rotated_text_unrealize (GtkWidget *widget)
3190 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
3194 on_rotated_text_expose (GtkWidget *widget,
3195 GdkEventExpose *event,
3196 GdkPixbuf *tile_pixbuf)
3198 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
3199 "had", "10,000", "men" };
3200 PangoRenderer *renderer;
3205 PangoMatrix matrix = PANGO_MATRIX_INIT;
3206 PangoLayout *layout;
3207 PangoContext *context;
3208 PangoFontDescription *desc;
3210 gc = g_object_get_data (G_OBJECT (widget), "text-gc");
3213 static GdkColor black = { 0, 0, 0, 0 };
3215 gc = gdk_gc_new (widget->window);
3216 gdk_gc_set_rgb_fg_color (gc, &black);
3222 gint width = gdk_pixbuf_get_width (tile_pixbuf);
3223 gint height = gdk_pixbuf_get_height (tile_pixbuf);
3225 tile = gdk_pixmap_new (widget->window, width, height, -1);
3226 gdk_draw_pixbuf (tile, gc, tile_pixbuf,
3227 0, 0, 0, 0, width, height,
3228 GDK_RGB_DITHER_NORMAL, 0, 0);
3230 gdk_gc_set_tile (gc, tile);
3231 gdk_gc_set_fill (gc, GDK_TILED);
3233 g_object_unref (tile);
3236 g_object_set_data_full (G_OBJECT (widget), "text-gc", gc, (GDestroyNotify)g_object_unref);
3239 renderer = gdk_pango_renderer_get_default (gtk_widget_get_screen (widget));
3240 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), widget->window);
3241 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), gc);
3243 radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
3245 pango_matrix_translate (&matrix,
3246 radius + (widget->allocation.width - 2 * radius) / 2,
3247 radius + (widget->allocation.height - 2 * radius) / 2);
3248 pango_matrix_scale (&matrix, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
3250 context = gtk_widget_get_pango_context (widget);
3251 layout = pango_layout_new (context);
3252 desc = pango_font_description_from_string ("Sans Bold 30");
3253 pango_layout_set_font_description (layout, desc);
3254 pango_font_description_free (desc);
3256 n_words = G_N_ELEMENTS (words);
3257 for (i = 0; i < n_words; i++)
3259 PangoMatrix rotated_matrix = matrix;
3262 pango_matrix_rotate (&rotated_matrix, - (360. * i) / n_words);
3264 pango_context_set_matrix (context, &rotated_matrix);
3265 pango_layout_context_changed (layout);
3266 pango_layout_set_text (layout, words[i], -1);
3268 pango_layout_get_size (layout, &width, &height);
3270 pango_renderer_draw_layout (renderer, layout,
3271 - width / 2, - DEFAULT_TEXT_RADIUS * PANGO_SCALE);
3274 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL);
3275 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL);
3277 g_object_unref (layout);
3283 create_rotated_text (GtkWidget *widget)
3285 static GtkWidget *window = NULL;
3289 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
3290 GtkRequisition requisition;
3291 GtkWidget *drawing_area;
3292 GdkPixbuf *tile_pixbuf;
3294 window = gtk_dialog_new_with_buttons ("Rotated Text",
3295 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
3296 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3299 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3301 gtk_window_set_screen (GTK_WINDOW (window),
3302 gtk_widget_get_screen (widget));
3304 g_signal_connect (window, "response",
3305 G_CALLBACK (gtk_object_destroy), NULL);
3306 g_signal_connect (window, "destroy",
3307 G_CALLBACK (gtk_widget_destroyed), &window);
3309 drawing_area = gtk_drawing_area_new ();
3310 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), drawing_area, TRUE, TRUE, 0);
3311 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
3313 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
3315 g_signal_connect (drawing_area, "expose-event",
3316 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
3317 g_signal_connect (drawing_area, "unrealize",
3318 G_CALLBACK (on_rotated_text_unrealize), NULL);
3320 gtk_widget_show_all (GTK_BIN (window)->child);
3322 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
3323 gtk_widget_size_request (window, &requisition);
3324 gtk_widget_set_size_request (drawing_area, -1, -1);
3325 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
3328 if (!GTK_WIDGET_VISIBLE (window))
3329 gtk_widget_show (window);
3331 gtk_widget_destroy (window);
3339 reparent_label (GtkWidget *widget,
3340 GtkWidget *new_parent)
3344 label = g_object_get_data (G_OBJECT (widget), "user_data");
3346 gtk_widget_reparent (label, new_parent);
3350 set_parent_signal (GtkWidget *child,
3351 GtkWidget *old_parent,
3354 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
3355 g_type_name (G_OBJECT_TYPE (child)),
3356 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
3357 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
3358 GPOINTER_TO_INT (func_data));
3362 create_reparent (GtkWidget *widget)
3364 static GtkWidget *window = NULL;
3371 GtkWidget *separator;
3372 GtkWidget *event_box;
3376 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3378 gtk_window_set_screen (GTK_WINDOW (window),
3379 gtk_widget_get_screen (widget));
3381 g_signal_connect (window, "destroy",
3382 G_CALLBACK (gtk_widget_destroyed),
3385 gtk_window_set_title (GTK_WINDOW (window), "reparent");
3386 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3388 box1 = gtk_vbox_new (FALSE, 0);
3389 gtk_container_add (GTK_CONTAINER (window), box1);
3391 box2 = gtk_hbox_new (FALSE, 5);
3392 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3393 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3395 label = gtk_label_new ("Hello World");
3397 frame = gtk_frame_new ("Frame 1");
3398 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
3400 box3 = gtk_vbox_new (FALSE, 5);
3401 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
3402 gtk_container_add (GTK_CONTAINER (frame), box3);
3404 button = gtk_button_new_with_label ("switch");
3405 g_object_set_data (G_OBJECT (button), "user_data", label);
3406 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
3408 event_box = gtk_event_box_new ();
3409 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
3410 gtk_container_add (GTK_CONTAINER (event_box), label);
3412 g_signal_connect (button, "clicked",
3413 G_CALLBACK (reparent_label),
3416 g_signal_connect (label, "parent_set",
3417 G_CALLBACK (set_parent_signal),
3418 GINT_TO_POINTER (42));
3420 frame = gtk_frame_new ("Frame 2");
3421 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
3423 box3 = gtk_vbox_new (FALSE, 5);
3424 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
3425 gtk_container_add (GTK_CONTAINER (frame), box3);
3427 button = gtk_button_new_with_label ("switch");
3428 g_object_set_data (G_OBJECT (button), "user_data", label);
3429 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
3431 event_box = gtk_event_box_new ();
3432 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
3434 g_signal_connect (button, "clicked",
3435 G_CALLBACK (reparent_label),
3438 separator = gtk_hseparator_new ();
3439 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3441 box2 = gtk_vbox_new (FALSE, 10);
3442 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3443 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3445 button = gtk_button_new_with_label ("close");
3446 g_signal_connect_swapped (button, "clicked",
3447 G_CALLBACK (gtk_widget_destroy), window);
3448 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3449 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3450 gtk_widget_grab_default (button);
3453 if (!GTK_WIDGET_VISIBLE (window))
3454 gtk_widget_show_all (window);
3456 gtk_widget_destroy (window);
3463 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
3465 if (event->type == GDK_BUTTON_PRESS)
3467 if (event->button == 1)
3468 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
3469 event->button, event->x_root, event->y_root,
3471 else if (event->button == 2)
3472 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
3473 event->button, event->x_root, event->y_root,
3480 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
3482 gtk_paint_resize_grip (area->style,
3484 GTK_WIDGET_STATE (area),
3490 area->allocation.width,
3491 area->allocation.height);
3497 create_resize_grips (GtkWidget *widget)
3499 static GtkWidget *window = NULL;
3501 GtkWidget *hbox, *vbox;
3504 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3506 gtk_window_set_screen (GTK_WINDOW (window),
3507 gtk_widget_get_screen (widget));
3509 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
3511 g_signal_connect (window, "destroy",
3512 G_CALLBACK (gtk_widget_destroyed),
3515 vbox = gtk_vbox_new (FALSE, 0);
3516 gtk_container_add (GTK_CONTAINER (window), vbox);
3518 hbox = gtk_hbox_new (FALSE, 0);
3519 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3522 area = gtk_drawing_area_new ();
3523 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3524 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3525 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3526 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3527 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3528 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3531 area = gtk_drawing_area_new ();
3532 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3533 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3534 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3535 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3536 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3537 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3540 area = gtk_drawing_area_new ();
3541 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3542 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3543 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3544 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3545 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3546 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3548 hbox = gtk_hbox_new (FALSE, 0);
3549 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3552 area = gtk_drawing_area_new ();
3553 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3554 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3555 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3556 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3557 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3558 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3561 area = gtk_drawing_area_new ();
3562 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3565 area = gtk_drawing_area_new ();
3566 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3567 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3568 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3569 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3570 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3571 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3574 hbox = gtk_hbox_new (FALSE, 0);
3575 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3578 area = gtk_drawing_area_new ();
3579 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3580 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3581 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3582 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3583 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3584 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3586 area = gtk_drawing_area_new ();
3587 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3588 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3589 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3590 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3591 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3592 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3595 area = gtk_drawing_area_new ();
3596 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3597 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3598 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3599 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3600 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3601 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3604 if (!GTK_WIDGET_VISIBLE (window))
3605 gtk_widget_show_all (window);
3607 gtk_widget_destroy (window);
3613 gint upositionx = 0;
3614 gint upositiony = 0;
3617 uposition_configure (GtkWidget *window)
3623 lx = g_object_get_data (G_OBJECT (window), "x");
3624 ly = g_object_get_data (G_OBJECT (window), "y");
3626 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
3627 sprintf (buffer, "%d", upositionx);
3628 gtk_label_set_text (lx, buffer);
3629 sprintf (buffer, "%d", upositiony);
3630 gtk_label_set_text (ly, buffer);
3636 uposition_stop_configure (GtkToggleButton *toggle,
3640 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
3642 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
3646 create_saved_position (GtkWidget *widget)
3648 static GtkWidget *window = NULL;
3653 GtkWidget *main_vbox;
3661 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
3662 "type", GTK_WINDOW_TOPLEVEL,
3663 "title", "Saved Position",
3665 "signal::configure_event", uposition_configure, NULL,
3668 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3670 gtk_window_set_screen (GTK_WINDOW (window),
3671 gtk_widget_get_screen (widget));
3674 g_signal_connect (window, "destroy",
3675 G_CALLBACK (gtk_widget_destroyed),
3678 main_vbox = gtk_vbox_new (FALSE, 5);
3679 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3680 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3683 g_object_new (gtk_vbox_get_type (),
3684 "GtkBox::homogeneous", FALSE,
3685 "GtkBox::spacing", 5,
3686 "GtkContainer::border_width", 10,
3687 "GtkWidget::parent", main_vbox,
3688 "GtkWidget::visible", TRUE,
3689 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
3690 "label", "Stop Events",
3694 "signal::clicked", uposition_stop_configure, window,
3698 hbox = gtk_hbox_new (FALSE, 0);
3699 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3700 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3702 label = gtk_label_new ("X Origin : ");
3703 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3704 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3706 x_label = gtk_label_new ("");
3707 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3708 g_object_set_data (G_OBJECT (window), "x", x_label);
3710 hbox = gtk_hbox_new (FALSE, 0);
3711 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3712 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3714 label = gtk_label_new ("Y Origin : ");
3715 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3716 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3718 y_label = gtk_label_new ("");
3719 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3720 g_object_set_data (G_OBJECT (window), "y", y_label);
3723 g_object_new (gtk_hseparator_get_type (),
3724 "GtkWidget::visible", TRUE,
3726 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3728 hbox = gtk_hbox_new (FALSE, 0);
3729 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3730 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3732 button = gtk_button_new_with_label ("Close");
3733 g_signal_connect_swapped (button, "clicked",
3734 G_CALLBACK (gtk_widget_destroy),
3736 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3737 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3738 gtk_widget_grab_default (button);
3740 gtk_widget_show_all (window);
3743 gtk_widget_destroy (window);
3751 create_pixmap (GtkWidget *widget)
3753 static GtkWidget *window = NULL;
3759 GtkWidget *separator;
3760 GtkWidget *pixmapwid;
3764 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3766 gtk_window_set_screen (GTK_WINDOW (window),
3767 gtk_widget_get_screen (widget));
3769 g_signal_connect (window, "destroy",
3770 G_CALLBACK (gtk_widget_destroyed),
3773 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3774 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3775 gtk_widget_realize(window);
3777 box1 = gtk_vbox_new (FALSE, 0);
3778 gtk_container_add (GTK_CONTAINER (window), box1);
3780 box2 = gtk_vbox_new (FALSE, 10);
3781 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3782 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3784 button = gtk_button_new ();
3785 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3787 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3789 label = gtk_label_new ("Pixmap\ntest");
3790 box3 = gtk_hbox_new (FALSE, 0);
3791 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3792 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3793 gtk_container_add (GTK_CONTAINER (box3), label);
3794 gtk_container_add (GTK_CONTAINER (button), box3);
3796 button = gtk_button_new ();
3797 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3799 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3801 label = gtk_label_new ("Pixmap\ntest");
3802 box3 = gtk_hbox_new (FALSE, 0);
3803 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3804 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3805 gtk_container_add (GTK_CONTAINER (box3), label);
3806 gtk_container_add (GTK_CONTAINER (button), box3);
3808 gtk_widget_set_sensitive (button, FALSE);
3810 separator = gtk_hseparator_new ();
3811 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3813 box2 = gtk_vbox_new (FALSE, 10);
3814 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3815 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3817 button = gtk_button_new_with_label ("close");
3818 g_signal_connect_swapped (button, "clicked",
3819 G_CALLBACK (gtk_widget_destroy),
3821 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3822 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3823 gtk_widget_grab_default (button);
3826 if (!GTK_WIDGET_VISIBLE (window))
3827 gtk_widget_show_all (window);
3829 gtk_widget_destroy (window);
3833 tips_query_widget_entered (GtkTipsQuery *tips_query,
3835 const gchar *tip_text,
3836 const gchar *tip_private,
3839 if (GTK_TOGGLE_BUTTON (toggle)->active)
3841 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3842 /* don't let GtkTipsQuery reset its label */
3843 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3848 tips_query_widget_selected (GtkWidget *tips_query,
3850 const gchar *tip_text,
3851 const gchar *tip_private,
3852 GdkEventButton *event,
3856 g_print ("Help \"%s\" requested for <%s>\n",
3857 tip_private ? tip_private : "None",
3858 g_type_name (G_OBJECT_TYPE (widget)));
3863 create_tooltips (GtkWidget *widget)
3865 static GtkWidget *window = NULL;
3872 GtkWidget *tips_query;
3873 GtkWidget *separator;
3874 GtkTooltips *tooltips;
3879 g_object_new (gtk_window_get_type (),
3880 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3881 "GtkContainer::border_width", 0,
3882 "GtkWindow::title", "Tooltips",
3883 "GtkWindow::allow_shrink", TRUE,
3884 "GtkWindow::allow_grow", FALSE,
3887 gtk_window_set_screen (GTK_WINDOW (window),
3888 gtk_widget_get_screen (widget));
3890 g_signal_connect (window, "destroy",
3891 G_CALLBACK (destroy_tooltips),
3894 tooltips=gtk_tooltips_new();
3895 g_object_ref (tooltips);
3896 gtk_object_sink (GTK_OBJECT (tooltips));
3897 g_object_set_data (G_OBJECT (window), "tooltips", tooltips);
3899 box1 = gtk_vbox_new (FALSE, 0);
3900 gtk_container_add (GTK_CONTAINER (window), box1);
3902 box2 = gtk_vbox_new (FALSE, 10);
3903 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3904 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3906 button = gtk_toggle_button_new_with_label ("button1");
3907 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3909 gtk_tooltips_set_tip (tooltips,
3912 "ContextHelp/buttons/1");
3914 button = gtk_toggle_button_new_with_label ("button2");
3915 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3917 gtk_tooltips_set_tip (tooltips,
3919 "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.",
3920 "ContextHelp/buttons/2_long");
3922 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3923 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3925 gtk_tooltips_set_tip (tooltips,
3927 "Toggle TipsQuery view.",
3931 g_object_new (gtk_vbox_get_type (),
3932 "homogeneous", FALSE,
3938 tips_query = gtk_tips_query_new ();
3941 g_object_new (gtk_button_get_type (),
3946 g_object_connect (button,
3947 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3949 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3950 gtk_tooltips_set_tip (tooltips,
3952 "Start the Tooltips Inspector",
3953 "ContextHelp/buttons/?");
3956 g_object_set (g_object_connect (tips_query,
3957 "signal::widget_entered", tips_query_widget_entered, toggle,
3958 "signal::widget_selected", tips_query_widget_selected, NULL,
3965 frame = g_object_new (gtk_frame_get_type (),
3966 "label", "ToolTips Inspector",
3967 "label_xalign", (double) 0.5,
3973 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3975 separator = gtk_hseparator_new ();
3976 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3978 box2 = gtk_vbox_new (FALSE, 10);
3979 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3980 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3982 button = gtk_button_new_with_label ("close");
3983 g_signal_connect_swapped (button, "clicked",
3984 G_CALLBACK (gtk_widget_destroy),
3986 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3987 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3988 gtk_widget_grab_default (button);
3990 gtk_tooltips_set_tip (tooltips, button, "Push this button to close window", "ContextHelp/buttons/Close");
3993 if (!GTK_WIDGET_VISIBLE (window))
3994 gtk_widget_show_all (window);
3996 gtk_widget_destroy (window);
4004 pack_image (GtkWidget *box,
4008 gtk_box_pack_start (GTK_BOX (box),
4009 gtk_label_new (text),
4012 gtk_box_pack_start (GTK_BOX (box),
4018 create_image (GtkWidget *widget)
4020 static GtkWidget *window = NULL;
4028 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4030 gtk_window_set_screen (GTK_WINDOW (window),
4031 gtk_widget_get_screen (widget));
4033 /* this is bogus for testing drawing when allocation < request,
4034 * don't copy into real code
4036 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
4038 g_signal_connect (window, "destroy",
4039 G_CALLBACK (gtk_widget_destroyed),
4042 vbox = gtk_vbox_new (FALSE, 5);
4044 gtk_container_add (GTK_CONTAINER (window), vbox);
4046 pack_image (vbox, "Stock Warning Dialog",
4047 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
4048 GTK_ICON_SIZE_DIALOG));
4050 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
4051 gtk_widget_get_colormap (window),
4056 pack_image (vbox, "Pixmap",
4057 gtk_image_new_from_pixmap (pixmap, mask));
4060 if (!GTK_WIDGET_VISIBLE (window))
4061 gtk_widget_show_all (window);
4063 gtk_widget_destroy (window);
4071 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
4074 GtkWidget *menuitem;
4083 menu = gtk_menu_new ();
4084 gtk_menu_set_screen (GTK_MENU (menu), screen);
4090 menuitem = gtk_tearoff_menu_item_new ();
4091 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4092 gtk_widget_show (menuitem);
4095 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
4096 GTK_ICON_SIZE_MENU);
4097 gtk_widget_show (image);
4098 menuitem = gtk_image_menu_item_new_with_label ("Image item");
4099 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4100 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4101 gtk_widget_show (menuitem);
4103 for (i = 0, j = 1; i < length; i++, j++)
4105 sprintf (buf, "item %2d - %d", depth, j);
4107 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
4108 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
4112 gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
4115 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4116 gtk_widget_show (menuitem);
4118 gtk_widget_set_sensitive (menuitem, FALSE);
4121 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
4125 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
4126 create_menu (screen, depth - 1, 5, TRUE));
4133 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
4136 GtkWidget *menuitem;
4142 menu = gtk_menu_new ();
4143 gtk_menu_set_screen (GTK_MENU (menu), screen);
4148 menuitem = gtk_tearoff_menu_item_new ();
4149 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4150 gtk_widget_show (menuitem);
4154 menuitem = gtk_menu_item_new_with_label ("items");
4155 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4157 submenu = gtk_menu_new ();
4158 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4159 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4160 gtk_widget_show (menuitem);
4163 /* now fill the items submenu */
4164 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4165 GTK_ICON_SIZE_MENU);
4166 gtk_widget_show (image);
4167 menuitem = gtk_image_menu_item_new_with_label ("Image");
4168 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4169 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4170 gtk_widget_show (menuitem);
4172 menuitem = gtk_menu_item_new_with_label ("x");
4173 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
4174 gtk_widget_show (menuitem);
4176 menuitem = gtk_menu_item_new_with_label ("x");
4177 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
4178 gtk_widget_show (menuitem);
4180 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4181 GTK_ICON_SIZE_MENU);
4182 gtk_widget_show (image);
4183 menuitem = gtk_image_menu_item_new_with_label ("Image");
4184 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4185 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4186 gtk_widget_show (menuitem);
4188 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4189 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
4190 gtk_widget_show (menuitem);
4192 menuitem = gtk_menu_item_new_with_label ("x");
4193 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
4194 gtk_widget_show (menuitem);
4196 menuitem = gtk_menu_item_new_with_label ("x");
4197 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
4198 gtk_widget_show (menuitem);
4200 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4201 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
4202 gtk_widget_show (menuitem);
4204 menuitem = gtk_check_menu_item_new_with_label ("Check");
4205 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
4206 gtk_widget_show (menuitem);
4208 menuitem = gtk_menu_item_new_with_label ("x");
4209 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
4210 gtk_widget_show (menuitem);
4212 menuitem = gtk_menu_item_new_with_label ("x");
4213 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
4214 gtk_widget_show (menuitem);
4216 menuitem = gtk_check_menu_item_new_with_label ("Check");
4217 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
4218 gtk_widget_show (menuitem);
4220 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4221 gtk_widget_show (menuitem);
4222 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
4224 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4225 gtk_widget_show (menuitem);
4226 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
4228 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4229 gtk_widget_show (menuitem);
4230 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
4232 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4233 gtk_widget_show (menuitem);
4234 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
4236 /* end of items submenu */
4238 menuitem = gtk_menu_item_new_with_label ("spanning");
4239 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4241 submenu = gtk_menu_new ();
4242 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4243 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4244 gtk_widget_show (menuitem);
4247 /* now fill the spanning submenu */
4248 menuitem = gtk_menu_item_new_with_label ("a");
4249 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
4250 gtk_widget_show (menuitem);
4252 menuitem = gtk_menu_item_new_with_label ("b");
4253 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
4254 gtk_widget_show (menuitem);
4256 menuitem = gtk_menu_item_new_with_label ("c");
4257 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
4258 gtk_widget_show (menuitem);
4260 menuitem = gtk_menu_item_new_with_label ("d");
4261 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4262 gtk_widget_show (menuitem);
4264 menuitem = gtk_menu_item_new_with_label ("e");
4265 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
4266 gtk_widget_show (menuitem);
4267 /* end of spanning submenu */
4269 menuitem = gtk_menu_item_new_with_label ("left");
4270 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
4271 submenu = gtk_menu_new ();
4272 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4273 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4274 gtk_widget_show (menuitem);
4276 menuitem = gtk_menu_item_new_with_label ("Empty");
4277 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4278 submenu = gtk_menu_new ();
4279 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4280 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4281 gtk_widget_show (menuitem);
4283 menuitem = gtk_menu_item_new_with_label ("right");
4284 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
4285 submenu = gtk_menu_new ();
4286 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4287 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4288 gtk_widget_show (menuitem);
4290 menuitem = gtk_menu_item_new_with_label ("Empty");
4291 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4292 gtk_widget_show (menuitem);
4296 for (; j < rows; j++)
4297 for (i = 0; i < cols; i++)
4299 sprintf (buf, "(%d %d)", i, j);
4300 menuitem = gtk_menu_item_new_with_label (buf);
4301 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
4302 gtk_widget_show (menuitem);
4305 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4306 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
4307 gtk_widget_show (menuitem);
4308 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4309 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
4310 gtk_widget_show (menuitem);
4311 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4312 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
4313 gtk_widget_show (menuitem);
4314 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4315 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
4316 gtk_widget_show (menuitem);
4322 create_menus (GtkWidget *widget)
4324 static GtkWidget *window = NULL;
4328 GtkWidget *optionmenu;
4329 GtkWidget *separator;
4335 GtkWidget *menuitem;
4336 GtkAccelGroup *accel_group;
4338 GdkScreen *screen = gtk_widget_get_screen (widget);
4340 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4342 gtk_window_set_screen (GTK_WINDOW (window), screen);
4344 g_signal_connect (window, "destroy",
4345 G_CALLBACK (gtk_widget_destroyed),
4347 g_signal_connect (window, "delete-event",
4348 G_CALLBACK (gtk_true),
4351 accel_group = gtk_accel_group_new ();
4352 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4354 gtk_window_set_title (GTK_WINDOW (window), "menus");
4355 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4358 box1 = gtk_vbox_new (FALSE, 0);
4359 gtk_container_add (GTK_CONTAINER (window), box1);
4360 gtk_widget_show (box1);
4362 menubar = gtk_menu_bar_new ();
4363 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4364 gtk_widget_show (menubar);
4366 menu = create_menu (screen, 2, 50, TRUE);
4368 menuitem = gtk_menu_item_new_with_label ("test\nline2");
4369 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4370 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4371 gtk_widget_show (menuitem);
4373 menu = create_table_menu (screen, 2, 50, TRUE);
4375 menuitem = gtk_menu_item_new_with_label ("table");
4376 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4377 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4378 gtk_widget_show (menuitem);
4380 menuitem = gtk_menu_item_new_with_label ("foo");
4381 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
4382 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4383 gtk_widget_show (menuitem);
4385 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4386 GTK_ICON_SIZE_MENU);
4387 gtk_widget_show (image);
4388 menuitem = gtk_image_menu_item_new_with_label ("Help");
4389 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4390 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
4391 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
4392 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4393 gtk_widget_show (menuitem);
4395 menubar = gtk_menu_bar_new ();
4396 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4397 gtk_widget_show (menubar);
4399 menu = create_menu (screen, 2, 10, TRUE);
4401 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
4402 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4403 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4404 gtk_widget_show (menuitem);
4406 box2 = gtk_vbox_new (FALSE, 10);
4407 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4408 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4409 gtk_widget_show (box2);
4411 menu = create_menu (screen, 1, 5, FALSE);
4412 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
4414 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
4415 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4416 gtk_widget_show (menuitem);
4418 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
4419 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4420 gtk_widget_show (menuitem);
4421 gtk_widget_add_accelerator (menuitem,
4427 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
4428 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4429 gtk_widget_show (menuitem);
4430 gtk_widget_add_accelerator (menuitem,
4435 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4436 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
4437 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4438 gtk_widget_show (menuitem);
4439 gtk_widget_add_accelerator (menuitem,
4445 gtk_widget_add_accelerator (menuitem,
4452 optionmenu = gtk_option_menu_new ();
4453 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
4454 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
4455 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
4456 gtk_widget_show (optionmenu);
4458 separator = gtk_hseparator_new ();
4459 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4460 gtk_widget_show (separator);
4462 box2 = gtk_vbox_new (FALSE, 10);
4463 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4464 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4465 gtk_widget_show (box2);
4467 button = gtk_button_new_with_label ("close");
4468 g_signal_connect_swapped (button, "clicked",
4469 G_CALLBACK (gtk_widget_destroy),
4471 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4472 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4473 gtk_widget_grab_default (button);
4474 gtk_widget_show (button);
4477 if (!GTK_WIDGET_VISIBLE (window))
4478 gtk_widget_show (window);
4480 gtk_widget_destroy (window);
4484 gtk_ifactory_cb (gpointer callback_data,
4485 guint callback_action,
4488 g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
4491 /* GdkPixbuf RGBA C-Source image dump */
4493 static const guint8 apple[] =
4495 /* Pixbuf magic (0x47646b50) */
4497 /* length: header (24) + pixel_data (2304) */
4499 /* pixdata_type (0x1010002) */
4501 /* rowstride (96) */
4508 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4509 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4510 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4511 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4512 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4513 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4514 "\0\0\0\0\0\0\0\0\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"
4515 "\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"
4516 "\0\0\0\0\0\0\0\0\0\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"
4517 "[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"
4518 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4519 "\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"
4520 "\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"
4521 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4522 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
4523 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
4524 "\0\0\0\0\0\0\0\0\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"
4525 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
4526 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
4527 "\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["
4528 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
4529 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
4530 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
4531 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
4532 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
4533 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
4534 "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"
4535 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
4536 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
4537 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
4538 "\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"
4539 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
4540 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
4541 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
4542 "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"
4543 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
4544 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
4545 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
4546 "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"
4547 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
4548 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
4549 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4550 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4551 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4552 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4553 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4554 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4555 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4556 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4557 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4558 "\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>"
4559 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4560 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4561 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4562 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\205W\312\216\220`\377\230"
4563 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4564 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4565 "\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"
4566 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4567 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4568 "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"
4569 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4570 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4571 "\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"
4572 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4573 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4574 "\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"
4575 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4576 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4577 "\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"
4578 "\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"
4579 "\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"
4580 "\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"
4581 "\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"
4582 "\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"
4583 "\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"
4584 "\0\0\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"
4585 "\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"
4586 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4590 dump_accels (gpointer callback_data,
4591 guint callback_action,
4594 gtk_accel_map_save_fd (1 /* stdout */);
4597 static GtkItemFactoryEntry menu_items[] =
4599 { "/_File", NULL, NULL, 0, "<Branch>" },
4600 { "/File/tearoff1", NULL, gtk_ifactory_cb, 0, "<Tearoff>" },
4601 { "/File/_New", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_NEW },
4602 { "/File/_Open", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
4603 { "/File/_Save", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4604 { "/File/Save _As...", "<control>A", gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4605 { "/File/_Dump \"_Accels\"", NULL, dump_accels, 0 },
4606 { "/File/\\/Test__Escaping/And\\/\n\tWei\\\\rdly",
4607 NULL, gtk_ifactory_cb, 0 },
4608 { "/File/sep1", NULL, gtk_ifactory_cb, 0, "<Separator>" },
4609 { "/File/_Quit", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
4611 { "/_Preferences", NULL, 0, 0, "<Branch>" },
4612 { "/_Preferences/_Color", NULL, 0, 0, "<Branch>" },
4613 { "/_Preferences/Color/_Red", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4614 { "/_Preferences/Color/_Green", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4615 { "/_Preferences/Color/_Blue", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4616 { "/_Preferences/_Shape", NULL, 0, 0, "<Branch>" },
4617 { "/_Preferences/Shape/_Square", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4618 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
4619 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
4620 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
4621 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
4622 { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple },
4623 { "/_Preferences/Coffee", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4624 { "/_Preferences/Toast", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4625 { "/_Preferences/Marshmallow Froot Loops", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4627 /* For testing deletion of menus */
4628 { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
4629 { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
4630 { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
4632 { "/_Help", NULL, 0, 0, "<LastBranch>" },
4633 { "/Help/_Help", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_HELP},
4634 { "/Help/_About", NULL, gtk_ifactory_cb, 0 },
4638 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
4641 create_item_factory (GtkWidget *widget)
4643 static GtkWidget *window = NULL;
4649 GtkWidget *separator;
4652 GtkAccelGroup *accel_group;
4653 GtkItemFactory *item_factory;
4654 GtkTooltips *tooltips;
4656 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4658 gtk_window_set_screen (GTK_WINDOW (window),
4659 gtk_widget_get_screen (widget));
4661 g_signal_connect (window, "destroy",
4662 G_CALLBACK(gtk_widget_destroyed),
4664 g_signal_connect (window, "delete-event",
4665 G_CALLBACK (gtk_true),
4668 accel_group = gtk_accel_group_new ();
4669 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
4670 g_object_set_data_full (G_OBJECT (window),
4674 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4675 gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
4676 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4677 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
4679 /* preselect /Preferences/Shape/Oval over the other radios
4681 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4682 "/Preferences/Shape/Oval")),
4685 /* preselect /Preferences/Coffee
4687 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4688 "/Preferences/Coffee")),
4691 /* preselect /Preferences/Marshmallow Froot Loops and set it insensitive
4693 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4694 "/Preferences/Marshmallow Froot Loops")),
4696 gtk_widget_set_sensitive (GTK_WIDGET (gtk_item_factory_get_item (item_factory,
4697 "/Preferences/Marshmallow Froot Loops")),
4700 /* Test how tooltips (ugh) work on menu items
4702 tooltips = gtk_tooltips_new ();
4703 g_object_ref (tooltips);
4704 gtk_object_sink (GTK_OBJECT (tooltips));
4705 g_object_set_data_full (G_OBJECT (window), "testgtk-tooltips",
4706 tooltips, (GDestroyNotify)g_object_unref);
4708 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/New"),
4709 "Create a new file", NULL);
4710 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Open"),
4711 "Open a file", NULL);
4712 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Save"),
4714 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/Preferences/Color"),
4715 "Modify color", NULL);
4717 box1 = gtk_vbox_new (FALSE, 0);
4718 gtk_container_add (GTK_CONTAINER (window), box1);
4720 gtk_box_pack_start (GTK_BOX (box1),
4721 gtk_item_factory_get_widget (item_factory, "<main>"),
4724 label = gtk_label_new ("Type\n<alt>\nto start");
4725 gtk_widget_set_size_request (label, 200, 200);
4726 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
4727 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
4730 separator = gtk_hseparator_new ();
4731 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4734 box2 = gtk_vbox_new (FALSE, 10);
4735 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4736 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4738 button = gtk_button_new_with_label ("close");
4739 g_signal_connect_swapped (button, "clicked",
4740 G_CALLBACK (gtk_widget_destroy),
4742 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4743 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4744 gtk_widget_grab_default (button);
4746 gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
4748 gtk_widget_show_all (window);
4751 gtk_widget_destroy (window);
4755 accel_button_new (GtkAccelGroup *accel_group,
4760 GdkModifierType modifiers;
4764 gtk_accelerator_parse (accel, &keyval, &modifiers);
4767 button = gtk_button_new ();
4768 gtk_widget_add_accelerator (button, "activate", accel_group,
4769 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4771 label = gtk_accel_label_new (text);
4772 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4773 gtk_widget_show (label);
4775 gtk_container_add (GTK_CONTAINER (button), label);
4781 create_key_lookup (GtkWidget *widget)
4783 static GtkWidget *window = NULL;
4784 gpointer window_ptr;
4788 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4791 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4792 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4795 gtk_window_set_screen (GTK_WINDOW (window),
4796 gtk_widget_get_screen (widget));
4798 /* We have to expand it so the accel labels will draw their labels
4800 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4802 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4804 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4805 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4806 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4807 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4808 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4809 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4810 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4811 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4812 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4813 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4814 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4815 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4816 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4817 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4818 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4819 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4820 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4821 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4822 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4823 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4824 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4825 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4826 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4827 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4828 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4829 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4830 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4831 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4833 window_ptr = &window;
4834 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
4835 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4837 gtk_widget_show_all (window);
4840 gtk_widget_destroy (window);
4849 cmw_destroy_cb(GtkWidget *widget)
4851 /* This is needed to get out of gtk_main */
4858 cmw_color (GtkWidget *widget, GtkWidget *parent)
4862 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4864 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4866 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4870 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4872 /* And mark it as a transient dialog */
4873 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4875 g_signal_connect (csd, "destroy",
4876 G_CALLBACK (cmw_destroy_cb), NULL);
4878 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4879 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4880 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4881 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4883 /* wait until destroy calls gtk_main_quit */
4884 gtk_widget_show (csd);
4889 cmw_file (GtkWidget *widget, GtkWidget *parent)
4893 fs = gtk_file_selection_new("This is a modal file selection dialog");
4895 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4898 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4900 /* And mark it as a transient dialog */
4901 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4903 g_signal_connect (fs, "destroy",
4904 G_CALLBACK (cmw_destroy_cb), NULL);
4906 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4907 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4908 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4909 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4911 /* wait until destroy calls gtk_main_quit */
4912 gtk_widget_show (fs);
4919 create_modal_window (GtkWidget *widget)
4921 GtkWidget *window = NULL;
4922 GtkWidget *box1,*box2;
4924 GtkWidget *btnColor,*btnFile,*btnClose;
4926 /* Create modal window (Here you can use any window descendent )*/
4927 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4928 gtk_window_set_screen (GTK_WINDOW (window),
4929 gtk_widget_get_screen (widget));
4931 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4933 /* Set window as modal */
4934 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4936 /* Create widgets */
4937 box1 = gtk_vbox_new (FALSE,5);
4938 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4939 box2 = gtk_vbox_new (TRUE,5);
4940 btnColor = gtk_button_new_with_label ("Color");
4941 btnFile = gtk_button_new_with_label ("File Selection");
4942 btnClose = gtk_button_new_with_label ("Close");
4945 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4946 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4949 gtk_container_add (GTK_CONTAINER (window), box1);
4950 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4951 gtk_container_add (GTK_CONTAINER (frame1), box2);
4952 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4953 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4954 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4955 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4957 /* connect signals */
4958 g_signal_connect_swapped (btnClose, "clicked",
4959 G_CALLBACK (gtk_widget_destroy), window);
4961 g_signal_connect (window, "destroy",
4962 G_CALLBACK (cmw_destroy_cb), NULL);
4964 g_signal_connect (btnColor, "clicked",
4965 G_CALLBACK (cmw_color), window);
4966 g_signal_connect (btnFile, "clicked",
4967 G_CALLBACK (cmw_file), window);
4970 gtk_widget_show_all (window);
4972 /* wait until dialog get destroyed */
4981 make_message_dialog (GdkScreen *screen,
4983 GtkMessageType type,
4984 GtkButtonsType buttons,
4985 guint default_response)
4989 gtk_widget_destroy (*dialog);
4994 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4995 "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.)");
4997 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4999 g_signal_connect_swapped (*dialog,
5001 G_CALLBACK (gtk_widget_destroy),
5004 g_signal_connect (*dialog,
5006 G_CALLBACK (gtk_widget_destroyed),
5009 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
5011 gtk_widget_show (*dialog);
5015 create_message_dialog (GtkWidget *widget)
5017 static GtkWidget *info = NULL;
5018 static GtkWidget *warning = NULL;
5019 static GtkWidget *error = NULL;
5020 static GtkWidget *question = NULL;
5021 GdkScreen *screen = gtk_widget_get_screen (widget);
5023 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
5024 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
5025 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
5026 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
5033 static GtkWidget *sw_parent = NULL;
5034 static GtkWidget *sw_float_parent;
5035 static guint sw_destroyed_handler = 0;
5038 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
5040 gtk_widget_reparent (scrollwin, sw_parent);
5042 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5043 sw_float_parent = NULL;
5045 sw_destroyed_handler = 0;
5051 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
5053 gtk_widget_destroy (sw_float_parent);
5055 sw_float_parent = NULL;
5057 sw_destroyed_handler = 0;
5061 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
5065 gtk_widget_reparent (scrollwin, sw_parent);
5066 gtk_widget_destroy (sw_float_parent);
5068 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5069 sw_float_parent = NULL;
5071 sw_destroyed_handler = 0;
5075 sw_parent = scrollwin->parent;
5076 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5077 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
5078 gtk_widget_get_screen (widget));
5080 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
5082 gtk_widget_reparent (scrollwin, sw_float_parent);
5083 gtk_widget_show (sw_float_parent);
5085 sw_destroyed_handler =
5086 g_signal_connect (sw_parent, "destroy",
5087 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
5088 g_signal_connect (sw_float_parent, "delete_event",
5089 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
5094 create_scrolled_windows (GtkWidget *widget)
5096 static GtkWidget *window;
5097 GtkWidget *scrolled_window;
5105 window = gtk_dialog_new ();
5107 gtk_window_set_screen (GTK_WINDOW (window),
5108 gtk_widget_get_screen (widget));
5110 g_signal_connect (window, "destroy",
5111 G_CALLBACK (gtk_widget_destroyed),
5114 gtk_window_set_title (GTK_WINDOW (window), "dialog");
5115 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5118 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
5119 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
5120 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
5121 GTK_POLICY_AUTOMATIC,
5122 GTK_POLICY_AUTOMATIC);
5123 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5124 scrolled_window, TRUE, TRUE, 0);
5125 gtk_widget_show (scrolled_window);
5127 table = gtk_table_new (20, 20, FALSE);
5128 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
5129 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
5130 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
5131 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
5132 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5133 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
5134 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5135 gtk_widget_show (table);
5137 for (i = 0; i < 20; i++)
5138 for (j = 0; j < 20; j++)
5140 sprintf (buffer, "button (%d,%d)\n", i, j);
5141 button = gtk_toggle_button_new_with_label (buffer);
5142 gtk_table_attach_defaults (GTK_TABLE (table), button,
5144 gtk_widget_show (button);
5148 button = gtk_button_new_with_label ("Close");
5149 g_signal_connect_swapped (button, "clicked",
5150 G_CALLBACK (gtk_widget_destroy),
5152 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5153 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5154 button, TRUE, TRUE, 0);
5155 gtk_widget_grab_default (button);
5156 gtk_widget_show (button);
5158 button = gtk_button_new_with_label ("Reparent Out");
5159 g_signal_connect (button, "clicked",
5160 G_CALLBACK (scrolled_windows_remove),
5162 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5163 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5164 button, TRUE, TRUE, 0);
5165 gtk_widget_grab_default (button);
5166 gtk_widget_show (button);
5168 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
5171 if (!GTK_WIDGET_VISIBLE (window))
5172 gtk_widget_show (window);
5174 gtk_widget_destroy (window);
5182 entry_toggle_frame (GtkWidget *checkbutton,
5185 gtk_entry_set_has_frame (GTK_ENTRY(entry),
5186 GTK_TOGGLE_BUTTON(checkbutton)->active);
5190 entry_toggle_sensitive (GtkWidget *checkbutton,
5193 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
5197 entry_progress_timeout (gpointer data)
5199 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
5201 gtk_entry_progress_pulse (GTK_ENTRY (data));
5207 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
5210 if (fraction > 1.0001)
5213 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
5220 entry_remove_timeout (gpointer data)
5222 g_source_remove (GPOINTER_TO_UINT (data));
5226 entry_toggle_progress (GtkWidget *checkbutton,
5229 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
5231 guint timeout = gdk_threads_add_timeout (100,
5232 entry_progress_timeout,
5234 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
5235 GUINT_TO_POINTER (timeout),
5236 entry_remove_timeout);
5240 g_object_set_data (G_OBJECT (entry), "timeout-id",
5241 GUINT_TO_POINTER (0));
5243 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
5248 entry_toggle_pulse (GtkWidget *checkbutton,
5251 g_object_set_data (G_OBJECT (entry), "progress-pulse",
5252 GINT_TO_POINTER (GTK_TOGGLE_BUTTON (checkbutton)->active));
5256 entry_props_clicked (GtkWidget *button,
5259 GtkWidget *window = create_prop_editor (entry, 0);
5261 gtk_window_set_title (GTK_WINDOW (window), "Entry Properties");
5265 create_entry (GtkWidget *widget)
5267 static GtkWidget *window = NULL;
5271 GtkWidget *has_frame_check;
5272 GtkWidget *sensitive_check;
5273 GtkWidget *progress_check;
5274 GtkWidget *entry, *cb;
5276 GtkWidget *separator;
5277 GList *cbitems = NULL;
5281 cbitems = g_list_append(cbitems, "item0");
5282 cbitems = g_list_append(cbitems, "item1 item1");
5283 cbitems = g_list_append(cbitems, "item2 item2 item2");
5284 cbitems = g_list_append(cbitems, "item3 item3 item3 item3");
5285 cbitems = g_list_append(cbitems, "item4 item4 item4 item4 item4");
5286 cbitems = g_list_append(cbitems, "item5 item5 item5 item5 item5 item5");
5287 cbitems = g_list_append(cbitems, "item6 item6 item6 item6 item6");
5288 cbitems = g_list_append(cbitems, "item7 item7 item7 item7");
5289 cbitems = g_list_append(cbitems, "item8 item8 item8");
5290 cbitems = g_list_append(cbitems, "item9 item9");
5292 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5293 gtk_window_set_screen (GTK_WINDOW (window),
5294 gtk_widget_get_screen (widget));
5296 g_signal_connect (window, "destroy",
5297 G_CALLBACK (gtk_widget_destroyed),
5300 gtk_window_set_title (GTK_WINDOW (window), "entry");
5301 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5304 box1 = gtk_vbox_new (FALSE, 0);
5305 gtk_container_add (GTK_CONTAINER (window), box1);
5308 box2 = gtk_vbox_new (FALSE, 10);
5309 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5310 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5312 hbox = gtk_hbox_new (FALSE, 5);
5313 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5315 entry = gtk_entry_new ();
5316 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");
5317 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
5318 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
5320 button = gtk_button_new_with_mnemonic ("_Props");
5321 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5322 g_signal_connect (button, "clicked",
5323 G_CALLBACK (entry_props_clicked),
5326 cb = gtk_combo_new ();
5327 gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
5328 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO(cb)->entry), "hello world \n\n\n foo");
5329 gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry),
5331 gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0);
5333 sensitive_check = gtk_check_button_new_with_label("Sensitive");
5334 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
5335 g_signal_connect (sensitive_check, "toggled",
5336 G_CALLBACK (entry_toggle_sensitive), entry);
5337 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
5339 has_frame_check = gtk_check_button_new_with_label("Has Frame");
5340 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
5341 g_signal_connect (has_frame_check, "toggled",
5342 G_CALLBACK (entry_toggle_frame), entry);
5343 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
5345 progress_check = gtk_check_button_new_with_label("Show Progress");
5346 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
5347 g_signal_connect (progress_check, "toggled",
5348 G_CALLBACK (entry_toggle_progress), entry);
5350 progress_check = gtk_check_button_new_with_label("Pulse Progress");
5351 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
5352 g_signal_connect (progress_check, "toggled",
5353 G_CALLBACK (entry_toggle_pulse), entry);
5355 separator = gtk_hseparator_new ();
5356 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5358 box2 = gtk_vbox_new (FALSE, 10);
5359 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5360 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5362 button = gtk_button_new_with_label ("close");
5363 g_signal_connect_swapped (button, "clicked",
5364 G_CALLBACK (gtk_widget_destroy),
5366 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5367 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5368 gtk_widget_grab_default (button);
5371 if (!GTK_WIDGET_VISIBLE (window))
5372 gtk_widget_show_all (window);
5374 gtk_widget_destroy (window);
5378 create_expander (GtkWidget *widget)
5381 GtkWidget *expander;
5383 static GtkWidget *window = NULL;
5387 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5388 gtk_window_set_screen (GTK_WINDOW (window),
5389 gtk_widget_get_screen (widget));
5391 g_signal_connect (window, "destroy",
5392 G_CALLBACK (gtk_widget_destroyed),
5395 gtk_window_set_title (GTK_WINDOW (window), "expander");
5396 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5398 box1 = gtk_vbox_new (FALSE, 0);
5399 gtk_container_add (GTK_CONTAINER (window), box1);
5401 expander = gtk_expander_new ("The Hidden");
5403 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
5405 hidden = gtk_label_new ("Revealed!");
5407 gtk_container_add (GTK_CONTAINER (expander), hidden);
5410 if (!GTK_WIDGET_VISIBLE (window))
5411 gtk_widget_show_all (window);
5413 gtk_widget_destroy (window);
5421 event_box_label_pressed (GtkWidget *widget,
5422 GdkEventButton *event,
5425 g_print ("clicked on event box\n");
5429 event_box_button_clicked (GtkWidget *widget,
5433 g_print ("pushed button\n");
5437 event_box_toggle_visible_window (GtkWidget *checkbutton,
5438 GtkEventBox *event_box)
5440 gtk_event_box_set_visible_window (event_box,
5441 GTK_TOGGLE_BUTTON(checkbutton)->active);
5445 event_box_toggle_above_child (GtkWidget *checkbutton,
5446 GtkEventBox *event_box)
5448 gtk_event_box_set_above_child (event_box,
5449 GTK_TOGGLE_BUTTON(checkbutton)->active);
5453 create_event_box (GtkWidget *widget)
5455 static GtkWidget *window = NULL;
5461 GtkWidget *separator;
5462 GtkWidget *event_box;
5464 GtkWidget *visible_window_check;
5465 GtkWidget *above_child_check;
5474 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5475 gtk_window_set_screen (GTK_WINDOW (window),
5476 gtk_widget_get_screen (widget));
5478 g_signal_connect (window, "destroy",
5479 G_CALLBACK (gtk_widget_destroyed),
5482 gtk_window_set_title (GTK_WINDOW (window), "event box");
5483 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5485 box1 = gtk_vbox_new (FALSE, 0);
5486 gtk_container_add (GTK_CONTAINER (window), box1);
5487 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
5489 hbox = gtk_hbox_new (FALSE, 0);
5490 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
5492 event_box = gtk_event_box_new ();
5493 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
5495 vbox = gtk_vbox_new (FALSE, 0);
5496 gtk_container_add (GTK_CONTAINER (event_box), vbox);
5497 g_signal_connect (event_box, "button_press_event",
5498 G_CALLBACK (event_box_label_pressed),
5501 label = gtk_label_new ("Click on this label");
5502 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
5504 button = gtk_button_new_with_label ("button in eventbox");
5505 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
5506 g_signal_connect (button, "clicked",
5507 G_CALLBACK (event_box_button_clicked),
5511 visible_window_check = gtk_check_button_new_with_label("Visible Window");
5512 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
5513 g_signal_connect (visible_window_check, "toggled",
5514 G_CALLBACK (event_box_toggle_visible_window), event_box);
5515 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
5517 above_child_check = gtk_check_button_new_with_label("Above Child");
5518 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
5519 g_signal_connect (above_child_check, "toggled",
5520 G_CALLBACK (event_box_toggle_above_child), event_box);
5521 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
5523 separator = gtk_hseparator_new ();
5524 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5526 box2 = gtk_vbox_new (FALSE, 10);
5527 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5528 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5530 button = gtk_button_new_with_label ("close");
5531 g_signal_connect_swapped (button, "clicked",
5532 G_CALLBACK (gtk_widget_destroy),
5534 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5535 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5536 gtk_widget_grab_default (button);
5539 if (!GTK_WIDGET_VISIBLE (window))
5540 gtk_widget_show_all (window);
5542 gtk_widget_destroy (window);
5550 #define SIZE_GROUP_INITIAL_SIZE 50
5553 size_group_hsize_changed (GtkSpinButton *spin_button,
5556 gtk_widget_set_size_request (GTK_BIN (button)->child,
5557 gtk_spin_button_get_value_as_int (spin_button),
5562 size_group_vsize_changed (GtkSpinButton *spin_button,
5565 gtk_widget_set_size_request (GTK_BIN (button)->child,
5567 gtk_spin_button_get_value_as_int (spin_button));
5571 create_size_group_window (GdkScreen *screen,
5572 GtkSizeGroup *master_size_group)
5576 GtkWidget *main_button;
5578 GtkWidget *spin_button;
5580 GtkSizeGroup *hgroup1;
5581 GtkSizeGroup *hgroup2;
5582 GtkSizeGroup *vgroup1;
5583 GtkSizeGroup *vgroup2;
5585 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
5591 gtk_window_set_screen (GTK_WINDOW (window), screen);
5593 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
5595 g_signal_connect (window, "response",
5596 G_CALLBACK (gtk_widget_destroy),
5599 table = gtk_table_new (2, 2, FALSE);
5600 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
5602 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
5603 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
5604 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
5605 gtk_widget_set_size_request (table, 250, 250);
5607 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5608 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5609 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5610 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5612 main_button = gtk_button_new_with_label ("X");
5614 gtk_table_attach (GTK_TABLE (table), main_button,
5616 GTK_EXPAND, GTK_EXPAND,
5618 gtk_size_group_add_widget (master_size_group, main_button);
5619 gtk_size_group_add_widget (hgroup1, main_button);
5620 gtk_size_group_add_widget (vgroup1, main_button);
5621 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
5622 SIZE_GROUP_INITIAL_SIZE,
5623 SIZE_GROUP_INITIAL_SIZE);
5625 button = gtk_button_new ();
5626 gtk_table_attach (GTK_TABLE (table), button,
5628 GTK_EXPAND, GTK_EXPAND,
5630 gtk_size_group_add_widget (vgroup1, button);
5631 gtk_size_group_add_widget (vgroup2, button);
5633 button = gtk_button_new ();
5634 gtk_table_attach (GTK_TABLE (table), button,
5636 GTK_EXPAND, GTK_EXPAND,
5638 gtk_size_group_add_widget (hgroup1, button);
5639 gtk_size_group_add_widget (hgroup2, button);
5641 button = gtk_button_new ();
5642 gtk_table_attach (GTK_TABLE (table), button,
5644 GTK_EXPAND, GTK_EXPAND,
5646 gtk_size_group_add_widget (hgroup2, button);
5647 gtk_size_group_add_widget (vgroup2, button);
5649 g_object_unref (hgroup1);
5650 g_object_unref (hgroup2);
5651 g_object_unref (vgroup1);
5652 g_object_unref (vgroup2);
5654 hbox = gtk_hbox_new (FALSE, 5);
5655 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
5657 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5658 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5659 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5660 g_signal_connect (spin_button, "value_changed",
5661 G_CALLBACK (size_group_hsize_changed), main_button);
5663 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5664 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5665 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5666 g_signal_connect (spin_button, "value_changed",
5667 G_CALLBACK (size_group_vsize_changed), main_button);
5673 create_size_groups (GtkWidget *widget)
5675 static GtkWidget *window1 = NULL;
5676 static GtkWidget *window2 = NULL;
5677 static GtkSizeGroup *master_size_group;
5679 if (!master_size_group)
5680 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
5684 window1 = create_size_group_window (gtk_widget_get_screen (widget),
5687 g_signal_connect (window1, "destroy",
5688 G_CALLBACK (gtk_widget_destroyed),
5694 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5697 g_signal_connect (window2, "destroy",
5698 G_CALLBACK (gtk_widget_destroyed),
5702 if (GTK_WIDGET_VISIBLE (window1) && GTK_WIDGET_VISIBLE (window2))
5704 gtk_widget_destroy (window1);
5705 gtk_widget_destroy (window2);
5709 if (!GTK_WIDGET_VISIBLE (window1))
5710 gtk_widget_show_all (window1);
5711 if (!GTK_WIDGET_VISIBLE (window2))
5712 gtk_widget_show_all (window2);
5720 static GtkWidget *spinner1;
5723 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5725 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5729 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5731 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5735 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5737 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5738 gtk_spin_button_get_value_as_int (spin));
5742 get_value (GtkWidget *widget, gpointer data)
5746 GtkSpinButton *spin;
5748 spin = GTK_SPIN_BUTTON (spinner1);
5749 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5750 if (GPOINTER_TO_INT (data) == 1)
5751 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5753 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5754 gtk_label_set_text (label, buf);
5758 get_spin_value (GtkWidget *widget, gpointer data)
5762 GtkSpinButton *spin;
5764 spin = GTK_SPIN_BUTTON (widget);
5765 label = GTK_LABEL (data);
5767 buffer = g_strdup_printf ("%0.*f", spin->digits,
5768 gtk_spin_button_get_value (spin));
5769 gtk_label_set_text (label, buffer);
5775 spin_button_time_output_func (GtkSpinButton *spin_button)
5777 static gchar buf[6];
5781 hours = spin_button->adjustment->value / 60.0;
5782 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5783 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5784 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5785 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5790 spin_button_month_input_func (GtkSpinButton *spin_button,
5794 static gchar *month[12] = { "January", "February", "March", "April",
5795 "May", "June", "July", "August",
5796 "September", "October", "November", "December" };
5798 gboolean found = FALSE;
5800 for (i = 1; i <= 12; i++)
5802 tmp1 = g_ascii_strup (month[i - 1], -1);
5803 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5804 if (strstr (tmp1, tmp2) == tmp1)
5814 return GTK_INPUT_ERROR;
5816 *new_val = (gdouble) i;
5821 spin_button_month_output_func (GtkSpinButton *spin_button)
5824 static gchar *month[12] = { "January", "February", "March", "April",
5825 "May", "June", "July", "August", "September",
5826 "October", "November", "December" };
5828 for (i = 1; i <= 12; i++)
5829 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5831 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5832 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5838 spin_button_hex_input_func (GtkSpinButton *spin_button,
5845 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5846 res = strtol(buf, &err, 16);
5849 return GTK_INPUT_ERROR;
5855 spin_button_hex_output_func (GtkSpinButton *spin_button)
5857 static gchar buf[7];
5860 val = (gint) spin_button->adjustment->value;
5861 if (fabs (val) < 1e-5)
5862 sprintf (buf, "0x00");
5864 sprintf (buf, "0x%.2X", val);
5865 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5866 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5871 create_spins (GtkWidget *widget)
5873 static GtkWidget *window = NULL;
5876 GtkWidget *main_vbox;
5879 GtkWidget *spinner2;
5883 GtkWidget *val_label;
5888 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5889 gtk_window_set_screen (GTK_WINDOW (window),
5890 gtk_widget_get_screen (widget));
5892 g_signal_connect (window, "destroy",
5893 G_CALLBACK (gtk_widget_destroyed),
5896 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5898 main_vbox = gtk_vbox_new (FALSE, 5);
5899 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5900 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5902 frame = gtk_frame_new ("Not accelerated");
5903 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5905 vbox = gtk_vbox_new (FALSE, 0);
5906 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5907 gtk_container_add (GTK_CONTAINER (frame), vbox);
5909 /* Time, month, hex spinners */
5911 hbox = gtk_hbox_new (FALSE, 0);
5912 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5914 vbox2 = gtk_vbox_new (FALSE, 0);
5915 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5917 label = gtk_label_new ("Time :");
5918 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5919 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5921 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5922 spinner = gtk_spin_button_new (adj, 0, 0);
5923 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5924 g_signal_connect (spinner,
5926 G_CALLBACK (spin_button_time_output_func),
5928 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5929 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5930 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5932 vbox2 = gtk_vbox_new (FALSE, 0);
5933 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5935 label = gtk_label_new ("Month :");
5936 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5937 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5939 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5941 spinner = gtk_spin_button_new (adj, 0, 0);
5942 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5943 GTK_UPDATE_IF_VALID);
5944 g_signal_connect (spinner,
5946 G_CALLBACK (spin_button_month_input_func),
5948 g_signal_connect (spinner,
5950 G_CALLBACK (spin_button_month_output_func),
5952 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5953 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5954 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5956 vbox2 = gtk_vbox_new (FALSE, 0);
5957 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5959 label = gtk_label_new ("Hex :");
5960 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5961 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5963 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5964 spinner = gtk_spin_button_new (adj, 0, 0);
5965 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5966 g_signal_connect (spinner,
5968 G_CALLBACK (spin_button_hex_input_func),
5970 g_signal_connect (spinner,
5972 G_CALLBACK (spin_button_hex_output_func),
5974 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5975 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
5976 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5978 frame = gtk_frame_new ("Accelerated");
5979 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5981 vbox = gtk_vbox_new (FALSE, 0);
5982 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5983 gtk_container_add (GTK_CONTAINER (frame), vbox);
5985 hbox = gtk_hbox_new (FALSE, 0);
5986 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5988 vbox2 = gtk_vbox_new (FALSE, 0);
5989 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5991 label = gtk_label_new ("Value :");
5992 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5993 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5995 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
5997 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5998 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5999 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
6001 vbox2 = gtk_vbox_new (FALSE, 0);
6002 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
6004 label = gtk_label_new ("Digits :");
6005 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6006 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
6008 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
6009 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
6010 g_signal_connect (adj, "value_changed",
6011 G_CALLBACK (change_digits),
6013 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
6015 hbox = gtk_hbox_new (FALSE, 0);
6016 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
6018 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
6019 g_signal_connect (button, "clicked",
6020 G_CALLBACK (toggle_snap),
6022 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
6023 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6025 button = gtk_check_button_new_with_label ("Numeric only input mode");
6026 g_signal_connect (button, "clicked",
6027 G_CALLBACK (toggle_numeric),
6029 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
6030 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6032 val_label = gtk_label_new ("");
6034 hbox = gtk_hbox_new (FALSE, 0);
6035 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6037 button = gtk_button_new_with_label ("Value as Int");
6038 g_object_set_data (G_OBJECT (button), "user_data", val_label);
6039 g_signal_connect (button, "clicked",
6040 G_CALLBACK (get_value),
6041 GINT_TO_POINTER (1));
6042 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6044 button = gtk_button_new_with_label ("Value as Float");
6045 g_object_set_data (G_OBJECT (button), "user_data", val_label);
6046 g_signal_connect (button, "clicked",
6047 G_CALLBACK (get_value),
6048 GINT_TO_POINTER (2));
6049 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6051 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
6052 gtk_label_set_text (GTK_LABEL (val_label), "0");
6054 frame = gtk_frame_new ("Using Convenience Constructor");
6055 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
6057 hbox = gtk_hbox_new (FALSE, 0);
6058 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6059 gtk_container_add (GTK_CONTAINER (frame), hbox);
6061 val_label = gtk_label_new ("0.0");
6063 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
6064 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
6065 g_signal_connect (spinner, "value_changed",
6066 G_CALLBACK (get_spin_value), val_label);
6067 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
6068 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
6070 hbox = gtk_hbox_new (FALSE, 0);
6071 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
6073 button = gtk_button_new_with_label ("Close");
6074 g_signal_connect_swapped (button, "clicked",
6075 G_CALLBACK (gtk_widget_destroy),
6077 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6080 if (!GTK_WIDGET_VISIBLE (window))
6081 gtk_widget_show_all (window);
6083 gtk_widget_destroy (window);
6092 cursor_expose_event (GtkWidget *widget,
6096 GtkDrawingArea *darea;
6097 GdkDrawable *drawable;
6104 g_return_val_if_fail (widget != NULL, TRUE);
6105 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
6107 darea = GTK_DRAWING_AREA (widget);
6108 drawable = widget->window;
6109 white_gc = widget->style->white_gc;
6110 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
6111 black_gc = widget->style->black_gc;
6112 max_width = widget->allocation.width;
6113 max_height = widget->allocation.height;
6115 gdk_draw_rectangle (drawable, white_gc,
6122 gdk_draw_rectangle (drawable, black_gc,
6129 gdk_draw_rectangle (drawable, gray_gc,
6140 set_cursor (GtkWidget *spinner,
6149 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
6152 label = g_object_get_data (G_OBJECT (spinner), "user_data");
6154 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
6155 vals = class->values;
6157 while (vals && vals->value != c)
6160 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
6162 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
6164 g_type_class_unref (class);
6166 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
6167 gdk_window_set_cursor (widget->window, cursor);
6168 gdk_cursor_unref (cursor);
6172 cursor_event (GtkWidget *widget,
6174 GtkSpinButton *spinner)
6176 if ((event->type == GDK_BUTTON_PRESS) &&
6177 ((event->button.button == 1) ||
6178 (event->button.button == 3)))
6180 gtk_spin_button_spin (spinner, event->button.button == 1 ?
6181 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
6188 #ifdef GDK_WINDOWING_X11
6189 #include "x11/gdkx.h"
6192 change_cursor_theme (GtkWidget *widget,
6199 children = gtk_container_get_children (GTK_CONTAINER (data));
6201 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
6202 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
6204 g_list_free (children);
6206 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
6213 create_cursors (GtkWidget *widget)
6215 static GtkWidget *window = NULL;
6218 GtkWidget *main_vbox;
6231 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6232 gtk_window_set_screen (GTK_WINDOW (window),
6233 gtk_widget_get_screen (widget));
6235 g_signal_connect (window, "destroy",
6236 G_CALLBACK (gtk_widget_destroyed),
6239 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
6241 main_vbox = gtk_vbox_new (FALSE, 5);
6242 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
6243 gtk_container_add (GTK_CONTAINER (window), main_vbox);
6246 g_object_new (gtk_vbox_get_type (),
6247 "GtkBox::homogeneous", FALSE,
6248 "GtkBox::spacing", 5,
6249 "GtkContainer::border_width", 10,
6250 "GtkWidget::parent", main_vbox,
6251 "GtkWidget::visible", TRUE,
6254 #ifdef GDK_WINDOWING_X11
6255 hbox = gtk_hbox_new (FALSE, 0);
6256 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6257 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6259 label = gtk_label_new ("Cursor Theme : ");
6260 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6261 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6263 entry = gtk_entry_new ();
6264 gtk_entry_set_text (GTK_ENTRY (entry), "default");
6265 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
6267 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
6268 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
6269 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
6271 g_signal_connect (entry, "changed",
6272 G_CALLBACK (change_cursor_theme), hbox);
6273 g_signal_connect (size, "changed",
6274 G_CALLBACK (change_cursor_theme), hbox);
6277 hbox = gtk_hbox_new (FALSE, 0);
6278 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6279 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6281 label = gtk_label_new ("Cursor Value : ");
6282 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6283 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6285 adj = (GtkAdjustment *) gtk_adjustment_new (0,
6289 spinner = gtk_spin_button_new (adj, 0, 0);
6290 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
6293 g_object_new (gtk_frame_get_type (),
6294 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
6295 "GtkFrame::label_xalign", 0.5,
6296 "GtkFrame::label", "Cursor Area",
6297 "GtkContainer::border_width", 10,
6298 "GtkWidget::parent", vbox,
6299 "GtkWidget::visible", TRUE,
6302 darea = gtk_drawing_area_new ();
6303 gtk_widget_set_size_request (darea, 80, 80);
6304 gtk_container_add (GTK_CONTAINER (frame), darea);
6305 g_signal_connect (darea,
6307 G_CALLBACK (cursor_expose_event),
6309 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
6310 g_signal_connect (darea,
6311 "button_press_event",
6312 G_CALLBACK (cursor_event),
6314 gtk_widget_show (darea);
6316 g_signal_connect (spinner, "changed",
6317 G_CALLBACK (set_cursor),
6320 label = g_object_new (GTK_TYPE_LABEL,
6325 gtk_container_child_set (GTK_CONTAINER (vbox), label,
6328 g_object_set_data (G_OBJECT (spinner), "user_data", label);
6331 g_object_new (gtk_hseparator_get_type (),
6332 "GtkWidget::visible", TRUE,
6334 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
6336 hbox = gtk_hbox_new (FALSE, 0);
6337 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
6338 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
6340 button = gtk_button_new_with_label ("Close");
6341 g_signal_connect_swapped (button, "clicked",
6342 G_CALLBACK (gtk_widget_destroy),
6344 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6346 gtk_widget_show_all (window);
6348 set_cursor (spinner, darea);
6351 gtk_widget_destroy (window);
6359 list_add (GtkWidget *widget,
6364 GtkWidget *list_item;
6365 GtkContainer *container;
6367 container = GTK_CONTAINER (list);
6369 sprintf (buffer, "added item %d", i++);
6370 list_item = gtk_list_item_new_with_label (buffer);
6371 gtk_widget_show (list_item);
6373 gtk_container_add (container, list_item);
6377 list_remove (GtkWidget *widget,
6380 GList *clear_list = NULL;
6381 GList *sel_row = NULL;
6384 if (list->selection_mode == GTK_SELECTION_EXTENDED)
6388 item = GTK_CONTAINER (list)->focus_child;
6389 if (!item && list->selection)
6390 item = list->selection->data;
6394 work = g_list_find (list->children, item);
6395 for (sel_row = work; sel_row; sel_row = sel_row->next)
6396 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
6401 for (sel_row = work; sel_row; sel_row = sel_row->prev)
6402 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
6408 for (work = list->selection; work; work = work->next)
6409 clear_list = g_list_prepend (clear_list, work->data);
6411 clear_list = g_list_reverse (clear_list);
6412 gtk_list_remove_items (GTK_LIST (list), clear_list);
6413 g_list_free (clear_list);
6415 if (list->selection_mode == GTK_SELECTION_EXTENDED && sel_row)
6416 gtk_list_select_child (list, GTK_WIDGET(sel_row->data));
6420 list_clear (GtkWidget *widget,
6423 gtk_list_clear_items (GTK_LIST (list), 0, -1);
6426 static gchar *selection_mode_items[] =
6433 static const GtkSelectionMode selection_modes[] = {
6434 GTK_SELECTION_SINGLE,
6435 GTK_SELECTION_BROWSE,
6436 GTK_SELECTION_MULTIPLE
6439 static GtkWidget *list_omenu;
6442 list_toggle_sel_mode (GtkWidget *widget, gpointer data)
6447 list = GTK_LIST (data);
6449 if (!GTK_WIDGET_MAPPED (widget))
6452 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6454 gtk_list_set_selection_mode (list, selection_modes[i]);
6458 create_list (GtkWidget *widget)
6460 static GtkWidget *window = NULL;
6468 GtkWidget *scrolled_win;
6471 GtkWidget *separator;
6474 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6476 gtk_window_set_screen (GTK_WINDOW (window),
6477 gtk_widget_get_screen (widget));
6479 g_signal_connect (window, "destroy",
6480 G_CALLBACK (gtk_widget_destroyed),
6483 gtk_window_set_title (GTK_WINDOW (window), "list");
6484 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6486 vbox = gtk_vbox_new (FALSE, 0);
6487 gtk_container_add (GTK_CONTAINER (window), vbox);
6489 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6490 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6491 gtk_widget_set_size_request (scrolled_win, -1, 300);
6492 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6493 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6494 GTK_POLICY_AUTOMATIC,
6495 GTK_POLICY_AUTOMATIC);
6497 list = gtk_list_new ();
6498 gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE);
6499 gtk_scrolled_window_add_with_viewport
6500 (GTK_SCROLLED_WINDOW (scrolled_win), list);
6501 gtk_container_set_focus_vadjustment
6502 (GTK_CONTAINER (list),
6503 gtk_scrolled_window_get_vadjustment
6504 (GTK_SCROLLED_WINDOW (scrolled_win)));
6505 gtk_container_set_focus_hadjustment
6506 (GTK_CONTAINER (list),
6507 gtk_scrolled_window_get_hadjustment
6508 (GTK_SCROLLED_WINDOW (scrolled_win)));
6510 if ((infile = fopen("../gtk/gtkenums.h", "r")))
6516 while (fgets (buffer, 256, infile))
6518 if ((pos = strchr (buffer, '\n')))
6520 item = gtk_list_item_new_with_label (buffer);
6521 gtk_container_add (GTK_CONTAINER (list), item);
6528 hbox = gtk_hbox_new (TRUE, 5);
6529 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6530 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6532 button = gtk_button_new_with_label ("Insert Row");
6533 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6534 g_signal_connect (button, "clicked",
6535 G_CALLBACK (list_add),
6538 button = gtk_button_new_with_label ("Clear List");
6539 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6540 g_signal_connect (button, "clicked",
6541 G_CALLBACK (list_clear),
6544 button = gtk_button_new_with_label ("Remove Selection");
6545 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6546 g_signal_connect (button, "clicked",
6547 G_CALLBACK (list_remove),
6550 cbox = gtk_hbox_new (FALSE, 0);
6551 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
6553 hbox = gtk_hbox_new (FALSE, 5);
6554 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6555 gtk_box_pack_start (GTK_BOX (cbox), hbox, TRUE, FALSE, 0);
6557 label = gtk_label_new ("Selection Mode :");
6558 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6560 list_omenu = build_option_menu (selection_mode_items, 3, 3,
6561 list_toggle_sel_mode,
6563 gtk_box_pack_start (GTK_BOX (hbox), list_omenu, FALSE, TRUE, 0);
6565 separator = gtk_hseparator_new ();
6566 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
6568 cbox = gtk_hbox_new (FALSE, 0);
6569 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
6571 button = gtk_button_new_with_label ("close");
6572 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6573 gtk_box_pack_start (GTK_BOX (cbox), button, TRUE, TRUE, 0);
6574 g_signal_connect_swapped (button, "clicked",
6575 G_CALLBACK (gtk_widget_destroy),
6578 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
6579 gtk_widget_grab_default (button);
6582 if (!GTK_WIDGET_VISIBLE (window))
6583 gtk_widget_show_all (window);
6585 gtk_widget_destroy (window);
6592 static char * book_open_xpm[] = {
6615 static char * book_closed_xpm[] = {
6640 static char * mini_page_xpm[] = {
6663 static char * gtk_mini_xpm[] = {
6703 #define TESTGTK_CLIST_COLUMNS 12
6704 static gint clist_rows = 0;
6705 static GtkWidget *clist_omenu;
6708 add1000_clist (GtkWidget *widget, gpointer data)
6711 char text[TESTGTK_CLIST_COLUMNS][50];
6712 char *texts[TESTGTK_CLIST_COLUMNS];
6717 clist = GTK_CLIST (data);
6719 pixmap = gdk_pixmap_create_from_xpm_d (clist->clist_window,
6721 >K_WIDGET (data)->style->white,
6724 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
6727 sprintf (text[i], "Column %d", i);
6731 sprintf (text[1], "Right");
6732 sprintf (text[2], "Center");
6734 gtk_clist_freeze (GTK_CLIST (data));
6735 for (i = 0; i < 1000; i++)
6737 sprintf (text[0], "CListRow %d", rand() % 10000);
6738 row = gtk_clist_append (clist, texts);
6739 gtk_clist_set_pixtext (clist, row, 3, "gtk+", 5, pixmap, mask);
6742 gtk_clist_thaw (GTK_CLIST (data));
6744 g_object_unref (pixmap);
6745 g_object_unref (mask);
6749 add10000_clist (GtkWidget *widget, gpointer data)
6752 char text[TESTGTK_CLIST_COLUMNS][50];
6753 char *texts[TESTGTK_CLIST_COLUMNS];
6755 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
6758 sprintf (text[i], "Column %d", i);
6761 sprintf (text[1], "Right");
6762 sprintf (text[2], "Center");
6764 gtk_clist_freeze (GTK_CLIST (data));
6765 for (i = 0; i < 10000; i++)
6767 sprintf (text[0], "CListRow %d", rand() % 10000);
6768 gtk_clist_append (GTK_CLIST (data), texts);
6770 gtk_clist_thaw (GTK_CLIST (data));
6774 clear_clist (GtkWidget *widget, gpointer data)
6776 gtk_clist_clear (GTK_CLIST (data));
6780 void clist_remove_selection (GtkWidget *widget, GtkCList *clist)
6782 gtk_clist_freeze (clist);
6784 while (clist->selection)
6789 row = GPOINTER_TO_INT (clist->selection->data);
6791 gtk_clist_remove (clist, row);
6793 if (clist->selection_mode == GTK_SELECTION_BROWSE)
6797 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
6798 clist->focus_row >= 0)
6799 gtk_clist_select_row (clist, clist->focus_row, -1);
6801 gtk_clist_thaw (clist);
6804 void toggle_title_buttons (GtkWidget *widget, GtkCList *clist)
6806 if (GTK_TOGGLE_BUTTON (widget)->active)
6807 gtk_clist_column_titles_show (clist);
6809 gtk_clist_column_titles_hide (clist);
6812 void toggle_reorderable (GtkWidget *widget, GtkCList *clist)
6814 gtk_clist_set_reorderable (clist, GTK_TOGGLE_BUTTON (widget)->active);
6818 insert_row_clist (GtkWidget *widget, gpointer data)
6820 static char *text[] =
6822 "This", "is an", "inserted", "row.",
6823 "This", "is an", "inserted", "row.",
6824 "This", "is an", "inserted", "row."
6827 static GtkStyle *style1 = NULL;
6828 static GtkStyle *style2 = NULL;
6829 static GtkStyle *style3 = NULL;
6832 if (GTK_CLIST (data)->focus_row >= 0)
6833 row = gtk_clist_insert (GTK_CLIST (data), GTK_CLIST (data)->focus_row,
6836 row = gtk_clist_prepend (GTK_CLIST (data), text);
6840 GdkColor col1 = { 0, 0, 56000, 0};
6841 GdkColor col2 = { 0, 32000, 0, 56000};
6843 style1 = gtk_style_copy (GTK_WIDGET (data)->style);
6844 style1->base[GTK_STATE_NORMAL] = col1;
6845 style1->base[GTK_STATE_SELECTED] = col2;
6847 style2 = gtk_style_copy (GTK_WIDGET (data)->style);
6848 style2->fg[GTK_STATE_NORMAL] = col1;
6849 style2->fg[GTK_STATE_SELECTED] = col2;
6851 style3 = gtk_style_copy (GTK_WIDGET (data)->style);
6852 style3->fg[GTK_STATE_NORMAL] = col1;
6853 style3->base[GTK_STATE_NORMAL] = col2;
6854 pango_font_description_free (style3->font_desc);
6855 style3->font_desc = pango_font_description_from_string ("courier 12");
6858 gtk_clist_set_cell_style (GTK_CLIST (data), row, 3, style1);
6859 gtk_clist_set_cell_style (GTK_CLIST (data), row, 4, style2);
6860 gtk_clist_set_cell_style (GTK_CLIST (data), row, 0, style3);
6866 clist_warning_test (GtkWidget *button,
6870 static gboolean add_remove = FALSE;
6872 add_remove = !add_remove;
6874 child = gtk_label_new ("Test");
6875 g_object_ref (child);
6876 gtk_object_sink (GTK_OBJECT (child));
6879 gtk_container_add (GTK_CONTAINER (clist), child);
6882 child->parent = clist;
6883 gtk_container_remove (GTK_CONTAINER (clist), child);
6884 child->parent = NULL;
6887 gtk_widget_destroy (child);
6888 g_object_unref (child);
6892 undo_selection (GtkWidget *button, GtkCList *clist)
6894 gtk_clist_undo_selection (clist);
6898 clist_toggle_sel_mode (GtkWidget *widget, gpointer data)
6903 clist = GTK_CLIST (data);
6905 if (!GTK_WIDGET_MAPPED (widget))
6908 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6910 gtk_clist_set_selection_mode (clist, selection_modes[i]);
6914 clist_click_column (GtkCList *clist, gint column, gpointer data)
6917 gtk_clist_set_column_visibility (clist, column, FALSE);
6918 else if (column == clist->sort_column)
6920 if (clist->sort_type == GTK_SORT_ASCENDING)
6921 clist->sort_type = GTK_SORT_DESCENDING;
6923 clist->sort_type = GTK_SORT_ASCENDING;
6926 gtk_clist_set_sort_column (clist, column);
6928 gtk_clist_sort (clist);
6932 create_clist (GtkWidget *widget)
6935 static GtkWidget *window = NULL;
6937 static char *titles[] =
6939 "auto resize", "not resizeable", "max width 100", "min width 50",
6940 "hide column", "Title 5", "Title 6", "Title 7",
6941 "Title 8", "Title 9", "Title 10", "Title 11"
6944 char text[TESTGTK_CLIST_COLUMNS][50];
6945 char *texts[TESTGTK_CLIST_COLUMNS];
6951 GtkWidget *separator;
6952 GtkWidget *scrolled_win;
6955 GtkWidget *undo_button;
6959 GdkColor red_col = { 0, 56000, 0, 0};
6960 GdkColor light_green_col = { 0, 0, 56000, 32000};
6965 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6966 gtk_window_set_screen (GTK_WINDOW (window),
6967 gtk_widget_get_screen (widget));
6969 g_signal_connect (window, "destroy",
6970 G_CALLBACK (gtk_widget_destroyed), &window);
6972 gtk_window_set_title (GTK_WINDOW (window), "clist");
6973 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6975 vbox = gtk_vbox_new (FALSE, 0);
6976 gtk_container_add (GTK_CONTAINER (window), vbox);
6978 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6979 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6980 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6981 GTK_POLICY_AUTOMATIC,
6982 GTK_POLICY_AUTOMATIC);
6984 /* create GtkCList here so we have a pointer to throw at the
6985 * button callbacks -- more is done with it later */
6986 clist = gtk_clist_new_with_titles (TESTGTK_CLIST_COLUMNS, titles);
6987 gtk_container_add (GTK_CONTAINER (scrolled_win), clist);
6988 g_signal_connect (clist, "click_column",
6989 G_CALLBACK (clist_click_column), NULL);
6991 /* control buttons */
6992 hbox = gtk_hbox_new (FALSE, 5);
6993 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6994 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6996 button = gtk_button_new_with_label ("Insert Row");
6997 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6998 g_signal_connect (button, "clicked",
6999 G_CALLBACK (insert_row_clist), clist);
7001 button = gtk_button_new_with_label ("Add 1,000 Rows With Pixmaps");
7002 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7003 g_signal_connect (button, "clicked",
7004 G_CALLBACK (add1000_clist), clist);
7006 button = gtk_button_new_with_label ("Add 10,000 Rows");
7007 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7008 g_signal_connect (button, "clicked",
7009 G_CALLBACK (add10000_clist), clist);
7011 /* second layer of buttons */
7012 hbox = gtk_hbox_new (FALSE, 5);
7013 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
7014 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
7016 button = gtk_button_new_with_label ("Clear List");
7017 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7018 g_signal_connect (button, "clicked",
7019 G_CALLBACK (clear_clist), clist);
7021 button = gtk_button_new_with_label ("Remove Selection");
7022 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7023 g_signal_connect (button, "clicked",
7024 G_CALLBACK (clist_remove_selection), clist);
7026 undo_button = gtk_button_new_with_label ("Undo Selection");
7027 gtk_box_pack_start (GTK_BOX (hbox), undo_button, TRUE, TRUE, 0);
7028 g_signal_connect (undo_button, "clicked",
7029 G_CALLBACK (undo_selection), clist);
7031 button = gtk_button_new_with_label ("Warning Test");
7032 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7033 g_signal_connect (button, "clicked",
7034 G_CALLBACK (clist_warning_test), clist);
7036 /* third layer of buttons */
7037 hbox = gtk_hbox_new (FALSE, 5);
7038 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
7039 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
7041 check = gtk_check_button_new_with_label ("Show Title Buttons");
7042 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
7043 g_signal_connect (check, "clicked",
7044 G_CALLBACK (toggle_title_buttons), clist);
7045 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
7047 check = gtk_check_button_new_with_label ("Reorderable");
7048 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
7049 g_signal_connect (check, "clicked",
7050 G_CALLBACK (toggle_reorderable), clist);
7051 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
7053 label = gtk_label_new ("Selection Mode :");
7054 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7056 clist_omenu = build_option_menu (selection_mode_items, 3, 3,
7057 clist_toggle_sel_mode,
7059 gtk_box_pack_start (GTK_BOX (hbox), clist_omenu, FALSE, TRUE, 0);
7062 * the rest of the clist configuration
7065 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
7066 gtk_clist_set_row_height (GTK_CLIST (clist), 18);
7067 gtk_widget_set_size_request (clist, -1, 300);
7069 for (i = 1; i < TESTGTK_CLIST_COLUMNS; i++)
7070 gtk_clist_set_column_width (GTK_CLIST (clist), i, 80);
7072 gtk_clist_set_column_auto_resize (GTK_CLIST (clist), 0, TRUE);
7073 gtk_clist_set_column_resizeable (GTK_CLIST (clist), 1, FALSE);
7074 gtk_clist_set_column_max_width (GTK_CLIST (clist), 2, 100);
7075 gtk_clist_set_column_min_width (GTK_CLIST (clist), 3, 50);
7076 gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
7077 gtk_clist_set_column_justification (GTK_CLIST (clist), 1,
7079 gtk_clist_set_column_justification (GTK_CLIST (clist), 2,
7080 GTK_JUSTIFY_CENTER);
7082 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
7085 sprintf (text[i], "Column %d", i);
7088 sprintf (text[1], "Right");
7089 sprintf (text[2], "Center");
7091 style = gtk_style_new ();
7092 style->fg[GTK_STATE_NORMAL] = red_col;
7093 style->base[GTK_STATE_NORMAL] = light_green_col;
7095 pango_font_description_set_size (style->font_desc, 14 * PANGO_SCALE);
7096 pango_font_description_set_weight (style->font_desc, PANGO_WEIGHT_BOLD);
7098 for (i = 0; i < 10; i++)
7100 sprintf (text[0], "CListRow %d", clist_rows++);
7101 gtk_clist_append (GTK_CLIST (clist), texts);
7106 gtk_clist_set_row_style (GTK_CLIST (clist), i, style);
7109 gtk_clist_set_cell_style (GTK_CLIST (clist), i, i % 4, style);
7114 g_object_unref (style);
7116 separator = gtk_hseparator_new ();
7117 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
7119 hbox = gtk_hbox_new (FALSE, 0);
7120 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
7122 button = gtk_button_new_with_label ("close");
7123 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
7124 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7125 g_signal_connect_swapped (button, "clicked",
7126 G_CALLBACK (gtk_widget_destroy),
7129 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7130 gtk_widget_grab_default (button);
7133 if (!GTK_WIDGET_VISIBLE (window))
7134 gtk_widget_show_all (window);
7138 gtk_widget_destroy (window);
7156 static gint books = 0;
7157 static gint pages = 0;
7159 static GtkWidget *book_label;
7160 static GtkWidget *page_label;
7161 static GtkWidget *sel_label;
7162 static GtkWidget *vis_label;
7163 static GtkWidget *omenu1;
7164 static GtkWidget *omenu2;
7165 static GtkWidget *omenu3;
7166 static GtkWidget *omenu4;
7167 static GtkWidget *spin1;
7168 static GtkWidget *spin2;
7169 static GtkWidget *spin3;
7170 static gint line_style;
7173 static CTreePixmaps *
7174 get_ctree_pixmaps (GtkCTree *ctree)
7176 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (ctree));
7177 CTreePixmaps *pixmaps = g_object_get_data (G_OBJECT (screen), "ctree-pixmaps");
7181 GdkColormap *colormap = gdk_screen_get_rgb_colormap (screen);
7182 pixmaps = g_new (CTreePixmaps, 1);
7184 pixmaps->pixmap1 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
7186 NULL, book_closed_xpm);
7187 pixmaps->pixmap2 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
7189 NULL, book_open_xpm);
7190 pixmaps->pixmap3 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
7192 NULL, mini_page_xpm);
7194 g_object_set_data (G_OBJECT (screen), "ctree-pixmaps", pixmaps);
7200 void after_press (GtkCTree *ctree, gpointer data)
7204 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
7205 gtk_label_set_text (GTK_LABEL (sel_label), buf);
7207 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
7208 gtk_label_set_text (GTK_LABEL (vis_label), buf);
7210 sprintf (buf, "%d", books);
7211 gtk_label_set_text (GTK_LABEL (book_label), buf);
7213 sprintf (buf, "%d", pages);
7214 gtk_label_set_text (GTK_LABEL (page_label), buf);
7217 void after_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent,
7218 GtkCTreeNode *sibling, gpointer data)
7224 gtk_ctree_get_node_info (ctree, child, &source,
7225 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7227 gtk_ctree_get_node_info (ctree, parent, &target1,
7228 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7230 gtk_ctree_get_node_info (ctree, sibling, &target2,
7231 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7233 g_print ("Moving \"%s\" to \"%s\" with sibling \"%s\".\n", source,
7234 (parent) ? target1 : "nil", (sibling) ? target2 : "nil");
7237 void count_items (GtkCTree *ctree, GtkCTreeNode *list)
7239 if (GTK_CTREE_ROW (list)->is_leaf)
7245 void expand_all (GtkWidget *widget, GtkCTree *ctree)
7247 gtk_ctree_expand_recursive (ctree, NULL);
7248 after_press (ctree, NULL);
7251 void collapse_all (GtkWidget *widget, GtkCTree *ctree)
7253 gtk_ctree_collapse_recursive (ctree, NULL);
7254 after_press (ctree, NULL);
7257 void select_all (GtkWidget *widget, GtkCTree *ctree)
7259 gtk_ctree_select_recursive (ctree, NULL);
7260 after_press (ctree, NULL);
7263 void change_style (GtkWidget *widget, GtkCTree *ctree)
7265 static GtkStyle *style1 = NULL;
7266 static GtkStyle *style2 = NULL;
7269 GdkColor green_col = { 0, 0, 56000, 0};
7270 GdkColor purple_col = { 0, 32000, 0, 56000};
7272 if (GTK_CLIST (ctree)->focus_row >= 0)
7273 node = GTK_CTREE_NODE
7274 (g_list_nth (GTK_CLIST (ctree)->row_list,GTK_CLIST (ctree)->focus_row));
7276 node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list);
7283 style1 = gtk_style_new ();
7284 style1->base[GTK_STATE_NORMAL] = green_col;
7285 style1->fg[GTK_STATE_SELECTED] = purple_col;
7287 style2 = gtk_style_new ();
7288 style2->base[GTK_STATE_SELECTED] = purple_col;
7289 style2->fg[GTK_STATE_NORMAL] = green_col;
7290 style2->base[GTK_STATE_NORMAL] = purple_col;
7291 pango_font_description_free (style2->font_desc);
7292 style2->font_desc = pango_font_description_from_string ("courier 30");
7295 gtk_ctree_node_set_cell_style (ctree, node, 1, style1);
7296 gtk_ctree_node_set_cell_style (ctree, node, 0, style2);
7298 if (GTK_CTREE_ROW (node)->children)
7299 gtk_ctree_node_set_row_style (ctree, GTK_CTREE_ROW (node)->children,
7303 void unselect_all (GtkWidget *widget, GtkCTree *ctree)
7305 gtk_ctree_unselect_recursive (ctree, NULL);
7306 after_press (ctree, NULL);
7309 void remove_selection (GtkWidget *widget, GtkCTree *ctree)
7314 clist = GTK_CLIST (ctree);
7316 gtk_clist_freeze (clist);
7318 while (clist->selection)
7320 node = clist->selection->data;
7322 if (GTK_CTREE_ROW (node)->is_leaf)
7325 gtk_ctree_post_recursive (ctree, node,
7326 (GtkCTreeFunc) count_items, NULL);
7328 gtk_ctree_remove_node (ctree, node);
7330 if (clist->selection_mode == GTK_SELECTION_BROWSE)
7334 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
7335 clist->focus_row >= 0)
7337 node = gtk_ctree_node_nth (ctree, clist->focus_row);
7340 gtk_ctree_select (ctree, node);
7343 gtk_clist_thaw (clist);
7344 after_press (ctree, NULL);
7347 struct _ExportStruct {
7353 typedef struct _ExportStruct ExportStruct;
7356 gnode2ctree (GtkCTree *ctree,
7359 GtkCTreeNode *cnode,
7363 GdkPixmap *pixmap_closed;
7364 GdkBitmap *mask_closed;
7365 GdkPixmap *pixmap_opened;
7366 GdkBitmap *mask_opened;
7367 CTreePixmaps *pixmaps;
7369 if (!cnode || !gnode || (!(es = gnode->data)))
7372 pixmaps = get_ctree_pixmaps (ctree);
7376 pixmap_closed = pixmaps->pixmap3;
7377 mask_closed = pixmaps->mask3;
7378 pixmap_opened = NULL;
7383 pixmap_closed = pixmaps->pixmap1;
7384 mask_closed = pixmaps->mask1;
7385 pixmap_opened = pixmaps->pixmap2;
7386 mask_opened = pixmaps->mask2;
7389 gtk_ctree_set_node_info (ctree, cnode, es->tree, 2, pixmap_closed,
7390 mask_closed, pixmap_opened, mask_opened,
7391 es->is_leaf, (depth < 3));
7392 gtk_ctree_node_set_text (ctree, cnode, 1, es->info);
7400 ctree2gnode (GtkCTree *ctree,
7403 GtkCTreeNode *cnode,
7408 if (!cnode || !gnode)
7411 es = g_new (ExportStruct, 1);
7413 es->is_leaf = GTK_CTREE_ROW (cnode)->is_leaf;
7414 es->tree = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[0])->text;
7415 es->info = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[1])->text;
7419 void export_ctree (GtkWidget *widget, GtkCTree *ctree)
7421 char *title[] = { "Tree" , "Info" };
7422 static GtkWidget *export_window = NULL;
7423 static GtkCTree *export_ctree;
7425 GtkWidget *scrolled_win;
7433 export_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7435 gtk_window_set_screen (GTK_WINDOW (export_window),
7436 gtk_widget_get_screen (widget));
7438 g_signal_connect (export_window, "destroy",
7439 G_CALLBACK (gtk_widget_destroyed),
7442 gtk_window_set_title (GTK_WINDOW (export_window), "exported ctree");
7443 gtk_container_set_border_width (GTK_CONTAINER (export_window), 5);
7445 vbox = gtk_vbox_new (FALSE, 0);
7446 gtk_container_add (GTK_CONTAINER (export_window), vbox);
7448 button = gtk_button_new_with_label ("Close");
7449 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, TRUE, 0);
7451 g_signal_connect_swapped (button, "clicked",
7452 G_CALLBACK (gtk_widget_destroy),
7455 sep = gtk_hseparator_new ();
7456 gtk_box_pack_end (GTK_BOX (vbox), sep, FALSE, TRUE, 10);
7458 export_ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
7459 gtk_ctree_set_line_style (export_ctree, GTK_CTREE_LINES_DOTTED);
7461 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
7462 gtk_container_add (GTK_CONTAINER (scrolled_win),
7463 GTK_WIDGET (export_ctree));
7464 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
7465 GTK_POLICY_AUTOMATIC,
7466 GTK_POLICY_AUTOMATIC);
7467 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
7468 gtk_clist_set_selection_mode (GTK_CLIST (export_ctree),
7469 GTK_SELECTION_EXTENDED);
7470 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 0, 200);
7471 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 1, 200);
7472 gtk_widget_set_size_request (GTK_WIDGET (export_ctree), 300, 200);
7475 if (!GTK_WIDGET_VISIBLE (export_window))
7476 gtk_widget_show_all (export_window);
7478 gtk_clist_clear (GTK_CLIST (export_ctree));
7480 node = GTK_CTREE_NODE (g_list_nth (GTK_CLIST (ctree)->row_list,
7481 GTK_CLIST (ctree)->focus_row));
7485 gnode = gtk_ctree_export_to_gnode (ctree, NULL, NULL, node,
7489 gtk_ctree_insert_gnode (export_ctree, NULL, NULL, gnode,
7491 g_node_destroy (gnode);
7495 void change_indent (GtkWidget *widget, GtkCTree *ctree)
7497 gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
7500 void change_spacing (GtkWidget *widget, GtkCTree *ctree)
7502 gtk_ctree_set_spacing (ctree, GTK_ADJUSTMENT (widget)->value);
7505 void change_row_height (GtkWidget *widget, GtkCList *clist)
7507 gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value);
7510 void set_background (GtkCTree *ctree, GtkCTreeNode *node, gpointer data)
7512 GtkStyle *style = NULL;
7517 if (ctree->line_style != GTK_CTREE_LINES_TABBED)
7519 if (!GTK_CTREE_ROW (node)->is_leaf)
7520 style = GTK_CTREE_ROW (node)->row.data;
7521 else if (GTK_CTREE_ROW (node)->parent)
7522 style = GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data;
7525 gtk_ctree_node_set_row_style (ctree, node, style);
7529 ctree_toggle_line_style (GtkWidget *widget, gpointer data)
7534 ctree = GTK_CTREE (data);
7536 if (!GTK_WIDGET_MAPPED (widget))
7539 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7541 if ((ctree->line_style == GTK_CTREE_LINES_TABBED &&
7542 ((GtkCTreeLineStyle) i) != GTK_CTREE_LINES_TABBED) ||
7543 (ctree->line_style != GTK_CTREE_LINES_TABBED &&
7544 ((GtkCTreeLineStyle) i) == GTK_CTREE_LINES_TABBED))
7545 gtk_ctree_pre_recursive (ctree, NULL, set_background, NULL);
7546 gtk_ctree_set_line_style (ctree, i);
7551 ctree_toggle_expander_style (GtkWidget *widget, gpointer data)
7556 ctree = GTK_CTREE (data);
7558 if (!GTK_WIDGET_MAPPED (widget))
7561 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7563 gtk_ctree_set_expander_style (ctree, (GtkCTreeExpanderStyle) i);
7567 ctree_toggle_justify (GtkWidget *widget, gpointer data)
7572 ctree = GTK_CTREE (data);
7574 if (!GTK_WIDGET_MAPPED (widget))
7577 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7579 gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column,
7580 (GtkJustification) i);
7584 ctree_toggle_sel_mode (GtkWidget *widget, gpointer data)
7589 ctree = GTK_CTREE (data);
7591 if (!GTK_WIDGET_MAPPED (widget))
7594 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7596 gtk_clist_set_selection_mode (GTK_CLIST (ctree), selection_modes[i]);
7597 after_press (ctree, NULL);
7600 void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
7601 gint num_books, gint num_pages, GtkCTreeNode *parent)
7606 GtkCTreeNode *sibling;
7607 CTreePixmaps *pixmaps;
7614 pixmaps = get_ctree_pixmaps (ctree);
7616 for (i = num_pages + num_books; i > num_books; i--)
7619 sprintf (buf1, "Page %02d", (gint) rand() % 100);
7620 sprintf (buf2, "Item %d-%d", cur_depth, i);
7621 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
7622 pixmaps->pixmap3, pixmaps->mask3, NULL, NULL,
7625 if (parent && ctree->line_style == GTK_CTREE_LINES_TABBED)
7626 gtk_ctree_node_set_row_style (ctree, sibling,
7627 GTK_CTREE_ROW (parent)->row.style);
7630 if (cur_depth == depth)
7633 for (i = num_books; i > 0; i--)
7638 sprintf (buf1, "Book %02d", (gint) rand() % 100);
7639 sprintf (buf2, "Item %d-%d", cur_depth, i);
7640 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
7641 pixmaps->pixmap1, pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2,
7644 style = gtk_style_new ();
7645 switch (cur_depth % 3)
7648 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
7649 style->base[GTK_STATE_NORMAL].green = 0;
7650 style->base[GTK_STATE_NORMAL].blue = 65535 - ((i * 10000) % 65535);
7653 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
7654 style->base[GTK_STATE_NORMAL].green = 65535 - ((i * 10000) % 65535);
7655 style->base[GTK_STATE_NORMAL].blue = 0;
7658 style->base[GTK_STATE_NORMAL].red = 65535 - ((i * 10000) % 65535);
7659 style->base[GTK_STATE_NORMAL].green = 0;
7660 style->base[GTK_STATE_NORMAL].blue = 10000 * (cur_depth % 6);
7663 gtk_ctree_node_set_row_data_full (ctree, sibling, style,
7664 (GDestroyNotify) g_object_unref);
7666 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
7667 gtk_ctree_node_set_row_style (ctree, sibling, style);
7669 build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages,
7674 void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
7677 gchar label1[] = "Root";
7678 gchar label2[] = "";
7679 GtkCTreeNode *parent;
7682 CTreePixmaps *pixmaps;
7684 pixmaps = get_ctree_pixmaps (ctree);
7689 d = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7690 b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7691 p = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin3));
7693 n = ((pow (b, d) - 1) / (b - 1)) * (p + 1);
7697 g_print ("%d total items? Try less\n",n);
7701 gtk_clist_freeze (GTK_CLIST (ctree));
7702 gtk_clist_clear (GTK_CLIST (ctree));
7707 parent = gtk_ctree_insert_node (ctree, NULL, NULL, text, 5, pixmaps->pixmap1,
7708 pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2, FALSE, TRUE);
7710 style = gtk_style_new ();
7711 style->base[GTK_STATE_NORMAL].red = 0;
7712 style->base[GTK_STATE_NORMAL].green = 45000;
7713 style->base[GTK_STATE_NORMAL].blue = 55000;
7714 gtk_ctree_node_set_row_data_full (ctree, parent, style,
7715 (GDestroyNotify) g_object_unref);
7717 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
7718 gtk_ctree_node_set_row_style (ctree, parent, style);
7720 build_recursive (ctree, 1, d, b, p, parent);
7721 gtk_clist_thaw (GTK_CLIST (ctree));
7722 after_press (ctree, NULL);
7726 ctree_click_column (GtkCTree *ctree, gint column, gpointer data)
7730 clist = GTK_CLIST (ctree);
7732 if (column == clist->sort_column)
7734 if (clist->sort_type == GTK_SORT_ASCENDING)
7735 clist->sort_type = GTK_SORT_DESCENDING;
7737 clist->sort_type = GTK_SORT_ASCENDING;
7740 gtk_clist_set_sort_column (clist, column);
7742 gtk_ctree_sort_recursive (ctree, NULL);
7745 void create_ctree (GtkWidget *widget)
7747 static GtkWidget *window = NULL;
7748 GtkTooltips *tooltips;
7750 GtkWidget *scrolled_win;
7763 char *title[] = { "Tree" , "Info" };
7766 static gchar *items1[] =
7774 static gchar *items2[] =
7782 static gchar *items3[] =
7790 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7791 gtk_window_set_screen (GTK_WINDOW (window),
7792 gtk_widget_get_screen (widget));
7794 g_signal_connect (window, "destroy",
7795 G_CALLBACK (gtk_widget_destroyed),
7798 gtk_window_set_title (GTK_WINDOW (window), "GtkCTree");
7799 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7801 tooltips = gtk_tooltips_new ();
7802 g_object_ref (tooltips);
7803 gtk_object_sink (GTK_OBJECT (tooltips));
7805 g_object_set_data_full (G_OBJECT (window), "tooltips", tooltips,
7808 vbox = gtk_vbox_new (FALSE, 0);
7809 gtk_container_add (GTK_CONTAINER (window), vbox);
7811 hbox = gtk_hbox_new (FALSE, 5);
7812 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
7813 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
7815 label = gtk_label_new ("Depth :");
7816 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7818 adj = (GtkAdjustment *) gtk_adjustment_new (4, 1, 10, 1, 5, 0);
7819 spin1 = gtk_spin_button_new (adj, 0, 0);
7820 gtk_box_pack_start (GTK_BOX (hbox), spin1, FALSE, TRUE, 5);
7822 label = gtk_label_new ("Books :");
7823 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7825 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
7826 spin2 = gtk_spin_button_new (adj, 0, 0);
7827 gtk_box_pack_start (GTK_BOX (hbox), spin2, FALSE, TRUE, 5);
7829 label = gtk_label_new ("Pages :");
7830 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7832 adj = (GtkAdjustment *) gtk_adjustment_new (5, 1, 20, 1, 5, 0);
7833 spin3 = gtk_spin_button_new (adj, 0, 0);
7834 gtk_box_pack_start (GTK_BOX (hbox), spin3, FALSE, TRUE, 5);
7836 button = gtk_button_new_with_label ("Close");
7837 gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7839 g_signal_connect_swapped (button, "clicked",
7840 G_CALLBACK (gtk_widget_destroy),
7843 button = gtk_button_new_with_label ("Rebuild Tree");
7844 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7846 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
7847 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
7848 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
7849 GTK_POLICY_AUTOMATIC,
7851 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
7853 ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
7854 gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (ctree));
7856 gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
7857 gtk_clist_set_column_width (GTK_CLIST (ctree), 1, 200);
7858 gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_EXTENDED);
7859 gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
7860 line_style = GTK_CTREE_LINES_DOTTED;
7862 g_signal_connect (button, "clicked",
7863 G_CALLBACK (rebuild_tree), ctree);
7864 g_signal_connect (ctree, "click_column",
7865 G_CALLBACK (ctree_click_column), NULL);
7867 g_signal_connect_after (ctree, "button_press_event",
7868 G_CALLBACK (after_press), NULL);
7869 g_signal_connect_after (ctree, "button_release_event",
7870 G_CALLBACK (after_press), NULL);
7871 g_signal_connect_after (ctree, "tree_move",
7872 G_CALLBACK (after_move), NULL);
7873 g_signal_connect_after (ctree, "end_selection",
7874 G_CALLBACK (after_press), NULL);
7875 g_signal_connect_after (ctree, "toggle_focus_row",
7876 G_CALLBACK (after_press), NULL);
7877 g_signal_connect_after (ctree, "select_all",
7878 G_CALLBACK (after_press), NULL);
7879 g_signal_connect_after (ctree, "unselect_all",
7880 G_CALLBACK (after_press), NULL);
7881 g_signal_connect_after (ctree, "scroll_vertical",
7882 G_CALLBACK (after_press), NULL);
7884 bbox = gtk_hbox_new (FALSE, 5);
7885 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
7886 gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, TRUE, 0);
7888 mbox = gtk_vbox_new (TRUE, 5);
7889 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7891 label = gtk_label_new ("Row Height :");
7892 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7894 label = gtk_label_new ("Indent :");
7895 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7897 label = gtk_label_new ("Spacing :");
7898 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7900 mbox = gtk_vbox_new (TRUE, 5);
7901 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7903 adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0);
7904 spinner = gtk_spin_button_new (adj, 0, 0);
7905 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7906 gtk_tooltips_set_tip (tooltips, spinner,
7907 "Row height of list items", NULL);
7908 g_signal_connect (adj, "value_changed",
7909 G_CALLBACK (change_row_height), ctree);
7910 gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value);
7912 adj = (GtkAdjustment *) gtk_adjustment_new (20, 0, 60, 1, 10, 0);
7913 spinner = gtk_spin_button_new (adj, 0, 0);
7914 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7915 gtk_tooltips_set_tip (tooltips, spinner, "Tree Indentation.", NULL);
7916 g_signal_connect (adj, "value_changed",
7917 G_CALLBACK (change_indent), ctree);
7919 adj = (GtkAdjustment *) gtk_adjustment_new (5, 0, 60, 1, 10, 0);
7920 spinner = gtk_spin_button_new (adj, 0, 0);
7921 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7922 gtk_tooltips_set_tip (tooltips, spinner, "Tree Spacing.", NULL);
7923 g_signal_connect (adj, "value_changed",
7924 G_CALLBACK (change_spacing), ctree);
7926 mbox = gtk_vbox_new (TRUE, 5);
7927 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7929 hbox = gtk_hbox_new (FALSE, 5);
7930 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7932 button = gtk_button_new_with_label ("Expand All");
7933 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7934 g_signal_connect (button, "clicked",
7935 G_CALLBACK (expand_all), ctree);
7937 button = gtk_button_new_with_label ("Collapse All");
7938 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7939 g_signal_connect (button, "clicked",
7940 G_CALLBACK (collapse_all), ctree);
7942 button = gtk_button_new_with_label ("Change Style");
7943 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7944 g_signal_connect (button, "clicked",
7945 G_CALLBACK (change_style), ctree);
7947 button = gtk_button_new_with_label ("Export Tree");
7948 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7949 g_signal_connect (button, "clicked",
7950 G_CALLBACK (export_ctree), ctree);
7952 hbox = gtk_hbox_new (FALSE, 5);
7953 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7955 button = gtk_button_new_with_label ("Select All");
7956 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7957 g_signal_connect (button, "clicked",
7958 G_CALLBACK (select_all), ctree);
7960 button = gtk_button_new_with_label ("Unselect All");
7961 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7962 g_signal_connect (button, "clicked",
7963 G_CALLBACK (unselect_all), ctree);
7965 button = gtk_button_new_with_label ("Remove Selection");
7966 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7967 g_signal_connect (button, "clicked",
7968 G_CALLBACK (remove_selection), ctree);
7970 check = gtk_check_button_new_with_label ("Reorderable");
7971 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
7972 gtk_tooltips_set_tip (tooltips, check,
7973 "Tree items can be reordered by dragging.", NULL);
7974 g_signal_connect (check, "clicked",
7975 G_CALLBACK (toggle_reorderable), ctree);
7976 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
7978 hbox = gtk_hbox_new (TRUE, 5);
7979 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7981 omenu1 = build_option_menu (items1, 4, 2,
7982 ctree_toggle_line_style,
7984 gtk_box_pack_start (GTK_BOX (hbox), omenu1, FALSE, TRUE, 0);
7985 gtk_tooltips_set_tip (tooltips, omenu1, "The tree's line style.", NULL);
7987 omenu2 = build_option_menu (items2, 4, 1,
7988 ctree_toggle_expander_style,
7990 gtk_box_pack_start (GTK_BOX (hbox), omenu2, FALSE, TRUE, 0);
7991 gtk_tooltips_set_tip (tooltips, omenu2, "The tree's expander style.",
7994 omenu3 = build_option_menu (items3, 2, 0,
7995 ctree_toggle_justify, ctree);
7996 gtk_box_pack_start (GTK_BOX (hbox), omenu3, FALSE, TRUE, 0);
7997 gtk_tooltips_set_tip (tooltips, omenu3, "The tree's justification.",
8000 omenu4 = build_option_menu (selection_mode_items, 3, 3,
8001 ctree_toggle_sel_mode, ctree);
8002 gtk_box_pack_start (GTK_BOX (hbox), omenu4, FALSE, TRUE, 0);
8003 gtk_tooltips_set_tip (tooltips, omenu4, "The list's selection mode.",
8006 gtk_widget_realize (window);
8008 gtk_widget_set_size_request (GTK_WIDGET (ctree), -1, 300);
8010 frame = gtk_frame_new (NULL);
8011 gtk_container_set_border_width (GTK_CONTAINER (frame), 0);
8012 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
8013 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8015 hbox = gtk_hbox_new (TRUE, 2);
8016 gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
8017 gtk_container_add (GTK_CONTAINER (frame), hbox);
8019 frame = gtk_frame_new (NULL);
8020 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
8021 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
8023 hbox2 = gtk_hbox_new (FALSE, 0);
8024 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
8025 gtk_container_add (GTK_CONTAINER (frame), hbox2);
8027 label = gtk_label_new ("Books :");
8028 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
8030 sprintf (buf, "%d", books);
8031 book_label = gtk_label_new (buf);
8032 gtk_box_pack_end (GTK_BOX (hbox2), book_label, FALSE, TRUE, 5);
8034 frame = gtk_frame_new (NULL);
8035 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
8036 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
8038 hbox2 = gtk_hbox_new (FALSE, 0);
8039 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
8040 gtk_container_add (GTK_CONTAINER (frame), hbox2);
8042 label = gtk_label_new ("Pages :");
8043 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
8045 sprintf (buf, "%d", pages);
8046 page_label = gtk_label_new (buf);
8047 gtk_box_pack_end (GTK_BOX (hbox2), page_label, FALSE, TRUE, 5);
8049 frame = gtk_frame_new (NULL);
8050 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
8051 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
8053 hbox2 = gtk_hbox_new (FALSE, 0);
8054 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
8055 gtk_container_add (GTK_CONTAINER (frame), hbox2);
8057 label = gtk_label_new ("Selected :");
8058 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
8060 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
8061 sel_label = gtk_label_new (buf);
8062 gtk_box_pack_end (GTK_BOX (hbox2), sel_label, FALSE, TRUE, 5);
8064 frame = gtk_frame_new (NULL);
8065 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
8066 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
8068 hbox2 = gtk_hbox_new (FALSE, 0);
8069 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
8070 gtk_container_add (GTK_CONTAINER (frame), hbox2);
8072 label = gtk_label_new ("Visible :");
8073 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
8075 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
8076 vis_label = gtk_label_new (buf);
8077 gtk_box_pack_end (GTK_BOX (hbox2), vis_label, FALSE, TRUE, 5);
8079 rebuild_tree (NULL, ctree);
8082 if (!GTK_WIDGET_VISIBLE (window))
8083 gtk_widget_show_all (window);
8085 gtk_widget_destroy (window);
8093 color_selection_ok (GtkWidget *w,
8094 GtkColorSelectionDialog *cs)
8096 GtkColorSelection *colorsel;
8099 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
8101 gtk_color_selection_get_color(colorsel,color);
8102 gtk_color_selection_set_color(colorsel,color);
8106 color_selection_changed (GtkWidget *w,
8107 GtkColorSelectionDialog *cs)
8109 GtkColorSelection *colorsel;
8112 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
8113 gtk_color_selection_get_color(colorsel,color);
8118 opacity_toggled_cb (GtkWidget *w,
8119 GtkColorSelectionDialog *cs)
8121 GtkColorSelection *colorsel;
8123 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
8124 gtk_color_selection_set_has_opacity_control (colorsel,
8125 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
8129 palette_toggled_cb (GtkWidget *w,
8130 GtkColorSelectionDialog *cs)
8132 GtkColorSelection *colorsel;
8134 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
8135 gtk_color_selection_set_has_palette (colorsel,
8136 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
8141 create_color_selection (GtkWidget *widget)
8143 static GtkWidget *window = NULL;
8151 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8152 gtk_window_set_screen (GTK_WINDOW (window),
8153 gtk_widget_get_screen (widget));
8155 g_signal_connect (window, "destroy",
8156 G_CALLBACK (gtk_widget_destroyed),
8159 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
8160 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8162 hbox = gtk_hbox_new (FALSE, 8);
8163 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
8164 gtk_container_add (GTK_CONTAINER (window), hbox);
8166 label = gtk_label_new ("Pick a color");
8167 gtk_container_add (GTK_CONTAINER (hbox), label);
8169 picker = gtk_color_button_new ();
8170 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
8171 gtk_container_add (GTK_CONTAINER (hbox), picker);
8174 if (!GTK_WIDGET_VISIBLE (window))
8175 gtk_widget_show_all (window);
8177 gtk_widget_destroy (window);
8185 show_fileops (GtkWidget *widget,
8186 GtkFileSelection *fs)
8190 show_ops = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8193 gtk_file_selection_show_fileop_buttons (fs);
8195 gtk_file_selection_hide_fileop_buttons (fs);
8199 select_multiple (GtkWidget *widget,
8200 GtkFileSelection *fs)
8202 gboolean select_multiple;
8204 select_multiple = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8205 gtk_file_selection_set_select_multiple (fs, select_multiple);
8209 file_selection_ok (GtkFileSelection *fs)
8214 selections = gtk_file_selection_get_selections (fs);
8216 for (i = 0; selections[i] != NULL; i++)
8217 g_print ("%s\n", selections[i]);
8219 g_strfreev (selections);
8221 gtk_widget_destroy (GTK_WIDGET (fs));
8225 create_file_selection (GtkWidget *widget)
8227 static GtkWidget *window = NULL;
8232 window = gtk_file_selection_new ("file selection dialog");
8233 gtk_window_set_screen (GTK_WINDOW (window),
8234 gtk_widget_get_screen (widget));
8236 gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window));
8238 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
8240 g_signal_connect (window, "destroy",
8241 G_CALLBACK (gtk_widget_destroyed),
8244 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->ok_button,
8246 G_CALLBACK (file_selection_ok),
8248 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->cancel_button,
8250 G_CALLBACK (gtk_widget_destroy),
8253 button = gtk_check_button_new_with_label ("Show Fileops");
8254 g_signal_connect (button, "toggled",
8255 G_CALLBACK (show_fileops),
8257 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
8258 button, FALSE, FALSE, 0);
8259 gtk_widget_show (button);
8261 button = gtk_check_button_new_with_label ("Select Multiple");
8262 g_signal_connect (button, "clicked",
8263 G_CALLBACK (select_multiple),
8265 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
8266 button, FALSE, FALSE, 0);
8267 gtk_widget_show (button);
8270 if (!GTK_WIDGET_VISIBLE (window))
8271 gtk_widget_show (window);
8273 gtk_widget_destroy (window);
8277 flipping_toggled_cb (GtkWidget *widget, gpointer data)
8279 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8280 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
8282 gtk_widget_set_default_direction (new_direction);
8286 orientable_toggle_orientation (GtkOrientable *orientable)
8288 GtkOrientation orientation;
8290 orientation = gtk_orientable_get_orientation (orientable);
8291 gtk_orientable_set_orientation (orientable,
8292 orientation == GTK_ORIENTATION_HORIZONTAL ?
8293 GTK_ORIENTATION_VERTICAL :
8294 GTK_ORIENTATION_HORIZONTAL);
8296 if (GTK_IS_CONTAINER (orientable))
8301 children = gtk_container_get_children (GTK_CONTAINER (orientable));
8303 for (child = children; child; child = child->next)
8305 if (GTK_IS_ORIENTABLE (child->data))
8306 orientable_toggle_orientation (child->data);
8309 g_list_free (children);
8314 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
8316 orientable_toggle_orientation (GTK_ORIENTABLE (GTK_DIALOG (gtk_widget_get_toplevel (widget))->vbox));
8320 set_direction_recurse (GtkWidget *widget,
8323 GtkTextDirection *dir = data;
8325 gtk_widget_set_direction (widget, *dir);
8326 if (GTK_IS_CONTAINER (widget))
8327 gtk_container_foreach (GTK_CONTAINER (widget),
8328 set_direction_recurse,
8333 create_forward_back (const char *title,
8334 GtkTextDirection text_dir)
8336 GtkWidget *frame = gtk_frame_new (title);
8337 GtkWidget *bbox = gtk_hbutton_box_new ();
8338 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
8339 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
8341 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
8343 gtk_container_add (GTK_CONTAINER (frame), bbox);
8344 gtk_container_add (GTK_CONTAINER (bbox), back_button);
8345 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
8347 set_direction_recurse (frame, &text_dir);
8353 create_flipping (GtkWidget *widget)
8355 static GtkWidget *window = NULL;
8356 GtkWidget *check_button, *button;
8360 window = gtk_dialog_new ();
8362 gtk_window_set_screen (GTK_WINDOW (window),
8363 gtk_widget_get_screen (widget));
8365 g_signal_connect (window, "destroy",
8366 G_CALLBACK (gtk_widget_destroyed),
8369 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
8371 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
8372 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
8373 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8374 check_button, TRUE, TRUE, 0);
8376 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
8377 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
8379 g_signal_connect (check_button, "toggled",
8380 G_CALLBACK (flipping_toggled_cb), NULL);
8382 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
8383 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
8384 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8385 check_button, TRUE, TRUE, 0);
8387 g_signal_connect (check_button, "toggled",
8388 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
8390 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8391 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
8394 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8395 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
8398 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8399 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
8402 button = gtk_button_new_with_label ("Close");
8403 g_signal_connect_swapped (button, "clicked",
8404 G_CALLBACK (gtk_widget_destroy), window);
8405 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
8406 button, TRUE, TRUE, 0);
8409 if (!GTK_WIDGET_VISIBLE (window))
8410 gtk_widget_show_all (window);
8412 gtk_widget_destroy (window);
8420 make_focus_table (GList **list)
8425 table = gtk_table_new (5, 5, FALSE);
8438 widget = gtk_entry_new ();
8440 widget = gtk_button_new_with_label ("Foo");
8442 *list = g_list_prepend (*list, widget);
8444 gtk_table_attach (GTK_TABLE (table),
8448 GTK_EXPAND | GTK_FILL,
8449 GTK_EXPAND | GTK_FILL,
8458 *list = g_list_reverse (*list);
8464 create_focus (GtkWidget *widget)
8466 static GtkWidget *window = NULL;
8474 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
8480 gtk_window_set_screen (GTK_WINDOW (window),
8481 gtk_widget_get_screen (widget));
8483 g_signal_connect (window, "destroy",
8484 G_CALLBACK (gtk_widget_destroyed),
8487 g_signal_connect (window, "response",
8488 G_CALLBACK (gtk_widget_destroy),
8491 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
8493 frame = gtk_frame_new ("Weird tab focus chain");
8495 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8496 frame, TRUE, TRUE, 0);
8498 table = make_focus_table (&list);
8500 gtk_container_add (GTK_CONTAINER (frame), table);
8502 gtk_container_set_focus_chain (GTK_CONTAINER (table),
8507 frame = gtk_frame_new ("Default tab focus chain");
8509 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8510 frame, TRUE, TRUE, 0);
8513 table = make_focus_table (&list);
8517 gtk_container_add (GTK_CONTAINER (frame), table);
8520 if (!GTK_WIDGET_VISIBLE (window))
8521 gtk_widget_show_all (window);
8523 gtk_widget_destroy (window);
8531 font_selection_ok (GtkWidget *w,
8532 GtkFontSelectionDialog *fs)
8534 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
8536 g_print ("%s\n", s);
8538 gtk_widget_destroy (GTK_WIDGET (fs));
8542 create_font_selection (GtkWidget *widget)
8544 static GtkWidget *window = NULL;
8552 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8553 gtk_window_set_screen (GTK_WINDOW (window),
8554 gtk_widget_get_screen (widget));
8556 g_signal_connect (window, "destroy",
8557 G_CALLBACK (gtk_widget_destroyed),
8560 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
8561 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8563 hbox = gtk_hbox_new (FALSE, 8);
8564 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
8565 gtk_container_add (GTK_CONTAINER (window), hbox);
8567 label = gtk_label_new ("Pick a font");
8568 gtk_container_add (GTK_CONTAINER (hbox), label);
8570 picker = gtk_font_button_new ();
8571 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
8572 gtk_container_add (GTK_CONTAINER (hbox), picker);
8575 if (!GTK_WIDGET_VISIBLE (window))
8576 gtk_widget_show_all (window);
8578 gtk_widget_destroy (window);
8585 static GtkWidget *dialog_window = NULL;
8588 label_toggle (GtkWidget *widget,
8593 *label = gtk_label_new ("Dialog Test");
8594 g_signal_connect (*label,
8596 G_CALLBACK (gtk_widget_destroyed),
8598 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
8599 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
8600 *label, TRUE, TRUE, 0);
8601 gtk_widget_show (*label);
8604 gtk_widget_destroy (*label);
8607 #define RESPONSE_TOGGLE_SEPARATOR 1
8610 print_response (GtkWidget *dialog,
8614 g_print ("response signal received (%d)\n", response_id);
8616 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
8618 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
8619 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
8624 create_dialog (GtkWidget *widget)
8626 static GtkWidget *label;
8631 /* This is a terrible example; it's much simpler to create
8632 * dialogs than this. Don't use testgtk for example code,
8636 dialog_window = gtk_dialog_new ();
8637 gtk_window_set_screen (GTK_WINDOW (dialog_window),
8638 gtk_widget_get_screen (widget));
8640 g_signal_connect (dialog_window,
8642 G_CALLBACK (print_response),
8645 g_signal_connect (dialog_window, "destroy",
8646 G_CALLBACK (gtk_widget_destroyed),
8649 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
8650 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
8652 button = gtk_button_new_with_label ("OK");
8653 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8654 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8655 button, TRUE, TRUE, 0);
8656 gtk_widget_grab_default (button);
8657 gtk_widget_show (button);
8659 button = gtk_button_new_with_label ("Toggle");
8660 g_signal_connect (button, "clicked",
8661 G_CALLBACK (label_toggle),
8663 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8664 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8665 button, TRUE, TRUE, 0);
8666 gtk_widget_show (button);
8670 button = gtk_button_new_with_label ("Separator");
8672 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8674 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
8676 RESPONSE_TOGGLE_SEPARATOR);
8677 gtk_widget_show (button);
8680 if (!GTK_WIDGET_VISIBLE (dialog_window))
8681 gtk_widget_show (dialog_window);
8683 gtk_widget_destroy (dialog_window);
8686 /* Display & Screen test
8692 GtkWidget *radio_dpy;
8693 GtkWidget *toplevel;
8694 GtkWidget *dialog_window;
8695 GList *valid_display_list;
8696 } ScreenDisplaySelection;
8699 display_name_cmp (gconstpointer a,
8702 return g_ascii_strcasecmp (a,b);
8706 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
8709 GdkDisplay *display = gtk_widget_get_display (widget);
8711 GdkScreen *new_screen = NULL;
8712 GdkScreen *current_screen = gtk_widget_get_screen (widget);
8714 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
8716 display_name = g_strdup (gtk_entry_get_text (data->entry));
8717 display = gdk_display_open (display_name);
8721 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
8722 GTK_DIALOG_DESTROY_WITH_PARENT,
8725 "The display :\n%s\ncannot be opened",
8727 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
8728 gtk_widget_show (dialog);
8729 g_signal_connect (dialog, "response",
8730 G_CALLBACK (gtk_widget_destroy),
8735 if (!g_list_find_custom (data->valid_display_list,
8738 data->valid_display_list = g_list_append (data->valid_display_list,
8741 new_screen = gdk_display_get_default_screen (display);
8746 gint number_of_screens = gdk_display_get_n_screens (display);
8747 gint screen_num = gdk_screen_get_number (current_screen);
8748 if ((screen_num +1) < number_of_screens)
8749 new_screen = gdk_display_get_screen (display, screen_num + 1);
8751 new_screen = gdk_display_get_screen (display, 0);
8756 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
8757 gtk_widget_destroy (data->dialog_window);
8762 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
8764 gtk_widget_destroy (data);
8768 create_display_screen (GtkWidget *widget)
8770 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
8771 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
8773 ScreenDisplaySelection *scr_dpy_data;
8774 GdkScreen *screen = gtk_widget_get_screen (widget);
8775 static GList *valid_display_list = NULL;
8777 GdkDisplay *display = gdk_screen_get_display (screen);
8779 window = g_object_new (gtk_window_get_type (),
8782 "type", GTK_WINDOW_TOPLEVEL,
8784 "Screen or Display selection",
8785 "border_width", 10, NULL);
8786 g_signal_connect (window, "destroy",
8787 G_CALLBACK (gtk_widget_destroy), NULL);
8789 vbox = gtk_vbox_new (FALSE, 3);
8790 gtk_container_add (GTK_CONTAINER (window), vbox);
8792 frame = gtk_frame_new ("Select screen or display");
8793 gtk_container_add (GTK_CONTAINER (vbox), frame);
8795 table = gtk_table_new (2, 2, TRUE);
8796 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
8797 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
8799 gtk_container_add (GTK_CONTAINER (frame), table);
8801 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
8802 if (gdk_display_get_n_screens(display) > 1)
8803 radio_scr = gtk_radio_button_new_with_label
8804 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
8807 radio_scr = gtk_radio_button_new_with_label
8808 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
8809 "only one screen on the current display");
8810 gtk_widget_set_sensitive (radio_scr, FALSE);
8812 combo_dpy = gtk_combo_new ();
8813 if (!valid_display_list)
8814 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
8816 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
8818 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
8819 "<hostname>:<X Server Num>.<Screen Num>");
8821 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
8822 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
8823 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
8825 bbox = gtk_hbutton_box_new ();
8826 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
8827 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
8829 gtk_container_add (GTK_CONTAINER (vbox), bbox);
8831 gtk_container_add (GTK_CONTAINER (bbox), applyb);
8832 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
8834 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
8836 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
8837 scr_dpy_data->radio_dpy = radio_dpy;
8838 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
8839 scr_dpy_data->dialog_window = window;
8840 scr_dpy_data->valid_display_list = valid_display_list;
8842 g_signal_connect (cancelb, "clicked",
8843 G_CALLBACK (screen_display_destroy_diag), window);
8844 g_signal_connect (applyb, "clicked",
8845 G_CALLBACK (screen_display_check), scr_dpy_data);
8846 gtk_widget_show_all (window);
8851 static gboolean event_watcher_enter_id = 0;
8852 static gboolean event_watcher_leave_id = 0;
8855 event_watcher (GSignalInvocationHint *ihint,
8856 guint n_param_values,
8857 const GValue *param_values,
8860 g_print ("Watch: \"%s\" emitted for %s\n",
8861 g_signal_name (ihint->signal_id),
8862 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
8868 event_watcher_down (void)
8870 if (event_watcher_enter_id)
8874 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
8875 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
8876 event_watcher_enter_id = 0;
8877 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
8878 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
8879 event_watcher_leave_id = 0;
8884 event_watcher_toggle (void)
8886 if (event_watcher_enter_id)
8887 event_watcher_down ();
8892 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
8893 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8894 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
8895 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8900 create_event_watcher (GtkWidget *widget)
8906 dialog_window = gtk_dialog_new ();
8907 gtk_window_set_screen (GTK_WINDOW (dialog_window),
8908 gtk_widget_get_screen (widget));
8910 g_signal_connect (dialog_window, "destroy",
8911 G_CALLBACK (gtk_widget_destroyed),
8913 g_signal_connect (dialog_window, "destroy",
8914 G_CALLBACK (event_watcher_down),
8917 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
8918 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
8919 gtk_widget_set_size_request (dialog_window, 200, 110);
8921 button = gtk_toggle_button_new_with_label ("Activate Watch");
8922 g_signal_connect (button, "clicked",
8923 G_CALLBACK (event_watcher_toggle),
8925 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
8926 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
8927 button, TRUE, TRUE, 0);
8928 gtk_widget_show (button);
8930 button = gtk_button_new_with_label ("Close");
8931 g_signal_connect_swapped (button, "clicked",
8932 G_CALLBACK (gtk_widget_destroy),
8934 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8935 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8936 button, TRUE, TRUE, 0);
8937 gtk_widget_grab_default (button);
8938 gtk_widget_show (button);
8941 if (!GTK_WIDGET_VISIBLE (dialog_window))
8942 gtk_widget_show (dialog_window);
8944 gtk_widget_destroy (dialog_window);
8952 reformat_value (GtkScale *scale,
8955 return g_strdup_printf ("-->%0.*g<--",
8956 gtk_scale_get_digits (scale), value);
8960 create_range_controls (GtkWidget *widget)
8962 static GtkWidget *window = NULL;
8966 GtkWidget *scrollbar;
8968 GtkWidget *separator;
8969 GtkObject *adjustment;
8974 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8976 gtk_window_set_screen (GTK_WINDOW (window),
8977 gtk_widget_get_screen (widget));
8979 g_signal_connect (window, "destroy",
8980 G_CALLBACK (gtk_widget_destroyed),
8983 gtk_window_set_title (GTK_WINDOW (window), "range controls");
8984 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8987 box1 = gtk_vbox_new (FALSE, 0);
8988 gtk_container_add (GTK_CONTAINER (window), box1);
8989 gtk_widget_show (box1);
8992 box2 = gtk_vbox_new (FALSE, 10);
8993 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8994 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
8995 gtk_widget_show (box2);
8998 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
9000 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
9001 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
9002 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
9003 gtk_scale_set_digits (GTK_SCALE (scale), 1);
9004 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
9005 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
9006 gtk_widget_show (scale);
9008 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
9009 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
9010 GTK_UPDATE_CONTINUOUS);
9011 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
9012 gtk_widget_show (scrollbar);
9014 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
9015 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
9016 g_signal_connect (scale,
9018 G_CALLBACK (reformat_value),
9020 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
9021 gtk_widget_show (scale);
9023 hbox = gtk_hbox_new (FALSE, 0);
9025 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
9026 gtk_widget_set_size_request (scale, -1, 200);
9027 gtk_scale_set_digits (GTK_SCALE (scale), 2);
9028 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
9029 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
9030 gtk_widget_show (scale);
9032 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
9033 gtk_widget_set_size_request (scale, -1, 200);
9034 gtk_scale_set_digits (GTK_SCALE (scale), 2);
9035 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
9036 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
9037 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
9038 gtk_widget_show (scale);
9040 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
9041 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
9042 g_signal_connect (scale,
9044 G_CALLBACK (reformat_value),
9046 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
9047 gtk_widget_show (scale);
9050 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
9051 gtk_widget_show (hbox);
9053 separator = gtk_hseparator_new ();
9054 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9055 gtk_widget_show (separator);
9058 box2 = gtk_vbox_new (FALSE, 10);
9059 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9060 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9061 gtk_widget_show (box2);
9064 button = gtk_button_new_with_label ("close");
9065 g_signal_connect_swapped (button, "clicked",
9066 G_CALLBACK (gtk_widget_destroy),
9068 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9069 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9070 gtk_widget_grab_default (button);
9071 gtk_widget_show (button);
9074 if (!GTK_WIDGET_VISIBLE (window))
9075 gtk_widget_show (window);
9077 gtk_widget_destroy (window);
9085 create_rulers (GtkWidget *widget)
9087 static GtkWidget *window = NULL;
9093 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9095 gtk_window_set_screen (GTK_WINDOW (window),
9096 gtk_widget_get_screen (widget));
9098 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
9100 g_signal_connect (window, "destroy",
9101 G_CALLBACK (gtk_widget_destroyed),
9104 gtk_window_set_title (GTK_WINDOW (window), "rulers");
9105 gtk_widget_set_size_request (window, 300, 300);
9106 gtk_widget_set_events (window,
9107 GDK_POINTER_MOTION_MASK
9108 | GDK_POINTER_MOTION_HINT_MASK);
9109 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9111 table = gtk_table_new (2, 2, FALSE);
9112 gtk_container_add (GTK_CONTAINER (window), table);
9113 gtk_widget_show (table);
9115 ruler = gtk_hruler_new ();
9116 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
9117 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
9119 g_signal_connect_swapped (window,
9120 "motion_notify_event",
9121 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
9124 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
9125 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
9126 gtk_widget_show (ruler);
9129 ruler = gtk_vruler_new ();
9130 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
9132 g_signal_connect_swapped (window,
9133 "motion_notify_event",
9134 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
9137 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
9138 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
9139 gtk_widget_show (ruler);
9142 if (!GTK_WIDGET_VISIBLE (window))
9143 gtk_widget_show (window);
9145 gtk_widget_destroy (window);
9149 text_toggle_editable (GtkWidget *checkbutton,
9152 gtk_text_set_editable(GTK_TEXT(text),
9153 GTK_TOGGLE_BUTTON(checkbutton)->active);
9157 text_toggle_word_wrap (GtkWidget *checkbutton,
9160 gtk_text_set_word_wrap(GTK_TEXT(text),
9161 GTK_TOGGLE_BUTTON(checkbutton)->active);
9168 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
9169 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
9170 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
9171 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
9172 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
9173 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
9174 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
9175 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
9178 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
9184 text_insert_random (GtkWidget *w, GtkText *text)
9188 for (i=0; i<10; i++)
9190 c = 'A' + rand() % ('Z' - 'A');
9191 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
9192 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
9197 create_text (GtkWidget *widget)
9201 static GtkWidget *window = NULL;
9207 GtkWidget *separator;
9208 GtkWidget *scrolled_window;
9215 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9216 gtk_window_set_screen (GTK_WINDOW (window),
9217 gtk_widget_get_screen (widget));
9219 gtk_widget_set_name (window, "text window");
9220 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
9221 gtk_widget_set_size_request (window, 500, 500);
9223 g_signal_connect (window, "destroy",
9224 G_CALLBACK (gtk_widget_destroyed),
9227 gtk_window_set_title (GTK_WINDOW (window), "test");
9228 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9231 box1 = gtk_vbox_new (FALSE, 0);
9232 gtk_container_add (GTK_CONTAINER (window), box1);
9233 gtk_widget_show (box1);
9236 box2 = gtk_vbox_new (FALSE, 10);
9237 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9238 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
9239 gtk_widget_show (box2);
9242 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
9243 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
9244 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
9247 gtk_widget_show (scrolled_window);
9249 text = gtk_text_new (NULL, NULL);
9250 gtk_text_set_editable (GTK_TEXT (text), TRUE);
9251 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
9252 gtk_widget_grab_focus (text);
9253 gtk_widget_show (text);
9256 gtk_text_freeze (GTK_TEXT (text));
9258 for (i=0; i<ntext_colors; i++)
9260 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
9261 text_colors[i].name, -1);
9262 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
9264 for (j=0; j<ntext_colors; j++)
9266 gtk_text_insert (GTK_TEXT (text), NULL,
9267 &text_colors[j].color, &text_colors[i].color,
9270 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
9273 infile = fopen("testgtk.c", "r");
9278 int nbytes_read, nbytes_alloc;
9281 nbytes_alloc = 1024;
9282 buffer = g_new (char, nbytes_alloc);
9286 if (nbytes_alloc < nbytes_read + 1024)
9289 buffer = g_realloc (buffer, nbytes_alloc);
9291 len = fread (buffer + nbytes_read, 1, 1024, infile);
9297 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
9298 NULL, buffer, nbytes_read);
9303 gtk_text_thaw (GTK_TEXT (text));
9305 hbox = gtk_hbutton_box_new ();
9306 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
9307 gtk_widget_show (hbox);
9309 check = gtk_check_button_new_with_label("Editable");
9310 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
9311 g_signal_connect (check, "toggled",
9312 G_CALLBACK (text_toggle_editable), text);
9313 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
9314 gtk_widget_show (check);
9316 check = gtk_check_button_new_with_label("Wrap Words");
9317 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
9318 g_signal_connect (check, "toggled",
9319 G_CALLBACK (text_toggle_word_wrap), text);
9320 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
9321 gtk_widget_show (check);
9323 separator = gtk_hseparator_new ();
9324 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9325 gtk_widget_show (separator);
9328 box2 = gtk_vbox_new (FALSE, 10);
9329 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9330 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9331 gtk_widget_show (box2);
9334 button = gtk_button_new_with_label ("insert random");
9335 g_signal_connect (button, "clicked",
9336 G_CALLBACK (text_insert_random),
9338 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9339 gtk_widget_show (button);
9341 button = gtk_button_new_with_label ("close");
9342 g_signal_connect_swapped (button, "clicked",
9343 G_CALLBACK (gtk_widget_destroy),
9345 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9346 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9347 gtk_widget_grab_default (button);
9348 gtk_widget_show (button);
9351 if (!GTK_WIDGET_VISIBLE (window))
9352 gtk_widget_show (window);
9354 gtk_widget_destroy (window);
9361 GdkPixbuf *book_open;
9362 GdkPixbuf *book_closed;
9363 GtkWidget *sample_notebook;
9366 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
9368 GtkWidget *page_widget;
9371 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
9373 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
9374 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
9376 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
9377 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
9381 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
9383 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
9384 gint old_page_num = gtk_notebook_get_current_page (notebook);
9386 if (page_num == old_page_num)
9389 set_page_image (notebook, page_num, book_open);
9391 if (old_page_num != -1)
9392 set_page_image (notebook, old_page_num, book_closed);
9396 tab_fill (GtkToggleButton *button, GtkWidget *child)
9399 GtkPackType pack_type;
9401 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9402 &expand, NULL, &pack_type);
9403 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9404 expand, button->active, pack_type);
9408 tab_expand (GtkToggleButton *button, GtkWidget *child)
9411 GtkPackType pack_type;
9413 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9414 NULL, &fill, &pack_type);
9415 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9416 button->active, fill, pack_type);
9420 tab_pack (GtkToggleButton *button, GtkWidget *child)
9426 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9427 &expand, &fill, NULL);
9428 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9429 expand, fill, button->active);
9433 create_pages (GtkNotebook *notebook, gint start, gint end)
9435 GtkWidget *child = NULL;
9440 GtkWidget *label_box;
9441 GtkWidget *menu_box;
9445 char accel_buffer[32];
9447 for (i = start; i <= end; i++)
9449 sprintf (buffer, "Page %d", i);
9450 sprintf (accel_buffer, "Page _%d", i);
9452 child = gtk_frame_new (buffer);
9453 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
9455 vbox = gtk_vbox_new (TRUE,0);
9456 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9457 gtk_container_add (GTK_CONTAINER (child), vbox);
9459 hbox = gtk_hbox_new (TRUE,0);
9460 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
9462 button = gtk_check_button_new_with_label ("Fill Tab");
9463 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9464 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
9465 g_signal_connect (button, "toggled",
9466 G_CALLBACK (tab_fill), child);
9468 button = gtk_check_button_new_with_label ("Expand Tab");
9469 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9470 g_signal_connect (button, "toggled",
9471 G_CALLBACK (tab_expand), child);
9473 button = gtk_check_button_new_with_label ("Pack end");
9474 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9475 g_signal_connect (button, "toggled",
9476 G_CALLBACK (tab_pack), child);
9478 button = gtk_button_new_with_label ("Hide Page");
9479 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
9480 g_signal_connect_swapped (button, "clicked",
9481 G_CALLBACK (gtk_widget_hide),
9484 gtk_widget_show_all (child);
9486 label_box = gtk_hbox_new (FALSE, 0);
9487 pixwid = gtk_image_new_from_pixbuf (book_closed);
9488 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
9490 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
9491 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
9492 label = gtk_label_new_with_mnemonic (accel_buffer);
9493 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
9494 gtk_widget_show_all (label_box);
9497 menu_box = gtk_hbox_new (FALSE, 0);
9498 pixwid = gtk_image_new_from_pixbuf (book_closed);
9499 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
9501 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
9502 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
9503 label = gtk_label_new (buffer);
9504 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
9505 gtk_widget_show_all (menu_box);
9507 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
9512 rotate_notebook (GtkButton *button,
9513 GtkNotebook *notebook)
9515 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
9519 show_all_pages (GtkButton *button,
9520 GtkNotebook *notebook)
9522 gtk_container_foreach (GTK_CONTAINER (notebook),
9523 (GtkCallback) gtk_widget_show, NULL);
9527 notebook_type_changed (GtkWidget *optionmenu,
9530 GtkNotebook *notebook;
9540 notebook = GTK_NOTEBOOK (data);
9542 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
9547 /* standard notebook */
9548 gtk_notebook_set_show_tabs (notebook, TRUE);
9549 gtk_notebook_set_show_border (notebook, TRUE);
9550 gtk_notebook_set_scrollable (notebook, FALSE);
9554 /* notabs notebook */
9555 gtk_notebook_set_show_tabs (notebook, FALSE);
9556 gtk_notebook_set_show_border (notebook, TRUE);
9561 gtk_notebook_set_show_tabs (notebook, FALSE);
9562 gtk_notebook_set_show_border (notebook, FALSE);
9567 gtk_notebook_set_show_tabs (notebook, TRUE);
9568 gtk_notebook_set_show_border (notebook, TRUE);
9569 gtk_notebook_set_scrollable (notebook, TRUE);
9570 if (g_list_length (notebook->children) == 5)
9571 create_pages (notebook, 6, 15);
9577 if (g_list_length (notebook->children) == 15)
9578 for (i = 0; i < 10; i++)
9579 gtk_notebook_remove_page (notebook, 5);
9583 notebook_popup (GtkToggleButton *button,
9584 GtkNotebook *notebook)
9587 gtk_notebook_popup_enable (notebook);
9589 gtk_notebook_popup_disable (notebook);
9593 notebook_homogeneous (GtkToggleButton *button,
9594 GtkNotebook *notebook)
9596 g_object_set (notebook, "homogeneous", button->active, NULL);
9600 create_notebook (GtkWidget *widget)
9602 static GtkWidget *window = NULL;
9606 GtkWidget *separator;
9610 static gchar *items[] =
9620 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9621 gtk_window_set_screen (GTK_WINDOW (window),
9622 gtk_widget_get_screen (widget));
9624 g_signal_connect (window, "destroy",
9625 G_CALLBACK (gtk_widget_destroyed),
9628 gtk_window_set_title (GTK_WINDOW (window), "notebook");
9629 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9631 box1 = gtk_vbox_new (FALSE, 0);
9632 gtk_container_add (GTK_CONTAINER (window), box1);
9634 sample_notebook = gtk_notebook_new ();
9635 g_signal_connect (sample_notebook, "switch_page",
9636 G_CALLBACK (page_switch), NULL);
9637 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
9638 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
9639 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
9641 gtk_widget_realize (sample_notebook);
9644 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
9647 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
9649 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
9651 separator = gtk_hseparator_new ();
9652 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
9654 box2 = gtk_hbox_new (FALSE, 5);
9655 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9656 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9658 button = gtk_check_button_new_with_label ("popup menu");
9659 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
9660 g_signal_connect (button, "clicked",
9661 G_CALLBACK (notebook_popup),
9664 button = gtk_check_button_new_with_label ("homogeneous tabs");
9665 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
9666 g_signal_connect (button, "clicked",
9667 G_CALLBACK (notebook_homogeneous),
9670 box2 = gtk_hbox_new (FALSE, 5);
9671 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9672 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9674 label = gtk_label_new ("Notebook Style :");
9675 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
9677 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
9678 notebook_type_changed,
9680 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
9682 button = gtk_button_new_with_label ("Show all Pages");
9683 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
9684 g_signal_connect (button, "clicked",
9685 G_CALLBACK (show_all_pages), sample_notebook);
9687 box2 = gtk_hbox_new (TRUE, 10);
9688 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9689 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9691 button = gtk_button_new_with_label ("prev");
9692 g_signal_connect_swapped (button, "clicked",
9693 G_CALLBACK (gtk_notebook_prev_page),
9695 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9697 button = gtk_button_new_with_label ("next");
9698 g_signal_connect_swapped (button, "clicked",
9699 G_CALLBACK (gtk_notebook_next_page),
9701 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9703 button = gtk_button_new_with_label ("rotate");
9704 g_signal_connect (button, "clicked",
9705 G_CALLBACK (rotate_notebook), sample_notebook);
9706 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9708 separator = gtk_hseparator_new ();
9709 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
9711 button = gtk_button_new_with_label ("close");
9712 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
9713 g_signal_connect_swapped (button, "clicked",
9714 G_CALLBACK (gtk_widget_destroy),
9716 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
9717 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9718 gtk_widget_grab_default (button);
9721 if (!GTK_WIDGET_VISIBLE (window))
9722 gtk_widget_show_all (window);
9724 gtk_widget_destroy (window);
9732 toggle_resize (GtkWidget *widget, GtkWidget *child)
9734 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
9735 GValue value = { 0, };
9736 g_value_init (&value, G_TYPE_BOOLEAN);
9737 gtk_container_child_get_property (container, child, "resize", &value);
9738 g_value_set_boolean (&value, !g_value_get_boolean (&value));
9739 gtk_container_child_set_property (container, child, "resize", &value);
9743 toggle_shrink (GtkWidget *widget, GtkWidget *child)
9745 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
9746 GValue value = { 0, };
9747 g_value_init (&value, G_TYPE_BOOLEAN);
9748 gtk_container_child_get_property (container, child, "shrink", &value);
9749 g_value_set_boolean (&value, !g_value_get_boolean (&value));
9750 gtk_container_child_set_property (container, child, "shrink", &value);
9754 paned_props_clicked (GtkWidget *button,
9757 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
9759 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
9763 create_pane_options (GtkPaned *paned,
9764 const gchar *frame_label,
9765 const gchar *label1,
9766 const gchar *label2)
9772 GtkWidget *check_button;
9774 frame = gtk_frame_new (frame_label);
9775 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
9777 table = gtk_table_new (4, 2, 4);
9778 gtk_container_add (GTK_CONTAINER (frame), table);
9780 label = gtk_label_new (label1);
9781 gtk_table_attach_defaults (GTK_TABLE (table), label,
9784 check_button = gtk_check_button_new_with_label ("Resize");
9785 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9787 g_signal_connect (check_button, "toggled",
9788 G_CALLBACK (toggle_resize),
9791 check_button = gtk_check_button_new_with_label ("Shrink");
9792 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9794 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9796 g_signal_connect (check_button, "toggled",
9797 G_CALLBACK (toggle_shrink),
9800 label = gtk_label_new (label2);
9801 gtk_table_attach_defaults (GTK_TABLE (table), label,
9804 check_button = gtk_check_button_new_with_label ("Resize");
9805 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9807 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9809 g_signal_connect (check_button, "toggled",
9810 G_CALLBACK (toggle_resize),
9813 check_button = gtk_check_button_new_with_label ("Shrink");
9814 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9816 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9818 g_signal_connect (check_button, "toggled",
9819 G_CALLBACK (toggle_shrink),
9822 button = gtk_button_new_with_mnemonic ("_Properties");
9823 gtk_table_attach_defaults (GTK_TABLE (table), button,
9825 g_signal_connect (button, "clicked",
9826 G_CALLBACK (paned_props_clicked),
9833 create_panes (GtkWidget *widget)
9835 static GtkWidget *window = NULL;
9844 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9846 gtk_window_set_screen (GTK_WINDOW (window),
9847 gtk_widget_get_screen (widget));
9849 g_signal_connect (window, "destroy",
9850 G_CALLBACK (gtk_widget_destroyed),
9853 gtk_window_set_title (GTK_WINDOW (window), "Panes");
9854 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9856 vbox = gtk_vbox_new (FALSE, 0);
9857 gtk_container_add (GTK_CONTAINER (window), vbox);
9859 vpaned = gtk_vpaned_new ();
9860 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
9861 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
9863 hpaned = gtk_hpaned_new ();
9864 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
9866 frame = gtk_frame_new (NULL);
9867 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9868 gtk_widget_set_size_request (frame, 60, 60);
9869 gtk_paned_add1 (GTK_PANED (hpaned), frame);
9871 button = gtk_button_new_with_label ("Hi there");
9872 gtk_container_add (GTK_CONTAINER(frame), button);
9874 frame = gtk_frame_new (NULL);
9875 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9876 gtk_widget_set_size_request (frame, 80, 60);
9877 gtk_paned_add2 (GTK_PANED (hpaned), frame);
9879 frame = gtk_frame_new (NULL);
9880 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9881 gtk_widget_set_size_request (frame, 60, 80);
9882 gtk_paned_add2 (GTK_PANED (vpaned), frame);
9884 /* Now create toggle buttons to control sizing */
9886 gtk_box_pack_start (GTK_BOX (vbox),
9887 create_pane_options (GTK_PANED (hpaned),
9893 gtk_box_pack_start (GTK_BOX (vbox),
9894 create_pane_options (GTK_PANED (vpaned),
9900 gtk_widget_show_all (vbox);
9903 if (!GTK_WIDGET_VISIBLE (window))
9904 gtk_widget_show (window);
9906 gtk_widget_destroy (window);
9910 * Paned keyboard navigation
9914 paned_keyboard_window1 (GtkWidget *widget)
9937 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9938 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
9939 gtk_window_set_screen (GTK_WINDOW (window1),
9940 gtk_widget_get_screen (widget));
9942 hpaned1 = gtk_hpaned_new ();
9943 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
9945 frame1 = gtk_frame_new (NULL);
9946 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
9947 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
9949 vbox1 = gtk_vbox_new (FALSE, 0);
9950 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
9952 button7 = gtk_button_new_with_label ("button7");
9953 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
9955 button8 = gtk_button_new_with_label ("button8");
9956 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
9958 button9 = gtk_button_new_with_label ("button9");
9959 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
9961 vpaned1 = gtk_vpaned_new ();
9962 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
9964 frame2 = gtk_frame_new (NULL);
9965 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
9966 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
9968 frame5 = gtk_frame_new (NULL);
9969 gtk_container_add (GTK_CONTAINER (frame2), frame5);
9971 hbox1 = gtk_hbox_new (FALSE, 0);
9972 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
9974 button5 = gtk_button_new_with_label ("button5");
9975 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
9977 button6 = gtk_button_new_with_label ("button6");
9978 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
9980 frame3 = gtk_frame_new (NULL);
9981 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
9982 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
9984 frame4 = gtk_frame_new ("Buttons");
9985 gtk_container_add (GTK_CONTAINER (frame3), frame4);
9986 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
9988 table1 = gtk_table_new (2, 2, FALSE);
9989 gtk_container_add (GTK_CONTAINER (frame4), table1);
9990 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
9992 button1 = gtk_button_new_with_label ("button1");
9993 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
9994 (GtkAttachOptions) (GTK_FILL),
9995 (GtkAttachOptions) (0), 0, 0);
9997 button2 = gtk_button_new_with_label ("button2");
9998 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
9999 (GtkAttachOptions) (GTK_FILL),
10000 (GtkAttachOptions) (0), 0, 0);
10002 button3 = gtk_button_new_with_label ("button3");
10003 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
10004 (GtkAttachOptions) (GTK_FILL),
10005 (GtkAttachOptions) (0), 0, 0);
10007 button4 = gtk_button_new_with_label ("button4");
10008 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
10009 (GtkAttachOptions) (GTK_FILL),
10010 (GtkAttachOptions) (0), 0, 0);
10016 paned_keyboard_window2 (GtkWidget *widget)
10018 GtkWidget *window2;
10019 GtkWidget *hpaned2;
10021 GtkWidget *button13;
10023 GtkWidget *vpaned2;
10025 GtkWidget *button12;
10027 GtkWidget *button11;
10028 GtkWidget *button10;
10030 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10031 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
10033 gtk_window_set_screen (GTK_WINDOW (window2),
10034 gtk_widget_get_screen (widget));
10036 hpaned2 = gtk_hpaned_new ();
10037 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
10039 frame6 = gtk_frame_new (NULL);
10040 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
10041 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
10043 button13 = gtk_button_new_with_label ("button13");
10044 gtk_container_add (GTK_CONTAINER (frame6), button13);
10046 hbox2 = gtk_hbox_new (FALSE, 0);
10047 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
10049 vpaned2 = gtk_vpaned_new ();
10050 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
10052 frame7 = gtk_frame_new (NULL);
10053 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
10054 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
10056 button12 = gtk_button_new_with_label ("button12");
10057 gtk_container_add (GTK_CONTAINER (frame7), button12);
10059 frame8 = gtk_frame_new (NULL);
10060 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
10061 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
10063 button11 = gtk_button_new_with_label ("button11");
10064 gtk_container_add (GTK_CONTAINER (frame8), button11);
10066 button10 = gtk_button_new_with_label ("button10");
10067 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
10073 paned_keyboard_window3 (GtkWidget *widget)
10075 GtkWidget *window3;
10078 GtkWidget *hpaned3;
10080 GtkWidget *button14;
10081 GtkWidget *hpaned4;
10082 GtkWidget *frame10;
10083 GtkWidget *button15;
10084 GtkWidget *hpaned5;
10085 GtkWidget *frame11;
10086 GtkWidget *button16;
10087 GtkWidget *frame12;
10088 GtkWidget *button17;
10090 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10091 g_object_set_data (G_OBJECT (window3), "window3", window3);
10092 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
10094 gtk_window_set_screen (GTK_WINDOW (window3),
10095 gtk_widget_get_screen (widget));
10098 vbox2 = gtk_vbox_new (FALSE, 0);
10099 gtk_container_add (GTK_CONTAINER (window3), vbox2);
10101 label1 = gtk_label_new ("Three panes nested inside each other");
10102 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
10104 hpaned3 = gtk_hpaned_new ();
10105 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
10107 frame9 = gtk_frame_new (NULL);
10108 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
10109 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
10111 button14 = gtk_button_new_with_label ("button14");
10112 gtk_container_add (GTK_CONTAINER (frame9), button14);
10114 hpaned4 = gtk_hpaned_new ();
10115 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
10117 frame10 = gtk_frame_new (NULL);
10118 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
10119 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
10121 button15 = gtk_button_new_with_label ("button15");
10122 gtk_container_add (GTK_CONTAINER (frame10), button15);
10124 hpaned5 = gtk_hpaned_new ();
10125 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
10127 frame11 = gtk_frame_new (NULL);
10128 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
10129 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
10131 button16 = gtk_button_new_with_label ("button16");
10132 gtk_container_add (GTK_CONTAINER (frame11), button16);
10134 frame12 = gtk_frame_new (NULL);
10135 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
10136 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
10138 button17 = gtk_button_new_with_label ("button17");
10139 gtk_container_add (GTK_CONTAINER (frame12), button17);
10145 paned_keyboard_window4 (GtkWidget *widget)
10147 GtkWidget *window4;
10150 GtkWidget *hpaned6;
10151 GtkWidget *vpaned3;
10152 GtkWidget *button19;
10153 GtkWidget *button18;
10155 GtkWidget *vpaned4;
10156 GtkWidget *button21;
10157 GtkWidget *button20;
10158 GtkWidget *vpaned5;
10159 GtkWidget *button23;
10160 GtkWidget *button22;
10161 GtkWidget *vpaned6;
10162 GtkWidget *button25;
10163 GtkWidget *button24;
10165 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10166 g_object_set_data (G_OBJECT (window4), "window4", window4);
10167 gtk_window_set_title (GTK_WINDOW (window4), "window4");
10169 gtk_window_set_screen (GTK_WINDOW (window4),
10170 gtk_widget_get_screen (widget));
10172 vbox3 = gtk_vbox_new (FALSE, 0);
10173 gtk_container_add (GTK_CONTAINER (window4), vbox3);
10175 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
10176 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
10177 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
10179 hpaned6 = gtk_hpaned_new ();
10180 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
10182 vpaned3 = gtk_vpaned_new ();
10183 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
10185 button19 = gtk_button_new_with_label ("button19");
10186 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
10188 button18 = gtk_button_new_with_label ("button18");
10189 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
10191 hbox3 = gtk_hbox_new (FALSE, 0);
10192 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
10194 vpaned4 = gtk_vpaned_new ();
10195 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
10197 button21 = gtk_button_new_with_label ("button21");
10198 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
10200 button20 = gtk_button_new_with_label ("button20");
10201 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
10203 vpaned5 = gtk_vpaned_new ();
10204 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
10206 button23 = gtk_button_new_with_label ("button23");
10207 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
10209 button22 = gtk_button_new_with_label ("button22");
10210 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
10212 vpaned6 = gtk_vpaned_new ();
10213 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
10215 button25 = gtk_button_new_with_label ("button25");
10216 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
10218 button24 = gtk_button_new_with_label ("button24");
10219 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
10225 create_paned_keyboard_navigation (GtkWidget *widget)
10227 static GtkWidget *window1 = NULL;
10228 static GtkWidget *window2 = NULL;
10229 static GtkWidget *window3 = NULL;
10230 static GtkWidget *window4 = NULL;
10233 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
10235 gtk_widget_destroy (window1);
10236 gtk_widget_destroy (window2);
10237 gtk_widget_destroy (window3);
10238 gtk_widget_destroy (window4);
10243 window1 = paned_keyboard_window1 (widget);
10244 g_signal_connect (window1, "destroy",
10245 G_CALLBACK (gtk_widget_destroyed),
10251 window2 = paned_keyboard_window2 (widget);
10252 g_signal_connect (window2, "destroy",
10253 G_CALLBACK (gtk_widget_destroyed),
10259 window3 = paned_keyboard_window3 (widget);
10260 g_signal_connect (window3, "destroy",
10261 G_CALLBACK (gtk_widget_destroyed),
10267 window4 = paned_keyboard_window4 (widget);
10268 g_signal_connect (window4, "destroy",
10269 G_CALLBACK (gtk_widget_destroyed),
10273 if (GTK_WIDGET_VISIBLE (window1))
10274 gtk_widget_destroy (GTK_WIDGET (window1));
10276 gtk_widget_show_all (GTK_WIDGET (window1));
10278 if (GTK_WIDGET_VISIBLE (window2))
10279 gtk_widget_destroy (GTK_WIDGET (window2));
10281 gtk_widget_show_all (GTK_WIDGET (window2));
10283 if (GTK_WIDGET_VISIBLE (window3))
10284 gtk_widget_destroy (GTK_WIDGET (window3));
10286 gtk_widget_show_all (GTK_WIDGET (window3));
10288 if (GTK_WIDGET_VISIBLE (window4))
10289 gtk_widget_destroy (GTK_WIDGET (window4));
10291 gtk_widget_show_all (GTK_WIDGET (window4));
10299 typedef struct _cursoroffset {gint x,y;} CursorOffset;
10302 shape_pressed (GtkWidget *widget, GdkEventButton *event)
10306 /* ignore double and triple click */
10307 if (event->type != GDK_BUTTON_PRESS)
10310 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
10311 p->x = (int) event->x;
10312 p->y = (int) event->y;
10314 gtk_grab_add (widget);
10315 gdk_pointer_grab (widget->window, TRUE,
10316 GDK_BUTTON_RELEASE_MASK |
10317 GDK_BUTTON_MOTION_MASK |
10318 GDK_POINTER_MOTION_HINT_MASK,
10323 shape_released (GtkWidget *widget)
10325 gtk_grab_remove (widget);
10326 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10331 shape_motion (GtkWidget *widget,
10332 GdkEventMotion *event)
10336 GdkModifierType mask;
10338 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
10341 * Can't use event->x / event->y here
10342 * because I need absolute coordinates.
10344 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
10345 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
10349 shape_create_icon (GdkScreen *screen,
10360 CursorOffset* icon_pos;
10362 GdkBitmap *gdk_pixmap_mask;
10363 GdkPixmap *gdk_pixmap;
10366 style = gtk_widget_get_default_style ();
10367 gc = style->black_gc;
10370 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
10372 window = gtk_window_new (window_type);
10373 gtk_window_set_screen (GTK_WINDOW (window), screen);
10375 fixed = gtk_fixed_new ();
10376 gtk_widget_set_size_request (fixed, 100, 100);
10377 gtk_container_add (GTK_CONTAINER (window), fixed);
10378 gtk_widget_show (fixed);
10380 gtk_widget_set_events (window,
10381 gtk_widget_get_events (window) |
10382 GDK_BUTTON_MOTION_MASK |
10383 GDK_POINTER_MOTION_HINT_MASK |
10384 GDK_BUTTON_PRESS_MASK);
10386 gtk_widget_realize (window);
10387 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
10388 &style->bg[GTK_STATE_NORMAL],
10391 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
10392 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
10393 gtk_widget_show (pixmap);
10395 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
10397 g_object_unref (gdk_pixmap_mask);
10398 g_object_unref (gdk_pixmap);
10400 g_signal_connect (window, "button_press_event",
10401 G_CALLBACK (shape_pressed), NULL);
10402 g_signal_connect (window, "button_release_event",
10403 G_CALLBACK (shape_released), NULL);
10404 g_signal_connect (window, "motion_notify_event",
10405 G_CALLBACK (shape_motion), NULL);
10407 icon_pos = g_new (CursorOffset, 1);
10408 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
10410 gtk_widget_set_uposition (window, x, y);
10411 gtk_widget_show (window);
10417 create_shapes (GtkWidget *widget)
10419 /* Variables used by the Drag/Drop and Shape Window demos */
10420 static GtkWidget *modeller = NULL;
10421 static GtkWidget *sheets = NULL;
10422 static GtkWidget *rings = NULL;
10423 static GtkWidget *with_region = NULL;
10424 GdkScreen *screen = gtk_widget_get_screen (widget);
10426 if (!(file_exists ("Modeller.xpm") &&
10427 file_exists ("FilesQueue.xpm") &&
10428 file_exists ("3DRings.xpm")))
10434 modeller = shape_create_icon (screen, "Modeller.xpm",
10435 440, 140, 0,0, GTK_WINDOW_POPUP);
10437 g_signal_connect (modeller, "destroy",
10438 G_CALLBACK (gtk_widget_destroyed),
10442 gtk_widget_destroy (modeller);
10446 sheets = shape_create_icon (screen, "FilesQueue.xpm",
10447 580, 170, 0,0, GTK_WINDOW_POPUP);
10449 g_signal_connect (sheets, "destroy",
10450 G_CALLBACK (gtk_widget_destroyed),
10455 gtk_widget_destroy (sheets);
10459 rings = shape_create_icon (screen, "3DRings.xpm",
10460 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
10462 g_signal_connect (rings, "destroy",
10463 G_CALLBACK (gtk_widget_destroyed),
10467 gtk_widget_destroy (rings);
10474 with_region = shape_create_icon (screen, "3DRings.xpm",
10475 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
10477 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
10479 g_signal_connect (with_region, "destroy",
10480 G_CALLBACK (gtk_widget_destroyed),
10483 /* reset shape from mask to a region */
10486 region = gdk_region_new ();
10498 gdk_region_union_with_rect (region, &rect);
10506 gdk_window_shape_combine_region (with_region->window,
10511 gtk_widget_destroy (with_region);
10519 create_wmhints (GtkWidget *widget)
10521 static GtkWidget *window = NULL;
10523 GtkWidget *separator;
10528 GdkBitmap *circles;
10532 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10534 gtk_window_set_screen (GTK_WINDOW (window),
10535 gtk_widget_get_screen (widget));
10537 g_signal_connect (window, "destroy",
10538 G_CALLBACK (gtk_widget_destroyed),
10541 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
10542 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10544 gtk_widget_realize (window);
10546 circles = gdk_bitmap_create_from_data (window->window,
10547 (gchar *) circles_bits,
10550 gdk_window_set_icon (window->window, NULL,
10553 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
10555 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
10556 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
10558 box1 = gtk_vbox_new (FALSE, 0);
10559 gtk_container_add (GTK_CONTAINER (window), box1);
10560 gtk_widget_show (box1);
10562 label = gtk_label_new ("Try iconizing me!");
10563 gtk_widget_set_size_request (label, 150, 50);
10564 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
10565 gtk_widget_show (label);
10568 separator = gtk_hseparator_new ();
10569 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10570 gtk_widget_show (separator);
10573 box2 = gtk_vbox_new (FALSE, 10);
10574 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10575 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10576 gtk_widget_show (box2);
10579 button = gtk_button_new_with_label ("close");
10581 g_signal_connect_swapped (button, "clicked",
10582 G_CALLBACK (gtk_widget_destroy),
10585 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10586 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
10587 gtk_widget_grab_default (button);
10588 gtk_widget_show (button);
10591 if (!GTK_WIDGET_VISIBLE (window))
10592 gtk_widget_show (window);
10594 gtk_widget_destroy (window);
10599 * Window state tracking
10603 window_state_callback (GtkWidget *widget,
10604 GdkEventWindowState *event,
10607 GtkWidget *label = data;
10610 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
10611 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
10612 "withdrawn" : "not withdrawn", ", ",
10613 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
10614 "iconified" : "not iconified", ", ",
10615 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
10616 "sticky" : "not sticky", ", ",
10617 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
10618 "maximized" : "not maximized", ", ",
10619 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
10620 "fullscreen" : "not fullscreen",
10621 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
10622 "above" : "not above", ", ",
10623 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
10624 "below" : "not below", ", ",
10627 gtk_label_set_text (GTK_LABEL (label), msg);
10635 tracking_label (GtkWidget *window)
10641 hbox = gtk_hbox_new (FALSE, 5);
10643 g_signal_connect_object (hbox,
10645 G_CALLBACK (gtk_widget_destroy),
10647 G_CONNECT_SWAPPED);
10649 label = gtk_label_new ("<no window state events received>");
10650 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
10651 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
10653 g_signal_connect (window,
10654 "window_state_event",
10655 G_CALLBACK (window_state_callback),
10658 button = gtk_button_new_with_label ("Deiconify");
10659 g_signal_connect_object (button,
10661 G_CALLBACK (gtk_window_deiconify),
10663 G_CONNECT_SWAPPED);
10664 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10666 button = gtk_button_new_with_label ("Iconify");
10667 g_signal_connect_object (button,
10669 G_CALLBACK (gtk_window_iconify),
10671 G_CONNECT_SWAPPED);
10672 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10674 button = gtk_button_new_with_label ("Fullscreen");
10675 g_signal_connect_object (button,
10677 G_CALLBACK (gtk_window_fullscreen),
10679 G_CONNECT_SWAPPED);
10680 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10682 button = gtk_button_new_with_label ("Unfullscreen");
10683 g_signal_connect_object (button,
10685 G_CALLBACK (gtk_window_unfullscreen),
10687 G_CONNECT_SWAPPED);
10688 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10690 button = gtk_button_new_with_label ("Present");
10691 g_signal_connect_object (button,
10693 G_CALLBACK (gtk_window_present),
10695 G_CONNECT_SWAPPED);
10696 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10698 button = gtk_button_new_with_label ("Show");
10699 g_signal_connect_object (button,
10701 G_CALLBACK (gtk_widget_show),
10703 G_CONNECT_SWAPPED);
10704 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10706 gtk_widget_show_all (hbox);
10712 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
10714 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
10716 gtk_window_set_keep_above (GTK_WINDOW (data),
10717 gtk_toggle_button_get_active (togglebutton));
10719 if (gtk_toggle_button_get_active (togglebutton))
10720 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10724 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
10726 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
10728 gtk_window_set_keep_below (GTK_WINDOW (data),
10729 gtk_toggle_button_get_active (togglebutton));
10731 if (gtk_toggle_button_get_active (togglebutton))
10732 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10737 get_state_controls (GtkWidget *window)
10741 GtkWidget *button_above;
10742 GtkWidget *button_below;
10744 vbox = gtk_vbox_new (FALSE, 0);
10746 button = gtk_button_new_with_label ("Stick");
10747 g_signal_connect_object (button,
10749 G_CALLBACK (gtk_window_stick),
10751 G_CONNECT_SWAPPED);
10752 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10754 button = gtk_button_new_with_label ("Unstick");
10755 g_signal_connect_object (button,
10757 G_CALLBACK (gtk_window_unstick),
10759 G_CONNECT_SWAPPED);
10760 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10762 button = gtk_button_new_with_label ("Maximize");
10763 g_signal_connect_object (button,
10765 G_CALLBACK (gtk_window_maximize),
10767 G_CONNECT_SWAPPED);
10768 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10770 button = gtk_button_new_with_label ("Unmaximize");
10771 g_signal_connect_object (button,
10773 G_CALLBACK (gtk_window_unmaximize),
10775 G_CONNECT_SWAPPED);
10776 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10778 button = gtk_button_new_with_label ("Iconify");
10779 g_signal_connect_object (button,
10781 G_CALLBACK (gtk_window_iconify),
10783 G_CONNECT_SWAPPED);
10784 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10786 button = gtk_button_new_with_label ("Fullscreen");
10787 g_signal_connect_object (button,
10789 G_CALLBACK (gtk_window_fullscreen),
10791 G_CONNECT_SWAPPED);
10792 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10794 button = gtk_button_new_with_label ("Unfullscreen");
10795 g_signal_connect_object (button,
10797 G_CALLBACK (gtk_window_unfullscreen),
10799 G_CONNECT_SWAPPED);
10800 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10802 button_above = gtk_toggle_button_new_with_label ("Keep above");
10803 g_signal_connect (button_above,
10805 G_CALLBACK (keep_window_above),
10807 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
10809 button_below = gtk_toggle_button_new_with_label ("Keep below");
10810 g_signal_connect (button_below,
10812 G_CALLBACK (keep_window_below),
10814 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
10816 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
10817 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
10819 button = gtk_button_new_with_label ("Hide (withdraw)");
10820 g_signal_connect_object (button,
10822 G_CALLBACK (gtk_widget_hide),
10824 G_CONNECT_SWAPPED);
10825 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10827 gtk_widget_show_all (vbox);
10833 create_window_states (GtkWidget *widget)
10835 static GtkWidget *window = NULL;
10838 GtkWidget *iconified;
10840 GtkWidget *controls;
10844 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10845 gtk_window_set_screen (GTK_WINDOW (window),
10846 gtk_widget_get_screen (widget));
10848 g_signal_connect (window, "destroy",
10849 G_CALLBACK (gtk_widget_destroyed),
10852 gtk_window_set_title (GTK_WINDOW (window), "Window states");
10854 box1 = gtk_vbox_new (FALSE, 0);
10855 gtk_container_add (GTK_CONTAINER (window), box1);
10857 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10859 gtk_window_set_screen (GTK_WINDOW (iconified),
10860 gtk_widget_get_screen (widget));
10862 g_signal_connect_object (iconified, "destroy",
10863 G_CALLBACK (gtk_widget_destroy),
10865 G_CONNECT_SWAPPED);
10866 gtk_window_iconify (GTK_WINDOW (iconified));
10867 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
10868 controls = get_state_controls (iconified);
10869 gtk_container_add (GTK_CONTAINER (iconified), controls);
10871 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10873 gtk_window_set_screen (GTK_WINDOW (normal),
10874 gtk_widget_get_screen (widget));
10876 g_signal_connect_object (normal, "destroy",
10877 G_CALLBACK (gtk_widget_destroy),
10879 G_CONNECT_SWAPPED);
10881 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
10882 controls = get_state_controls (normal);
10883 gtk_container_add (GTK_CONTAINER (normal), controls);
10885 label = tracking_label (iconified);
10886 gtk_container_add (GTK_CONTAINER (box1), label);
10888 label = tracking_label (normal);
10889 gtk_container_add (GTK_CONTAINER (box1), label);
10891 gtk_widget_show_all (iconified);
10892 gtk_widget_show_all (normal);
10893 gtk_widget_show_all (box1);
10896 if (!GTK_WIDGET_VISIBLE (window))
10897 gtk_widget_show (window);
10899 gtk_widget_destroy (window);
10907 configure_event_callback (GtkWidget *widget,
10908 GdkEventConfigure *event,
10911 GtkWidget *label = data;
10915 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
10917 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
10918 "position: %d, %d",
10919 event->x, event->y, event->width, event->height,
10922 gtk_label_set_text (GTK_LABEL (label), msg);
10930 get_ints (GtkWidget *window,
10937 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
10938 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
10940 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
10941 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
10945 set_size_callback (GtkWidget *widget,
10950 get_ints (data, &w, &h);
10952 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
10956 unset_default_size_callback (GtkWidget *widget,
10959 gtk_window_set_default_size (g_object_get_data (data, "target"),
10964 set_default_size_callback (GtkWidget *widget,
10969 get_ints (data, &w, &h);
10971 gtk_window_set_default_size (g_object_get_data (data, "target"),
10976 unset_size_request_callback (GtkWidget *widget,
10979 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10984 set_size_request_callback (GtkWidget *widget,
10989 get_ints (data, &w, &h);
10991 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10996 set_location_callback (GtkWidget *widget,
11001 get_ints (data, &x, &y);
11003 gtk_window_move (g_object_get_data (data, "target"), x, y);
11007 move_to_position_callback (GtkWidget *widget,
11013 window = g_object_get_data (data, "target");
11015 gtk_window_get_position (window, &x, &y);
11017 gtk_window_move (window, x, y);
11021 set_geometry_callback (GtkWidget *entry,
11027 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
11029 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
11031 if (!gtk_window_parse_geometry (target, text))
11032 g_print ("Bad geometry string '%s'\n", text);
11038 allow_shrink_callback (GtkWidget *widget,
11041 g_object_set (g_object_get_data (data, "target"),
11043 GTK_TOGGLE_BUTTON (widget)->active,
11048 allow_grow_callback (GtkWidget *widget,
11051 g_object_set (g_object_get_data (data, "target"),
11053 GTK_TOGGLE_BUTTON (widget)->active,
11058 gravity_selected (GtkWidget *widget,
11061 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
11062 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
11066 pos_selected (GtkWidget *widget,
11069 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
11070 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
11074 move_gravity_window_to_current_position (GtkWidget *widget,
11080 window = GTK_WINDOW (data);
11082 gtk_window_get_position (window, &x, &y);
11084 gtk_window_move (window, x, y);
11088 get_screen_corner (GtkWindow *window,
11093 GdkScreen * screen = gtk_window_get_screen (window);
11095 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
11097 switch (gtk_window_get_gravity (window))
11099 case GDK_GRAVITY_SOUTH_EAST:
11100 *x = gdk_screen_get_width (screen) - w;
11101 *y = gdk_screen_get_height (screen) - h;
11104 case GDK_GRAVITY_NORTH_EAST:
11105 *x = gdk_screen_get_width (screen) - w;
11109 case GDK_GRAVITY_SOUTH_WEST:
11111 *y = gdk_screen_get_height (screen) - h;
11114 case GDK_GRAVITY_NORTH_WEST:
11119 case GDK_GRAVITY_SOUTH:
11120 *x = (gdk_screen_get_width (screen) - w) / 2;
11121 *y = gdk_screen_get_height (screen) - h;
11124 case GDK_GRAVITY_NORTH:
11125 *x = (gdk_screen_get_width (screen) - w) / 2;
11129 case GDK_GRAVITY_WEST:
11131 *y = (gdk_screen_get_height (screen) - h) / 2;
11134 case GDK_GRAVITY_EAST:
11135 *x = gdk_screen_get_width (screen) - w;
11136 *y = (gdk_screen_get_height (screen) - h) / 2;
11139 case GDK_GRAVITY_CENTER:
11140 *x = (gdk_screen_get_width (screen) - w) / 2;
11141 *y = (gdk_screen_get_height (screen) - h) / 2;
11144 case GDK_GRAVITY_STATIC:
11145 /* pick some random numbers */
11151 g_assert_not_reached ();
11157 move_gravity_window_to_starting_position (GtkWidget *widget,
11163 window = GTK_WINDOW (data);
11165 get_screen_corner (window,
11168 gtk_window_move (window, x, y);
11172 make_gravity_window (GtkWidget *destroy_with,
11173 GdkGravity gravity,
11174 const gchar *title)
11181 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11183 gtk_window_set_screen (GTK_WINDOW (window),
11184 gtk_widget_get_screen (destroy_with));
11186 vbox = gtk_vbox_new (FALSE, 0);
11187 gtk_widget_show (vbox);
11189 gtk_container_add (GTK_CONTAINER (window), vbox);
11190 gtk_window_set_title (GTK_WINDOW (window), title);
11191 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
11193 g_signal_connect_object (destroy_with,
11195 G_CALLBACK (gtk_widget_destroy),
11197 G_CONNECT_SWAPPED);
11200 button = gtk_button_new_with_mnemonic ("_Move to current position");
11202 g_signal_connect (button, "clicked",
11203 G_CALLBACK (move_gravity_window_to_current_position),
11206 gtk_container_add (GTK_CONTAINER (vbox), button);
11207 gtk_widget_show (button);
11209 button = gtk_button_new_with_mnemonic ("Move to _starting position");
11211 g_signal_connect (button, "clicked",
11212 G_CALLBACK (move_gravity_window_to_starting_position),
11215 gtk_container_add (GTK_CONTAINER (vbox), button);
11216 gtk_widget_show (button);
11218 /* Pretend this is the result of --geometry.
11219 * DO NOT COPY THIS CODE unless you are setting --geometry results,
11220 * and in that case you probably should just use gtk_window_parse_geometry().
11221 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
11222 * you are parsing --geometry or equivalent.
11224 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11226 GDK_HINT_USER_POS);
11228 gtk_window_set_default_size (GTK_WINDOW (window),
11231 get_screen_corner (GTK_WINDOW (window), &x, &y);
11233 gtk_window_move (GTK_WINDOW (window),
11240 do_gravity_test (GtkWidget *widget,
11243 GtkWidget *destroy_with = data;
11246 /* We put a window at each gravity point on the screen. */
11247 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
11249 gtk_widget_show (window);
11251 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
11253 gtk_widget_show (window);
11255 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
11257 gtk_widget_show (window);
11259 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
11261 gtk_widget_show (window);
11263 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
11265 gtk_widget_show (window);
11267 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
11269 gtk_widget_show (window);
11272 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
11274 gtk_widget_show (window);
11277 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
11279 gtk_widget_show (window);
11281 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
11283 gtk_widget_show (window);
11285 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
11287 gtk_widget_show (window);
11291 window_controls (GtkWidget *window)
11293 GtkWidget *control_window;
11298 GtkAdjustment *adj;
11304 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11306 gtk_window_set_screen (GTK_WINDOW (control_window),
11307 gtk_widget_get_screen (window));
11309 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
11311 g_object_set_data (G_OBJECT (control_window),
11315 g_signal_connect_object (control_window,
11317 G_CALLBACK (gtk_widget_destroy),
11319 G_CONNECT_SWAPPED);
11321 vbox = gtk_vbox_new (FALSE, 5);
11323 gtk_container_add (GTK_CONTAINER (control_window), vbox);
11325 label = gtk_label_new ("<no configure events>");
11326 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11328 g_signal_connect (window,
11330 G_CALLBACK (configure_event_callback),
11333 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
11335 spin = gtk_spin_button_new (adj, 0, 0);
11337 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
11339 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
11341 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
11343 spin = gtk_spin_button_new (adj, 0, 0);
11345 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
11347 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
11349 entry = gtk_entry_new ();
11350 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11352 g_signal_connect (entry, "changed",
11353 G_CALLBACK (set_geometry_callback),
11356 button = gtk_button_new_with_label ("Show gravity test windows");
11357 g_signal_connect_swapped (button,
11359 G_CALLBACK (do_gravity_test),
11361 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11363 button = gtk_button_new_with_label ("Reshow with initial size");
11364 g_signal_connect_object (button,
11366 G_CALLBACK (gtk_window_reshow_with_initial_size),
11368 G_CONNECT_SWAPPED);
11369 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11371 button = gtk_button_new_with_label ("Queue resize");
11372 g_signal_connect_object (button,
11374 G_CALLBACK (gtk_widget_queue_resize),
11376 G_CONNECT_SWAPPED);
11377 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11379 button = gtk_button_new_with_label ("Resize");
11380 g_signal_connect (button,
11382 G_CALLBACK (set_size_callback),
11384 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11386 button = gtk_button_new_with_label ("Set default size");
11387 g_signal_connect (button,
11389 G_CALLBACK (set_default_size_callback),
11391 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11393 button = gtk_button_new_with_label ("Unset default size");
11394 g_signal_connect (button,
11396 G_CALLBACK (unset_default_size_callback),
11398 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11400 button = gtk_button_new_with_label ("Set size request");
11401 g_signal_connect (button,
11403 G_CALLBACK (set_size_request_callback),
11405 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11407 button = gtk_button_new_with_label ("Unset size request");
11408 g_signal_connect (button,
11410 G_CALLBACK (unset_size_request_callback),
11412 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11414 button = gtk_button_new_with_label ("Move");
11415 g_signal_connect (button,
11417 G_CALLBACK (set_location_callback),
11419 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11421 button = gtk_button_new_with_label ("Move to current position");
11422 g_signal_connect (button,
11424 G_CALLBACK (move_to_position_callback),
11426 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11428 button = gtk_check_button_new_with_label ("Allow shrink");
11429 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
11430 g_signal_connect (button,
11432 G_CALLBACK (allow_shrink_callback),
11434 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11436 button = gtk_check_button_new_with_label ("Allow grow");
11437 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
11438 g_signal_connect (button,
11440 G_CALLBACK (allow_grow_callback),
11442 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11444 button = gtk_button_new_with_mnemonic ("_Show");
11445 g_signal_connect_object (button,
11447 G_CALLBACK (gtk_widget_show),
11449 G_CONNECT_SWAPPED);
11450 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11452 button = gtk_button_new_with_mnemonic ("_Hide");
11453 g_signal_connect_object (button,
11455 G_CALLBACK (gtk_widget_hide),
11457 G_CONNECT_SWAPPED);
11458 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11460 menu = gtk_menu_new ();
11466 static gchar *names[] = {
11467 "GDK_GRAVITY_NORTH_WEST",
11468 "GDK_GRAVITY_NORTH",
11469 "GDK_GRAVITY_NORTH_EAST",
11470 "GDK_GRAVITY_WEST",
11471 "GDK_GRAVITY_CENTER",
11472 "GDK_GRAVITY_EAST",
11473 "GDK_GRAVITY_SOUTH_WEST",
11474 "GDK_GRAVITY_SOUTH",
11475 "GDK_GRAVITY_SOUTH_EAST",
11476 "GDK_GRAVITY_STATIC",
11480 g_assert (names[i]);
11482 mi = gtk_menu_item_new_with_label (names[i]);
11484 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
11489 gtk_widget_show_all (menu);
11491 om = gtk_option_menu_new ();
11492 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
11495 g_signal_connect (om,
11497 G_CALLBACK (gravity_selected),
11500 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
11503 menu = gtk_menu_new ();
11509 static gchar *names[] = {
11510 "GTK_WIN_POS_NONE",
11511 "GTK_WIN_POS_CENTER",
11512 "GTK_WIN_POS_MOUSE",
11513 "GTK_WIN_POS_CENTER_ALWAYS",
11514 "GTK_WIN_POS_CENTER_ON_PARENT",
11518 g_assert (names[i]);
11520 mi = gtk_menu_item_new_with_label (names[i]);
11522 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
11527 gtk_widget_show_all (menu);
11529 om = gtk_option_menu_new ();
11530 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
11533 g_signal_connect (om,
11535 G_CALLBACK (pos_selected),
11538 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
11540 gtk_widget_show_all (vbox);
11542 return control_window;
11546 create_window_sizing (GtkWidget *widget)
11548 static GtkWidget *window = NULL;
11549 static GtkWidget *target_window = NULL;
11551 if (!target_window)
11555 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11556 gtk_window_set_screen (GTK_WINDOW (target_window),
11557 gtk_widget_get_screen (widget));
11558 label = gtk_label_new (NULL);
11559 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");
11560 gtk_container_add (GTK_CONTAINER (target_window), label);
11561 gtk_widget_show (label);
11563 g_signal_connect (target_window, "destroy",
11564 G_CALLBACK (gtk_widget_destroyed),
11567 window = window_controls (target_window);
11569 g_signal_connect (window, "destroy",
11570 G_CALLBACK (gtk_widget_destroyed),
11573 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
11576 /* don't show target window by default, we want to allow testing
11577 * of behavior on first show.
11580 if (!GTK_WIDGET_VISIBLE (window))
11581 gtk_widget_show (window);
11583 gtk_widget_destroy (window);
11590 typedef struct _ProgressData {
11593 GtkWidget *block_spin;
11594 GtkWidget *x_align_spin;
11595 GtkWidget *y_align_spin;
11596 GtkWidget *step_spin;
11597 GtkWidget *act_blocks_spin;
11607 progress_timeout (gpointer data)
11610 GtkAdjustment *adj;
11612 adj = GTK_PROGRESS (data)->adjustment;
11614 new_val = adj->value + 1;
11615 if (new_val > adj->upper)
11616 new_val = adj->lower;
11618 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
11624 destroy_progress (GtkWidget *widget,
11625 ProgressData **pdata)
11627 gtk_timeout_remove ((*pdata)->timer);
11628 (*pdata)->timer = 0;
11629 (*pdata)->window = NULL;
11635 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
11637 ProgressData *pdata;
11640 pdata = (ProgressData *) data;
11642 if (!GTK_WIDGET_MAPPED (widget))
11645 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11647 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
11648 (GtkProgressBarOrientation) i);
11652 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
11654 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
11655 GTK_TOGGLE_BUTTON (widget)->active);
11656 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
11657 gtk_widget_set_sensitive (pdata->x_align_spin,
11658 GTK_TOGGLE_BUTTON (widget)->active);
11659 gtk_widget_set_sensitive (pdata->y_align_spin,
11660 GTK_TOGGLE_BUTTON (widget)->active);
11664 progressbar_toggle_ellipsize (GtkWidget *widget,
11667 ProgressData *pdata = data;
11668 if (GTK_WIDGET_DRAWABLE (widget))
11670 gint i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11671 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
11676 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
11678 ProgressData *pdata;
11681 pdata = (ProgressData *) data;
11683 if (!GTK_WIDGET_MAPPED (widget))
11686 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11689 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
11691 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
11693 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
11694 (GtkProgressBarStyle) i);
11698 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
11702 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
11703 sprintf (buf, "???");
11705 sprintf (buf, "%.0f%%", 100 *
11706 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
11707 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
11711 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
11713 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
11714 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
11715 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
11719 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
11721 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
11722 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
11726 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
11728 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
11729 gtk_spin_button_get_value_as_int
11730 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
11734 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
11736 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
11737 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
11738 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
11742 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
11744 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
11745 GTK_TOGGLE_BUTTON (widget)->active);
11746 gtk_widget_set_sensitive (pdata->step_spin,
11747 GTK_TOGGLE_BUTTON (widget)->active);
11748 gtk_widget_set_sensitive (pdata->act_blocks_spin,
11749 GTK_TOGGLE_BUTTON (widget)->active);
11753 entry_changed (GtkWidget *widget, ProgressData *pdata)
11755 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
11756 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
11760 create_progress_bar (GtkWidget *widget)
11771 GtkAdjustment *adj;
11772 static ProgressData *pdata = NULL;
11774 static gchar *items1[] =
11782 static gchar *items2[] =
11788 static char *ellipsize_items[] = {
11789 "None", // PANGO_ELLIPSIZE_NONE,
11790 "Start", // PANGO_ELLIPSIZE_START,
11791 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
11792 "End", // PANGO_ELLIPSIZE_END
11796 pdata = g_new0 (ProgressData, 1);
11798 if (!pdata->window)
11800 pdata->window = gtk_dialog_new ();
11802 gtk_window_set_screen (GTK_WINDOW (pdata->window),
11803 gtk_widget_get_screen (widget));
11805 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
11807 g_signal_connect (pdata->window, "destroy",
11808 G_CALLBACK (destroy_progress),
11813 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
11814 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
11816 vbox = gtk_vbox_new (FALSE, 5);
11817 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11818 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
11819 vbox, FALSE, TRUE, 0);
11821 frame = gtk_frame_new ("Progress");
11822 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
11824 vbox2 = gtk_vbox_new (FALSE, 5);
11825 gtk_container_add (GTK_CONTAINER (frame), vbox2);
11827 align = gtk_alignment_new (0.5, 0.5, 0, 0);
11828 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
11830 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
11831 g_signal_connect (adj, "value_changed",
11832 G_CALLBACK (progress_value_changed), pdata);
11834 pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
11836 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
11838 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
11839 "%v from [%l,%u] (=%p%%)");
11840 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
11841 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
11843 align = gtk_alignment_new (0.5, 0.5, 0, 0);
11844 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
11846 hbox = gtk_hbox_new (FALSE, 5);
11847 gtk_container_add (GTK_CONTAINER (align), hbox);
11848 label = gtk_label_new ("Label updated by user :");
11849 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11850 pdata->label = gtk_label_new ("");
11851 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
11853 frame = gtk_frame_new ("Options");
11854 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
11856 vbox2 = gtk_vbox_new (FALSE, 5);
11857 gtk_container_add (GTK_CONTAINER (frame), vbox2);
11859 tab = gtk_table_new (7, 2, FALSE);
11860 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
11862 label = gtk_label_new ("Orientation :");
11863 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
11864 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11866 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11868 pdata->omenu1 = build_option_menu (items1, 4, 0,
11869 progressbar_toggle_orientation,
11871 hbox = gtk_hbox_new (FALSE, 0);
11872 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
11873 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11875 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
11877 check = gtk_check_button_new_with_label ("Show text");
11878 g_signal_connect (check, "clicked",
11879 G_CALLBACK (toggle_show_text),
11881 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
11882 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11885 hbox = gtk_hbox_new (FALSE, 0);
11886 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
11887 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11890 label = gtk_label_new ("Format : ");
11891 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11893 pdata->entry = gtk_entry_new ();
11894 g_signal_connect (pdata->entry, "changed",
11895 G_CALLBACK (entry_changed),
11897 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
11898 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
11899 gtk_widget_set_size_request (pdata->entry, 100, -1);
11900 gtk_widget_set_sensitive (pdata->entry, FALSE);
11902 label = gtk_label_new ("Text align :");
11903 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
11904 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11906 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11908 hbox = gtk_hbox_new (FALSE, 0);
11909 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
11910 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11913 label = gtk_label_new ("x :");
11914 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11916 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11917 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
11918 g_signal_connect (adj, "value_changed",
11919 G_CALLBACK (adjust_align), pdata);
11920 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
11921 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
11923 label = gtk_label_new ("y :");
11924 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11926 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11927 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
11928 g_signal_connect (adj, "value_changed",
11929 G_CALLBACK (adjust_align), pdata);
11930 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
11931 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
11933 label = gtk_label_new ("Ellipsize text :");
11934 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
11935 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11937 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11938 pdata->elmenu = build_option_menu (ellipsize_items,
11939 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
11940 2, // PANGO_ELLIPSIZE_MIDDLE
11941 progressbar_toggle_ellipsize,
11943 hbox = gtk_hbox_new (FALSE, 0);
11944 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
11945 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11947 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
11949 label = gtk_label_new ("Bar Style :");
11950 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 13, 14,
11951 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11953 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11955 pdata->omenu2 = build_option_menu (items2, 2, 0,
11956 progressbar_toggle_bar_style,
11958 hbox = gtk_hbox_new (FALSE, 0);
11959 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 13, 14,
11960 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11962 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
11964 label = gtk_label_new ("Block count :");
11965 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 14, 15,
11966 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11968 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11970 hbox = gtk_hbox_new (FALSE, 0);
11971 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 14, 15,
11972 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11974 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
11975 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
11976 g_signal_connect (adj, "value_changed",
11977 G_CALLBACK (adjust_blocks), pdata);
11978 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
11979 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
11981 check = gtk_check_button_new_with_label ("Activity mode");
11982 g_signal_connect (check, "clicked",
11983 G_CALLBACK (toggle_activity_mode), pdata);
11984 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
11985 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11988 hbox = gtk_hbox_new (FALSE, 0);
11989 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 15, 16,
11990 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11992 label = gtk_label_new ("Step size : ");
11993 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11994 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
11995 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
11996 g_signal_connect (adj, "value_changed",
11997 G_CALLBACK (adjust_step), pdata);
11998 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
11999 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
12001 hbox = gtk_hbox_new (FALSE, 0);
12002 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 16, 17,
12003 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
12005 label = gtk_label_new ("Blocks : ");
12006 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
12007 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
12008 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
12009 g_signal_connect (adj, "value_changed",
12010 G_CALLBACK (adjust_act_blocks), pdata);
12011 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
12013 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
12015 button = gtk_button_new_with_label ("close");
12016 g_signal_connect_swapped (button, "clicked",
12017 G_CALLBACK (gtk_widget_destroy),
12019 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12020 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
12021 button, TRUE, TRUE, 0);
12022 gtk_widget_grab_default (button);
12025 if (!GTK_WIDGET_VISIBLE (pdata->window))
12026 gtk_widget_show_all (pdata->window);
12028 gtk_widget_destroy (pdata->window);
12040 GtkWidget *res_widget;
12044 find_widget (GtkWidget *widget, FindWidgetData *data)
12046 GtkAllocation new_allocation;
12050 new_allocation = widget->allocation;
12052 if (data->found || !GTK_WIDGET_MAPPED (widget))
12055 /* Note that in the following code, we only count the
12056 * position as being inside a WINDOW widget if it is inside
12057 * widget->window; points that are outside of widget->window
12058 * but within the allocation are not counted. This is consistent
12059 * with the way we highlight drag targets.
12061 if (!GTK_WIDGET_NO_WINDOW (widget))
12063 new_allocation.x = 0;
12064 new_allocation.y = 0;
12067 if (widget->parent && !data->first)
12069 GdkWindow *window = widget->window;
12070 while (window != widget->parent->window)
12072 gint tx, ty, twidth, theight;
12073 gdk_drawable_get_size (window, &twidth, &theight);
12075 if (new_allocation.x < 0)
12077 new_allocation.width += new_allocation.x;
12078 new_allocation.x = 0;
12080 if (new_allocation.y < 0)
12082 new_allocation.height += new_allocation.y;
12083 new_allocation.y = 0;
12085 if (new_allocation.x + new_allocation.width > twidth)
12086 new_allocation.width = twidth - new_allocation.x;
12087 if (new_allocation.y + new_allocation.height > theight)
12088 new_allocation.height = theight - new_allocation.y;
12090 gdk_window_get_position (window, &tx, &ty);
12091 new_allocation.x += tx;
12093 new_allocation.y += ty;
12096 window = gdk_window_get_parent (window);
12100 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
12101 (data->x < new_allocation.x + new_allocation.width) &&
12102 (data->y < new_allocation.y + new_allocation.height))
12104 /* First, check if the drag is in a valid drop site in
12105 * one of our children
12107 if (GTK_IS_CONTAINER (widget))
12109 FindWidgetData new_data = *data;
12111 new_data.x -= x_offset;
12112 new_data.y -= y_offset;
12113 new_data.found = FALSE;
12114 new_data.first = FALSE;
12116 gtk_container_forall (GTK_CONTAINER (widget),
12117 (GtkCallback)find_widget,
12120 data->found = new_data.found;
12122 data->res_widget = new_data.res_widget;
12125 /* If not, and this widget is registered as a drop site, check to
12126 * emit "drag_motion" to check if we are actually in
12131 data->found = TRUE;
12132 data->res_widget = widget;
12138 find_widget_at_pointer (GdkDisplay *display)
12140 GtkWidget *widget = NULL;
12141 GdkWindow *pointer_window;
12143 FindWidgetData data;
12145 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
12147 if (pointer_window)
12149 gpointer widget_ptr;
12151 gdk_window_get_user_data (pointer_window, &widget_ptr);
12152 widget = widget_ptr;
12157 gdk_window_get_pointer (widget->window,
12162 data.found = FALSE;
12165 find_widget (widget, &data);
12167 return data.res_widget;
12173 struct PropertiesData {
12174 GtkWidget **window;
12181 destroy_properties (GtkWidget *widget,
12182 struct PropertiesData *data)
12186 *data->window = NULL;
12187 data->window = NULL;
12192 gdk_cursor_unref (data->cursor);
12193 data->cursor = NULL;
12198 g_signal_handler_disconnect (widget, data->handler);
12206 property_query_event (GtkWidget *widget,
12208 struct PropertiesData *data)
12210 GtkWidget *res_widget = NULL;
12212 if (!data->in_query)
12215 if (event->type == GDK_BUTTON_RELEASE)
12217 gtk_grab_remove (widget);
12218 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
12221 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
12224 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
12225 gtk_widget_get_screen (widget));
12226 create_prop_editor (G_OBJECT (res_widget), 0);
12229 data->in_query = FALSE;
12236 query_properties (GtkButton *button,
12237 struct PropertiesData *data)
12241 g_signal_connect (button, "event",
12242 G_CALLBACK (property_query_event), data);
12246 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
12249 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
12251 GDK_BUTTON_RELEASE_MASK,
12256 gtk_grab_add (GTK_WIDGET (button));
12258 data->in_query = TRUE;
12262 create_properties (GtkWidget *widget)
12264 static GtkWidget *window = NULL;
12268 struct PropertiesData *data;
12270 data = g_new (struct PropertiesData, 1);
12271 data->window = &window;
12272 data->in_query = FALSE;
12273 data->cursor = NULL;
12278 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12280 gtk_window_set_screen (GTK_WINDOW (window),
12281 gtk_widget_get_screen (widget));
12283 data->handler = g_signal_connect (window, "destroy",
12284 G_CALLBACK (destroy_properties),
12287 gtk_window_set_title (GTK_WINDOW (window), "test properties");
12288 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12290 vbox = gtk_vbox_new (FALSE, 1);
12291 gtk_container_add (GTK_CONTAINER (window), vbox);
12293 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
12294 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
12296 button = gtk_button_new_with_label ("Query properties");
12297 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12298 g_signal_connect (button, "clicked",
12299 G_CALLBACK (query_properties),
12303 if (!GTK_WIDGET_VISIBLE (window))
12304 gtk_widget_show_all (window);
12306 gtk_widget_destroy (window);
12310 struct SnapshotData {
12311 GtkWidget *toplevel_button;
12312 GtkWidget **window;
12315 gboolean is_toplevel;
12320 destroy_snapshot_data (GtkWidget *widget,
12321 struct SnapshotData *data)
12324 *data->window = NULL;
12328 gdk_cursor_unref (data->cursor);
12329 data->cursor = NULL;
12334 g_signal_handler_disconnect (widget, data->handler);
12342 snapshot_widget_event (GtkWidget *widget,
12344 struct SnapshotData *data)
12346 GtkWidget *res_widget = NULL;
12348 if (!data->in_query)
12351 if (event->type == GDK_BUTTON_RELEASE)
12353 gtk_grab_remove (widget);
12354 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
12357 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
12358 if (data->is_toplevel && res_widget)
12359 res_widget = gtk_widget_get_toplevel (res_widget);
12363 GtkWidget *window, *image;
12365 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12366 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
12367 gtk_widget_realize (window);
12368 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
12370 /* this branch is needed to convert ARGB -> RGB */
12373 gdk_drawable_get_size (pixmap, &width, &height);
12374 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
12375 gtk_widget_get_colormap (res_widget),
12379 image = gtk_image_new_from_pixbuf (pixbuf);
12380 g_object_unref (pixbuf);
12383 image = gtk_image_new_from_pixmap (pixmap, NULL);
12384 gtk_container_add (GTK_CONTAINER (window), image);
12385 g_object_unref (pixmap);
12386 gtk_widget_show_all (window);
12389 data->in_query = FALSE;
12396 snapshot_widget (GtkButton *button,
12397 struct SnapshotData *data)
12401 g_signal_connect (button, "event",
12402 G_CALLBACK (snapshot_widget_event), data);
12404 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
12407 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
12410 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
12412 GDK_BUTTON_RELEASE_MASK,
12417 gtk_grab_add (GTK_WIDGET (button));
12419 data->in_query = TRUE;
12423 create_snapshot (GtkWidget *widget)
12425 static GtkWidget *window = NULL;
12428 struct SnapshotData *data;
12430 data = g_new (struct SnapshotData, 1);
12431 data->window = &window;
12432 data->in_query = FALSE;
12433 data->cursor = NULL;
12438 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12440 gtk_window_set_screen (GTK_WINDOW (window),
12441 gtk_widget_get_screen (widget));
12443 data->handler = g_signal_connect (window, "destroy",
12444 G_CALLBACK (destroy_snapshot_data),
12447 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
12448 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12450 vbox = gtk_vbox_new (FALSE, 1);
12451 gtk_container_add (GTK_CONTAINER (window), vbox);
12453 button = gtk_button_new_with_label ("Snapshot widget");
12454 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12455 g_signal_connect (button, "clicked",
12456 G_CALLBACK (snapshot_widget),
12459 button = gtk_button_new_with_label ("Snapshot toplevel");
12460 data->toplevel_button = button;
12461 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12462 g_signal_connect (button, "clicked",
12463 G_CALLBACK (snapshot_widget),
12467 if (!GTK_WIDGET_VISIBLE (window))
12468 gtk_widget_show_all (window);
12470 gtk_widget_destroy (window);
12480 static int color_idle = 0;
12483 color_idle_func (GtkWidget *preview)
12485 static int count = 1;
12489 for (i = 0; i < 256; i++)
12491 for (j = 0, k = 0; j < 256; j++)
12493 buf[k+0] = i + count;
12495 buf[k+2] = j + count;
12499 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12504 gtk_widget_queue_draw (preview);
12505 gdk_window_process_updates (preview->window, TRUE);
12511 color_preview_destroy (GtkWidget *widget,
12512 GtkWidget **window)
12514 gtk_idle_remove (color_idle);
12521 create_color_preview (GtkWidget *widget)
12523 static GtkWidget *window = NULL;
12524 GtkWidget *preview;
12530 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12532 gtk_window_set_screen (GTK_WINDOW (window),
12533 gtk_widget_get_screen (widget));
12535 g_signal_connect (window, "destroy",
12536 G_CALLBACK (color_preview_destroy),
12539 gtk_window_set_title (GTK_WINDOW (window), "test");
12540 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12542 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
12543 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
12544 gtk_container_add (GTK_CONTAINER (window), preview);
12546 for (i = 0; i < 256; i++)
12548 for (j = 0, k = 0; j < 256; j++)
12556 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12559 color_idle = gtk_idle_add ((GtkFunction) color_idle_func, preview);
12562 if (!GTK_WIDGET_VISIBLE (window))
12563 gtk_widget_show_all (window);
12565 gtk_widget_destroy (window);
12572 static int gray_idle = 0;
12575 gray_idle_func (GtkWidget *preview)
12577 static int count = 1;
12581 for (i = 0; i < 256; i++)
12583 for (j = 0; j < 256; j++)
12584 buf[j] = i + j + count;
12586 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12591 gtk_widget_draw (preview, NULL);
12597 gray_preview_destroy (GtkWidget *widget,
12598 GtkWidget **window)
12600 gtk_idle_remove (gray_idle);
12607 create_gray_preview (GtkWidget *widget)
12609 static GtkWidget *window = NULL;
12610 GtkWidget *preview;
12616 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12618 gtk_window_set_screen (GTK_WINDOW (window),
12619 gtk_widget_get_screen (widget));
12621 g_signal_connect (window, "destroy",
12622 G_CALLBACK (gray_preview_destroy),
12625 gtk_window_set_title (GTK_WINDOW (window), "test");
12626 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12628 preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
12629 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
12630 gtk_container_add (GTK_CONTAINER (window), preview);
12632 for (i = 0; i < 256; i++)
12634 for (j = 0; j < 256; j++)
12637 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12640 gray_idle = gtk_idle_add ((GtkFunction) gray_idle_func, preview);
12643 if (!GTK_WIDGET_VISIBLE (window))
12644 gtk_widget_show_all (window);
12646 gtk_widget_destroy (window);
12655 selection_test_received (GtkWidget *list, GtkSelectionData *data)
12658 GtkWidget *list_item;
12662 if (data->length < 0)
12664 g_print ("Selection retrieval failed\n");
12667 if (data->type != GDK_SELECTION_TYPE_ATOM)
12669 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
12673 /* Clear out any current list items */
12675 gtk_list_clear_items (GTK_LIST(list), 0, -1);
12677 /* Add new items to list */
12679 atoms = (GdkAtom *)data->data;
12682 l = data->length / sizeof (GdkAtom);
12683 for (i = 0; i < l; i++)
12686 name = gdk_atom_name (atoms[i]);
12689 list_item = gtk_list_item_new_with_label (name);
12693 list_item = gtk_list_item_new_with_label ("(bad atom)");
12695 gtk_widget_show (list_item);
12696 item_list = g_list_append (item_list, list_item);
12699 gtk_list_append_items (GTK_LIST (list), item_list);
12705 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
12707 static GdkAtom targets_atom = GDK_NONE;
12709 if (targets_atom == GDK_NONE)
12710 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
12712 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
12717 create_selection_test (GtkWidget *widget)
12719 static GtkWidget *window = NULL;
12722 GtkWidget *scrolled_win;
12728 window = gtk_dialog_new ();
12730 gtk_window_set_screen (GTK_WINDOW (window),
12731 gtk_widget_get_screen (widget));
12733 g_signal_connect (window, "destroy",
12734 G_CALLBACK (gtk_widget_destroyed),
12737 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
12738 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12740 /* Create the list */
12742 vbox = gtk_vbox_new (FALSE, 5);
12743 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
12744 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
12747 label = gtk_label_new ("Gets available targets for current selection");
12748 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12750 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
12751 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
12752 GTK_POLICY_AUTOMATIC,
12753 GTK_POLICY_AUTOMATIC);
12754 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
12755 gtk_widget_set_size_request (scrolled_win, 100, 200);
12757 list = gtk_list_new ();
12758 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
12760 g_signal_connect (list, "selection_received",
12761 G_CALLBACK (selection_test_received), NULL);
12763 /* .. And create some buttons */
12764 button = gtk_button_new_with_label ("Get Targets");
12765 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12766 button, TRUE, TRUE, 0);
12768 g_signal_connect (button, "clicked",
12769 G_CALLBACK (selection_test_get_targets), list);
12771 button = gtk_button_new_with_label ("Quit");
12772 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12773 button, TRUE, TRUE, 0);
12775 g_signal_connect_swapped (button, "clicked",
12776 G_CALLBACK (gtk_widget_destroy),
12780 if (!GTK_WIDGET_VISIBLE (window))
12781 gtk_widget_show_all (window);
12783 gtk_widget_destroy (window);
12791 create_gamma_curve (GtkWidget *widget)
12793 static GtkWidget *window = NULL, *curve;
12794 static int count = 0;
12801 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12802 gtk_window_set_screen (GTK_WINDOW (window),
12803 gtk_widget_get_screen (widget));
12805 gtk_window_set_title (GTK_WINDOW (window), "test");
12806 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12808 g_signal_connect (window, "destroy",
12809 G_CALLBACK(gtk_widget_destroyed),
12812 curve = gtk_gamma_curve_new ();
12813 gtk_container_add (GTK_CONTAINER (window), curve);
12814 gtk_widget_show (curve);
12817 max = 127 + (count % 2)*128;
12818 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
12820 for (i = 0; i < max; ++i)
12821 vec[i] = (127 / sqrt (max)) * sqrt (i);
12822 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
12825 if (!GTK_WIDGET_VISIBLE (window))
12826 gtk_widget_show (window);
12827 else if (count % 4 == 3)
12829 gtk_widget_destroy (window);
12840 static int scroll_test_pos = 0.0;
12843 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
12844 GtkAdjustment *adj)
12847 gint imin, imax, jmin, jmax;
12849 imin = (event->area.x) / 10;
12850 imax = (event->area.x + event->area.width + 9) / 10;
12852 jmin = ((int)adj->value + event->area.y) / 10;
12853 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
12855 gdk_window_clear_area (widget->window,
12856 event->area.x, event->area.y,
12857 event->area.width, event->area.height);
12859 for (i=imin; i<imax; i++)
12860 for (j=jmin; j<jmax; j++)
12862 gdk_draw_rectangle (widget->window,
12863 widget->style->black_gc,
12865 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
12871 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
12872 GtkAdjustment *adj)
12874 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
12875 -adj->page_increment / 2:
12876 adj->page_increment / 2);
12877 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
12878 gtk_adjustment_set_value (adj, new_value);
12884 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
12885 GtkAdjustment *adj)
12887 adj->page_increment = 0.9 * widget->allocation.height;
12888 adj->page_size = widget->allocation.height;
12890 g_signal_emit_by_name (adj, "changed");
12894 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
12896 /* gint source_min = (int)adj->value - scroll_test_pos; */
12899 dy = scroll_test_pos - (int)adj->value;
12900 scroll_test_pos = adj->value;
12902 if (!GTK_WIDGET_DRAWABLE (widget))
12904 gdk_window_scroll (widget->window, 0, dy);
12905 gdk_window_process_updates (widget->window, FALSE);
12910 create_scroll_test (GtkWidget *widget)
12912 static GtkWidget *window = NULL;
12914 GtkWidget *drawing_area;
12915 GtkWidget *scrollbar;
12917 GtkAdjustment *adj;
12918 GdkGeometry geometry;
12919 GdkWindowHints geometry_mask;
12923 window = gtk_dialog_new ();
12925 gtk_window_set_screen (GTK_WINDOW (window),
12926 gtk_widget_get_screen (widget));
12928 g_signal_connect (window, "destroy",
12929 G_CALLBACK (gtk_widget_destroyed),
12932 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
12933 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12935 hbox = gtk_hbox_new (FALSE, 0);
12936 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
12938 gtk_widget_show (hbox);
12940 drawing_area = gtk_drawing_area_new ();
12941 gtk_widget_set_size_request (drawing_area, 200, 200);
12942 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
12943 gtk_widget_show (drawing_area);
12945 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
12947 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
12948 scroll_test_pos = 0.0;
12950 scrollbar = gtk_vscrollbar_new (adj);
12951 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
12952 gtk_widget_show (scrollbar);
12954 g_signal_connect (drawing_area, "expose_event",
12955 G_CALLBACK (scroll_test_expose), adj);
12956 g_signal_connect (drawing_area, "configure_event",
12957 G_CALLBACK (scroll_test_configure), adj);
12958 g_signal_connect (drawing_area, "scroll_event",
12959 G_CALLBACK (scroll_test_scroll), adj);
12961 g_signal_connect (adj, "value_changed",
12962 G_CALLBACK (scroll_test_adjustment_changed),
12965 /* .. And create some buttons */
12967 button = gtk_button_new_with_label ("Quit");
12968 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12969 button, TRUE, TRUE, 0);
12971 g_signal_connect_swapped (button, "clicked",
12972 G_CALLBACK (gtk_widget_destroy),
12974 gtk_widget_show (button);
12976 /* Set up gridded geometry */
12978 geometry_mask = GDK_HINT_MIN_SIZE |
12979 GDK_HINT_BASE_SIZE |
12980 GDK_HINT_RESIZE_INC;
12982 geometry.min_width = 20;
12983 geometry.min_height = 20;
12984 geometry.base_width = 0;
12985 geometry.base_height = 0;
12986 geometry.width_inc = 10;
12987 geometry.height_inc = 10;
12989 gtk_window_set_geometry_hints (GTK_WINDOW (window),
12990 drawing_area, &geometry, geometry_mask);
12993 if (!GTK_WIDGET_VISIBLE (window))
12994 gtk_widget_show (window);
12996 gtk_widget_destroy (window);
13003 static int timer = 0;
13006 timeout_test (GtkWidget *label)
13008 static int count = 0;
13009 static char buffer[32];
13011 sprintf (buffer, "count: %d", ++count);
13012 gtk_label_set_text (GTK_LABEL (label), buffer);
13018 start_timeout_test (GtkWidget *widget,
13023 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
13028 stop_timeout_test (GtkWidget *widget,
13033 gtk_timeout_remove (timer);
13039 destroy_timeout_test (GtkWidget *widget,
13040 GtkWidget **window)
13042 stop_timeout_test (NULL, NULL);
13048 create_timeout_test (GtkWidget *widget)
13050 static GtkWidget *window = NULL;
13056 window = gtk_dialog_new ();
13058 gtk_window_set_screen (GTK_WINDOW (window),
13059 gtk_widget_get_screen (widget));
13061 g_signal_connect (window, "destroy",
13062 G_CALLBACK (destroy_timeout_test),
13065 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
13066 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
13068 label = gtk_label_new ("count: 0");
13069 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
13070 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
13071 label, TRUE, TRUE, 0);
13072 gtk_widget_show (label);
13074 button = gtk_button_new_with_label ("close");
13075 g_signal_connect_swapped (button, "clicked",
13076 G_CALLBACK (gtk_widget_destroy),
13078 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13079 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13080 button, TRUE, TRUE, 0);
13081 gtk_widget_grab_default (button);
13082 gtk_widget_show (button);
13084 button = gtk_button_new_with_label ("start");
13085 g_signal_connect (button, "clicked",
13086 G_CALLBACK(start_timeout_test),
13088 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13089 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13090 button, TRUE, TRUE, 0);
13091 gtk_widget_show (button);
13093 button = gtk_button_new_with_label ("stop");
13094 g_signal_connect (button, "clicked",
13095 G_CALLBACK (stop_timeout_test),
13097 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13098 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13099 button, TRUE, TRUE, 0);
13100 gtk_widget_show (button);
13103 if (!GTK_WIDGET_VISIBLE (window))
13104 gtk_widget_show (window);
13106 gtk_widget_destroy (window);
13113 static int idle_id = 0;
13116 idle_test (GtkWidget *label)
13118 static int count = 0;
13119 static char buffer[32];
13121 sprintf (buffer, "count: %d", ++count);
13122 gtk_label_set_text (GTK_LABEL (label), buffer);
13128 start_idle_test (GtkWidget *widget,
13133 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
13138 stop_idle_test (GtkWidget *widget,
13143 gtk_idle_remove (idle_id);
13149 destroy_idle_test (GtkWidget *widget,
13150 GtkWidget **window)
13152 stop_idle_test (NULL, NULL);
13158 toggle_idle_container (GObject *button,
13159 GtkContainer *container)
13161 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
13165 create_idle_test (GtkWidget *widget)
13167 static GtkWidget *window = NULL;
13170 GtkWidget *container;
13174 GtkWidget *button2;
13178 window = gtk_dialog_new ();
13180 gtk_window_set_screen (GTK_WINDOW (window),
13181 gtk_widget_get_screen (widget));
13183 g_signal_connect (window, "destroy",
13184 G_CALLBACK (destroy_idle_test),
13187 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
13188 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
13190 label = gtk_label_new ("count: 0");
13191 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
13192 gtk_widget_show (label);
13195 g_object_new (GTK_TYPE_HBOX,
13197 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
13198 * "GtkWidget::visible", TRUE,
13203 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
13204 container, TRUE, TRUE, 0);
13207 g_object_new (GTK_TYPE_FRAME,
13209 "label", "Label Container",
13211 "parent", GTK_DIALOG (window)->vbox,
13214 g_object_new (GTK_TYPE_VBOX,
13219 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
13220 "label", "Resize-Parent",
13221 "user_data", (void*)GTK_RESIZE_PARENT,
13225 "signal::clicked", toggle_idle_container, container,
13227 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
13228 "label", "Resize-Queue",
13229 "user_data", (void*)GTK_RESIZE_QUEUE,
13234 g_object_connect (button,
13235 "signal::clicked", toggle_idle_container, container,
13237 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
13238 "label", "Resize-Immediate",
13239 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
13241 g_object_connect (button2,
13242 "signal::clicked", toggle_idle_container, container,
13244 g_object_set (button2,
13250 button = gtk_button_new_with_label ("close");
13251 g_signal_connect_swapped (button, "clicked",
13252 G_CALLBACK (gtk_widget_destroy),
13254 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13255 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13256 button, TRUE, TRUE, 0);
13257 gtk_widget_grab_default (button);
13258 gtk_widget_show (button);
13260 button = gtk_button_new_with_label ("start");
13261 g_signal_connect (button, "clicked",
13262 G_CALLBACK (start_idle_test),
13264 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13265 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13266 button, TRUE, TRUE, 0);
13267 gtk_widget_show (button);
13269 button = gtk_button_new_with_label ("stop");
13270 g_signal_connect (button, "clicked",
13271 G_CALLBACK (stop_idle_test),
13273 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13274 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13275 button, TRUE, TRUE, 0);
13276 gtk_widget_show (button);
13279 if (!GTK_WIDGET_VISIBLE (window))
13280 gtk_widget_show (window);
13282 gtk_widget_destroy (window);
13290 reload_all_rc_files (void)
13292 static GdkAtom atom_rcfiles = GDK_NONE;
13294 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
13298 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
13300 for(i = 0; i < 5; i++)
13301 send_event->client.data.l[i] = 0;
13302 send_event->client.data_format = 32;
13303 send_event->client.message_type = atom_rcfiles;
13304 gdk_event_send_clientmessage_toall (send_event);
13306 gdk_event_free (send_event);
13310 create_rc_file (GtkWidget *widget)
13312 static GtkWidget *window = NULL;
13320 window = gtk_dialog_new ();
13322 gtk_window_set_screen (GTK_WINDOW (window),
13323 gtk_widget_get_screen (widget));
13325 g_signal_connect (window, "destroy",
13326 G_CALLBACK (gtk_widget_destroyed),
13329 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
13330 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
13332 vbox = gtk_vbox_new (FALSE, 0);
13333 gtk_container_add (GTK_CONTAINER (frame), vbox);
13335 label = gtk_label_new ("This label should be red");
13336 gtk_widget_set_name (label, "testgtk-red-label");
13337 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13339 label = gtk_label_new ("This label should be green");
13340 gtk_widget_set_name (label, "testgtk-green-label");
13341 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13343 label = gtk_label_new ("This label should be blue");
13344 gtk_widget_set_name (label, "testgtk-blue-label");
13345 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13347 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
13348 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
13350 button = gtk_button_new_with_label ("Reload");
13351 g_signal_connect (button, "clicked",
13352 G_CALLBACK (gtk_rc_reparse_all), NULL);
13353 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13354 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13355 button, TRUE, TRUE, 0);
13356 gtk_widget_grab_default (button);
13358 button = gtk_button_new_with_label ("Reload All");
13359 g_signal_connect (button, "clicked",
13360 G_CALLBACK (reload_all_rc_files), NULL);
13361 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13362 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13363 button, TRUE, TRUE, 0);
13365 button = gtk_button_new_with_label ("Close");
13366 g_signal_connect_swapped (button, "clicked",
13367 G_CALLBACK (gtk_widget_destroy),
13369 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13370 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13371 button, TRUE, TRUE, 0);
13374 if (!GTK_WIDGET_VISIBLE (window))
13375 gtk_widget_show_all (window);
13377 gtk_widget_destroy (window);
13381 * Test of recursive mainloop
13385 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
13392 create_mainloop (GtkWidget *widget)
13394 static GtkWidget *window = NULL;
13400 window = gtk_dialog_new ();
13402 gtk_window_set_screen (GTK_WINDOW (window),
13403 gtk_widget_get_screen (widget));
13405 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
13407 g_signal_connect (window, "destroy",
13408 G_CALLBACK (mainloop_destroyed),
13411 label = gtk_label_new ("In recursive main loop...");
13412 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
13414 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
13416 gtk_widget_show (label);
13418 button = gtk_button_new_with_label ("Leave");
13419 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
13422 g_signal_connect_swapped (button, "clicked",
13423 G_CALLBACK (gtk_widget_destroy),
13426 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13427 gtk_widget_grab_default (button);
13429 gtk_widget_show (button);
13432 if (!GTK_WIDGET_VISIBLE (window))
13434 gtk_widget_show (window);
13436 g_print ("create_mainloop: start\n");
13438 g_print ("create_mainloop: done\n");
13441 gtk_widget_destroy (window);
13445 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
13450 gint imin, imax, jmin, jmax;
13452 layout = GTK_LAYOUT (widget);
13454 if (event->window != layout->bin_window)
13457 imin = (event->area.x) / 10;
13458 imax = (event->area.x + event->area.width + 9) / 10;
13460 jmin = (event->area.y) / 10;
13461 jmax = (event->area.y + event->area.height + 9) / 10;
13463 for (i=imin; i<imax; i++)
13464 for (j=jmin; j<jmax; j++)
13466 gdk_draw_rectangle (layout->bin_window,
13467 widget->style->black_gc,
13475 void create_layout (GtkWidget *widget)
13477 static GtkWidget *window = NULL;
13479 GtkWidget *scrolledwindow;
13488 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13489 gtk_window_set_screen (GTK_WINDOW (window),
13490 gtk_widget_get_screen (widget));
13492 g_signal_connect (window, "destroy",
13493 G_CALLBACK (gtk_widget_destroyed),
13496 gtk_window_set_title (GTK_WINDOW (window), "Layout");
13497 gtk_widget_set_size_request (window, 200, 200);
13499 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
13500 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
13502 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
13503 GTK_CORNER_TOP_RIGHT);
13505 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
13507 layout = gtk_layout_new (NULL, NULL);
13508 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
13510 /* We set step sizes here since GtkLayout does not set
13513 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
13514 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
13516 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
13517 g_signal_connect (layout, "expose_event",
13518 G_CALLBACK (layout_expose_handler), NULL);
13520 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
13522 for (i=0 ; i < 16 ; i++)
13523 for (j=0 ; j < 16 ; j++)
13525 sprintf(buf, "Button %d, %d", i, j);
13527 button = gtk_button_new_with_label (buf);
13529 button = gtk_label_new (buf);
13531 gtk_layout_put (GTK_LAYOUT (layout), button,
13535 for (i=16; i < 1280; i++)
13537 sprintf(buf, "Button %d, %d", i, 0);
13539 button = gtk_button_new_with_label (buf);
13541 button = gtk_label_new (buf);
13543 gtk_layout_put (GTK_LAYOUT (layout), button,
13548 if (!GTK_WIDGET_VISIBLE (window))
13549 gtk_widget_show_all (window);
13551 gtk_widget_destroy (window);
13555 create_styles (GtkWidget *widget)
13557 static GtkWidget *window = NULL;
13562 static GdkColor red = { 0, 0xffff, 0, 0 };
13563 static GdkColor green = { 0, 0, 0xffff, 0 };
13564 static GdkColor blue = { 0, 0, 0, 0xffff };
13565 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
13566 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
13567 PangoFontDescription *font_desc;
13569 GtkRcStyle *rc_style;
13573 window = gtk_dialog_new ();
13574 gtk_window_set_screen (GTK_WINDOW (window),
13575 gtk_widget_get_screen (widget));
13577 g_signal_connect (window, "destroy",
13578 G_CALLBACK (gtk_widget_destroyed),
13582 button = gtk_button_new_with_label ("Close");
13583 g_signal_connect_swapped (button, "clicked",
13584 G_CALLBACK (gtk_widget_destroy),
13586 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13587 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13588 button, TRUE, TRUE, 0);
13589 gtk_widget_show (button);
13591 vbox = gtk_vbox_new (FALSE, 5);
13592 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
13593 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
13595 label = gtk_label_new ("Font:");
13596 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13597 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13599 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
13601 button = gtk_button_new_with_label ("Some Text");
13602 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
13603 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13605 label = gtk_label_new ("Foreground:");
13606 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13607 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13609 button = gtk_button_new_with_label ("Some Text");
13610 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
13611 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13613 label = gtk_label_new ("Background:");
13614 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13615 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13617 button = gtk_button_new_with_label ("Some Text");
13618 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
13619 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13621 label = gtk_label_new ("Text:");
13622 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13623 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13625 entry = gtk_entry_new ();
13626 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13627 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
13628 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13630 label = gtk_label_new ("Base:");
13631 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13632 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13634 entry = gtk_entry_new ();
13635 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13636 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
13637 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13639 label = gtk_label_new ("Cursor:");
13640 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13641 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13643 entry = gtk_entry_new ();
13644 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13645 gtk_widget_modify_cursor (entry, &red, &red);
13646 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13648 label = gtk_label_new ("Multiple:");
13649 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13650 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13652 button = gtk_button_new_with_label ("Some Text");
13654 rc_style = gtk_rc_style_new ();
13656 rc_style->font_desc = pango_font_description_copy (font_desc);
13657 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
13658 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
13659 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
13660 rc_style->fg[GTK_STATE_NORMAL] = yellow;
13661 rc_style->bg[GTK_STATE_NORMAL] = blue;
13662 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
13663 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
13664 rc_style->fg[GTK_STATE_ACTIVE] = red;
13665 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
13666 rc_style->xthickness = 5;
13667 rc_style->ythickness = 5;
13669 gtk_widget_modify_style (button, rc_style);
13670 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
13672 g_object_unref (rc_style);
13674 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13677 if (!GTK_WIDGET_VISIBLE (window))
13678 gtk_widget_show_all (window);
13680 gtk_widget_destroy (window);
13684 * Main Window and Exit
13688 do_exit (GtkWidget *widget, GtkWidget *window)
13690 gtk_widget_destroy (window);
13696 void (*func) (GtkWidget *widget);
13697 gboolean do_not_benchmark;
13700 { "alpha window", create_alpha_window },
13702 /* dog slow on NT, no working at all on 9x */
13703 { "big windows", create_big_windows, TRUE },
13705 { "big windows", create_big_windows },
13707 { "button box", create_button_box },
13708 { "buttons", create_buttons },
13709 { "check buttons", create_check_buttons },
13710 { "clist", create_clist},
13711 { "color selection", create_color_selection },
13712 { "composited window", create_composited_window },
13713 { "ctree", create_ctree },
13714 { "cursors", create_cursors },
13715 { "dialog", create_dialog, TRUE },
13716 { "display & screen", create_display_screen, TRUE },
13717 { "entry", create_entry },
13718 { "event box", create_event_box },
13719 { "event watcher", create_event_watcher },
13720 { "expander", create_expander },
13721 { "file selection", create_file_selection },
13722 { "flipping", create_flipping },
13723 { "focus", create_focus },
13724 { "font selection", create_font_selection },
13725 { "gamma curve", create_gamma_curve, TRUE },
13726 { "gridded geometry", create_gridded_geometry },
13727 { "handle box", create_handle_box },
13728 { "image from drawable", create_get_image },
13729 { "image", create_image },
13730 { "item factory", create_item_factory },
13731 { "key lookup", create_key_lookup },
13732 { "labels", create_labels },
13733 { "layout", create_layout },
13734 { "list", create_list },
13735 { "menus", create_menus },
13736 { "message dialog", create_message_dialog },
13737 { "modal window", create_modal_window, TRUE },
13738 { "notebook", create_notebook },
13739 { "panes", create_panes },
13740 { "paned keyboard", create_paned_keyboard_navigation },
13741 { "pixmap", create_pixmap },
13742 { "preview color", create_color_preview, TRUE },
13743 { "preview gray", create_gray_preview, TRUE },
13744 { "progress bar", create_progress_bar },
13745 { "properties", create_properties },
13746 { "radio buttons", create_radio_buttons },
13747 { "range controls", create_range_controls },
13748 { "rc file", create_rc_file },
13749 { "reparent", create_reparent },
13750 { "resize grips", create_resize_grips },
13751 { "rotated label", create_rotated_label },
13752 { "rotated text", create_rotated_text },
13753 { "rulers", create_rulers },
13754 { "saved position", create_saved_position },
13755 { "scrolled windows", create_scrolled_windows },
13756 { "shapes", create_shapes },
13757 { "size groups", create_size_groups },
13758 { "snapshot", create_snapshot },
13759 { "spinbutton", create_spins },
13760 { "statusbar", create_statusbar },
13761 { "styles", create_styles },
13762 { "test idle", create_idle_test },
13763 { "test mainloop", create_mainloop, TRUE },
13764 { "test scrolling", create_scroll_test },
13765 { "test selection", create_selection_test },
13766 { "test timeout", create_timeout_test },
13767 { "text", create_text },
13768 { "toggle buttons", create_toggle_buttons },
13769 { "toolbar", create_toolbar },
13770 { "tooltips", create_tooltips },
13771 { "tree", create_tree_mode_window},
13772 { "WM hints", create_wmhints },
13773 { "window sizing", create_window_sizing },
13774 { "window states", create_window_states }
13776 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
13779 create_main_window (void)
13784 GtkWidget *scrolled_window;
13788 GtkWidget *separator;
13789 GdkGeometry geometry;
13792 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13793 gtk_widget_set_name (window, "main window");
13794 gtk_widget_set_uposition (window, 50, 20);
13795 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
13797 geometry.min_width = -1;
13798 geometry.min_height = -1;
13799 geometry.max_width = -1;
13800 geometry.max_height = G_MAXSHORT;
13801 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
13803 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
13805 g_signal_connect (window, "destroy",
13806 G_CALLBACK (gtk_main_quit),
13808 g_signal_connect (window, "delete-event",
13809 G_CALLBACK (gtk_false),
13812 box1 = gtk_vbox_new (FALSE, 0);
13813 gtk_container_add (GTK_CONTAINER (window), box1);
13815 if (gtk_micro_version > 0)
13820 gtk_micro_version);
13825 gtk_minor_version);
13827 label = gtk_label_new (buffer);
13828 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
13829 gtk_widget_set_name (label, "testgtk-version-label");
13831 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
13832 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
13833 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
13835 GTK_POLICY_AUTOMATIC);
13836 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
13838 box2 = gtk_vbox_new (FALSE, 0);
13839 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
13840 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
13841 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
13842 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
13843 gtk_widget_show (box2);
13845 for (i = 0; i < nbuttons; i++)
13847 button = gtk_button_new_with_label (buttons[i].label);
13848 if (buttons[i].func)
13849 g_signal_connect (button,
13851 G_CALLBACK(buttons[i].func),
13854 gtk_widget_set_sensitive (button, FALSE);
13855 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
13858 separator = gtk_hseparator_new ();
13859 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
13861 box2 = gtk_vbox_new (FALSE, 10);
13862 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
13863 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
13865 button = gtk_button_new_with_mnemonic ("_Close");
13866 g_signal_connect (button, "clicked",
13867 G_CALLBACK (do_exit),
13869 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
13870 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13871 gtk_widget_grab_default (button);
13873 gtk_widget_show_all (window);
13879 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
13880 G_FILE_TEST_EXISTS))
13882 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
13883 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
13888 pad (const char *str, int to)
13890 static char buf[256];
13891 int len = strlen (str);
13894 for (i = 0; i < to; i++)
13899 memcpy (buf, str, len);
13905 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
13907 fn (widget); /* on */
13908 while (g_main_context_iteration (NULL, FALSE));
13909 fn (widget); /* off */
13910 while (g_main_context_iteration (NULL, FALSE));
13914 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
13920 static gboolean printed_headers = FALSE;
13922 if (!printed_headers) {
13923 g_print ("Test Iters First Other\n");
13924 g_print ("-------------------- ----- ---------- ----------\n");
13925 printed_headers = TRUE;
13928 g_get_current_time (&tv0);
13929 bench_iteration (widget, fn);
13930 g_get_current_time (&tv1);
13932 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
13933 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
13935 g_get_current_time (&tv0);
13936 for (n = 0; n < num - 1; n++)
13937 bench_iteration (widget, fn);
13938 g_get_current_time (&tv1);
13939 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
13940 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
13942 g_print ("%s %5d ", pad (name, 20), num);
13944 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
13946 g_print ("%10.1f\n", dt_first);
13950 do_bench (char* what, int num)
13954 void (* fn) (GtkWidget *widget);
13956 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13958 if (g_ascii_strcasecmp (what, "ALL") == 0)
13960 for (i = 0; i < nbuttons; i++)
13962 if (!buttons[i].do_not_benchmark)
13963 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
13970 for (i = 0; i < nbuttons; i++)
13972 if (strcmp (buttons[i].label, what) == 0)
13974 fn = buttons[i].func;
13980 g_print ("Can't bench: \"%s\" not found.\n", what);
13982 do_real_bench (widget, fn, buttons[i].label, num);
13989 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
13994 main (int argc, char *argv[])
13996 GtkBindingSet *binding_set;
13998 gboolean done_benchmarks = FALSE;
14000 srand (time (NULL));
14004 /* Check to see if we are being run from the correct
14007 if (file_exists ("testgtkrc"))
14008 gtk_rc_add_default_file ("testgtkrc");
14009 else if (file_exists ("tests/testgtkrc"))
14010 gtk_rc_add_default_file ("tests/testgtkrc");
14012 g_warning ("Couldn't find file \"testgtkrc\".");
14014 g_set_application_name ("GTK+ Test Program");
14016 gtk_init (&argc, &argv);
14018 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
14027 for (i = 1; i < argc; i++)
14029 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
14036 nextarg = strchr (argv[i], '=');
14047 count = strchr (nextarg, ':');
14050 what = g_strndup (nextarg, count - nextarg);
14052 num = atoi (count);
14057 what = g_strdup (nextarg);
14059 do_bench (what, num ? num : 1);
14060 done_benchmarks = TRUE;
14065 if (done_benchmarks)
14070 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
14071 gtk_binding_entry_add_signal (binding_set,
14072 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
14075 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
14077 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
14081 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
14082 " fg[NORMAL] = \"#ff0000\"\n"
14083 " font = \"Sans 18\"\n"
14085 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
14087 create_main_window ();
14093 while (g_main_context_pending (NULL))
14094 g_main_context_iteration (NULL, FALSE);
14097 while (g_main_context_pending (NULL))
14098 g_main_context_iteration (NULL, FALSE);