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 set_direction_recurse (GtkWidget *widget,
8289 GtkTextDirection *dir = data;
8291 gtk_widget_set_direction (widget, *dir);
8292 if (GTK_IS_CONTAINER (widget))
8293 gtk_container_foreach (GTK_CONTAINER (widget),
8294 set_direction_recurse,
8299 create_forward_back (const char *title,
8300 GtkTextDirection text_dir)
8302 GtkWidget *frame = gtk_frame_new (title);
8303 GtkWidget *bbox = gtk_hbutton_box_new ();
8304 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
8305 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
8307 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
8309 gtk_container_add (GTK_CONTAINER (frame), bbox);
8310 gtk_container_add (GTK_CONTAINER (bbox), back_button);
8311 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
8313 set_direction_recurse (frame, &text_dir);
8319 create_flipping (GtkWidget *widget)
8321 static GtkWidget *window = NULL;
8322 GtkWidget *check_button, *button;
8326 window = gtk_dialog_new ();
8328 gtk_window_set_screen (GTK_WINDOW (window),
8329 gtk_widget_get_screen (widget));
8331 g_signal_connect (window, "destroy",
8332 G_CALLBACK (gtk_widget_destroyed),
8335 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
8337 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
8338 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8339 check_button, TRUE, TRUE, 0);
8341 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8342 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
8345 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8346 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
8349 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8350 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
8353 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
8354 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
8356 g_signal_connect (check_button, "toggled",
8357 G_CALLBACK (flipping_toggled_cb), NULL);
8359 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
8361 button = gtk_button_new_with_label ("Close");
8362 g_signal_connect_swapped (button, "clicked",
8363 G_CALLBACK (gtk_widget_destroy), window);
8364 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
8365 button, TRUE, TRUE, 0);
8368 if (!GTK_WIDGET_VISIBLE (window))
8369 gtk_widget_show_all (window);
8371 gtk_widget_destroy (window);
8379 make_focus_table (GList **list)
8384 table = gtk_table_new (5, 5, FALSE);
8397 widget = gtk_entry_new ();
8399 widget = gtk_button_new_with_label ("Foo");
8401 *list = g_list_prepend (*list, widget);
8403 gtk_table_attach (GTK_TABLE (table),
8407 GTK_EXPAND | GTK_FILL,
8408 GTK_EXPAND | GTK_FILL,
8417 *list = g_list_reverse (*list);
8423 create_focus (GtkWidget *widget)
8425 static GtkWidget *window = NULL;
8433 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
8439 gtk_window_set_screen (GTK_WINDOW (window),
8440 gtk_widget_get_screen (widget));
8442 g_signal_connect (window, "destroy",
8443 G_CALLBACK (gtk_widget_destroyed),
8446 g_signal_connect (window, "response",
8447 G_CALLBACK (gtk_widget_destroy),
8450 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
8452 frame = gtk_frame_new ("Weird tab focus chain");
8454 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8455 frame, TRUE, TRUE, 0);
8457 table = make_focus_table (&list);
8459 gtk_container_add (GTK_CONTAINER (frame), table);
8461 gtk_container_set_focus_chain (GTK_CONTAINER (table),
8466 frame = gtk_frame_new ("Default tab focus chain");
8468 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8469 frame, TRUE, TRUE, 0);
8472 table = make_focus_table (&list);
8476 gtk_container_add (GTK_CONTAINER (frame), table);
8479 if (!GTK_WIDGET_VISIBLE (window))
8480 gtk_widget_show_all (window);
8482 gtk_widget_destroy (window);
8490 font_selection_ok (GtkWidget *w,
8491 GtkFontSelectionDialog *fs)
8493 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
8495 g_print ("%s\n", s);
8497 gtk_widget_destroy (GTK_WIDGET (fs));
8501 create_font_selection (GtkWidget *widget)
8503 static GtkWidget *window = NULL;
8511 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8512 gtk_window_set_screen (GTK_WINDOW (window),
8513 gtk_widget_get_screen (widget));
8515 g_signal_connect (window, "destroy",
8516 G_CALLBACK (gtk_widget_destroyed),
8519 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
8520 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8522 hbox = gtk_hbox_new (FALSE, 8);
8523 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
8524 gtk_container_add (GTK_CONTAINER (window), hbox);
8526 label = gtk_label_new ("Pick a font");
8527 gtk_container_add (GTK_CONTAINER (hbox), label);
8529 picker = gtk_font_button_new ();
8530 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
8531 gtk_container_add (GTK_CONTAINER (hbox), picker);
8534 if (!GTK_WIDGET_VISIBLE (window))
8535 gtk_widget_show_all (window);
8537 gtk_widget_destroy (window);
8544 static GtkWidget *dialog_window = NULL;
8547 label_toggle (GtkWidget *widget,
8552 *label = gtk_label_new ("Dialog Test");
8553 g_signal_connect (*label,
8555 G_CALLBACK (gtk_widget_destroyed),
8557 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
8558 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
8559 *label, TRUE, TRUE, 0);
8560 gtk_widget_show (*label);
8563 gtk_widget_destroy (*label);
8566 #define RESPONSE_TOGGLE_SEPARATOR 1
8569 print_response (GtkWidget *dialog,
8573 g_print ("response signal received (%d)\n", response_id);
8575 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
8577 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
8578 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
8583 create_dialog (GtkWidget *widget)
8585 static GtkWidget *label;
8590 /* This is a terrible example; it's much simpler to create
8591 * dialogs than this. Don't use testgtk for example code,
8595 dialog_window = gtk_dialog_new ();
8596 gtk_window_set_screen (GTK_WINDOW (dialog_window),
8597 gtk_widget_get_screen (widget));
8599 g_signal_connect (dialog_window,
8601 G_CALLBACK (print_response),
8604 g_signal_connect (dialog_window, "destroy",
8605 G_CALLBACK (gtk_widget_destroyed),
8608 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
8609 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
8611 button = gtk_button_new_with_label ("OK");
8612 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8613 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8614 button, TRUE, TRUE, 0);
8615 gtk_widget_grab_default (button);
8616 gtk_widget_show (button);
8618 button = gtk_button_new_with_label ("Toggle");
8619 g_signal_connect (button, "clicked",
8620 G_CALLBACK (label_toggle),
8622 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8623 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8624 button, TRUE, TRUE, 0);
8625 gtk_widget_show (button);
8629 button = gtk_button_new_with_label ("Separator");
8631 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8633 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
8635 RESPONSE_TOGGLE_SEPARATOR);
8636 gtk_widget_show (button);
8639 if (!GTK_WIDGET_VISIBLE (dialog_window))
8640 gtk_widget_show (dialog_window);
8642 gtk_widget_destroy (dialog_window);
8645 /* Display & Screen test
8651 GtkWidget *radio_dpy;
8652 GtkWidget *toplevel;
8653 GtkWidget *dialog_window;
8654 GList *valid_display_list;
8655 } ScreenDisplaySelection;
8658 display_name_cmp (gconstpointer a,
8661 return g_ascii_strcasecmp (a,b);
8665 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
8668 GdkDisplay *display = gtk_widget_get_display (widget);
8670 GdkScreen *new_screen = NULL;
8671 GdkScreen *current_screen = gtk_widget_get_screen (widget);
8673 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
8675 display_name = g_strdup (gtk_entry_get_text (data->entry));
8676 display = gdk_display_open (display_name);
8680 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
8681 GTK_DIALOG_DESTROY_WITH_PARENT,
8684 "The display :\n%s\ncannot be opened",
8686 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
8687 gtk_widget_show (dialog);
8688 g_signal_connect (dialog, "response",
8689 G_CALLBACK (gtk_widget_destroy),
8694 if (!g_list_find_custom (data->valid_display_list,
8697 data->valid_display_list = g_list_append (data->valid_display_list,
8700 new_screen = gdk_display_get_default_screen (display);
8705 gint number_of_screens = gdk_display_get_n_screens (display);
8706 gint screen_num = gdk_screen_get_number (current_screen);
8707 if ((screen_num +1) < number_of_screens)
8708 new_screen = gdk_display_get_screen (display, screen_num + 1);
8710 new_screen = gdk_display_get_screen (display, 0);
8715 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
8716 gtk_widget_destroy (data->dialog_window);
8721 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
8723 gtk_widget_destroy (data);
8727 create_display_screen (GtkWidget *widget)
8729 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
8730 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
8732 ScreenDisplaySelection *scr_dpy_data;
8733 GdkScreen *screen = gtk_widget_get_screen (widget);
8734 static GList *valid_display_list = NULL;
8736 GdkDisplay *display = gdk_screen_get_display (screen);
8738 window = g_object_new (gtk_window_get_type (),
8741 "type", GTK_WINDOW_TOPLEVEL,
8743 "Screen or Display selection",
8744 "border_width", 10, NULL);
8745 g_signal_connect (window, "destroy",
8746 G_CALLBACK (gtk_widget_destroy), NULL);
8748 vbox = gtk_vbox_new (FALSE, 3);
8749 gtk_container_add (GTK_CONTAINER (window), vbox);
8751 frame = gtk_frame_new ("Select screen or display");
8752 gtk_container_add (GTK_CONTAINER (vbox), frame);
8754 table = gtk_table_new (2, 2, TRUE);
8755 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
8756 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
8758 gtk_container_add (GTK_CONTAINER (frame), table);
8760 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
8761 if (gdk_display_get_n_screens(display) > 1)
8762 radio_scr = gtk_radio_button_new_with_label
8763 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
8766 radio_scr = gtk_radio_button_new_with_label
8767 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
8768 "only one screen on the current display");
8769 gtk_widget_set_sensitive (radio_scr, FALSE);
8771 combo_dpy = gtk_combo_new ();
8772 if (!valid_display_list)
8773 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
8775 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
8777 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
8778 "<hostname>:<X Server Num>.<Screen Num>");
8780 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
8781 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
8782 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
8784 bbox = gtk_hbutton_box_new ();
8785 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
8786 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
8788 gtk_container_add (GTK_CONTAINER (vbox), bbox);
8790 gtk_container_add (GTK_CONTAINER (bbox), applyb);
8791 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
8793 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
8795 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
8796 scr_dpy_data->radio_dpy = radio_dpy;
8797 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
8798 scr_dpy_data->dialog_window = window;
8799 scr_dpy_data->valid_display_list = valid_display_list;
8801 g_signal_connect (cancelb, "clicked",
8802 G_CALLBACK (screen_display_destroy_diag), window);
8803 g_signal_connect (applyb, "clicked",
8804 G_CALLBACK (screen_display_check), scr_dpy_data);
8805 gtk_widget_show_all (window);
8810 static gboolean event_watcher_enter_id = 0;
8811 static gboolean event_watcher_leave_id = 0;
8814 event_watcher (GSignalInvocationHint *ihint,
8815 guint n_param_values,
8816 const GValue *param_values,
8819 g_print ("Watch: \"%s\" emitted for %s\n",
8820 g_signal_name (ihint->signal_id),
8821 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
8827 event_watcher_down (void)
8829 if (event_watcher_enter_id)
8833 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
8834 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
8835 event_watcher_enter_id = 0;
8836 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
8837 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
8838 event_watcher_leave_id = 0;
8843 event_watcher_toggle (void)
8845 if (event_watcher_enter_id)
8846 event_watcher_down ();
8851 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
8852 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8853 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
8854 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8859 create_event_watcher (GtkWidget *widget)
8865 dialog_window = gtk_dialog_new ();
8866 gtk_window_set_screen (GTK_WINDOW (dialog_window),
8867 gtk_widget_get_screen (widget));
8869 g_signal_connect (dialog_window, "destroy",
8870 G_CALLBACK (gtk_widget_destroyed),
8872 g_signal_connect (dialog_window, "destroy",
8873 G_CALLBACK (event_watcher_down),
8876 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
8877 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
8878 gtk_widget_set_size_request (dialog_window, 200, 110);
8880 button = gtk_toggle_button_new_with_label ("Activate Watch");
8881 g_signal_connect (button, "clicked",
8882 G_CALLBACK (event_watcher_toggle),
8884 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
8885 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
8886 button, TRUE, TRUE, 0);
8887 gtk_widget_show (button);
8889 button = gtk_button_new_with_label ("Close");
8890 g_signal_connect_swapped (button, "clicked",
8891 G_CALLBACK (gtk_widget_destroy),
8893 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8894 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8895 button, TRUE, TRUE, 0);
8896 gtk_widget_grab_default (button);
8897 gtk_widget_show (button);
8900 if (!GTK_WIDGET_VISIBLE (dialog_window))
8901 gtk_widget_show (dialog_window);
8903 gtk_widget_destroy (dialog_window);
8911 reformat_value (GtkScale *scale,
8914 return g_strdup_printf ("-->%0.*g<--",
8915 gtk_scale_get_digits (scale), value);
8919 create_range_controls (GtkWidget *widget)
8921 static GtkWidget *window = NULL;
8925 GtkWidget *scrollbar;
8927 GtkWidget *separator;
8928 GtkObject *adjustment;
8933 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8935 gtk_window_set_screen (GTK_WINDOW (window),
8936 gtk_widget_get_screen (widget));
8938 g_signal_connect (window, "destroy",
8939 G_CALLBACK (gtk_widget_destroyed),
8942 gtk_window_set_title (GTK_WINDOW (window), "range controls");
8943 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8946 box1 = gtk_vbox_new (FALSE, 0);
8947 gtk_container_add (GTK_CONTAINER (window), box1);
8948 gtk_widget_show (box1);
8951 box2 = gtk_vbox_new (FALSE, 10);
8952 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8953 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
8954 gtk_widget_show (box2);
8957 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
8959 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
8960 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
8961 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
8962 gtk_scale_set_digits (GTK_SCALE (scale), 1);
8963 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8964 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
8965 gtk_widget_show (scale);
8967 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
8968 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
8969 GTK_UPDATE_CONTINUOUS);
8970 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
8971 gtk_widget_show (scrollbar);
8973 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
8974 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8975 g_signal_connect (scale,
8977 G_CALLBACK (reformat_value),
8979 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
8980 gtk_widget_show (scale);
8982 hbox = gtk_hbox_new (FALSE, 0);
8984 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8985 gtk_widget_set_size_request (scale, -1, 200);
8986 gtk_scale_set_digits (GTK_SCALE (scale), 2);
8987 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8988 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8989 gtk_widget_show (scale);
8991 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8992 gtk_widget_set_size_request (scale, -1, 200);
8993 gtk_scale_set_digits (GTK_SCALE (scale), 2);
8994 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8995 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
8996 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8997 gtk_widget_show (scale);
8999 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
9000 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
9001 g_signal_connect (scale,
9003 G_CALLBACK (reformat_value),
9005 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
9006 gtk_widget_show (scale);
9009 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
9010 gtk_widget_show (hbox);
9012 separator = gtk_hseparator_new ();
9013 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9014 gtk_widget_show (separator);
9017 box2 = gtk_vbox_new (FALSE, 10);
9018 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9019 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9020 gtk_widget_show (box2);
9023 button = gtk_button_new_with_label ("close");
9024 g_signal_connect_swapped (button, "clicked",
9025 G_CALLBACK (gtk_widget_destroy),
9027 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9028 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9029 gtk_widget_grab_default (button);
9030 gtk_widget_show (button);
9033 if (!GTK_WIDGET_VISIBLE (window))
9034 gtk_widget_show (window);
9036 gtk_widget_destroy (window);
9044 create_rulers (GtkWidget *widget)
9046 static GtkWidget *window = NULL;
9052 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9054 gtk_window_set_screen (GTK_WINDOW (window),
9055 gtk_widget_get_screen (widget));
9057 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
9059 g_signal_connect (window, "destroy",
9060 G_CALLBACK (gtk_widget_destroyed),
9063 gtk_window_set_title (GTK_WINDOW (window), "rulers");
9064 gtk_widget_set_size_request (window, 300, 300);
9065 gtk_widget_set_events (window,
9066 GDK_POINTER_MOTION_MASK
9067 | GDK_POINTER_MOTION_HINT_MASK);
9068 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9070 table = gtk_table_new (2, 2, FALSE);
9071 gtk_container_add (GTK_CONTAINER (window), table);
9072 gtk_widget_show (table);
9074 ruler = gtk_hruler_new ();
9075 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
9076 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
9078 g_signal_connect_swapped (window,
9079 "motion_notify_event",
9080 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
9083 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
9084 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
9085 gtk_widget_show (ruler);
9088 ruler = gtk_vruler_new ();
9089 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
9091 g_signal_connect_swapped (window,
9092 "motion_notify_event",
9093 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
9096 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
9097 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
9098 gtk_widget_show (ruler);
9101 if (!GTK_WIDGET_VISIBLE (window))
9102 gtk_widget_show (window);
9104 gtk_widget_destroy (window);
9108 text_toggle_editable (GtkWidget *checkbutton,
9111 gtk_text_set_editable(GTK_TEXT(text),
9112 GTK_TOGGLE_BUTTON(checkbutton)->active);
9116 text_toggle_word_wrap (GtkWidget *checkbutton,
9119 gtk_text_set_word_wrap(GTK_TEXT(text),
9120 GTK_TOGGLE_BUTTON(checkbutton)->active);
9127 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
9128 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
9129 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
9130 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
9131 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
9132 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
9133 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
9134 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
9137 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
9143 text_insert_random (GtkWidget *w, GtkText *text)
9147 for (i=0; i<10; i++)
9149 c = 'A' + rand() % ('Z' - 'A');
9150 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
9151 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
9156 create_text (GtkWidget *widget)
9160 static GtkWidget *window = NULL;
9166 GtkWidget *separator;
9167 GtkWidget *scrolled_window;
9174 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9175 gtk_window_set_screen (GTK_WINDOW (window),
9176 gtk_widget_get_screen (widget));
9178 gtk_widget_set_name (window, "text window");
9179 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
9180 gtk_widget_set_size_request (window, 500, 500);
9182 g_signal_connect (window, "destroy",
9183 G_CALLBACK (gtk_widget_destroyed),
9186 gtk_window_set_title (GTK_WINDOW (window), "test");
9187 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9190 box1 = gtk_vbox_new (FALSE, 0);
9191 gtk_container_add (GTK_CONTAINER (window), box1);
9192 gtk_widget_show (box1);
9195 box2 = gtk_vbox_new (FALSE, 10);
9196 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9197 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
9198 gtk_widget_show (box2);
9201 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
9202 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
9203 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
9206 gtk_widget_show (scrolled_window);
9208 text = gtk_text_new (NULL, NULL);
9209 gtk_text_set_editable (GTK_TEXT (text), TRUE);
9210 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
9211 gtk_widget_grab_focus (text);
9212 gtk_widget_show (text);
9215 gtk_text_freeze (GTK_TEXT (text));
9217 for (i=0; i<ntext_colors; i++)
9219 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
9220 text_colors[i].name, -1);
9221 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
9223 for (j=0; j<ntext_colors; j++)
9225 gtk_text_insert (GTK_TEXT (text), NULL,
9226 &text_colors[j].color, &text_colors[i].color,
9229 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
9232 infile = fopen("testgtk.c", "r");
9237 int nbytes_read, nbytes_alloc;
9240 nbytes_alloc = 1024;
9241 buffer = g_new (char, nbytes_alloc);
9245 if (nbytes_alloc < nbytes_read + 1024)
9248 buffer = g_realloc (buffer, nbytes_alloc);
9250 len = fread (buffer + nbytes_read, 1, 1024, infile);
9256 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
9257 NULL, buffer, nbytes_read);
9262 gtk_text_thaw (GTK_TEXT (text));
9264 hbox = gtk_hbutton_box_new ();
9265 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
9266 gtk_widget_show (hbox);
9268 check = gtk_check_button_new_with_label("Editable");
9269 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
9270 g_signal_connect (check, "toggled",
9271 G_CALLBACK (text_toggle_editable), text);
9272 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
9273 gtk_widget_show (check);
9275 check = gtk_check_button_new_with_label("Wrap Words");
9276 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
9277 g_signal_connect (check, "toggled",
9278 G_CALLBACK (text_toggle_word_wrap), text);
9279 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
9280 gtk_widget_show (check);
9282 separator = gtk_hseparator_new ();
9283 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9284 gtk_widget_show (separator);
9287 box2 = gtk_vbox_new (FALSE, 10);
9288 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9289 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9290 gtk_widget_show (box2);
9293 button = gtk_button_new_with_label ("insert random");
9294 g_signal_connect (button, "clicked",
9295 G_CALLBACK (text_insert_random),
9297 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9298 gtk_widget_show (button);
9300 button = gtk_button_new_with_label ("close");
9301 g_signal_connect_swapped (button, "clicked",
9302 G_CALLBACK (gtk_widget_destroy),
9304 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9305 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9306 gtk_widget_grab_default (button);
9307 gtk_widget_show (button);
9310 if (!GTK_WIDGET_VISIBLE (window))
9311 gtk_widget_show (window);
9313 gtk_widget_destroy (window);
9320 GdkPixbuf *book_open;
9321 GdkPixbuf *book_closed;
9322 GtkWidget *sample_notebook;
9325 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
9327 GtkWidget *page_widget;
9330 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
9332 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
9333 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
9335 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
9336 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
9340 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
9342 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
9343 gint old_page_num = gtk_notebook_get_current_page (notebook);
9345 if (page_num == old_page_num)
9348 set_page_image (notebook, page_num, book_open);
9350 if (old_page_num != -1)
9351 set_page_image (notebook, old_page_num, book_closed);
9355 tab_fill (GtkToggleButton *button, GtkWidget *child)
9358 GtkPackType pack_type;
9360 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9361 &expand, NULL, &pack_type);
9362 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9363 expand, button->active, pack_type);
9367 tab_expand (GtkToggleButton *button, GtkWidget *child)
9370 GtkPackType pack_type;
9372 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9373 NULL, &fill, &pack_type);
9374 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9375 button->active, fill, pack_type);
9379 tab_pack (GtkToggleButton *button, GtkWidget *child)
9385 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9386 &expand, &fill, NULL);
9387 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9388 expand, fill, button->active);
9392 create_pages (GtkNotebook *notebook, gint start, gint end)
9394 GtkWidget *child = NULL;
9399 GtkWidget *label_box;
9400 GtkWidget *menu_box;
9404 char accel_buffer[32];
9406 for (i = start; i <= end; i++)
9408 sprintf (buffer, "Page %d", i);
9409 sprintf (accel_buffer, "Page _%d", i);
9411 child = gtk_frame_new (buffer);
9412 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
9414 vbox = gtk_vbox_new (TRUE,0);
9415 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9416 gtk_container_add (GTK_CONTAINER (child), vbox);
9418 hbox = gtk_hbox_new (TRUE,0);
9419 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
9421 button = gtk_check_button_new_with_label ("Fill Tab");
9422 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9423 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
9424 g_signal_connect (button, "toggled",
9425 G_CALLBACK (tab_fill), child);
9427 button = gtk_check_button_new_with_label ("Expand Tab");
9428 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9429 g_signal_connect (button, "toggled",
9430 G_CALLBACK (tab_expand), child);
9432 button = gtk_check_button_new_with_label ("Pack end");
9433 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9434 g_signal_connect (button, "toggled",
9435 G_CALLBACK (tab_pack), child);
9437 button = gtk_button_new_with_label ("Hide Page");
9438 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
9439 g_signal_connect_swapped (button, "clicked",
9440 G_CALLBACK (gtk_widget_hide),
9443 gtk_widget_show_all (child);
9445 label_box = gtk_hbox_new (FALSE, 0);
9446 pixwid = gtk_image_new_from_pixbuf (book_closed);
9447 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
9449 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
9450 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
9451 label = gtk_label_new_with_mnemonic (accel_buffer);
9452 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
9453 gtk_widget_show_all (label_box);
9456 menu_box = gtk_hbox_new (FALSE, 0);
9457 pixwid = gtk_image_new_from_pixbuf (book_closed);
9458 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
9460 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
9461 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
9462 label = gtk_label_new (buffer);
9463 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
9464 gtk_widget_show_all (menu_box);
9466 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
9471 rotate_notebook (GtkButton *button,
9472 GtkNotebook *notebook)
9474 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
9478 show_all_pages (GtkButton *button,
9479 GtkNotebook *notebook)
9481 gtk_container_foreach (GTK_CONTAINER (notebook),
9482 (GtkCallback) gtk_widget_show, NULL);
9486 notebook_type_changed (GtkWidget *optionmenu,
9489 GtkNotebook *notebook;
9499 notebook = GTK_NOTEBOOK (data);
9501 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
9506 /* standard notebook */
9507 gtk_notebook_set_show_tabs (notebook, TRUE);
9508 gtk_notebook_set_show_border (notebook, TRUE);
9509 gtk_notebook_set_scrollable (notebook, FALSE);
9513 /* notabs notebook */
9514 gtk_notebook_set_show_tabs (notebook, FALSE);
9515 gtk_notebook_set_show_border (notebook, TRUE);
9520 gtk_notebook_set_show_tabs (notebook, FALSE);
9521 gtk_notebook_set_show_border (notebook, FALSE);
9526 gtk_notebook_set_show_tabs (notebook, TRUE);
9527 gtk_notebook_set_show_border (notebook, TRUE);
9528 gtk_notebook_set_scrollable (notebook, TRUE);
9529 if (g_list_length (notebook->children) == 5)
9530 create_pages (notebook, 6, 15);
9536 if (g_list_length (notebook->children) == 15)
9537 for (i = 0; i < 10; i++)
9538 gtk_notebook_remove_page (notebook, 5);
9542 notebook_popup (GtkToggleButton *button,
9543 GtkNotebook *notebook)
9546 gtk_notebook_popup_enable (notebook);
9548 gtk_notebook_popup_disable (notebook);
9552 notebook_homogeneous (GtkToggleButton *button,
9553 GtkNotebook *notebook)
9555 g_object_set (notebook, "homogeneous", button->active, NULL);
9559 create_notebook (GtkWidget *widget)
9561 static GtkWidget *window = NULL;
9565 GtkWidget *separator;
9569 static gchar *items[] =
9579 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9580 gtk_window_set_screen (GTK_WINDOW (window),
9581 gtk_widget_get_screen (widget));
9583 g_signal_connect (window, "destroy",
9584 G_CALLBACK (gtk_widget_destroyed),
9587 gtk_window_set_title (GTK_WINDOW (window), "notebook");
9588 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9590 box1 = gtk_vbox_new (FALSE, 0);
9591 gtk_container_add (GTK_CONTAINER (window), box1);
9593 sample_notebook = gtk_notebook_new ();
9594 g_signal_connect (sample_notebook, "switch_page",
9595 G_CALLBACK (page_switch), NULL);
9596 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
9597 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
9598 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
9600 gtk_widget_realize (sample_notebook);
9603 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
9606 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
9608 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
9610 separator = gtk_hseparator_new ();
9611 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
9613 box2 = gtk_hbox_new (FALSE, 5);
9614 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9615 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9617 button = gtk_check_button_new_with_label ("popup menu");
9618 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
9619 g_signal_connect (button, "clicked",
9620 G_CALLBACK (notebook_popup),
9623 button = gtk_check_button_new_with_label ("homogeneous tabs");
9624 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
9625 g_signal_connect (button, "clicked",
9626 G_CALLBACK (notebook_homogeneous),
9629 box2 = gtk_hbox_new (FALSE, 5);
9630 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9631 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9633 label = gtk_label_new ("Notebook Style :");
9634 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
9636 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
9637 notebook_type_changed,
9639 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
9641 button = gtk_button_new_with_label ("Show all Pages");
9642 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
9643 g_signal_connect (button, "clicked",
9644 G_CALLBACK (show_all_pages), sample_notebook);
9646 box2 = gtk_hbox_new (TRUE, 10);
9647 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9648 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9650 button = gtk_button_new_with_label ("prev");
9651 g_signal_connect_swapped (button, "clicked",
9652 G_CALLBACK (gtk_notebook_prev_page),
9654 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9656 button = gtk_button_new_with_label ("next");
9657 g_signal_connect_swapped (button, "clicked",
9658 G_CALLBACK (gtk_notebook_next_page),
9660 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9662 button = gtk_button_new_with_label ("rotate");
9663 g_signal_connect (button, "clicked",
9664 G_CALLBACK (rotate_notebook), sample_notebook);
9665 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9667 separator = gtk_hseparator_new ();
9668 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
9670 button = gtk_button_new_with_label ("close");
9671 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
9672 g_signal_connect_swapped (button, "clicked",
9673 G_CALLBACK (gtk_widget_destroy),
9675 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
9676 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9677 gtk_widget_grab_default (button);
9680 if (!GTK_WIDGET_VISIBLE (window))
9681 gtk_widget_show_all (window);
9683 gtk_widget_destroy (window);
9691 toggle_resize (GtkWidget *widget, GtkWidget *child)
9693 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
9694 GValue value = { 0, };
9695 g_value_init (&value, G_TYPE_BOOLEAN);
9696 gtk_container_child_get_property (container, child, "resize", &value);
9697 g_value_set_boolean (&value, !g_value_get_boolean (&value));
9698 gtk_container_child_set_property (container, child, "resize", &value);
9702 toggle_shrink (GtkWidget *widget, GtkWidget *child)
9704 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
9705 GValue value = { 0, };
9706 g_value_init (&value, G_TYPE_BOOLEAN);
9707 gtk_container_child_get_property (container, child, "shrink", &value);
9708 g_value_set_boolean (&value, !g_value_get_boolean (&value));
9709 gtk_container_child_set_property (container, child, "shrink", &value);
9713 paned_props_clicked (GtkWidget *button,
9716 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
9718 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
9722 create_pane_options (GtkPaned *paned,
9723 const gchar *frame_label,
9724 const gchar *label1,
9725 const gchar *label2)
9731 GtkWidget *check_button;
9733 frame = gtk_frame_new (frame_label);
9734 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
9736 table = gtk_table_new (4, 2, 4);
9737 gtk_container_add (GTK_CONTAINER (frame), table);
9739 label = gtk_label_new (label1);
9740 gtk_table_attach_defaults (GTK_TABLE (table), label,
9743 check_button = gtk_check_button_new_with_label ("Resize");
9744 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9746 g_signal_connect (check_button, "toggled",
9747 G_CALLBACK (toggle_resize),
9750 check_button = gtk_check_button_new_with_label ("Shrink");
9751 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9753 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9755 g_signal_connect (check_button, "toggled",
9756 G_CALLBACK (toggle_shrink),
9759 label = gtk_label_new (label2);
9760 gtk_table_attach_defaults (GTK_TABLE (table), label,
9763 check_button = gtk_check_button_new_with_label ("Resize");
9764 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9766 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9768 g_signal_connect (check_button, "toggled",
9769 G_CALLBACK (toggle_resize),
9772 check_button = gtk_check_button_new_with_label ("Shrink");
9773 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9775 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9777 g_signal_connect (check_button, "toggled",
9778 G_CALLBACK (toggle_shrink),
9781 button = gtk_button_new_with_mnemonic ("_Properties");
9782 gtk_table_attach_defaults (GTK_TABLE (table), button,
9784 g_signal_connect (button, "clicked",
9785 G_CALLBACK (paned_props_clicked),
9792 create_panes (GtkWidget *widget)
9794 static GtkWidget *window = NULL;
9803 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9805 gtk_window_set_screen (GTK_WINDOW (window),
9806 gtk_widget_get_screen (widget));
9808 g_signal_connect (window, "destroy",
9809 G_CALLBACK (gtk_widget_destroyed),
9812 gtk_window_set_title (GTK_WINDOW (window), "Panes");
9813 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9815 vbox = gtk_vbox_new (FALSE, 0);
9816 gtk_container_add (GTK_CONTAINER (window), vbox);
9818 vpaned = gtk_vpaned_new ();
9819 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
9820 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
9822 hpaned = gtk_hpaned_new ();
9823 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
9825 frame = gtk_frame_new (NULL);
9826 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9827 gtk_widget_set_size_request (frame, 60, 60);
9828 gtk_paned_add1 (GTK_PANED (hpaned), frame);
9830 button = gtk_button_new_with_label ("Hi there");
9831 gtk_container_add (GTK_CONTAINER(frame), button);
9833 frame = gtk_frame_new (NULL);
9834 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9835 gtk_widget_set_size_request (frame, 80, 60);
9836 gtk_paned_add2 (GTK_PANED (hpaned), frame);
9838 frame = gtk_frame_new (NULL);
9839 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9840 gtk_widget_set_size_request (frame, 60, 80);
9841 gtk_paned_add2 (GTK_PANED (vpaned), frame);
9843 /* Now create toggle buttons to control sizing */
9845 gtk_box_pack_start (GTK_BOX (vbox),
9846 create_pane_options (GTK_PANED (hpaned),
9852 gtk_box_pack_start (GTK_BOX (vbox),
9853 create_pane_options (GTK_PANED (vpaned),
9859 gtk_widget_show_all (vbox);
9862 if (!GTK_WIDGET_VISIBLE (window))
9863 gtk_widget_show (window);
9865 gtk_widget_destroy (window);
9869 * Paned keyboard navigation
9873 paned_keyboard_window1 (GtkWidget *widget)
9896 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9897 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
9898 gtk_window_set_screen (GTK_WINDOW (window1),
9899 gtk_widget_get_screen (widget));
9901 hpaned1 = gtk_hpaned_new ();
9902 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
9904 frame1 = gtk_frame_new (NULL);
9905 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
9906 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
9908 vbox1 = gtk_vbox_new (FALSE, 0);
9909 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
9911 button7 = gtk_button_new_with_label ("button7");
9912 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
9914 button8 = gtk_button_new_with_label ("button8");
9915 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
9917 button9 = gtk_button_new_with_label ("button9");
9918 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
9920 vpaned1 = gtk_vpaned_new ();
9921 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
9923 frame2 = gtk_frame_new (NULL);
9924 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
9925 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
9927 frame5 = gtk_frame_new (NULL);
9928 gtk_container_add (GTK_CONTAINER (frame2), frame5);
9930 hbox1 = gtk_hbox_new (FALSE, 0);
9931 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
9933 button5 = gtk_button_new_with_label ("button5");
9934 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
9936 button6 = gtk_button_new_with_label ("button6");
9937 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
9939 frame3 = gtk_frame_new (NULL);
9940 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
9941 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
9943 frame4 = gtk_frame_new ("Buttons");
9944 gtk_container_add (GTK_CONTAINER (frame3), frame4);
9945 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
9947 table1 = gtk_table_new (2, 2, FALSE);
9948 gtk_container_add (GTK_CONTAINER (frame4), table1);
9949 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
9951 button1 = gtk_button_new_with_label ("button1");
9952 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
9953 (GtkAttachOptions) (GTK_FILL),
9954 (GtkAttachOptions) (0), 0, 0);
9956 button2 = gtk_button_new_with_label ("button2");
9957 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
9958 (GtkAttachOptions) (GTK_FILL),
9959 (GtkAttachOptions) (0), 0, 0);
9961 button3 = gtk_button_new_with_label ("button3");
9962 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
9963 (GtkAttachOptions) (GTK_FILL),
9964 (GtkAttachOptions) (0), 0, 0);
9966 button4 = gtk_button_new_with_label ("button4");
9967 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
9968 (GtkAttachOptions) (GTK_FILL),
9969 (GtkAttachOptions) (0), 0, 0);
9975 paned_keyboard_window2 (GtkWidget *widget)
9980 GtkWidget *button13;
9984 GtkWidget *button12;
9986 GtkWidget *button11;
9987 GtkWidget *button10;
9989 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9990 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
9992 gtk_window_set_screen (GTK_WINDOW (window2),
9993 gtk_widget_get_screen (widget));
9995 hpaned2 = gtk_hpaned_new ();
9996 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
9998 frame6 = gtk_frame_new (NULL);
9999 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
10000 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
10002 button13 = gtk_button_new_with_label ("button13");
10003 gtk_container_add (GTK_CONTAINER (frame6), button13);
10005 hbox2 = gtk_hbox_new (FALSE, 0);
10006 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
10008 vpaned2 = gtk_vpaned_new ();
10009 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
10011 frame7 = gtk_frame_new (NULL);
10012 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
10013 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
10015 button12 = gtk_button_new_with_label ("button12");
10016 gtk_container_add (GTK_CONTAINER (frame7), button12);
10018 frame8 = gtk_frame_new (NULL);
10019 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
10020 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
10022 button11 = gtk_button_new_with_label ("button11");
10023 gtk_container_add (GTK_CONTAINER (frame8), button11);
10025 button10 = gtk_button_new_with_label ("button10");
10026 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
10032 paned_keyboard_window3 (GtkWidget *widget)
10034 GtkWidget *window3;
10037 GtkWidget *hpaned3;
10039 GtkWidget *button14;
10040 GtkWidget *hpaned4;
10041 GtkWidget *frame10;
10042 GtkWidget *button15;
10043 GtkWidget *hpaned5;
10044 GtkWidget *frame11;
10045 GtkWidget *button16;
10046 GtkWidget *frame12;
10047 GtkWidget *button17;
10049 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10050 g_object_set_data (G_OBJECT (window3), "window3", window3);
10051 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
10053 gtk_window_set_screen (GTK_WINDOW (window3),
10054 gtk_widget_get_screen (widget));
10057 vbox2 = gtk_vbox_new (FALSE, 0);
10058 gtk_container_add (GTK_CONTAINER (window3), vbox2);
10060 label1 = gtk_label_new ("Three panes nested inside each other");
10061 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
10063 hpaned3 = gtk_hpaned_new ();
10064 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
10066 frame9 = gtk_frame_new (NULL);
10067 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
10068 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
10070 button14 = gtk_button_new_with_label ("button14");
10071 gtk_container_add (GTK_CONTAINER (frame9), button14);
10073 hpaned4 = gtk_hpaned_new ();
10074 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
10076 frame10 = gtk_frame_new (NULL);
10077 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
10078 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
10080 button15 = gtk_button_new_with_label ("button15");
10081 gtk_container_add (GTK_CONTAINER (frame10), button15);
10083 hpaned5 = gtk_hpaned_new ();
10084 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
10086 frame11 = gtk_frame_new (NULL);
10087 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
10088 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
10090 button16 = gtk_button_new_with_label ("button16");
10091 gtk_container_add (GTK_CONTAINER (frame11), button16);
10093 frame12 = gtk_frame_new (NULL);
10094 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
10095 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
10097 button17 = gtk_button_new_with_label ("button17");
10098 gtk_container_add (GTK_CONTAINER (frame12), button17);
10104 paned_keyboard_window4 (GtkWidget *widget)
10106 GtkWidget *window4;
10109 GtkWidget *hpaned6;
10110 GtkWidget *vpaned3;
10111 GtkWidget *button19;
10112 GtkWidget *button18;
10114 GtkWidget *vpaned4;
10115 GtkWidget *button21;
10116 GtkWidget *button20;
10117 GtkWidget *vpaned5;
10118 GtkWidget *button23;
10119 GtkWidget *button22;
10120 GtkWidget *vpaned6;
10121 GtkWidget *button25;
10122 GtkWidget *button24;
10124 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10125 g_object_set_data (G_OBJECT (window4), "window4", window4);
10126 gtk_window_set_title (GTK_WINDOW (window4), "window4");
10128 gtk_window_set_screen (GTK_WINDOW (window4),
10129 gtk_widget_get_screen (widget));
10131 vbox3 = gtk_vbox_new (FALSE, 0);
10132 gtk_container_add (GTK_CONTAINER (window4), vbox3);
10134 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
10135 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
10136 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
10138 hpaned6 = gtk_hpaned_new ();
10139 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
10141 vpaned3 = gtk_vpaned_new ();
10142 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
10144 button19 = gtk_button_new_with_label ("button19");
10145 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
10147 button18 = gtk_button_new_with_label ("button18");
10148 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
10150 hbox3 = gtk_hbox_new (FALSE, 0);
10151 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
10153 vpaned4 = gtk_vpaned_new ();
10154 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
10156 button21 = gtk_button_new_with_label ("button21");
10157 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
10159 button20 = gtk_button_new_with_label ("button20");
10160 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
10162 vpaned5 = gtk_vpaned_new ();
10163 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
10165 button23 = gtk_button_new_with_label ("button23");
10166 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
10168 button22 = gtk_button_new_with_label ("button22");
10169 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
10171 vpaned6 = gtk_vpaned_new ();
10172 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
10174 button25 = gtk_button_new_with_label ("button25");
10175 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
10177 button24 = gtk_button_new_with_label ("button24");
10178 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
10184 create_paned_keyboard_navigation (GtkWidget *widget)
10186 static GtkWidget *window1 = NULL;
10187 static GtkWidget *window2 = NULL;
10188 static GtkWidget *window3 = NULL;
10189 static GtkWidget *window4 = NULL;
10192 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
10194 gtk_widget_destroy (window1);
10195 gtk_widget_destroy (window2);
10196 gtk_widget_destroy (window3);
10197 gtk_widget_destroy (window4);
10202 window1 = paned_keyboard_window1 (widget);
10203 g_signal_connect (window1, "destroy",
10204 G_CALLBACK (gtk_widget_destroyed),
10210 window2 = paned_keyboard_window2 (widget);
10211 g_signal_connect (window2, "destroy",
10212 G_CALLBACK (gtk_widget_destroyed),
10218 window3 = paned_keyboard_window3 (widget);
10219 g_signal_connect (window3, "destroy",
10220 G_CALLBACK (gtk_widget_destroyed),
10226 window4 = paned_keyboard_window4 (widget);
10227 g_signal_connect (window4, "destroy",
10228 G_CALLBACK (gtk_widget_destroyed),
10232 if (GTK_WIDGET_VISIBLE (window1))
10233 gtk_widget_destroy (GTK_WIDGET (window1));
10235 gtk_widget_show_all (GTK_WIDGET (window1));
10237 if (GTK_WIDGET_VISIBLE (window2))
10238 gtk_widget_destroy (GTK_WIDGET (window2));
10240 gtk_widget_show_all (GTK_WIDGET (window2));
10242 if (GTK_WIDGET_VISIBLE (window3))
10243 gtk_widget_destroy (GTK_WIDGET (window3));
10245 gtk_widget_show_all (GTK_WIDGET (window3));
10247 if (GTK_WIDGET_VISIBLE (window4))
10248 gtk_widget_destroy (GTK_WIDGET (window4));
10250 gtk_widget_show_all (GTK_WIDGET (window4));
10258 typedef struct _cursoroffset {gint x,y;} CursorOffset;
10261 shape_pressed (GtkWidget *widget, GdkEventButton *event)
10265 /* ignore double and triple click */
10266 if (event->type != GDK_BUTTON_PRESS)
10269 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
10270 p->x = (int) event->x;
10271 p->y = (int) event->y;
10273 gtk_grab_add (widget);
10274 gdk_pointer_grab (widget->window, TRUE,
10275 GDK_BUTTON_RELEASE_MASK |
10276 GDK_BUTTON_MOTION_MASK |
10277 GDK_POINTER_MOTION_HINT_MASK,
10282 shape_released (GtkWidget *widget)
10284 gtk_grab_remove (widget);
10285 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10290 shape_motion (GtkWidget *widget,
10291 GdkEventMotion *event)
10295 GdkModifierType mask;
10297 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
10300 * Can't use event->x / event->y here
10301 * because I need absolute coordinates.
10303 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
10304 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
10308 shape_create_icon (GdkScreen *screen,
10319 CursorOffset* icon_pos;
10321 GdkBitmap *gdk_pixmap_mask;
10322 GdkPixmap *gdk_pixmap;
10325 style = gtk_widget_get_default_style ();
10326 gc = style->black_gc;
10329 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
10331 window = gtk_window_new (window_type);
10332 gtk_window_set_screen (GTK_WINDOW (window), screen);
10334 fixed = gtk_fixed_new ();
10335 gtk_widget_set_size_request (fixed, 100, 100);
10336 gtk_container_add (GTK_CONTAINER (window), fixed);
10337 gtk_widget_show (fixed);
10339 gtk_widget_set_events (window,
10340 gtk_widget_get_events (window) |
10341 GDK_BUTTON_MOTION_MASK |
10342 GDK_POINTER_MOTION_HINT_MASK |
10343 GDK_BUTTON_PRESS_MASK);
10345 gtk_widget_realize (window);
10346 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
10347 &style->bg[GTK_STATE_NORMAL],
10350 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
10351 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
10352 gtk_widget_show (pixmap);
10354 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
10356 g_object_unref (gdk_pixmap_mask);
10357 g_object_unref (gdk_pixmap);
10359 g_signal_connect (window, "button_press_event",
10360 G_CALLBACK (shape_pressed), NULL);
10361 g_signal_connect (window, "button_release_event",
10362 G_CALLBACK (shape_released), NULL);
10363 g_signal_connect (window, "motion_notify_event",
10364 G_CALLBACK (shape_motion), NULL);
10366 icon_pos = g_new (CursorOffset, 1);
10367 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
10369 gtk_widget_set_uposition (window, x, y);
10370 gtk_widget_show (window);
10376 create_shapes (GtkWidget *widget)
10378 /* Variables used by the Drag/Drop and Shape Window demos */
10379 static GtkWidget *modeller = NULL;
10380 static GtkWidget *sheets = NULL;
10381 static GtkWidget *rings = NULL;
10382 static GtkWidget *with_region = NULL;
10383 GdkScreen *screen = gtk_widget_get_screen (widget);
10385 if (!(file_exists ("Modeller.xpm") &&
10386 file_exists ("FilesQueue.xpm") &&
10387 file_exists ("3DRings.xpm")))
10393 modeller = shape_create_icon (screen, "Modeller.xpm",
10394 440, 140, 0,0, GTK_WINDOW_POPUP);
10396 g_signal_connect (modeller, "destroy",
10397 G_CALLBACK (gtk_widget_destroyed),
10401 gtk_widget_destroy (modeller);
10405 sheets = shape_create_icon (screen, "FilesQueue.xpm",
10406 580, 170, 0,0, GTK_WINDOW_POPUP);
10408 g_signal_connect (sheets, "destroy",
10409 G_CALLBACK (gtk_widget_destroyed),
10414 gtk_widget_destroy (sheets);
10418 rings = shape_create_icon (screen, "3DRings.xpm",
10419 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
10421 g_signal_connect (rings, "destroy",
10422 G_CALLBACK (gtk_widget_destroyed),
10426 gtk_widget_destroy (rings);
10433 with_region = shape_create_icon (screen, "3DRings.xpm",
10434 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
10436 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
10438 g_signal_connect (with_region, "destroy",
10439 G_CALLBACK (gtk_widget_destroyed),
10442 /* reset shape from mask to a region */
10445 region = gdk_region_new ();
10457 gdk_region_union_with_rect (region, &rect);
10465 gdk_window_shape_combine_region (with_region->window,
10470 gtk_widget_destroy (with_region);
10478 create_wmhints (GtkWidget *widget)
10480 static GtkWidget *window = NULL;
10482 GtkWidget *separator;
10487 GdkBitmap *circles;
10491 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10493 gtk_window_set_screen (GTK_WINDOW (window),
10494 gtk_widget_get_screen (widget));
10496 g_signal_connect (window, "destroy",
10497 G_CALLBACK (gtk_widget_destroyed),
10500 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
10501 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10503 gtk_widget_realize (window);
10505 circles = gdk_bitmap_create_from_data (window->window,
10506 (gchar *) circles_bits,
10509 gdk_window_set_icon (window->window, NULL,
10512 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
10514 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
10515 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
10517 box1 = gtk_vbox_new (FALSE, 0);
10518 gtk_container_add (GTK_CONTAINER (window), box1);
10519 gtk_widget_show (box1);
10521 label = gtk_label_new ("Try iconizing me!");
10522 gtk_widget_set_size_request (label, 150, 50);
10523 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
10524 gtk_widget_show (label);
10527 separator = gtk_hseparator_new ();
10528 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10529 gtk_widget_show (separator);
10532 box2 = gtk_vbox_new (FALSE, 10);
10533 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10534 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10535 gtk_widget_show (box2);
10538 button = gtk_button_new_with_label ("close");
10540 g_signal_connect_swapped (button, "clicked",
10541 G_CALLBACK (gtk_widget_destroy),
10544 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10545 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
10546 gtk_widget_grab_default (button);
10547 gtk_widget_show (button);
10550 if (!GTK_WIDGET_VISIBLE (window))
10551 gtk_widget_show (window);
10553 gtk_widget_destroy (window);
10558 * Window state tracking
10562 window_state_callback (GtkWidget *widget,
10563 GdkEventWindowState *event,
10566 GtkWidget *label = data;
10569 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
10570 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
10571 "withdrawn" : "not withdrawn", ", ",
10572 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
10573 "iconified" : "not iconified", ", ",
10574 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
10575 "sticky" : "not sticky", ", ",
10576 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
10577 "maximized" : "not maximized", ", ",
10578 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
10579 "fullscreen" : "not fullscreen",
10580 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
10581 "above" : "not above", ", ",
10582 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
10583 "below" : "not below", ", ",
10586 gtk_label_set_text (GTK_LABEL (label), msg);
10594 tracking_label (GtkWidget *window)
10600 hbox = gtk_hbox_new (FALSE, 5);
10602 g_signal_connect_object (hbox,
10604 G_CALLBACK (gtk_widget_destroy),
10606 G_CONNECT_SWAPPED);
10608 label = gtk_label_new ("<no window state events received>");
10609 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
10610 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
10612 g_signal_connect (window,
10613 "window_state_event",
10614 G_CALLBACK (window_state_callback),
10617 button = gtk_button_new_with_label ("Deiconify");
10618 g_signal_connect_object (button,
10620 G_CALLBACK (gtk_window_deiconify),
10622 G_CONNECT_SWAPPED);
10623 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10625 button = gtk_button_new_with_label ("Iconify");
10626 g_signal_connect_object (button,
10628 G_CALLBACK (gtk_window_iconify),
10630 G_CONNECT_SWAPPED);
10631 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10633 button = gtk_button_new_with_label ("Fullscreen");
10634 g_signal_connect_object (button,
10636 G_CALLBACK (gtk_window_fullscreen),
10638 G_CONNECT_SWAPPED);
10639 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10641 button = gtk_button_new_with_label ("Unfullscreen");
10642 g_signal_connect_object (button,
10644 G_CALLBACK (gtk_window_unfullscreen),
10646 G_CONNECT_SWAPPED);
10647 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10649 button = gtk_button_new_with_label ("Present");
10650 g_signal_connect_object (button,
10652 G_CALLBACK (gtk_window_present),
10654 G_CONNECT_SWAPPED);
10655 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10657 button = gtk_button_new_with_label ("Show");
10658 g_signal_connect_object (button,
10660 G_CALLBACK (gtk_widget_show),
10662 G_CONNECT_SWAPPED);
10663 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10665 gtk_widget_show_all (hbox);
10671 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
10673 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
10675 gtk_window_set_keep_above (GTK_WINDOW (data),
10676 gtk_toggle_button_get_active (togglebutton));
10678 if (gtk_toggle_button_get_active (togglebutton))
10679 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10683 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
10685 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
10687 gtk_window_set_keep_below (GTK_WINDOW (data),
10688 gtk_toggle_button_get_active (togglebutton));
10690 if (gtk_toggle_button_get_active (togglebutton))
10691 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10696 get_state_controls (GtkWidget *window)
10700 GtkWidget *button_above;
10701 GtkWidget *button_below;
10703 vbox = gtk_vbox_new (FALSE, 0);
10705 button = gtk_button_new_with_label ("Stick");
10706 g_signal_connect_object (button,
10708 G_CALLBACK (gtk_window_stick),
10710 G_CONNECT_SWAPPED);
10711 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10713 button = gtk_button_new_with_label ("Unstick");
10714 g_signal_connect_object (button,
10716 G_CALLBACK (gtk_window_unstick),
10718 G_CONNECT_SWAPPED);
10719 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10721 button = gtk_button_new_with_label ("Maximize");
10722 g_signal_connect_object (button,
10724 G_CALLBACK (gtk_window_maximize),
10726 G_CONNECT_SWAPPED);
10727 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10729 button = gtk_button_new_with_label ("Unmaximize");
10730 g_signal_connect_object (button,
10732 G_CALLBACK (gtk_window_unmaximize),
10734 G_CONNECT_SWAPPED);
10735 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10737 button = gtk_button_new_with_label ("Iconify");
10738 g_signal_connect_object (button,
10740 G_CALLBACK (gtk_window_iconify),
10742 G_CONNECT_SWAPPED);
10743 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10745 button = gtk_button_new_with_label ("Fullscreen");
10746 g_signal_connect_object (button,
10748 G_CALLBACK (gtk_window_fullscreen),
10750 G_CONNECT_SWAPPED);
10751 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10753 button = gtk_button_new_with_label ("Unfullscreen");
10754 g_signal_connect_object (button,
10756 G_CALLBACK (gtk_window_unfullscreen),
10758 G_CONNECT_SWAPPED);
10759 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10761 button_above = gtk_toggle_button_new_with_label ("Keep above");
10762 g_signal_connect (button_above,
10764 G_CALLBACK (keep_window_above),
10766 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
10768 button_below = gtk_toggle_button_new_with_label ("Keep below");
10769 g_signal_connect (button_below,
10771 G_CALLBACK (keep_window_below),
10773 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
10775 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
10776 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
10778 button = gtk_button_new_with_label ("Hide (withdraw)");
10779 g_signal_connect_object (button,
10781 G_CALLBACK (gtk_widget_hide),
10783 G_CONNECT_SWAPPED);
10784 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10786 gtk_widget_show_all (vbox);
10792 create_window_states (GtkWidget *widget)
10794 static GtkWidget *window = NULL;
10797 GtkWidget *iconified;
10799 GtkWidget *controls;
10803 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10804 gtk_window_set_screen (GTK_WINDOW (window),
10805 gtk_widget_get_screen (widget));
10807 g_signal_connect (window, "destroy",
10808 G_CALLBACK (gtk_widget_destroyed),
10811 gtk_window_set_title (GTK_WINDOW (window), "Window states");
10813 box1 = gtk_vbox_new (FALSE, 0);
10814 gtk_container_add (GTK_CONTAINER (window), box1);
10816 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10818 gtk_window_set_screen (GTK_WINDOW (iconified),
10819 gtk_widget_get_screen (widget));
10821 g_signal_connect_object (iconified, "destroy",
10822 G_CALLBACK (gtk_widget_destroy),
10824 G_CONNECT_SWAPPED);
10825 gtk_window_iconify (GTK_WINDOW (iconified));
10826 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
10827 controls = get_state_controls (iconified);
10828 gtk_container_add (GTK_CONTAINER (iconified), controls);
10830 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10832 gtk_window_set_screen (GTK_WINDOW (normal),
10833 gtk_widget_get_screen (widget));
10835 g_signal_connect_object (normal, "destroy",
10836 G_CALLBACK (gtk_widget_destroy),
10838 G_CONNECT_SWAPPED);
10840 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
10841 controls = get_state_controls (normal);
10842 gtk_container_add (GTK_CONTAINER (normal), controls);
10844 label = tracking_label (iconified);
10845 gtk_container_add (GTK_CONTAINER (box1), label);
10847 label = tracking_label (normal);
10848 gtk_container_add (GTK_CONTAINER (box1), label);
10850 gtk_widget_show_all (iconified);
10851 gtk_widget_show_all (normal);
10852 gtk_widget_show_all (box1);
10855 if (!GTK_WIDGET_VISIBLE (window))
10856 gtk_widget_show (window);
10858 gtk_widget_destroy (window);
10866 configure_event_callback (GtkWidget *widget,
10867 GdkEventConfigure *event,
10870 GtkWidget *label = data;
10874 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
10876 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
10877 "position: %d, %d",
10878 event->x, event->y, event->width, event->height,
10881 gtk_label_set_text (GTK_LABEL (label), msg);
10889 get_ints (GtkWidget *window,
10896 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
10897 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
10899 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
10900 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
10904 set_size_callback (GtkWidget *widget,
10909 get_ints (data, &w, &h);
10911 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
10915 unset_default_size_callback (GtkWidget *widget,
10918 gtk_window_set_default_size (g_object_get_data (data, "target"),
10923 set_default_size_callback (GtkWidget *widget,
10928 get_ints (data, &w, &h);
10930 gtk_window_set_default_size (g_object_get_data (data, "target"),
10935 unset_size_request_callback (GtkWidget *widget,
10938 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10943 set_size_request_callback (GtkWidget *widget,
10948 get_ints (data, &w, &h);
10950 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10955 set_location_callback (GtkWidget *widget,
10960 get_ints (data, &x, &y);
10962 gtk_window_move (g_object_get_data (data, "target"), x, y);
10966 move_to_position_callback (GtkWidget *widget,
10972 window = g_object_get_data (data, "target");
10974 gtk_window_get_position (window, &x, &y);
10976 gtk_window_move (window, x, y);
10980 set_geometry_callback (GtkWidget *entry,
10986 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
10988 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
10990 if (!gtk_window_parse_geometry (target, text))
10991 g_print ("Bad geometry string '%s'\n", text);
10997 allow_shrink_callback (GtkWidget *widget,
11000 g_object_set (g_object_get_data (data, "target"),
11002 GTK_TOGGLE_BUTTON (widget)->active,
11007 allow_grow_callback (GtkWidget *widget,
11010 g_object_set (g_object_get_data (data, "target"),
11012 GTK_TOGGLE_BUTTON (widget)->active,
11017 gravity_selected (GtkWidget *widget,
11020 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
11021 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
11025 pos_selected (GtkWidget *widget,
11028 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
11029 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
11033 move_gravity_window_to_current_position (GtkWidget *widget,
11039 window = GTK_WINDOW (data);
11041 gtk_window_get_position (window, &x, &y);
11043 gtk_window_move (window, x, y);
11047 get_screen_corner (GtkWindow *window,
11052 GdkScreen * screen = gtk_window_get_screen (window);
11054 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
11056 switch (gtk_window_get_gravity (window))
11058 case GDK_GRAVITY_SOUTH_EAST:
11059 *x = gdk_screen_get_width (screen) - w;
11060 *y = gdk_screen_get_height (screen) - h;
11063 case GDK_GRAVITY_NORTH_EAST:
11064 *x = gdk_screen_get_width (screen) - w;
11068 case GDK_GRAVITY_SOUTH_WEST:
11070 *y = gdk_screen_get_height (screen) - h;
11073 case GDK_GRAVITY_NORTH_WEST:
11078 case GDK_GRAVITY_SOUTH:
11079 *x = (gdk_screen_get_width (screen) - w) / 2;
11080 *y = gdk_screen_get_height (screen) - h;
11083 case GDK_GRAVITY_NORTH:
11084 *x = (gdk_screen_get_width (screen) - w) / 2;
11088 case GDK_GRAVITY_WEST:
11090 *y = (gdk_screen_get_height (screen) - h) / 2;
11093 case GDK_GRAVITY_EAST:
11094 *x = gdk_screen_get_width (screen) - w;
11095 *y = (gdk_screen_get_height (screen) - h) / 2;
11098 case GDK_GRAVITY_CENTER:
11099 *x = (gdk_screen_get_width (screen) - w) / 2;
11100 *y = (gdk_screen_get_height (screen) - h) / 2;
11103 case GDK_GRAVITY_STATIC:
11104 /* pick some random numbers */
11110 g_assert_not_reached ();
11116 move_gravity_window_to_starting_position (GtkWidget *widget,
11122 window = GTK_WINDOW (data);
11124 get_screen_corner (window,
11127 gtk_window_move (window, x, y);
11131 make_gravity_window (GtkWidget *destroy_with,
11132 GdkGravity gravity,
11133 const gchar *title)
11140 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11142 gtk_window_set_screen (GTK_WINDOW (window),
11143 gtk_widget_get_screen (destroy_with));
11145 vbox = gtk_vbox_new (FALSE, 0);
11146 gtk_widget_show (vbox);
11148 gtk_container_add (GTK_CONTAINER (window), vbox);
11149 gtk_window_set_title (GTK_WINDOW (window), title);
11150 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
11152 g_signal_connect_object (destroy_with,
11154 G_CALLBACK (gtk_widget_destroy),
11156 G_CONNECT_SWAPPED);
11159 button = gtk_button_new_with_mnemonic ("_Move to current position");
11161 g_signal_connect (button, "clicked",
11162 G_CALLBACK (move_gravity_window_to_current_position),
11165 gtk_container_add (GTK_CONTAINER (vbox), button);
11166 gtk_widget_show (button);
11168 button = gtk_button_new_with_mnemonic ("Move to _starting position");
11170 g_signal_connect (button, "clicked",
11171 G_CALLBACK (move_gravity_window_to_starting_position),
11174 gtk_container_add (GTK_CONTAINER (vbox), button);
11175 gtk_widget_show (button);
11177 /* Pretend this is the result of --geometry.
11178 * DO NOT COPY THIS CODE unless you are setting --geometry results,
11179 * and in that case you probably should just use gtk_window_parse_geometry().
11180 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
11181 * you are parsing --geometry or equivalent.
11183 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11185 GDK_HINT_USER_POS);
11187 gtk_window_set_default_size (GTK_WINDOW (window),
11190 get_screen_corner (GTK_WINDOW (window), &x, &y);
11192 gtk_window_move (GTK_WINDOW (window),
11199 do_gravity_test (GtkWidget *widget,
11202 GtkWidget *destroy_with = data;
11205 /* We put a window at each gravity point on the screen. */
11206 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
11208 gtk_widget_show (window);
11210 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
11212 gtk_widget_show (window);
11214 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
11216 gtk_widget_show (window);
11218 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
11220 gtk_widget_show (window);
11222 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
11224 gtk_widget_show (window);
11226 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
11228 gtk_widget_show (window);
11231 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
11233 gtk_widget_show (window);
11236 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
11238 gtk_widget_show (window);
11240 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
11242 gtk_widget_show (window);
11244 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
11246 gtk_widget_show (window);
11250 window_controls (GtkWidget *window)
11252 GtkWidget *control_window;
11257 GtkAdjustment *adj;
11263 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11265 gtk_window_set_screen (GTK_WINDOW (control_window),
11266 gtk_widget_get_screen (window));
11268 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
11270 g_object_set_data (G_OBJECT (control_window),
11274 g_signal_connect_object (control_window,
11276 G_CALLBACK (gtk_widget_destroy),
11278 G_CONNECT_SWAPPED);
11280 vbox = gtk_vbox_new (FALSE, 5);
11282 gtk_container_add (GTK_CONTAINER (control_window), vbox);
11284 label = gtk_label_new ("<no configure events>");
11285 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11287 g_signal_connect (window,
11289 G_CALLBACK (configure_event_callback),
11292 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
11294 spin = gtk_spin_button_new (adj, 0, 0);
11296 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
11298 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
11300 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
11302 spin = gtk_spin_button_new (adj, 0, 0);
11304 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
11306 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
11308 entry = gtk_entry_new ();
11309 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11311 g_signal_connect (entry, "changed",
11312 G_CALLBACK (set_geometry_callback),
11315 button = gtk_button_new_with_label ("Show gravity test windows");
11316 g_signal_connect_swapped (button,
11318 G_CALLBACK (do_gravity_test),
11320 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11322 button = gtk_button_new_with_label ("Reshow with initial size");
11323 g_signal_connect_object (button,
11325 G_CALLBACK (gtk_window_reshow_with_initial_size),
11327 G_CONNECT_SWAPPED);
11328 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11330 button = gtk_button_new_with_label ("Queue resize");
11331 g_signal_connect_object (button,
11333 G_CALLBACK (gtk_widget_queue_resize),
11335 G_CONNECT_SWAPPED);
11336 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11338 button = gtk_button_new_with_label ("Resize");
11339 g_signal_connect (button,
11341 G_CALLBACK (set_size_callback),
11343 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11345 button = gtk_button_new_with_label ("Set default size");
11346 g_signal_connect (button,
11348 G_CALLBACK (set_default_size_callback),
11350 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11352 button = gtk_button_new_with_label ("Unset default size");
11353 g_signal_connect (button,
11355 G_CALLBACK (unset_default_size_callback),
11357 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11359 button = gtk_button_new_with_label ("Set size request");
11360 g_signal_connect (button,
11362 G_CALLBACK (set_size_request_callback),
11364 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11366 button = gtk_button_new_with_label ("Unset size request");
11367 g_signal_connect (button,
11369 G_CALLBACK (unset_size_request_callback),
11371 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11373 button = gtk_button_new_with_label ("Move");
11374 g_signal_connect (button,
11376 G_CALLBACK (set_location_callback),
11378 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11380 button = gtk_button_new_with_label ("Move to current position");
11381 g_signal_connect (button,
11383 G_CALLBACK (move_to_position_callback),
11385 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11387 button = gtk_check_button_new_with_label ("Allow shrink");
11388 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
11389 g_signal_connect (button,
11391 G_CALLBACK (allow_shrink_callback),
11393 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11395 button = gtk_check_button_new_with_label ("Allow grow");
11396 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
11397 g_signal_connect (button,
11399 G_CALLBACK (allow_grow_callback),
11401 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11403 button = gtk_button_new_with_mnemonic ("_Show");
11404 g_signal_connect_object (button,
11406 G_CALLBACK (gtk_widget_show),
11408 G_CONNECT_SWAPPED);
11409 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11411 button = gtk_button_new_with_mnemonic ("_Hide");
11412 g_signal_connect_object (button,
11414 G_CALLBACK (gtk_widget_hide),
11416 G_CONNECT_SWAPPED);
11417 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11419 menu = gtk_menu_new ();
11425 static gchar *names[] = {
11426 "GDK_GRAVITY_NORTH_WEST",
11427 "GDK_GRAVITY_NORTH",
11428 "GDK_GRAVITY_NORTH_EAST",
11429 "GDK_GRAVITY_WEST",
11430 "GDK_GRAVITY_CENTER",
11431 "GDK_GRAVITY_EAST",
11432 "GDK_GRAVITY_SOUTH_WEST",
11433 "GDK_GRAVITY_SOUTH",
11434 "GDK_GRAVITY_SOUTH_EAST",
11435 "GDK_GRAVITY_STATIC",
11439 g_assert (names[i]);
11441 mi = gtk_menu_item_new_with_label (names[i]);
11443 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
11448 gtk_widget_show_all (menu);
11450 om = gtk_option_menu_new ();
11451 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
11454 g_signal_connect (om,
11456 G_CALLBACK (gravity_selected),
11459 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
11462 menu = gtk_menu_new ();
11468 static gchar *names[] = {
11469 "GTK_WIN_POS_NONE",
11470 "GTK_WIN_POS_CENTER",
11471 "GTK_WIN_POS_MOUSE",
11472 "GTK_WIN_POS_CENTER_ALWAYS",
11473 "GTK_WIN_POS_CENTER_ON_PARENT",
11477 g_assert (names[i]);
11479 mi = gtk_menu_item_new_with_label (names[i]);
11481 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
11486 gtk_widget_show_all (menu);
11488 om = gtk_option_menu_new ();
11489 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
11492 g_signal_connect (om,
11494 G_CALLBACK (pos_selected),
11497 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
11499 gtk_widget_show_all (vbox);
11501 return control_window;
11505 create_window_sizing (GtkWidget *widget)
11507 static GtkWidget *window = NULL;
11508 static GtkWidget *target_window = NULL;
11510 if (!target_window)
11514 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11515 gtk_window_set_screen (GTK_WINDOW (target_window),
11516 gtk_widget_get_screen (widget));
11517 label = gtk_label_new (NULL);
11518 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");
11519 gtk_container_add (GTK_CONTAINER (target_window), label);
11520 gtk_widget_show (label);
11522 g_signal_connect (target_window, "destroy",
11523 G_CALLBACK (gtk_widget_destroyed),
11526 window = window_controls (target_window);
11528 g_signal_connect (window, "destroy",
11529 G_CALLBACK (gtk_widget_destroyed),
11532 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
11535 /* don't show target window by default, we want to allow testing
11536 * of behavior on first show.
11539 if (!GTK_WIDGET_VISIBLE (window))
11540 gtk_widget_show (window);
11542 gtk_widget_destroy (window);
11549 typedef struct _ProgressData {
11552 GtkWidget *block_spin;
11553 GtkWidget *x_align_spin;
11554 GtkWidget *y_align_spin;
11555 GtkWidget *step_spin;
11556 GtkWidget *act_blocks_spin;
11566 progress_timeout (gpointer data)
11569 GtkAdjustment *adj;
11571 adj = GTK_PROGRESS (data)->adjustment;
11573 new_val = adj->value + 1;
11574 if (new_val > adj->upper)
11575 new_val = adj->lower;
11577 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
11583 destroy_progress (GtkWidget *widget,
11584 ProgressData **pdata)
11586 gtk_timeout_remove ((*pdata)->timer);
11587 (*pdata)->timer = 0;
11588 (*pdata)->window = NULL;
11594 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
11596 ProgressData *pdata;
11599 pdata = (ProgressData *) data;
11601 if (!GTK_WIDGET_MAPPED (widget))
11604 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11606 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
11607 (GtkProgressBarOrientation) i);
11611 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
11613 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
11614 GTK_TOGGLE_BUTTON (widget)->active);
11615 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
11616 gtk_widget_set_sensitive (pdata->x_align_spin,
11617 GTK_TOGGLE_BUTTON (widget)->active);
11618 gtk_widget_set_sensitive (pdata->y_align_spin,
11619 GTK_TOGGLE_BUTTON (widget)->active);
11623 progressbar_toggle_ellipsize (GtkWidget *widget,
11626 ProgressData *pdata = data;
11627 if (GTK_WIDGET_DRAWABLE (widget))
11629 gint i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11630 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
11635 progressbar_toggle_bar_style (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));
11648 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
11650 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
11652 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
11653 (GtkProgressBarStyle) i);
11657 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
11661 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
11662 sprintf (buf, "???");
11664 sprintf (buf, "%.0f%%", 100 *
11665 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
11666 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
11670 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
11672 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
11673 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
11674 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
11678 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
11680 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
11681 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
11685 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
11687 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
11688 gtk_spin_button_get_value_as_int
11689 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
11693 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
11695 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
11696 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
11697 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
11701 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
11703 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
11704 GTK_TOGGLE_BUTTON (widget)->active);
11705 gtk_widget_set_sensitive (pdata->step_spin,
11706 GTK_TOGGLE_BUTTON (widget)->active);
11707 gtk_widget_set_sensitive (pdata->act_blocks_spin,
11708 GTK_TOGGLE_BUTTON (widget)->active);
11712 entry_changed (GtkWidget *widget, ProgressData *pdata)
11714 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
11715 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
11719 create_progress_bar (GtkWidget *widget)
11730 GtkAdjustment *adj;
11731 static ProgressData *pdata = NULL;
11733 static gchar *items1[] =
11741 static gchar *items2[] =
11747 static char *ellipsize_items[] = {
11748 "None", // PANGO_ELLIPSIZE_NONE,
11749 "Start", // PANGO_ELLIPSIZE_START,
11750 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
11751 "End", // PANGO_ELLIPSIZE_END
11755 pdata = g_new0 (ProgressData, 1);
11757 if (!pdata->window)
11759 pdata->window = gtk_dialog_new ();
11761 gtk_window_set_screen (GTK_WINDOW (pdata->window),
11762 gtk_widget_get_screen (widget));
11764 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
11766 g_signal_connect (pdata->window, "destroy",
11767 G_CALLBACK (destroy_progress),
11772 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
11773 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
11775 vbox = gtk_vbox_new (FALSE, 5);
11776 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11777 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
11778 vbox, FALSE, TRUE, 0);
11780 frame = gtk_frame_new ("Progress");
11781 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
11783 vbox2 = gtk_vbox_new (FALSE, 5);
11784 gtk_container_add (GTK_CONTAINER (frame), vbox2);
11786 align = gtk_alignment_new (0.5, 0.5, 0, 0);
11787 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
11789 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
11790 g_signal_connect (adj, "value_changed",
11791 G_CALLBACK (progress_value_changed), pdata);
11793 pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
11795 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
11797 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
11798 "%v from [%l,%u] (=%p%%)");
11799 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
11800 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
11802 align = gtk_alignment_new (0.5, 0.5, 0, 0);
11803 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
11805 hbox = gtk_hbox_new (FALSE, 5);
11806 gtk_container_add (GTK_CONTAINER (align), hbox);
11807 label = gtk_label_new ("Label updated by user :");
11808 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11809 pdata->label = gtk_label_new ("");
11810 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
11812 frame = gtk_frame_new ("Options");
11813 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
11815 vbox2 = gtk_vbox_new (FALSE, 5);
11816 gtk_container_add (GTK_CONTAINER (frame), vbox2);
11818 tab = gtk_table_new (7, 2, FALSE);
11819 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
11821 label = gtk_label_new ("Orientation :");
11822 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
11823 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11825 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11827 pdata->omenu1 = build_option_menu (items1, 4, 0,
11828 progressbar_toggle_orientation,
11830 hbox = gtk_hbox_new (FALSE, 0);
11831 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
11832 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11834 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
11836 check = gtk_check_button_new_with_label ("Show text");
11837 g_signal_connect (check, "clicked",
11838 G_CALLBACK (toggle_show_text),
11840 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
11841 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11844 hbox = gtk_hbox_new (FALSE, 0);
11845 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
11846 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11849 label = gtk_label_new ("Format : ");
11850 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11852 pdata->entry = gtk_entry_new ();
11853 g_signal_connect (pdata->entry, "changed",
11854 G_CALLBACK (entry_changed),
11856 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
11857 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
11858 gtk_widget_set_size_request (pdata->entry, 100, -1);
11859 gtk_widget_set_sensitive (pdata->entry, FALSE);
11861 label = gtk_label_new ("Text align :");
11862 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
11863 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11865 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11867 hbox = gtk_hbox_new (FALSE, 0);
11868 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
11869 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11872 label = gtk_label_new ("x :");
11873 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11875 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11876 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
11877 g_signal_connect (adj, "value_changed",
11878 G_CALLBACK (adjust_align), pdata);
11879 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
11880 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
11882 label = gtk_label_new ("y :");
11883 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11885 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11886 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
11887 g_signal_connect (adj, "value_changed",
11888 G_CALLBACK (adjust_align), pdata);
11889 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
11890 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
11892 label = gtk_label_new ("Ellipsize text :");
11893 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
11894 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11896 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11897 pdata->elmenu = build_option_menu (ellipsize_items,
11898 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
11899 2, // PANGO_ELLIPSIZE_MIDDLE
11900 progressbar_toggle_ellipsize,
11902 hbox = gtk_hbox_new (FALSE, 0);
11903 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
11904 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11906 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
11908 label = gtk_label_new ("Bar Style :");
11909 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 13, 14,
11910 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11912 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11914 pdata->omenu2 = build_option_menu (items2, 2, 0,
11915 progressbar_toggle_bar_style,
11917 hbox = gtk_hbox_new (FALSE, 0);
11918 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 13, 14,
11919 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11921 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
11923 label = gtk_label_new ("Block count :");
11924 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 14, 15,
11925 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11927 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11929 hbox = gtk_hbox_new (FALSE, 0);
11930 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 14, 15,
11931 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11933 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
11934 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
11935 g_signal_connect (adj, "value_changed",
11936 G_CALLBACK (adjust_blocks), pdata);
11937 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
11938 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
11940 check = gtk_check_button_new_with_label ("Activity mode");
11941 g_signal_connect (check, "clicked",
11942 G_CALLBACK (toggle_activity_mode), pdata);
11943 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
11944 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11947 hbox = gtk_hbox_new (FALSE, 0);
11948 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 15, 16,
11949 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11951 label = gtk_label_new ("Step size : ");
11952 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11953 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
11954 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
11955 g_signal_connect (adj, "value_changed",
11956 G_CALLBACK (adjust_step), pdata);
11957 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
11958 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
11960 hbox = gtk_hbox_new (FALSE, 0);
11961 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 16, 17,
11962 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11964 label = gtk_label_new ("Blocks : ");
11965 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11966 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
11967 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
11968 g_signal_connect (adj, "value_changed",
11969 G_CALLBACK (adjust_act_blocks), pdata);
11970 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
11972 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
11974 button = gtk_button_new_with_label ("close");
11975 g_signal_connect_swapped (button, "clicked",
11976 G_CALLBACK (gtk_widget_destroy),
11978 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11979 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
11980 button, TRUE, TRUE, 0);
11981 gtk_widget_grab_default (button);
11984 if (!GTK_WIDGET_VISIBLE (pdata->window))
11985 gtk_widget_show_all (pdata->window);
11987 gtk_widget_destroy (pdata->window);
11999 GtkWidget *res_widget;
12003 find_widget (GtkWidget *widget, FindWidgetData *data)
12005 GtkAllocation new_allocation;
12009 new_allocation = widget->allocation;
12011 if (data->found || !GTK_WIDGET_MAPPED (widget))
12014 /* Note that in the following code, we only count the
12015 * position as being inside a WINDOW widget if it is inside
12016 * widget->window; points that are outside of widget->window
12017 * but within the allocation are not counted. This is consistent
12018 * with the way we highlight drag targets.
12020 if (!GTK_WIDGET_NO_WINDOW (widget))
12022 new_allocation.x = 0;
12023 new_allocation.y = 0;
12026 if (widget->parent && !data->first)
12028 GdkWindow *window = widget->window;
12029 while (window != widget->parent->window)
12031 gint tx, ty, twidth, theight;
12032 gdk_drawable_get_size (window, &twidth, &theight);
12034 if (new_allocation.x < 0)
12036 new_allocation.width += new_allocation.x;
12037 new_allocation.x = 0;
12039 if (new_allocation.y < 0)
12041 new_allocation.height += new_allocation.y;
12042 new_allocation.y = 0;
12044 if (new_allocation.x + new_allocation.width > twidth)
12045 new_allocation.width = twidth - new_allocation.x;
12046 if (new_allocation.y + new_allocation.height > theight)
12047 new_allocation.height = theight - new_allocation.y;
12049 gdk_window_get_position (window, &tx, &ty);
12050 new_allocation.x += tx;
12052 new_allocation.y += ty;
12055 window = gdk_window_get_parent (window);
12059 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
12060 (data->x < new_allocation.x + new_allocation.width) &&
12061 (data->y < new_allocation.y + new_allocation.height))
12063 /* First, check if the drag is in a valid drop site in
12064 * one of our children
12066 if (GTK_IS_CONTAINER (widget))
12068 FindWidgetData new_data = *data;
12070 new_data.x -= x_offset;
12071 new_data.y -= y_offset;
12072 new_data.found = FALSE;
12073 new_data.first = FALSE;
12075 gtk_container_forall (GTK_CONTAINER (widget),
12076 (GtkCallback)find_widget,
12079 data->found = new_data.found;
12081 data->res_widget = new_data.res_widget;
12084 /* If not, and this widget is registered as a drop site, check to
12085 * emit "drag_motion" to check if we are actually in
12090 data->found = TRUE;
12091 data->res_widget = widget;
12097 find_widget_at_pointer (GdkDisplay *display)
12099 GtkWidget *widget = NULL;
12100 GdkWindow *pointer_window;
12102 FindWidgetData data;
12104 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
12106 if (pointer_window)
12108 gpointer widget_ptr;
12110 gdk_window_get_user_data (pointer_window, &widget_ptr);
12111 widget = widget_ptr;
12116 gdk_window_get_pointer (widget->window,
12121 data.found = FALSE;
12124 find_widget (widget, &data);
12126 return data.res_widget;
12132 struct PropertiesData {
12133 GtkWidget **window;
12140 destroy_properties (GtkWidget *widget,
12141 struct PropertiesData *data)
12145 *data->window = NULL;
12146 data->window = NULL;
12151 gdk_cursor_unref (data->cursor);
12152 data->cursor = NULL;
12157 g_signal_handler_disconnect (widget, data->handler);
12165 property_query_event (GtkWidget *widget,
12167 struct PropertiesData *data)
12169 GtkWidget *res_widget = NULL;
12171 if (!data->in_query)
12174 if (event->type == GDK_BUTTON_RELEASE)
12176 gtk_grab_remove (widget);
12177 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
12180 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
12183 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
12184 gtk_widget_get_screen (widget));
12185 create_prop_editor (G_OBJECT (res_widget), 0);
12188 data->in_query = FALSE;
12195 query_properties (GtkButton *button,
12196 struct PropertiesData *data)
12200 g_signal_connect (button, "event",
12201 G_CALLBACK (property_query_event), data);
12205 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
12208 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
12210 GDK_BUTTON_RELEASE_MASK,
12215 gtk_grab_add (GTK_WIDGET (button));
12217 data->in_query = TRUE;
12221 create_properties (GtkWidget *widget)
12223 static GtkWidget *window = NULL;
12227 struct PropertiesData *data;
12229 data = g_new (struct PropertiesData, 1);
12230 data->window = &window;
12231 data->in_query = FALSE;
12232 data->cursor = NULL;
12237 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12239 gtk_window_set_screen (GTK_WINDOW (window),
12240 gtk_widget_get_screen (widget));
12242 data->handler = g_signal_connect (window, "destroy",
12243 G_CALLBACK (destroy_properties),
12246 gtk_window_set_title (GTK_WINDOW (window), "test properties");
12247 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12249 vbox = gtk_vbox_new (FALSE, 1);
12250 gtk_container_add (GTK_CONTAINER (window), vbox);
12252 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
12253 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
12255 button = gtk_button_new_with_label ("Query properties");
12256 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12257 g_signal_connect (button, "clicked",
12258 G_CALLBACK (query_properties),
12262 if (!GTK_WIDGET_VISIBLE (window))
12263 gtk_widget_show_all (window);
12265 gtk_widget_destroy (window);
12269 struct SnapshotData {
12270 GtkWidget *toplevel_button;
12271 GtkWidget **window;
12274 gboolean is_toplevel;
12279 destroy_snapshot_data (GtkWidget *widget,
12280 struct SnapshotData *data)
12283 *data->window = NULL;
12287 gdk_cursor_unref (data->cursor);
12288 data->cursor = NULL;
12293 g_signal_handler_disconnect (widget, data->handler);
12301 snapshot_widget_event (GtkWidget *widget,
12303 struct SnapshotData *data)
12305 GtkWidget *res_widget = NULL;
12307 if (!data->in_query)
12310 if (event->type == GDK_BUTTON_RELEASE)
12312 gtk_grab_remove (widget);
12313 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
12316 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
12317 if (data->is_toplevel && res_widget)
12318 res_widget = gtk_widget_get_toplevel (res_widget);
12322 GtkWidget *window, *image;
12324 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12325 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
12326 gtk_widget_realize (window);
12327 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
12329 /* this branch is needed to convert ARGB -> RGB */
12332 gdk_drawable_get_size (pixmap, &width, &height);
12333 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
12334 gtk_widget_get_colormap (res_widget),
12338 image = gtk_image_new_from_pixbuf (pixbuf);
12339 g_object_unref (pixbuf);
12342 image = gtk_image_new_from_pixmap (pixmap, NULL);
12343 gtk_container_add (GTK_CONTAINER (window), image);
12344 g_object_unref (pixmap);
12345 gtk_widget_show_all (window);
12348 data->in_query = FALSE;
12355 snapshot_widget (GtkButton *button,
12356 struct SnapshotData *data)
12360 g_signal_connect (button, "event",
12361 G_CALLBACK (snapshot_widget_event), data);
12363 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
12366 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
12369 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
12371 GDK_BUTTON_RELEASE_MASK,
12376 gtk_grab_add (GTK_WIDGET (button));
12378 data->in_query = TRUE;
12382 create_snapshot (GtkWidget *widget)
12384 static GtkWidget *window = NULL;
12387 struct SnapshotData *data;
12389 data = g_new (struct SnapshotData, 1);
12390 data->window = &window;
12391 data->in_query = FALSE;
12392 data->cursor = NULL;
12397 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12399 gtk_window_set_screen (GTK_WINDOW (window),
12400 gtk_widget_get_screen (widget));
12402 data->handler = g_signal_connect (window, "destroy",
12403 G_CALLBACK (destroy_snapshot_data),
12406 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
12407 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12409 vbox = gtk_vbox_new (FALSE, 1);
12410 gtk_container_add (GTK_CONTAINER (window), vbox);
12412 button = gtk_button_new_with_label ("Snapshot widget");
12413 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12414 g_signal_connect (button, "clicked",
12415 G_CALLBACK (snapshot_widget),
12418 button = gtk_button_new_with_label ("Snapshot toplevel");
12419 data->toplevel_button = button;
12420 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12421 g_signal_connect (button, "clicked",
12422 G_CALLBACK (snapshot_widget),
12426 if (!GTK_WIDGET_VISIBLE (window))
12427 gtk_widget_show_all (window);
12429 gtk_widget_destroy (window);
12439 static int color_idle = 0;
12442 color_idle_func (GtkWidget *preview)
12444 static int count = 1;
12448 for (i = 0; i < 256; i++)
12450 for (j = 0, k = 0; j < 256; j++)
12452 buf[k+0] = i + count;
12454 buf[k+2] = j + count;
12458 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12463 gtk_widget_queue_draw (preview);
12464 gdk_window_process_updates (preview->window, TRUE);
12470 color_preview_destroy (GtkWidget *widget,
12471 GtkWidget **window)
12473 gtk_idle_remove (color_idle);
12480 create_color_preview (GtkWidget *widget)
12482 static GtkWidget *window = NULL;
12483 GtkWidget *preview;
12489 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12491 gtk_window_set_screen (GTK_WINDOW (window),
12492 gtk_widget_get_screen (widget));
12494 g_signal_connect (window, "destroy",
12495 G_CALLBACK (color_preview_destroy),
12498 gtk_window_set_title (GTK_WINDOW (window), "test");
12499 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12501 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
12502 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
12503 gtk_container_add (GTK_CONTAINER (window), preview);
12505 for (i = 0; i < 256; i++)
12507 for (j = 0, k = 0; j < 256; j++)
12515 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12518 color_idle = gtk_idle_add ((GtkFunction) color_idle_func, preview);
12521 if (!GTK_WIDGET_VISIBLE (window))
12522 gtk_widget_show_all (window);
12524 gtk_widget_destroy (window);
12531 static int gray_idle = 0;
12534 gray_idle_func (GtkWidget *preview)
12536 static int count = 1;
12540 for (i = 0; i < 256; i++)
12542 for (j = 0; j < 256; j++)
12543 buf[j] = i + j + count;
12545 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12550 gtk_widget_draw (preview, NULL);
12556 gray_preview_destroy (GtkWidget *widget,
12557 GtkWidget **window)
12559 gtk_idle_remove (gray_idle);
12566 create_gray_preview (GtkWidget *widget)
12568 static GtkWidget *window = NULL;
12569 GtkWidget *preview;
12575 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12577 gtk_window_set_screen (GTK_WINDOW (window),
12578 gtk_widget_get_screen (widget));
12580 g_signal_connect (window, "destroy",
12581 G_CALLBACK (gray_preview_destroy),
12584 gtk_window_set_title (GTK_WINDOW (window), "test");
12585 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12587 preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
12588 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
12589 gtk_container_add (GTK_CONTAINER (window), preview);
12591 for (i = 0; i < 256; i++)
12593 for (j = 0; j < 256; j++)
12596 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12599 gray_idle = gtk_idle_add ((GtkFunction) gray_idle_func, preview);
12602 if (!GTK_WIDGET_VISIBLE (window))
12603 gtk_widget_show_all (window);
12605 gtk_widget_destroy (window);
12614 selection_test_received (GtkWidget *list, GtkSelectionData *data)
12617 GtkWidget *list_item;
12621 if (data->length < 0)
12623 g_print ("Selection retrieval failed\n");
12626 if (data->type != GDK_SELECTION_TYPE_ATOM)
12628 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
12632 /* Clear out any current list items */
12634 gtk_list_clear_items (GTK_LIST(list), 0, -1);
12636 /* Add new items to list */
12638 atoms = (GdkAtom *)data->data;
12641 l = data->length / sizeof (GdkAtom);
12642 for (i = 0; i < l; i++)
12645 name = gdk_atom_name (atoms[i]);
12648 list_item = gtk_list_item_new_with_label (name);
12652 list_item = gtk_list_item_new_with_label ("(bad atom)");
12654 gtk_widget_show (list_item);
12655 item_list = g_list_append (item_list, list_item);
12658 gtk_list_append_items (GTK_LIST (list), item_list);
12664 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
12666 static GdkAtom targets_atom = GDK_NONE;
12668 if (targets_atom == GDK_NONE)
12669 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
12671 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
12676 create_selection_test (GtkWidget *widget)
12678 static GtkWidget *window = NULL;
12681 GtkWidget *scrolled_win;
12687 window = gtk_dialog_new ();
12689 gtk_window_set_screen (GTK_WINDOW (window),
12690 gtk_widget_get_screen (widget));
12692 g_signal_connect (window, "destroy",
12693 G_CALLBACK (gtk_widget_destroyed),
12696 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
12697 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12699 /* Create the list */
12701 vbox = gtk_vbox_new (FALSE, 5);
12702 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
12703 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
12706 label = gtk_label_new ("Gets available targets for current selection");
12707 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12709 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
12710 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
12711 GTK_POLICY_AUTOMATIC,
12712 GTK_POLICY_AUTOMATIC);
12713 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
12714 gtk_widget_set_size_request (scrolled_win, 100, 200);
12716 list = gtk_list_new ();
12717 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
12719 g_signal_connect (list, "selection_received",
12720 G_CALLBACK (selection_test_received), NULL);
12722 /* .. And create some buttons */
12723 button = gtk_button_new_with_label ("Get Targets");
12724 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12725 button, TRUE, TRUE, 0);
12727 g_signal_connect (button, "clicked",
12728 G_CALLBACK (selection_test_get_targets), list);
12730 button = gtk_button_new_with_label ("Quit");
12731 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12732 button, TRUE, TRUE, 0);
12734 g_signal_connect_swapped (button, "clicked",
12735 G_CALLBACK (gtk_widget_destroy),
12739 if (!GTK_WIDGET_VISIBLE (window))
12740 gtk_widget_show_all (window);
12742 gtk_widget_destroy (window);
12750 create_gamma_curve (GtkWidget *widget)
12752 static GtkWidget *window = NULL, *curve;
12753 static int count = 0;
12760 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12761 gtk_window_set_screen (GTK_WINDOW (window),
12762 gtk_widget_get_screen (widget));
12764 gtk_window_set_title (GTK_WINDOW (window), "test");
12765 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12767 g_signal_connect (window, "destroy",
12768 G_CALLBACK(gtk_widget_destroyed),
12771 curve = gtk_gamma_curve_new ();
12772 gtk_container_add (GTK_CONTAINER (window), curve);
12773 gtk_widget_show (curve);
12776 max = 127 + (count % 2)*128;
12777 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
12779 for (i = 0; i < max; ++i)
12780 vec[i] = (127 / sqrt (max)) * sqrt (i);
12781 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
12784 if (!GTK_WIDGET_VISIBLE (window))
12785 gtk_widget_show (window);
12786 else if (count % 4 == 3)
12788 gtk_widget_destroy (window);
12799 static int scroll_test_pos = 0.0;
12802 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
12803 GtkAdjustment *adj)
12806 gint imin, imax, jmin, jmax;
12808 imin = (event->area.x) / 10;
12809 imax = (event->area.x + event->area.width + 9) / 10;
12811 jmin = ((int)adj->value + event->area.y) / 10;
12812 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
12814 gdk_window_clear_area (widget->window,
12815 event->area.x, event->area.y,
12816 event->area.width, event->area.height);
12818 for (i=imin; i<imax; i++)
12819 for (j=jmin; j<jmax; j++)
12821 gdk_draw_rectangle (widget->window,
12822 widget->style->black_gc,
12824 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
12830 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
12831 GtkAdjustment *adj)
12833 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
12834 -adj->page_increment / 2:
12835 adj->page_increment / 2);
12836 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
12837 gtk_adjustment_set_value (adj, new_value);
12843 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
12844 GtkAdjustment *adj)
12846 adj->page_increment = 0.9 * widget->allocation.height;
12847 adj->page_size = widget->allocation.height;
12849 g_signal_emit_by_name (adj, "changed");
12853 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
12855 /* gint source_min = (int)adj->value - scroll_test_pos; */
12858 dy = scroll_test_pos - (int)adj->value;
12859 scroll_test_pos = adj->value;
12861 if (!GTK_WIDGET_DRAWABLE (widget))
12863 gdk_window_scroll (widget->window, 0, dy);
12864 gdk_window_process_updates (widget->window, FALSE);
12869 create_scroll_test (GtkWidget *widget)
12871 static GtkWidget *window = NULL;
12873 GtkWidget *drawing_area;
12874 GtkWidget *scrollbar;
12876 GtkAdjustment *adj;
12877 GdkGeometry geometry;
12878 GdkWindowHints geometry_mask;
12882 window = gtk_dialog_new ();
12884 gtk_window_set_screen (GTK_WINDOW (window),
12885 gtk_widget_get_screen (widget));
12887 g_signal_connect (window, "destroy",
12888 G_CALLBACK (gtk_widget_destroyed),
12891 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
12892 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12894 hbox = gtk_hbox_new (FALSE, 0);
12895 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
12897 gtk_widget_show (hbox);
12899 drawing_area = gtk_drawing_area_new ();
12900 gtk_widget_set_size_request (drawing_area, 200, 200);
12901 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
12902 gtk_widget_show (drawing_area);
12904 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
12906 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
12907 scroll_test_pos = 0.0;
12909 scrollbar = gtk_vscrollbar_new (adj);
12910 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
12911 gtk_widget_show (scrollbar);
12913 g_signal_connect (drawing_area, "expose_event",
12914 G_CALLBACK (scroll_test_expose), adj);
12915 g_signal_connect (drawing_area, "configure_event",
12916 G_CALLBACK (scroll_test_configure), adj);
12917 g_signal_connect (drawing_area, "scroll_event",
12918 G_CALLBACK (scroll_test_scroll), adj);
12920 g_signal_connect (adj, "value_changed",
12921 G_CALLBACK (scroll_test_adjustment_changed),
12924 /* .. And create some buttons */
12926 button = gtk_button_new_with_label ("Quit");
12927 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12928 button, TRUE, TRUE, 0);
12930 g_signal_connect_swapped (button, "clicked",
12931 G_CALLBACK (gtk_widget_destroy),
12933 gtk_widget_show (button);
12935 /* Set up gridded geometry */
12937 geometry_mask = GDK_HINT_MIN_SIZE |
12938 GDK_HINT_BASE_SIZE |
12939 GDK_HINT_RESIZE_INC;
12941 geometry.min_width = 20;
12942 geometry.min_height = 20;
12943 geometry.base_width = 0;
12944 geometry.base_height = 0;
12945 geometry.width_inc = 10;
12946 geometry.height_inc = 10;
12948 gtk_window_set_geometry_hints (GTK_WINDOW (window),
12949 drawing_area, &geometry, geometry_mask);
12952 if (!GTK_WIDGET_VISIBLE (window))
12953 gtk_widget_show (window);
12955 gtk_widget_destroy (window);
12962 static int timer = 0;
12965 timeout_test (GtkWidget *label)
12967 static int count = 0;
12968 static char buffer[32];
12970 sprintf (buffer, "count: %d", ++count);
12971 gtk_label_set_text (GTK_LABEL (label), buffer);
12977 start_timeout_test (GtkWidget *widget,
12982 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
12987 stop_timeout_test (GtkWidget *widget,
12992 gtk_timeout_remove (timer);
12998 destroy_timeout_test (GtkWidget *widget,
12999 GtkWidget **window)
13001 stop_timeout_test (NULL, NULL);
13007 create_timeout_test (GtkWidget *widget)
13009 static GtkWidget *window = NULL;
13015 window = gtk_dialog_new ();
13017 gtk_window_set_screen (GTK_WINDOW (window),
13018 gtk_widget_get_screen (widget));
13020 g_signal_connect (window, "destroy",
13021 G_CALLBACK (destroy_timeout_test),
13024 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
13025 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
13027 label = gtk_label_new ("count: 0");
13028 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
13029 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
13030 label, TRUE, TRUE, 0);
13031 gtk_widget_show (label);
13033 button = gtk_button_new_with_label ("close");
13034 g_signal_connect_swapped (button, "clicked",
13035 G_CALLBACK (gtk_widget_destroy),
13037 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13038 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13039 button, TRUE, TRUE, 0);
13040 gtk_widget_grab_default (button);
13041 gtk_widget_show (button);
13043 button = gtk_button_new_with_label ("start");
13044 g_signal_connect (button, "clicked",
13045 G_CALLBACK(start_timeout_test),
13047 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13048 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13049 button, TRUE, TRUE, 0);
13050 gtk_widget_show (button);
13052 button = gtk_button_new_with_label ("stop");
13053 g_signal_connect (button, "clicked",
13054 G_CALLBACK (stop_timeout_test),
13056 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13057 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13058 button, TRUE, TRUE, 0);
13059 gtk_widget_show (button);
13062 if (!GTK_WIDGET_VISIBLE (window))
13063 gtk_widget_show (window);
13065 gtk_widget_destroy (window);
13072 static int idle_id = 0;
13075 idle_test (GtkWidget *label)
13077 static int count = 0;
13078 static char buffer[32];
13080 sprintf (buffer, "count: %d", ++count);
13081 gtk_label_set_text (GTK_LABEL (label), buffer);
13087 start_idle_test (GtkWidget *widget,
13092 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
13097 stop_idle_test (GtkWidget *widget,
13102 gtk_idle_remove (idle_id);
13108 destroy_idle_test (GtkWidget *widget,
13109 GtkWidget **window)
13111 stop_idle_test (NULL, NULL);
13117 toggle_idle_container (GObject *button,
13118 GtkContainer *container)
13120 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
13124 create_idle_test (GtkWidget *widget)
13126 static GtkWidget *window = NULL;
13129 GtkWidget *container;
13133 GtkWidget *button2;
13137 window = gtk_dialog_new ();
13139 gtk_window_set_screen (GTK_WINDOW (window),
13140 gtk_widget_get_screen (widget));
13142 g_signal_connect (window, "destroy",
13143 G_CALLBACK (destroy_idle_test),
13146 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
13147 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
13149 label = gtk_label_new ("count: 0");
13150 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
13151 gtk_widget_show (label);
13154 g_object_new (GTK_TYPE_HBOX,
13156 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
13157 * "GtkWidget::visible", TRUE,
13162 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
13163 container, TRUE, TRUE, 0);
13166 g_object_new (GTK_TYPE_FRAME,
13168 "label", "Label Container",
13170 "parent", GTK_DIALOG (window)->vbox,
13173 g_object_new (GTK_TYPE_VBOX,
13178 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
13179 "label", "Resize-Parent",
13180 "user_data", (void*)GTK_RESIZE_PARENT,
13184 "signal::clicked", toggle_idle_container, container,
13186 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
13187 "label", "Resize-Queue",
13188 "user_data", (void*)GTK_RESIZE_QUEUE,
13193 g_object_connect (button,
13194 "signal::clicked", toggle_idle_container, container,
13196 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
13197 "label", "Resize-Immediate",
13198 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
13200 g_object_connect (button2,
13201 "signal::clicked", toggle_idle_container, container,
13203 g_object_set (button2,
13209 button = gtk_button_new_with_label ("close");
13210 g_signal_connect_swapped (button, "clicked",
13211 G_CALLBACK (gtk_widget_destroy),
13213 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13214 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13215 button, TRUE, TRUE, 0);
13216 gtk_widget_grab_default (button);
13217 gtk_widget_show (button);
13219 button = gtk_button_new_with_label ("start");
13220 g_signal_connect (button, "clicked",
13221 G_CALLBACK (start_idle_test),
13223 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13224 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13225 button, TRUE, TRUE, 0);
13226 gtk_widget_show (button);
13228 button = gtk_button_new_with_label ("stop");
13229 g_signal_connect (button, "clicked",
13230 G_CALLBACK (stop_idle_test),
13232 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13233 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13234 button, TRUE, TRUE, 0);
13235 gtk_widget_show (button);
13238 if (!GTK_WIDGET_VISIBLE (window))
13239 gtk_widget_show (window);
13241 gtk_widget_destroy (window);
13249 reload_all_rc_files (void)
13251 static GdkAtom atom_rcfiles = GDK_NONE;
13253 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
13257 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
13259 for(i = 0; i < 5; i++)
13260 send_event->client.data.l[i] = 0;
13261 send_event->client.data_format = 32;
13262 send_event->client.message_type = atom_rcfiles;
13263 gdk_event_send_clientmessage_toall (send_event);
13265 gdk_event_free (send_event);
13269 create_rc_file (GtkWidget *widget)
13271 static GtkWidget *window = NULL;
13279 window = gtk_dialog_new ();
13281 gtk_window_set_screen (GTK_WINDOW (window),
13282 gtk_widget_get_screen (widget));
13284 g_signal_connect (window, "destroy",
13285 G_CALLBACK (gtk_widget_destroyed),
13288 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
13289 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
13291 vbox = gtk_vbox_new (FALSE, 0);
13292 gtk_container_add (GTK_CONTAINER (frame), vbox);
13294 label = gtk_label_new ("This label should be red");
13295 gtk_widget_set_name (label, "testgtk-red-label");
13296 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13298 label = gtk_label_new ("This label should be green");
13299 gtk_widget_set_name (label, "testgtk-green-label");
13300 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13302 label = gtk_label_new ("This label should be blue");
13303 gtk_widget_set_name (label, "testgtk-blue-label");
13304 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13306 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
13307 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
13309 button = gtk_button_new_with_label ("Reload");
13310 g_signal_connect (button, "clicked",
13311 G_CALLBACK (gtk_rc_reparse_all), NULL);
13312 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13313 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13314 button, TRUE, TRUE, 0);
13315 gtk_widget_grab_default (button);
13317 button = gtk_button_new_with_label ("Reload All");
13318 g_signal_connect (button, "clicked",
13319 G_CALLBACK (reload_all_rc_files), NULL);
13320 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13321 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13322 button, TRUE, TRUE, 0);
13324 button = gtk_button_new_with_label ("Close");
13325 g_signal_connect_swapped (button, "clicked",
13326 G_CALLBACK (gtk_widget_destroy),
13328 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13329 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13330 button, TRUE, TRUE, 0);
13333 if (!GTK_WIDGET_VISIBLE (window))
13334 gtk_widget_show_all (window);
13336 gtk_widget_destroy (window);
13340 * Test of recursive mainloop
13344 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
13351 create_mainloop (GtkWidget *widget)
13353 static GtkWidget *window = NULL;
13359 window = gtk_dialog_new ();
13361 gtk_window_set_screen (GTK_WINDOW (window),
13362 gtk_widget_get_screen (widget));
13364 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
13366 g_signal_connect (window, "destroy",
13367 G_CALLBACK (mainloop_destroyed),
13370 label = gtk_label_new ("In recursive main loop...");
13371 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
13373 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
13375 gtk_widget_show (label);
13377 button = gtk_button_new_with_label ("Leave");
13378 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
13381 g_signal_connect_swapped (button, "clicked",
13382 G_CALLBACK (gtk_widget_destroy),
13385 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13386 gtk_widget_grab_default (button);
13388 gtk_widget_show (button);
13391 if (!GTK_WIDGET_VISIBLE (window))
13393 gtk_widget_show (window);
13395 g_print ("create_mainloop: start\n");
13397 g_print ("create_mainloop: done\n");
13400 gtk_widget_destroy (window);
13404 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
13409 gint imin, imax, jmin, jmax;
13411 layout = GTK_LAYOUT (widget);
13413 if (event->window != layout->bin_window)
13416 imin = (event->area.x) / 10;
13417 imax = (event->area.x + event->area.width + 9) / 10;
13419 jmin = (event->area.y) / 10;
13420 jmax = (event->area.y + event->area.height + 9) / 10;
13422 for (i=imin; i<imax; i++)
13423 for (j=jmin; j<jmax; j++)
13425 gdk_draw_rectangle (layout->bin_window,
13426 widget->style->black_gc,
13434 void create_layout (GtkWidget *widget)
13436 static GtkWidget *window = NULL;
13438 GtkWidget *scrolledwindow;
13447 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13448 gtk_window_set_screen (GTK_WINDOW (window),
13449 gtk_widget_get_screen (widget));
13451 g_signal_connect (window, "destroy",
13452 G_CALLBACK (gtk_widget_destroyed),
13455 gtk_window_set_title (GTK_WINDOW (window), "Layout");
13456 gtk_widget_set_size_request (window, 200, 200);
13458 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
13459 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
13461 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
13462 GTK_CORNER_TOP_RIGHT);
13464 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
13466 layout = gtk_layout_new (NULL, NULL);
13467 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
13469 /* We set step sizes here since GtkLayout does not set
13472 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
13473 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
13475 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
13476 g_signal_connect (layout, "expose_event",
13477 G_CALLBACK (layout_expose_handler), NULL);
13479 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
13481 for (i=0 ; i < 16 ; i++)
13482 for (j=0 ; j < 16 ; j++)
13484 sprintf(buf, "Button %d, %d", i, j);
13486 button = gtk_button_new_with_label (buf);
13488 button = gtk_label_new (buf);
13490 gtk_layout_put (GTK_LAYOUT (layout), button,
13494 for (i=16; i < 1280; i++)
13496 sprintf(buf, "Button %d, %d", i, 0);
13498 button = gtk_button_new_with_label (buf);
13500 button = gtk_label_new (buf);
13502 gtk_layout_put (GTK_LAYOUT (layout), button,
13507 if (!GTK_WIDGET_VISIBLE (window))
13508 gtk_widget_show_all (window);
13510 gtk_widget_destroy (window);
13514 create_styles (GtkWidget *widget)
13516 static GtkWidget *window = NULL;
13521 static GdkColor red = { 0, 0xffff, 0, 0 };
13522 static GdkColor green = { 0, 0, 0xffff, 0 };
13523 static GdkColor blue = { 0, 0, 0, 0xffff };
13524 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
13525 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
13526 PangoFontDescription *font_desc;
13528 GtkRcStyle *rc_style;
13532 window = gtk_dialog_new ();
13533 gtk_window_set_screen (GTK_WINDOW (window),
13534 gtk_widget_get_screen (widget));
13536 g_signal_connect (window, "destroy",
13537 G_CALLBACK (gtk_widget_destroyed),
13541 button = gtk_button_new_with_label ("Close");
13542 g_signal_connect_swapped (button, "clicked",
13543 G_CALLBACK (gtk_widget_destroy),
13545 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13546 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13547 button, TRUE, TRUE, 0);
13548 gtk_widget_show (button);
13550 vbox = gtk_vbox_new (FALSE, 5);
13551 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
13552 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
13554 label = gtk_label_new ("Font:");
13555 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13556 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13558 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
13560 button = gtk_button_new_with_label ("Some Text");
13561 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
13562 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13564 label = gtk_label_new ("Foreground:");
13565 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13566 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13568 button = gtk_button_new_with_label ("Some Text");
13569 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
13570 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13572 label = gtk_label_new ("Background:");
13573 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13574 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13576 button = gtk_button_new_with_label ("Some Text");
13577 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
13578 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13580 label = gtk_label_new ("Text:");
13581 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13582 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13584 entry = gtk_entry_new ();
13585 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13586 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
13587 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13589 label = gtk_label_new ("Base:");
13590 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13591 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13593 entry = gtk_entry_new ();
13594 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13595 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
13596 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13598 label = gtk_label_new ("Cursor:");
13599 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13600 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13602 entry = gtk_entry_new ();
13603 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13604 gtk_widget_modify_cursor (entry, &red, &red);
13605 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13607 label = gtk_label_new ("Multiple:");
13608 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13609 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13611 button = gtk_button_new_with_label ("Some Text");
13613 rc_style = gtk_rc_style_new ();
13615 rc_style->font_desc = pango_font_description_copy (font_desc);
13616 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
13617 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
13618 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
13619 rc_style->fg[GTK_STATE_NORMAL] = yellow;
13620 rc_style->bg[GTK_STATE_NORMAL] = blue;
13621 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
13622 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
13623 rc_style->fg[GTK_STATE_ACTIVE] = red;
13624 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
13625 rc_style->xthickness = 5;
13626 rc_style->ythickness = 5;
13628 gtk_widget_modify_style (button, rc_style);
13629 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
13631 g_object_unref (rc_style);
13633 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13636 if (!GTK_WIDGET_VISIBLE (window))
13637 gtk_widget_show_all (window);
13639 gtk_widget_destroy (window);
13643 * Main Window and Exit
13647 do_exit (GtkWidget *widget, GtkWidget *window)
13649 gtk_widget_destroy (window);
13655 void (*func) (GtkWidget *widget);
13656 gboolean do_not_benchmark;
13659 { "alpha window", create_alpha_window },
13661 /* dog slow on NT, no working at all on 9x */
13662 { "big windows", create_big_windows, TRUE },
13664 { "big windows", create_big_windows },
13666 { "button box", create_button_box },
13667 { "buttons", create_buttons },
13668 { "check buttons", create_check_buttons },
13669 { "clist", create_clist},
13670 { "color selection", create_color_selection },
13671 { "composited window", create_composited_window },
13672 { "ctree", create_ctree },
13673 { "cursors", create_cursors },
13674 { "dialog", create_dialog, TRUE },
13675 { "display & screen", create_display_screen, TRUE },
13676 { "entry", create_entry },
13677 { "event box", create_event_box },
13678 { "event watcher", create_event_watcher },
13679 { "expander", create_expander },
13680 { "file selection", create_file_selection },
13681 { "flipping", create_flipping },
13682 { "focus", create_focus },
13683 { "font selection", create_font_selection },
13684 { "gamma curve", create_gamma_curve, TRUE },
13685 { "gridded geometry", create_gridded_geometry },
13686 { "handle box", create_handle_box },
13687 { "image from drawable", create_get_image },
13688 { "image", create_image },
13689 { "item factory", create_item_factory },
13690 { "key lookup", create_key_lookup },
13691 { "labels", create_labels },
13692 { "layout", create_layout },
13693 { "list", create_list },
13694 { "menus", create_menus },
13695 { "message dialog", create_message_dialog },
13696 { "modal window", create_modal_window, TRUE },
13697 { "notebook", create_notebook },
13698 { "panes", create_panes },
13699 { "paned keyboard", create_paned_keyboard_navigation },
13700 { "pixmap", create_pixmap },
13701 { "preview color", create_color_preview, TRUE },
13702 { "preview gray", create_gray_preview, TRUE },
13703 { "progress bar", create_progress_bar },
13704 { "properties", create_properties },
13705 { "radio buttons", create_radio_buttons },
13706 { "range controls", create_range_controls },
13707 { "rc file", create_rc_file },
13708 { "reparent", create_reparent },
13709 { "resize grips", create_resize_grips },
13710 { "rotated label", create_rotated_label },
13711 { "rotated text", create_rotated_text },
13712 { "rulers", create_rulers },
13713 { "saved position", create_saved_position },
13714 { "scrolled windows", create_scrolled_windows },
13715 { "shapes", create_shapes },
13716 { "size groups", create_size_groups },
13717 { "snapshot", create_snapshot },
13718 { "spinbutton", create_spins },
13719 { "statusbar", create_statusbar },
13720 { "styles", create_styles },
13721 { "test idle", create_idle_test },
13722 { "test mainloop", create_mainloop, TRUE },
13723 { "test scrolling", create_scroll_test },
13724 { "test selection", create_selection_test },
13725 { "test timeout", create_timeout_test },
13726 { "text", create_text },
13727 { "toggle buttons", create_toggle_buttons },
13728 { "toolbar", create_toolbar },
13729 { "tooltips", create_tooltips },
13730 { "tree", create_tree_mode_window},
13731 { "WM hints", create_wmhints },
13732 { "window sizing", create_window_sizing },
13733 { "window states", create_window_states }
13735 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
13738 create_main_window (void)
13743 GtkWidget *scrolled_window;
13747 GtkWidget *separator;
13748 GdkGeometry geometry;
13751 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13752 gtk_widget_set_name (window, "main window");
13753 gtk_widget_set_uposition (window, 50, 20);
13754 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
13756 geometry.min_width = -1;
13757 geometry.min_height = -1;
13758 geometry.max_width = -1;
13759 geometry.max_height = G_MAXSHORT;
13760 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
13762 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
13764 g_signal_connect (window, "destroy",
13765 G_CALLBACK (gtk_main_quit),
13767 g_signal_connect (window, "delete-event",
13768 G_CALLBACK (gtk_false),
13771 box1 = gtk_vbox_new (FALSE, 0);
13772 gtk_container_add (GTK_CONTAINER (window), box1);
13774 if (gtk_micro_version > 0)
13779 gtk_micro_version);
13784 gtk_minor_version);
13786 label = gtk_label_new (buffer);
13787 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
13788 gtk_widget_set_name (label, "testgtk-version-label");
13790 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
13791 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
13792 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
13794 GTK_POLICY_AUTOMATIC);
13795 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
13797 box2 = gtk_vbox_new (FALSE, 0);
13798 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
13799 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
13800 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
13801 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
13802 gtk_widget_show (box2);
13804 for (i = 0; i < nbuttons; i++)
13806 button = gtk_button_new_with_label (buttons[i].label);
13807 if (buttons[i].func)
13808 g_signal_connect (button,
13810 G_CALLBACK(buttons[i].func),
13813 gtk_widget_set_sensitive (button, FALSE);
13814 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
13817 separator = gtk_hseparator_new ();
13818 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
13820 box2 = gtk_vbox_new (FALSE, 10);
13821 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
13822 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
13824 button = gtk_button_new_with_mnemonic ("_Close");
13825 g_signal_connect (button, "clicked",
13826 G_CALLBACK (do_exit),
13828 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
13829 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13830 gtk_widget_grab_default (button);
13832 gtk_widget_show_all (window);
13838 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
13839 G_FILE_TEST_EXISTS))
13841 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
13842 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
13847 pad (const char *str, int to)
13849 static char buf[256];
13850 int len = strlen (str);
13853 for (i = 0; i < to; i++)
13858 memcpy (buf, str, len);
13864 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
13866 fn (widget); /* on */
13867 while (g_main_context_iteration (NULL, FALSE));
13868 fn (widget); /* off */
13869 while (g_main_context_iteration (NULL, FALSE));
13873 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
13879 static gboolean printed_headers = FALSE;
13881 if (!printed_headers) {
13882 g_print ("Test Iters First Other\n");
13883 g_print ("-------------------- ----- ---------- ----------\n");
13884 printed_headers = TRUE;
13887 g_get_current_time (&tv0);
13888 bench_iteration (widget, fn);
13889 g_get_current_time (&tv1);
13891 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
13892 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
13894 g_get_current_time (&tv0);
13895 for (n = 0; n < num - 1; n++)
13896 bench_iteration (widget, fn);
13897 g_get_current_time (&tv1);
13898 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
13899 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
13901 g_print ("%s %5d ", pad (name, 20), num);
13903 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
13905 g_print ("%10.1f\n", dt_first);
13909 do_bench (char* what, int num)
13913 void (* fn) (GtkWidget *widget);
13915 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13917 if (g_ascii_strcasecmp (what, "ALL") == 0)
13919 for (i = 0; i < nbuttons; i++)
13921 if (!buttons[i].do_not_benchmark)
13922 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
13929 for (i = 0; i < nbuttons; i++)
13931 if (strcmp (buttons[i].label, what) == 0)
13933 fn = buttons[i].func;
13939 g_print ("Can't bench: \"%s\" not found.\n", what);
13941 do_real_bench (widget, fn, buttons[i].label, num);
13948 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
13953 main (int argc, char *argv[])
13955 GtkBindingSet *binding_set;
13957 gboolean done_benchmarks = FALSE;
13959 srand (time (NULL));
13963 /* Check to see if we are being run from the correct
13966 if (file_exists ("testgtkrc"))
13967 gtk_rc_add_default_file ("testgtkrc");
13968 else if (file_exists ("tests/testgtkrc"))
13969 gtk_rc_add_default_file ("tests/testgtkrc");
13971 g_warning ("Couldn't find file \"testgtkrc\".");
13973 g_set_application_name ("GTK+ Test Program");
13975 gtk_init (&argc, &argv);
13977 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
13986 for (i = 1; i < argc; i++)
13988 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
13995 nextarg = strchr (argv[i], '=');
14006 count = strchr (nextarg, ':');
14009 what = g_strndup (nextarg, count - nextarg);
14011 num = atoi (count);
14016 what = g_strdup (nextarg);
14018 do_bench (what, num ? num : 1);
14019 done_benchmarks = TRUE;
14024 if (done_benchmarks)
14029 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
14030 gtk_binding_entry_add_signal (binding_set,
14031 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
14034 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
14036 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
14040 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
14041 " fg[NORMAL] = \"#ff0000\"\n"
14042 " font = \"Sans 18\"\n"
14044 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
14046 create_main_window ();
14052 while (g_main_context_pending (NULL))
14053 g_main_context_iteration (NULL, FALSE);
14056 while (g_main_context_pending (NULL))
14057 g_main_context_iteration (NULL, FALSE);