1 /* GTK - The GTK+ 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;
2409 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
2412 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
2415 gtk_window_set_screen (GTK_WINDOW (window),
2416 gtk_widget_get_screen (widget));
2418 label = gtk_label_new ("Geometry string:");
2419 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0);
2421 entry = gtk_entry_new ();
2422 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
2423 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), entry, FALSE, FALSE, 0);
2425 g_signal_connect (window, "response",
2426 G_CALLBACK (gridded_geometry_response), entry);
2427 g_object_add_weak_pointer (G_OBJECT (window), (gpointer) &window);
2429 gtk_widget_show_all (window);
2432 gtk_widget_destroy (window);
2440 handle_box_child_signal (GtkHandleBox *hb,
2442 const gchar *action)
2444 printf ("%s: child <%s> %sed\n",
2445 g_type_name (G_OBJECT_TYPE (hb)),
2446 g_type_name (G_OBJECT_TYPE (child)),
2451 create_handle_box (GtkWidget *widget)
2453 static GtkWidget* window = NULL;
2454 GtkWidget *handle_box;
2455 GtkWidget *handle_box2;
2460 GtkWidget *separator;
2464 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2466 gtk_window_set_screen (GTK_WINDOW (window),
2467 gtk_widget_get_screen (widget));
2468 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
2469 gtk_window_set_title (GTK_WINDOW (window),
2471 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2473 g_signal_connect (window, "destroy",
2474 G_CALLBACK (gtk_widget_destroyed),
2477 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
2479 vbox = gtk_vbox_new (FALSE, 0);
2480 gtk_container_add (GTK_CONTAINER (window), vbox);
2481 gtk_widget_show (vbox);
2483 label = gtk_label_new ("Above");
2484 gtk_container_add (GTK_CONTAINER (vbox), label);
2485 gtk_widget_show (label);
2487 separator = gtk_hseparator_new ();
2488 gtk_container_add (GTK_CONTAINER (vbox), separator);
2489 gtk_widget_show (separator);
2491 hbox = gtk_hbox_new (FALSE, 10);
2492 gtk_container_add (GTK_CONTAINER (vbox), hbox);
2493 gtk_widget_show (hbox);
2495 separator = gtk_hseparator_new ();
2496 gtk_container_add (GTK_CONTAINER (vbox), separator);
2497 gtk_widget_show (separator);
2499 label = gtk_label_new ("Below");
2500 gtk_container_add (GTK_CONTAINER (vbox), label);
2501 gtk_widget_show (label);
2503 handle_box = gtk_handle_box_new ();
2504 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2505 g_signal_connect (handle_box,
2507 G_CALLBACK (handle_box_child_signal),
2509 g_signal_connect (handle_box,
2511 G_CALLBACK (handle_box_child_signal),
2513 gtk_widget_show (handle_box);
2515 toolbar = make_toolbar (window);
2517 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2518 gtk_widget_show (toolbar);
2520 handle_box = gtk_handle_box_new ();
2521 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2522 g_signal_connect (handle_box,
2524 G_CALLBACK (handle_box_child_signal),
2526 g_signal_connect (handle_box,
2528 G_CALLBACK (handle_box_child_signal),
2530 gtk_widget_show (handle_box);
2532 handle_box2 = gtk_handle_box_new ();
2533 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2534 g_signal_connect (handle_box2,
2536 G_CALLBACK (handle_box_child_signal),
2538 g_signal_connect (handle_box2,
2540 G_CALLBACK (handle_box_child_signal),
2542 gtk_widget_show (handle_box2);
2544 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
2545 label = gtk_label_new ("Fooo!");
2546 gtk_container_add (GTK_CONTAINER (hbox), label);
2547 gtk_widget_show (label);
2548 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
2551 if (!GTK_WIDGET_VISIBLE (window))
2552 gtk_widget_show (window);
2554 gtk_widget_destroy (window);
2558 * Test for getting an image from a drawable
2569 take_snapshot (GtkWidget *button,
2572 struct GetImageData *gid = data;
2573 GdkRectangle visible;
2575 int height_fraction;
2578 GdkColor color = { 0, 30000, 0, 0 };
2579 GdkRectangle target;
2582 /* Do some begin_paint_rect on some random rects, draw some
2583 * distinctive stuff into those rects, then take the snapshot.
2584 * figure out whether any rects were overlapped and report to
2588 visible = gid->sw->allocation;
2590 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2591 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2593 width_fraction = visible.width / 4;
2594 height_fraction = visible.height / 4;
2596 gc = gdk_gc_new (gid->src->window);
2597 black_gc = gid->src->style->black_gc;
2599 gdk_gc_set_rgb_fg_color (gc, &color);
2602 target.x = visible.x + width_fraction;
2603 target.y = visible.y + height_fraction * 3;
2604 target.width = width_fraction;
2605 target.height = height_fraction / 2;
2607 gdk_window_begin_paint_rect (gid->src->window,
2610 gdk_draw_rectangle (gid->src->window,
2614 target.width, target.height);
2616 gdk_draw_rectangle (gid->src->window,
2619 target.x + 10, target.y + 10,
2620 target.width - 20, target.height - 20);
2622 target.x = visible.x + width_fraction;
2623 target.y = visible.y + height_fraction;
2624 target.width = width_fraction;
2625 target.height = height_fraction;
2627 gdk_window_begin_paint_rect (gid->src->window,
2630 gdk_draw_rectangle (gid->src->window,
2634 target.width, target.height);
2636 gdk_draw_rectangle (gid->src->window,
2639 target.x + 10, target.y + 10,
2640 target.width - 20, target.height - 20);
2642 target.x = visible.x + width_fraction * 3;
2643 target.y = visible.y + height_fraction;
2644 target.width = width_fraction / 2;
2645 target.height = height_fraction;
2647 gdk_window_begin_paint_rect (gid->src->window,
2650 gdk_draw_rectangle (gid->src->window,
2654 target.width, target.height);
2656 gdk_draw_rectangle (gid->src->window,
2659 target.x + 10, target.y + 10,
2660 target.width - 20, target.height - 20);
2662 target.x = visible.x + width_fraction * 2;
2663 target.y = visible.y + height_fraction * 2;
2664 target.width = width_fraction / 4;
2665 target.height = height_fraction / 4;
2667 gdk_window_begin_paint_rect (gid->src->window,
2670 gdk_draw_rectangle (gid->src->window,
2674 target.width, target.height);
2676 gdk_draw_rectangle (gid->src->window,
2679 target.x + 10, target.y + 10,
2680 target.width - 20, target.height - 20);
2682 target.x += target.width / 2;
2683 target.y += target.width / 2;
2685 gdk_window_begin_paint_rect (gid->src->window,
2688 gdk_draw_rectangle (gid->src->window,
2692 target.width, target.height);
2694 gdk_draw_rectangle (gid->src->window,
2697 target.x + 10, target.y + 10,
2698 target.width - 20, target.height - 20);
2700 /* Screen shot area */
2702 target.x = visible.x + width_fraction * 1.5;
2703 target.y = visible.y + height_fraction * 1.5;
2704 target.width = width_fraction * 2;
2705 target.height = height_fraction * 2;
2707 shot = gdk_drawable_get_image (gid->src->window,
2709 target.width, target.height);
2711 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2714 g_object_unref (shot);
2716 gdk_window_end_paint (gid->src->window);
2717 gdk_window_end_paint (gid->src->window);
2718 gdk_window_end_paint (gid->src->window);
2719 gdk_window_end_paint (gid->src->window);
2720 gdk_window_end_paint (gid->src->window);
2722 gdk_draw_rectangle (gid->src->window,
2723 gid->src->style->black_gc,
2726 target.width, target.height);
2728 g_object_unref (gc);
2732 image_source_expose (GtkWidget *da,
2733 GdkEventExpose *event,
2736 int x = event->area.x;
2737 GdkColor red = { 0, 65535, 0, 0 };
2738 GdkColor green = { 0, 0, 65535, 0 };
2739 GdkColor blue = { 0, 0, 0, 65535 };
2742 gc = gdk_gc_new (event->window);
2744 while (x < (event->area.x + event->area.width))
2751 gdk_gc_set_rgb_fg_color (gc, &red);
2757 gdk_gc_set_rgb_fg_color (gc, &green);
2763 gdk_gc_set_rgb_fg_color (gc, &blue);
2767 g_assert_not_reached ();
2771 gdk_draw_line (event->window,
2774 x, event->area.y + event->area.height);
2779 g_object_unref (gc);
2785 create_get_image (GtkWidget *widget)
2787 static GtkWidget *window = NULL;
2790 gtk_widget_destroy (window);
2799 struct GetImageData *gid;
2801 gid = g_new (struct GetImageData, 1);
2803 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2805 gtk_window_set_screen (GTK_WINDOW (window),
2806 gtk_widget_get_screen (widget));
2808 g_signal_connect (window,
2810 G_CALLBACK (gtk_widget_destroyed),
2813 g_object_set_data_full (G_OBJECT (window),
2814 "testgtk-get-image-data",
2818 hbox = gtk_hbox_new (FALSE, 0);
2820 gtk_container_add (GTK_CONTAINER (window), hbox);
2822 sw = gtk_scrolled_window_new (NULL, NULL);
2823 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2824 GTK_POLICY_AUTOMATIC,
2825 GTK_POLICY_AUTOMATIC);
2829 gtk_widget_set_size_request (sw, 400, 400);
2831 src = gtk_drawing_area_new ();
2832 gtk_widget_set_size_request (src, 10000, 10000);
2834 g_signal_connect (src,
2836 G_CALLBACK (image_source_expose),
2841 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2844 gtk_box_pack_start (GTK_BOX (hbox),
2848 vbox = gtk_vbox_new (FALSE, 3);
2850 snap = g_object_new (GTK_TYPE_IMAGE, NULL);
2854 sw = gtk_scrolled_window_new (NULL, NULL);
2855 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2856 GTK_POLICY_AUTOMATIC,
2857 GTK_POLICY_AUTOMATIC);
2858 gtk_widget_set_size_request (sw, 300, 300);
2860 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2862 gtk_box_pack_end (GTK_BOX (vbox), sw, FALSE, FALSE, 5);
2864 button = gtk_button_new_with_label ("Get image from drawable");
2866 g_signal_connect (button,
2868 G_CALLBACK (take_snapshot),
2871 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2873 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2875 gtk_widget_show_all (window);
2883 sensitivity_toggled (GtkWidget *toggle,
2886 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2890 create_sensitivity_control (GtkWidget *widget)
2894 button = gtk_toggle_button_new_with_label ("Sensitive");
2896 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2897 GTK_WIDGET_IS_SENSITIVE (widget));
2899 g_signal_connect (button,
2901 G_CALLBACK (sensitivity_toggled),
2904 gtk_widget_show_all (button);
2910 set_selectable_recursive (GtkWidget *widget,
2913 if (GTK_IS_CONTAINER (widget))
2918 children = gtk_container_get_children (GTK_CONTAINER (widget));
2922 set_selectable_recursive (tmp->data, setting);
2926 g_list_free (children);
2928 else if (GTK_IS_LABEL (widget))
2930 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2935 selectable_toggled (GtkWidget *toggle,
2938 set_selectable_recursive (widget,
2939 GTK_TOGGLE_BUTTON (toggle)->active);
2943 create_selectable_control (GtkWidget *widget)
2947 button = gtk_toggle_button_new_with_label ("Selectable");
2949 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2952 g_signal_connect (button,
2954 G_CALLBACK (selectable_toggled),
2957 gtk_widget_show_all (button);
2962 void create_labels (GtkWidget *widget)
2964 static GtkWidget *window = NULL;
2973 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2975 gtk_window_set_screen (GTK_WINDOW (window),
2976 gtk_widget_get_screen (widget));
2978 g_signal_connect (window, "destroy",
2979 G_CALLBACK (gtk_widget_destroyed),
2982 gtk_window_set_title (GTK_WINDOW (window), "Label");
2984 vbox = gtk_vbox_new (FALSE, 5);
2986 hbox = gtk_hbox_new (FALSE, 5);
2987 gtk_container_add (GTK_CONTAINER (window), vbox);
2989 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2991 button = create_sensitivity_control (hbox);
2993 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2995 button = create_selectable_control (hbox);
2997 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2999 vbox = gtk_vbox_new (FALSE, 5);
3001 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3002 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
3004 frame = gtk_frame_new ("Normal Label");
3005 label = gtk_label_new ("This is a Normal label");
3006 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
3007 gtk_container_add (GTK_CONTAINER (frame), label);
3008 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3010 frame = gtk_frame_new ("Multi-line Label");
3011 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
3012 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
3013 gtk_container_add (GTK_CONTAINER (frame), label);
3014 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3016 frame = gtk_frame_new ("Left Justified Label");
3017 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
3018 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
3019 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3020 gtk_container_add (GTK_CONTAINER (frame), label);
3021 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3023 frame = gtk_frame_new ("Right Justified Label");
3024 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
3025 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
3026 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
3027 gtk_container_add (GTK_CONTAINER (frame), label);
3028 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3030 frame = gtk_frame_new ("Internationalized Label");
3031 label = gtk_label_new (NULL);
3032 gtk_label_set_markup (GTK_LABEL (label),
3033 "French (Fran\303\247ais) Bonjour, Salut\n"
3034 "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"
3035 "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"
3036 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
3037 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
3038 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
3039 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3040 gtk_container_add (GTK_CONTAINER (frame), label);
3041 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3043 frame = gtk_frame_new ("Bidirection Label");
3044 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"
3045 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
3046 gtk_container_add (GTK_CONTAINER (frame), label);
3047 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3049 vbox = gtk_vbox_new (FALSE, 5);
3050 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3051 frame = gtk_frame_new ("Line wrapped label");
3052 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
3053 "up the entire "/* big space to test spacing */\
3054 "width allocated to it, but automatically wraps the words to fit. "\
3055 "The time has come, for all good men, to come to the aid of their party. "\
3056 "The sixth sheik's six sheep's sick.\n"\
3057 " It supports multiple paragraphs correctly, and correctly adds "\
3058 "many extra spaces. ");
3060 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
3061 gtk_container_add (GTK_CONTAINER (frame), label);
3062 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3064 frame = gtk_frame_new ("Filled, wrapped label");
3065 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
3066 "up the entire width allocated to it. Here is a seneance to prove "\
3067 "my point. Here is another sentence. "\
3068 "Here comes the sun, do de do de do.\n"\
3069 " This is a new paragraph.\n"\
3070 " This is another newer, longer, better paragraph. It is coming to an end, "\
3072 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
3073 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
3074 gtk_container_add (GTK_CONTAINER (frame), label);
3075 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3077 frame = gtk_frame_new ("Underlined label");
3078 label = gtk_label_new ("This label is underlined!\n"
3079 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
3080 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3081 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
3082 gtk_container_add (GTK_CONTAINER (frame), label);
3083 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3085 frame = gtk_frame_new ("Markup label");
3086 label = gtk_label_new (NULL);
3088 /* There's also a gtk_label_set_markup() without accel if you
3089 * don't have an accelerator key
3091 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
3092 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
3093 "<b>markup</b> _such as "
3094 "<big><i>Big Italics</i></big>\n"
3095 "<tt>Monospace font</tt>\n"
3096 "<u>Underline!</u>\n"
3098 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
3099 "and nothing on this line,\n"
3102 "or even on this one\n"
3103 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
3104 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
3105 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
3107 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
3109 gtk_container_add (GTK_CONTAINER (frame), label);
3110 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3113 if (!GTK_WIDGET_VISIBLE (window))
3114 gtk_widget_show_all (window);
3116 gtk_widget_destroy (window);
3120 on_angle_scale_changed (GtkRange *range,
3123 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
3127 create_rotated_label (GtkWidget *widget)
3129 static GtkWidget *window = NULL;
3133 GtkWidget *scale_label;
3134 GtkWidget *scale_hbox;
3138 window = gtk_dialog_new_with_buttons ("Rotated Label",
3139 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
3140 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3143 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3145 gtk_window_set_screen (GTK_WINDOW (window),
3146 gtk_widget_get_screen (widget));
3148 g_signal_connect (window, "response",
3149 G_CALLBACK (gtk_object_destroy), NULL);
3150 g_signal_connect (window, "destroy",
3151 G_CALLBACK (gtk_widget_destroyed), &window);
3153 vbox = gtk_vbox_new (FALSE, 5);
3154 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0);
3155 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
3157 label = gtk_label_new (NULL);
3158 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
3159 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
3161 scale_hbox = gtk_hbox_new (FALSE, 0);
3162 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
3164 scale_label = gtk_label_new (NULL);
3165 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
3166 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
3168 hscale = gtk_hscale_new_with_range (0, 360, 5);
3169 g_signal_connect (hscale, "value-changed",
3170 G_CALLBACK (on_angle_scale_changed), label);
3172 gtk_range_set_value (GTK_RANGE (hscale), 45);
3173 gtk_widget_set_usize (hscale, 200, -1);
3174 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
3177 if (!GTK_WIDGET_VISIBLE (window))
3178 gtk_widget_show_all (window);
3180 gtk_widget_destroy (window);
3183 #define DEFAULT_TEXT_RADIUS 200
3186 on_rotated_text_unrealize (GtkWidget *widget)
3188 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
3192 on_rotated_text_expose (GtkWidget *widget,
3193 GdkEventExpose *event,
3194 GdkPixbuf *tile_pixbuf)
3196 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
3197 "had", "10,000", "men" };
3198 PangoRenderer *renderer;
3203 PangoMatrix matrix = PANGO_MATRIX_INIT;
3204 PangoLayout *layout;
3205 PangoContext *context;
3206 PangoFontDescription *desc;
3208 gc = g_object_get_data (G_OBJECT (widget), "text-gc");
3211 static GdkColor black = { 0, 0, 0, 0 };
3213 gc = gdk_gc_new (widget->window);
3214 gdk_gc_set_rgb_fg_color (gc, &black);
3220 gint width = gdk_pixbuf_get_width (tile_pixbuf);
3221 gint height = gdk_pixbuf_get_height (tile_pixbuf);
3223 tile = gdk_pixmap_new (widget->window, width, height, -1);
3224 gdk_draw_pixbuf (tile, gc, tile_pixbuf,
3225 0, 0, 0, 0, width, height,
3226 GDK_RGB_DITHER_NORMAL, 0, 0);
3228 gdk_gc_set_tile (gc, tile);
3229 gdk_gc_set_fill (gc, GDK_TILED);
3231 g_object_unref (tile);
3234 g_object_set_data_full (G_OBJECT (widget), "text-gc", gc, (GDestroyNotify)g_object_unref);
3237 renderer = gdk_pango_renderer_get_default (gtk_widget_get_screen (widget));
3238 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), widget->window);
3239 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), gc);
3241 radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
3243 pango_matrix_translate (&matrix,
3244 radius + (widget->allocation.width - 2 * radius) / 2,
3245 radius + (widget->allocation.height - 2 * radius) / 2);
3246 pango_matrix_scale (&matrix, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
3248 context = gtk_widget_get_pango_context (widget);
3249 layout = pango_layout_new (context);
3250 desc = pango_font_description_from_string ("Sans Bold 30");
3251 pango_layout_set_font_description (layout, desc);
3252 pango_font_description_free (desc);
3254 n_words = G_N_ELEMENTS (words);
3255 for (i = 0; i < n_words; i++)
3257 PangoMatrix rotated_matrix = matrix;
3260 pango_matrix_rotate (&rotated_matrix, - (360. * i) / n_words);
3262 pango_context_set_matrix (context, &rotated_matrix);
3263 pango_layout_context_changed (layout);
3264 pango_layout_set_text (layout, words[i], -1);
3266 pango_layout_get_size (layout, &width, &height);
3268 pango_renderer_draw_layout (renderer, layout,
3269 - width / 2, - DEFAULT_TEXT_RADIUS * PANGO_SCALE);
3272 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL);
3273 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL);
3275 g_object_unref (layout);
3281 create_rotated_text (GtkWidget *widget)
3283 static GtkWidget *window = NULL;
3287 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
3288 GtkRequisition requisition;
3289 GtkWidget *drawing_area;
3290 GdkPixbuf *tile_pixbuf;
3292 window = gtk_dialog_new_with_buttons ("Rotated Text",
3293 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
3294 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3297 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3299 gtk_window_set_screen (GTK_WINDOW (window),
3300 gtk_widget_get_screen (widget));
3302 g_signal_connect (window, "response",
3303 G_CALLBACK (gtk_object_destroy), NULL);
3304 g_signal_connect (window, "destroy",
3305 G_CALLBACK (gtk_widget_destroyed), &window);
3307 drawing_area = gtk_drawing_area_new ();
3308 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), drawing_area, TRUE, TRUE, 0);
3309 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
3311 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
3313 g_signal_connect (drawing_area, "expose-event",
3314 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
3315 g_signal_connect (drawing_area, "unrealize",
3316 G_CALLBACK (on_rotated_text_unrealize), NULL);
3318 gtk_widget_show_all (GTK_BIN (window)->child);
3320 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
3321 gtk_widget_size_request (window, &requisition);
3322 gtk_widget_set_size_request (drawing_area, -1, -1);
3323 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
3326 if (!GTK_WIDGET_VISIBLE (window))
3327 gtk_widget_show (window);
3329 gtk_widget_destroy (window);
3337 reparent_label (GtkWidget *widget,
3338 GtkWidget *new_parent)
3342 label = g_object_get_data (G_OBJECT (widget), "user_data");
3344 gtk_widget_reparent (label, new_parent);
3348 set_parent_signal (GtkWidget *child,
3349 GtkWidget *old_parent,
3352 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
3353 g_type_name (G_OBJECT_TYPE (child)),
3354 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
3355 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
3356 GPOINTER_TO_INT (func_data));
3360 create_reparent (GtkWidget *widget)
3362 static GtkWidget *window = NULL;
3369 GtkWidget *separator;
3370 GtkWidget *event_box;
3374 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3376 gtk_window_set_screen (GTK_WINDOW (window),
3377 gtk_widget_get_screen (widget));
3379 g_signal_connect (window, "destroy",
3380 G_CALLBACK (gtk_widget_destroyed),
3383 gtk_window_set_title (GTK_WINDOW (window), "reparent");
3384 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3386 box1 = gtk_vbox_new (FALSE, 0);
3387 gtk_container_add (GTK_CONTAINER (window), box1);
3389 box2 = gtk_hbox_new (FALSE, 5);
3390 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3391 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3393 label = gtk_label_new ("Hello World");
3395 frame = gtk_frame_new ("Frame 1");
3396 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
3398 box3 = gtk_vbox_new (FALSE, 5);
3399 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
3400 gtk_container_add (GTK_CONTAINER (frame), box3);
3402 button = gtk_button_new_with_label ("switch");
3403 g_object_set_data (G_OBJECT (button), "user_data", label);
3404 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
3406 event_box = gtk_event_box_new ();
3407 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
3408 gtk_container_add (GTK_CONTAINER (event_box), label);
3410 g_signal_connect (button, "clicked",
3411 G_CALLBACK (reparent_label),
3414 g_signal_connect (label, "parent_set",
3415 G_CALLBACK (set_parent_signal),
3416 GINT_TO_POINTER (42));
3418 frame = gtk_frame_new ("Frame 2");
3419 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
3421 box3 = gtk_vbox_new (FALSE, 5);
3422 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
3423 gtk_container_add (GTK_CONTAINER (frame), box3);
3425 button = gtk_button_new_with_label ("switch");
3426 g_object_set_data (G_OBJECT (button), "user_data", label);
3427 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
3429 event_box = gtk_event_box_new ();
3430 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
3432 g_signal_connect (button, "clicked",
3433 G_CALLBACK (reparent_label),
3436 separator = gtk_hseparator_new ();
3437 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3439 box2 = gtk_vbox_new (FALSE, 10);
3440 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3441 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3443 button = gtk_button_new_with_label ("close");
3444 g_signal_connect_swapped (button, "clicked",
3445 G_CALLBACK (gtk_widget_destroy), window);
3446 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3447 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3448 gtk_widget_grab_default (button);
3451 if (!GTK_WIDGET_VISIBLE (window))
3452 gtk_widget_show_all (window);
3454 gtk_widget_destroy (window);
3461 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
3463 if (event->type == GDK_BUTTON_PRESS)
3465 if (event->button == 1)
3466 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
3467 event->button, event->x_root, event->y_root,
3469 else if (event->button == 2)
3470 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
3471 event->button, event->x_root, event->y_root,
3478 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
3480 gtk_paint_resize_grip (area->style,
3482 GTK_WIDGET_STATE (area),
3488 area->allocation.width,
3489 area->allocation.height);
3495 create_resize_grips (GtkWidget *widget)
3497 static GtkWidget *window = NULL;
3499 GtkWidget *hbox, *vbox;
3502 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3504 gtk_window_set_screen (GTK_WINDOW (window),
3505 gtk_widget_get_screen (widget));
3507 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
3509 g_signal_connect (window, "destroy",
3510 G_CALLBACK (gtk_widget_destroyed),
3513 vbox = gtk_vbox_new (FALSE, 0);
3514 gtk_container_add (GTK_CONTAINER (window), vbox);
3516 hbox = gtk_hbox_new (FALSE, 0);
3517 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3520 area = gtk_drawing_area_new ();
3521 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3522 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3523 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3524 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3525 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3526 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3529 area = gtk_drawing_area_new ();
3530 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3531 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3532 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3533 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3534 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3535 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3538 area = gtk_drawing_area_new ();
3539 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3540 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3541 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3542 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3543 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3544 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3546 hbox = gtk_hbox_new (FALSE, 0);
3547 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3550 area = gtk_drawing_area_new ();
3551 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3552 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3553 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3554 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3555 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3556 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3559 area = gtk_drawing_area_new ();
3560 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3563 area = gtk_drawing_area_new ();
3564 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3565 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3566 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3567 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3568 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3569 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3572 hbox = gtk_hbox_new (FALSE, 0);
3573 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3576 area = gtk_drawing_area_new ();
3577 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3578 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3579 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3580 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3581 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3582 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3584 area = gtk_drawing_area_new ();
3585 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3586 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3587 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3588 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3589 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3590 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3593 area = gtk_drawing_area_new ();
3594 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3595 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3596 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3597 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3598 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3599 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3602 if (!GTK_WIDGET_VISIBLE (window))
3603 gtk_widget_show_all (window);
3605 gtk_widget_destroy (window);
3611 gint upositionx = 0;
3612 gint upositiony = 0;
3615 uposition_configure (GtkWidget *window)
3621 lx = g_object_get_data (G_OBJECT (window), "x");
3622 ly = g_object_get_data (G_OBJECT (window), "y");
3624 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
3625 sprintf (buffer, "%d", upositionx);
3626 gtk_label_set_text (lx, buffer);
3627 sprintf (buffer, "%d", upositiony);
3628 gtk_label_set_text (ly, buffer);
3634 uposition_stop_configure (GtkToggleButton *toggle,
3638 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
3640 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
3644 create_saved_position (GtkWidget *widget)
3646 static GtkWidget *window = NULL;
3651 GtkWidget *main_vbox;
3659 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
3660 "type", GTK_WINDOW_TOPLEVEL,
3661 "title", "Saved Position",
3663 "signal::configure_event", uposition_configure, NULL,
3666 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3668 gtk_window_set_screen (GTK_WINDOW (window),
3669 gtk_widget_get_screen (widget));
3672 g_signal_connect (window, "destroy",
3673 G_CALLBACK (gtk_widget_destroyed),
3676 main_vbox = gtk_vbox_new (FALSE, 5);
3677 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3678 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3681 g_object_new (gtk_vbox_get_type (),
3682 "GtkBox::homogeneous", FALSE,
3683 "GtkBox::spacing", 5,
3684 "GtkContainer::border_width", 10,
3685 "GtkWidget::parent", main_vbox,
3686 "GtkWidget::visible", TRUE,
3687 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
3688 "label", "Stop Events",
3692 "signal::clicked", uposition_stop_configure, window,
3696 hbox = gtk_hbox_new (FALSE, 0);
3697 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3698 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3700 label = gtk_label_new ("X Origin : ");
3701 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3702 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3704 x_label = gtk_label_new ("");
3705 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3706 g_object_set_data (G_OBJECT (window), "x", x_label);
3708 hbox = gtk_hbox_new (FALSE, 0);
3709 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3710 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3712 label = gtk_label_new ("Y Origin : ");
3713 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3714 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3716 y_label = gtk_label_new ("");
3717 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3718 g_object_set_data (G_OBJECT (window), "y", y_label);
3721 g_object_new (gtk_hseparator_get_type (),
3722 "GtkWidget::visible", TRUE,
3724 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3726 hbox = gtk_hbox_new (FALSE, 0);
3727 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3728 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3730 button = gtk_button_new_with_label ("Close");
3731 g_signal_connect_swapped (button, "clicked",
3732 G_CALLBACK (gtk_widget_destroy),
3734 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3735 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3736 gtk_widget_grab_default (button);
3738 gtk_widget_show_all (window);
3741 gtk_widget_destroy (window);
3749 create_pixmap (GtkWidget *widget)
3751 static GtkWidget *window = NULL;
3757 GtkWidget *separator;
3758 GtkWidget *pixmapwid;
3762 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3764 gtk_window_set_screen (GTK_WINDOW (window),
3765 gtk_widget_get_screen (widget));
3767 g_signal_connect (window, "destroy",
3768 G_CALLBACK (gtk_widget_destroyed),
3771 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3772 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3773 gtk_widget_realize(window);
3775 box1 = gtk_vbox_new (FALSE, 0);
3776 gtk_container_add (GTK_CONTAINER (window), box1);
3778 box2 = gtk_vbox_new (FALSE, 10);
3779 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3780 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3782 button = gtk_button_new ();
3783 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3785 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3787 label = gtk_label_new ("Pixmap\ntest");
3788 box3 = gtk_hbox_new (FALSE, 0);
3789 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3790 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3791 gtk_container_add (GTK_CONTAINER (box3), label);
3792 gtk_container_add (GTK_CONTAINER (button), box3);
3794 button = gtk_button_new ();
3795 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3797 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3799 label = gtk_label_new ("Pixmap\ntest");
3800 box3 = gtk_hbox_new (FALSE, 0);
3801 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3802 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3803 gtk_container_add (GTK_CONTAINER (box3), label);
3804 gtk_container_add (GTK_CONTAINER (button), box3);
3806 gtk_widget_set_sensitive (button, FALSE);
3808 separator = gtk_hseparator_new ();
3809 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3811 box2 = gtk_vbox_new (FALSE, 10);
3812 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3813 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3815 button = gtk_button_new_with_label ("close");
3816 g_signal_connect_swapped (button, "clicked",
3817 G_CALLBACK (gtk_widget_destroy),
3819 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3820 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3821 gtk_widget_grab_default (button);
3824 if (!GTK_WIDGET_VISIBLE (window))
3825 gtk_widget_show_all (window);
3827 gtk_widget_destroy (window);
3831 tips_query_widget_entered (GtkTipsQuery *tips_query,
3833 const gchar *tip_text,
3834 const gchar *tip_private,
3837 if (GTK_TOGGLE_BUTTON (toggle)->active)
3839 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3840 /* don't let GtkTipsQuery reset its label */
3841 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3846 tips_query_widget_selected (GtkWidget *tips_query,
3848 const gchar *tip_text,
3849 const gchar *tip_private,
3850 GdkEventButton *event,
3854 g_print ("Help \"%s\" requested for <%s>\n",
3855 tip_private ? tip_private : "None",
3856 g_type_name (G_OBJECT_TYPE (widget)));
3861 create_tooltips (GtkWidget *widget)
3863 static GtkWidget *window = NULL;
3870 GtkWidget *tips_query;
3871 GtkWidget *separator;
3872 GtkTooltips *tooltips;
3877 g_object_new (gtk_window_get_type (),
3878 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3879 "GtkContainer::border_width", 0,
3880 "GtkWindow::title", "Tooltips",
3881 "GtkWindow::allow_shrink", TRUE,
3882 "GtkWindow::allow_grow", FALSE,
3885 gtk_window_set_screen (GTK_WINDOW (window),
3886 gtk_widget_get_screen (widget));
3888 g_signal_connect (window, "destroy",
3889 G_CALLBACK (destroy_tooltips),
3892 tooltips=gtk_tooltips_new();
3893 g_object_ref (tooltips);
3894 gtk_object_sink (GTK_OBJECT (tooltips));
3895 g_object_set_data (G_OBJECT (window), "tooltips", tooltips);
3897 box1 = gtk_vbox_new (FALSE, 0);
3898 gtk_container_add (GTK_CONTAINER (window), box1);
3900 box2 = gtk_vbox_new (FALSE, 10);
3901 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3902 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3904 button = gtk_toggle_button_new_with_label ("button1");
3905 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3907 gtk_tooltips_set_tip (tooltips,
3910 "ContextHelp/buttons/1");
3912 button = gtk_toggle_button_new_with_label ("button2");
3913 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3915 gtk_tooltips_set_tip (tooltips,
3917 "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.",
3918 "ContextHelp/buttons/2_long");
3920 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3921 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3923 gtk_tooltips_set_tip (tooltips,
3925 "Toggle TipsQuery view.",
3929 g_object_new (gtk_vbox_get_type (),
3930 "homogeneous", FALSE,
3936 tips_query = gtk_tips_query_new ();
3939 g_object_new (gtk_button_get_type (),
3944 g_object_connect (button,
3945 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3947 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3948 gtk_tooltips_set_tip (tooltips,
3950 "Start the Tooltips Inspector",
3951 "ContextHelp/buttons/?");
3954 g_object_set (g_object_connect (tips_query,
3955 "signal::widget_entered", tips_query_widget_entered, toggle,
3956 "signal::widget_selected", tips_query_widget_selected, NULL,
3963 frame = g_object_new (gtk_frame_get_type (),
3964 "label", "ToolTips Inspector",
3965 "label_xalign", (double) 0.5,
3971 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3973 separator = gtk_hseparator_new ();
3974 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3976 box2 = gtk_vbox_new (FALSE, 10);
3977 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3978 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3980 button = gtk_button_new_with_label ("close");
3981 g_signal_connect_swapped (button, "clicked",
3982 G_CALLBACK (gtk_widget_destroy),
3984 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3985 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3986 gtk_widget_grab_default (button);
3988 gtk_tooltips_set_tip (tooltips, button, "Push this button to close window", "ContextHelp/buttons/Close");
3991 if (!GTK_WIDGET_VISIBLE (window))
3992 gtk_widget_show_all (window);
3994 gtk_widget_destroy (window);
4002 pack_image (GtkWidget *box,
4006 gtk_box_pack_start (GTK_BOX (box),
4007 gtk_label_new (text),
4010 gtk_box_pack_start (GTK_BOX (box),
4016 create_image (GtkWidget *widget)
4018 static GtkWidget *window = NULL;
4026 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4028 gtk_window_set_screen (GTK_WINDOW (window),
4029 gtk_widget_get_screen (widget));
4031 /* this is bogus for testing drawing when allocation < request,
4032 * don't copy into real code
4034 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
4036 g_signal_connect (window, "destroy",
4037 G_CALLBACK (gtk_widget_destroyed),
4040 vbox = gtk_vbox_new (FALSE, 5);
4042 gtk_container_add (GTK_CONTAINER (window), vbox);
4044 pack_image (vbox, "Stock Warning Dialog",
4045 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
4046 GTK_ICON_SIZE_DIALOG));
4048 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
4049 gtk_widget_get_colormap (window),
4054 pack_image (vbox, "Pixmap",
4055 gtk_image_new_from_pixmap (pixmap, mask));
4058 if (!GTK_WIDGET_VISIBLE (window))
4059 gtk_widget_show_all (window);
4061 gtk_widget_destroy (window);
4069 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
4072 GtkWidget *menuitem;
4081 menu = gtk_menu_new ();
4082 gtk_menu_set_screen (GTK_MENU (menu), screen);
4088 menuitem = gtk_tearoff_menu_item_new ();
4089 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4090 gtk_widget_show (menuitem);
4093 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
4094 GTK_ICON_SIZE_MENU);
4095 gtk_widget_show (image);
4096 menuitem = gtk_image_menu_item_new_with_label ("Image item");
4097 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4098 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4099 gtk_widget_show (menuitem);
4101 for (i = 0, j = 1; i < length; i++, j++)
4103 sprintf (buf, "item %2d - %d", depth, j);
4105 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
4106 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
4110 gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
4113 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4114 gtk_widget_show (menuitem);
4116 gtk_widget_set_sensitive (menuitem, FALSE);
4119 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
4123 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
4124 create_menu (screen, depth - 1, 5, TRUE));
4131 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
4134 GtkWidget *menuitem;
4140 menu = gtk_menu_new ();
4141 gtk_menu_set_screen (GTK_MENU (menu), screen);
4146 menuitem = gtk_tearoff_menu_item_new ();
4147 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4148 gtk_widget_show (menuitem);
4152 menuitem = gtk_menu_item_new_with_label ("items");
4153 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4155 submenu = gtk_menu_new ();
4156 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4157 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4158 gtk_widget_show (menuitem);
4161 /* now fill the items submenu */
4162 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4163 GTK_ICON_SIZE_MENU);
4164 gtk_widget_show (image);
4165 menuitem = gtk_image_menu_item_new_with_label ("Image");
4166 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4167 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4168 gtk_widget_show (menuitem);
4170 menuitem = gtk_menu_item_new_with_label ("x");
4171 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
4172 gtk_widget_show (menuitem);
4174 menuitem = gtk_menu_item_new_with_label ("x");
4175 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
4176 gtk_widget_show (menuitem);
4178 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4179 GTK_ICON_SIZE_MENU);
4180 gtk_widget_show (image);
4181 menuitem = gtk_image_menu_item_new_with_label ("Image");
4182 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4183 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4184 gtk_widget_show (menuitem);
4186 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4187 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
4188 gtk_widget_show (menuitem);
4190 menuitem = gtk_menu_item_new_with_label ("x");
4191 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
4192 gtk_widget_show (menuitem);
4194 menuitem = gtk_menu_item_new_with_label ("x");
4195 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
4196 gtk_widget_show (menuitem);
4198 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4199 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
4200 gtk_widget_show (menuitem);
4202 menuitem = gtk_check_menu_item_new_with_label ("Check");
4203 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
4204 gtk_widget_show (menuitem);
4206 menuitem = gtk_menu_item_new_with_label ("x");
4207 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
4208 gtk_widget_show (menuitem);
4210 menuitem = gtk_menu_item_new_with_label ("x");
4211 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
4212 gtk_widget_show (menuitem);
4214 menuitem = gtk_check_menu_item_new_with_label ("Check");
4215 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
4216 gtk_widget_show (menuitem);
4218 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4219 gtk_widget_show (menuitem);
4220 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
4222 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4223 gtk_widget_show (menuitem);
4224 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
4226 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4227 gtk_widget_show (menuitem);
4228 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
4230 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4231 gtk_widget_show (menuitem);
4232 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
4234 /* end of items submenu */
4236 menuitem = gtk_menu_item_new_with_label ("spanning");
4237 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4239 submenu = gtk_menu_new ();
4240 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4241 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4242 gtk_widget_show (menuitem);
4245 /* now fill the spanning submenu */
4246 menuitem = gtk_menu_item_new_with_label ("a");
4247 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
4248 gtk_widget_show (menuitem);
4250 menuitem = gtk_menu_item_new_with_label ("b");
4251 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
4252 gtk_widget_show (menuitem);
4254 menuitem = gtk_menu_item_new_with_label ("c");
4255 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
4256 gtk_widget_show (menuitem);
4258 menuitem = gtk_menu_item_new_with_label ("d");
4259 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4260 gtk_widget_show (menuitem);
4262 menuitem = gtk_menu_item_new_with_label ("e");
4263 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
4264 gtk_widget_show (menuitem);
4265 /* end of spanning submenu */
4267 menuitem = gtk_menu_item_new_with_label ("left");
4268 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
4269 submenu = gtk_menu_new ();
4270 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4271 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4272 gtk_widget_show (menuitem);
4274 menuitem = gtk_menu_item_new_with_label ("Empty");
4275 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4276 submenu = gtk_menu_new ();
4277 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4278 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4279 gtk_widget_show (menuitem);
4281 menuitem = gtk_menu_item_new_with_label ("right");
4282 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
4283 submenu = gtk_menu_new ();
4284 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4285 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4286 gtk_widget_show (menuitem);
4288 menuitem = gtk_menu_item_new_with_label ("Empty");
4289 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4290 gtk_widget_show (menuitem);
4294 for (; j < rows; j++)
4295 for (i = 0; i < cols; i++)
4297 sprintf (buf, "(%d %d)", i, j);
4298 menuitem = gtk_menu_item_new_with_label (buf);
4299 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
4300 gtk_widget_show (menuitem);
4303 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4304 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
4305 gtk_widget_show (menuitem);
4306 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4307 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
4308 gtk_widget_show (menuitem);
4309 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4310 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
4311 gtk_widget_show (menuitem);
4312 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4313 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
4314 gtk_widget_show (menuitem);
4320 create_menus (GtkWidget *widget)
4322 static GtkWidget *window = NULL;
4326 GtkWidget *optionmenu;
4327 GtkWidget *separator;
4333 GtkWidget *menuitem;
4334 GtkAccelGroup *accel_group;
4336 GdkScreen *screen = gtk_widget_get_screen (widget);
4338 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4340 gtk_window_set_screen (GTK_WINDOW (window), screen);
4342 g_signal_connect (window, "destroy",
4343 G_CALLBACK (gtk_widget_destroyed),
4345 g_signal_connect (window, "delete-event",
4346 G_CALLBACK (gtk_true),
4349 accel_group = gtk_accel_group_new ();
4350 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4352 gtk_window_set_title (GTK_WINDOW (window), "menus");
4353 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4356 box1 = gtk_vbox_new (FALSE, 0);
4357 gtk_container_add (GTK_CONTAINER (window), box1);
4358 gtk_widget_show (box1);
4360 menubar = gtk_menu_bar_new ();
4361 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4362 gtk_widget_show (menubar);
4364 menu = create_menu (screen, 2, 50, TRUE);
4366 menuitem = gtk_menu_item_new_with_label ("test\nline2");
4367 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4368 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4369 gtk_widget_show (menuitem);
4371 menu = create_table_menu (screen, 2, 50, TRUE);
4373 menuitem = gtk_menu_item_new_with_label ("table");
4374 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4375 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4376 gtk_widget_show (menuitem);
4378 menuitem = gtk_menu_item_new_with_label ("foo");
4379 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
4380 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4381 gtk_widget_show (menuitem);
4383 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4384 GTK_ICON_SIZE_MENU);
4385 gtk_widget_show (image);
4386 menuitem = gtk_image_menu_item_new_with_label ("Help");
4387 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4388 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
4389 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
4390 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4391 gtk_widget_show (menuitem);
4393 menubar = gtk_menu_bar_new ();
4394 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4395 gtk_widget_show (menubar);
4397 menu = create_menu (screen, 2, 10, TRUE);
4399 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
4400 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4401 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4402 gtk_widget_show (menuitem);
4404 box2 = gtk_vbox_new (FALSE, 10);
4405 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4406 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4407 gtk_widget_show (box2);
4409 menu = create_menu (screen, 1, 5, FALSE);
4410 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
4412 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
4413 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4414 gtk_widget_show (menuitem);
4416 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
4417 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4418 gtk_widget_show (menuitem);
4419 gtk_widget_add_accelerator (menuitem,
4425 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
4426 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4427 gtk_widget_show (menuitem);
4428 gtk_widget_add_accelerator (menuitem,
4433 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4434 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
4435 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4436 gtk_widget_show (menuitem);
4437 gtk_widget_add_accelerator (menuitem,
4443 gtk_widget_add_accelerator (menuitem,
4450 optionmenu = gtk_option_menu_new ();
4451 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
4452 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
4453 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
4454 gtk_widget_show (optionmenu);
4456 separator = gtk_hseparator_new ();
4457 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4458 gtk_widget_show (separator);
4460 box2 = gtk_vbox_new (FALSE, 10);
4461 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4462 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4463 gtk_widget_show (box2);
4465 button = gtk_button_new_with_label ("close");
4466 g_signal_connect_swapped (button, "clicked",
4467 G_CALLBACK (gtk_widget_destroy),
4469 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4470 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4471 gtk_widget_grab_default (button);
4472 gtk_widget_show (button);
4475 if (!GTK_WIDGET_VISIBLE (window))
4476 gtk_widget_show (window);
4478 gtk_widget_destroy (window);
4482 gtk_ifactory_cb (gpointer callback_data,
4483 guint callback_action,
4486 g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
4489 /* GdkPixbuf RGBA C-Source image dump */
4491 static const guint8 apple[] =
4493 /* Pixbuf magic (0x47646b50) */
4495 /* length: header (24) + pixel_data (2304) */
4497 /* pixdata_type (0x1010002) */
4499 /* rowstride (96) */
4506 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4507 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
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\26\24"
4513 "\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"
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\0`m"
4515 "[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"
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\0"
4517 "\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"
4518 "\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"
4519 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4520 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
4521 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
4522 "\0\0\0\0\0\0\0\0\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"
4523 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
4524 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
4525 "\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["
4526 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
4527 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
4528 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
4529 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
4530 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
4531 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
4532 "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"
4533 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
4534 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
4535 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
4536 "\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"
4537 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
4538 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
4539 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
4540 "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"
4541 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
4542 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
4543 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
4544 "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"
4545 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
4546 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
4547 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4548 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4549 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4550 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4551 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4552 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4553 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4554 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4555 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4556 "\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>"
4557 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4558 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4559 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4560 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\205W\312\216\220`\377\230"
4561 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4562 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4563 "\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"
4564 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4565 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4566 "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"
4567 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4568 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4569 "\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"
4570 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4571 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4572 "\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"
4573 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4574 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4575 "\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"
4576 "\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"
4577 "\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"
4578 "\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"
4579 "\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"
4580 "\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"
4581 "\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"
4582 "\0\0\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"
4583 "\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"
4584 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4588 dump_accels (gpointer callback_data,
4589 guint callback_action,
4592 gtk_accel_map_save_fd (1 /* stdout */);
4595 static GtkItemFactoryEntry menu_items[] =
4597 { "/_File", NULL, NULL, 0, "<Branch>" },
4598 { "/File/tearoff1", NULL, gtk_ifactory_cb, 0, "<Tearoff>" },
4599 { "/File/_New", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_NEW },
4600 { "/File/_Open", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
4601 { "/File/_Save", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4602 { "/File/Save _As...", "<control>A", gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4603 { "/File/_Dump \"_Accels\"", NULL, dump_accels, 0 },
4604 { "/File/\\/Test__Escaping/And\\/\n\tWei\\\\rdly",
4605 NULL, gtk_ifactory_cb, 0 },
4606 { "/File/sep1", NULL, gtk_ifactory_cb, 0, "<Separator>" },
4607 { "/File/_Quit", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
4609 { "/_Preferences", NULL, 0, 0, "<Branch>" },
4610 { "/_Preferences/_Color", NULL, 0, 0, "<Branch>" },
4611 { "/_Preferences/Color/_Red", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4612 { "/_Preferences/Color/_Green", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4613 { "/_Preferences/Color/_Blue", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4614 { "/_Preferences/_Shape", NULL, 0, 0, "<Branch>" },
4615 { "/_Preferences/Shape/_Square", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4616 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
4617 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
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/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple },
4621 { "/_Preferences/Coffee", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4622 { "/_Preferences/Toast", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4623 { "/_Preferences/Marshmallow Froot Loops", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4625 /* For testing deletion of menus */
4626 { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
4627 { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
4628 { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
4630 { "/_Help", NULL, 0, 0, "<LastBranch>" },
4631 { "/Help/_Help", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_HELP},
4632 { "/Help/_About", NULL, gtk_ifactory_cb, 0 },
4636 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
4639 create_item_factory (GtkWidget *widget)
4641 static GtkWidget *window = NULL;
4647 GtkWidget *separator;
4650 GtkAccelGroup *accel_group;
4651 GtkItemFactory *item_factory;
4652 GtkTooltips *tooltips;
4654 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4656 gtk_window_set_screen (GTK_WINDOW (window),
4657 gtk_widget_get_screen (widget));
4659 g_signal_connect (window, "destroy",
4660 G_CALLBACK(gtk_widget_destroyed),
4662 g_signal_connect (window, "delete-event",
4663 G_CALLBACK (gtk_true),
4666 accel_group = gtk_accel_group_new ();
4667 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
4668 g_object_set_data_full (G_OBJECT (window),
4672 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4673 gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
4674 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4675 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
4677 /* preselect /Preferences/Shape/Oval over the other radios
4679 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4680 "/Preferences/Shape/Oval")),
4683 /* preselect /Preferences/Coffee
4685 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4686 "/Preferences/Coffee")),
4689 /* preselect /Preferences/Marshmallow Froot Loops and set it insensitive
4691 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4692 "/Preferences/Marshmallow Froot Loops")),
4694 gtk_widget_set_sensitive (GTK_WIDGET (gtk_item_factory_get_item (item_factory,
4695 "/Preferences/Marshmallow Froot Loops")),
4698 /* Test how tooltips (ugh) work on menu items
4700 tooltips = gtk_tooltips_new ();
4701 g_object_ref (tooltips);
4702 gtk_object_sink (GTK_OBJECT (tooltips));
4703 g_object_set_data_full (G_OBJECT (window), "testgtk-tooltips",
4704 tooltips, (GDestroyNotify)g_object_unref);
4706 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/New"),
4707 "Create a new file", NULL);
4708 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Open"),
4709 "Open a file", NULL);
4710 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Save"),
4712 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/Preferences/Color"),
4713 "Modify color", NULL);
4715 box1 = gtk_vbox_new (FALSE, 0);
4716 gtk_container_add (GTK_CONTAINER (window), box1);
4718 gtk_box_pack_start (GTK_BOX (box1),
4719 gtk_item_factory_get_widget (item_factory, "<main>"),
4722 label = gtk_label_new ("Type\n<alt>\nto start");
4723 gtk_widget_set_size_request (label, 200, 200);
4724 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
4725 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
4728 separator = gtk_hseparator_new ();
4729 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4732 box2 = gtk_vbox_new (FALSE, 10);
4733 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4734 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4736 button = gtk_button_new_with_label ("close");
4737 g_signal_connect_swapped (button, "clicked",
4738 G_CALLBACK (gtk_widget_destroy),
4740 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4741 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4742 gtk_widget_grab_default (button);
4744 gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
4746 gtk_widget_show_all (window);
4749 gtk_widget_destroy (window);
4753 accel_button_new (GtkAccelGroup *accel_group,
4758 GdkModifierType modifiers;
4762 gtk_accelerator_parse (accel, &keyval, &modifiers);
4765 button = gtk_button_new ();
4766 gtk_widget_add_accelerator (button, "activate", accel_group,
4767 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4769 label = gtk_accel_label_new (text);
4770 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4771 gtk_widget_show (label);
4773 gtk_container_add (GTK_CONTAINER (button), label);
4779 create_key_lookup (GtkWidget *widget)
4781 static GtkWidget *window = NULL;
4785 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4788 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4789 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4792 gtk_window_set_screen (GTK_WINDOW (window),
4793 gtk_widget_get_screen (widget));
4795 /* We have to expand it so the accel labels will draw their labels
4797 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4799 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4801 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4802 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4803 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4804 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4805 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4806 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4807 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4808 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4809 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4810 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4811 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4812 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4813 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4814 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4815 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4816 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4817 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4818 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4819 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4820 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4821 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4822 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4823 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4824 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4825 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4826 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4827 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4828 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4830 g_object_add_weak_pointer (G_OBJECT (window), (gpointer) &window);
4831 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4833 gtk_widget_show_all (window);
4836 gtk_widget_destroy (window);
4845 cmw_destroy_cb(GtkWidget *widget)
4847 /* This is needed to get out of gtk_main */
4854 cmw_color (GtkWidget *widget, GtkWidget *parent)
4858 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4860 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4862 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4866 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4868 /* And mark it as a transient dialog */
4869 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4871 g_signal_connect (csd, "destroy",
4872 G_CALLBACK (cmw_destroy_cb), NULL);
4874 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4875 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4876 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4877 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4879 /* wait until destroy calls gtk_main_quit */
4880 gtk_widget_show (csd);
4885 cmw_file (GtkWidget *widget, GtkWidget *parent)
4889 fs = gtk_file_selection_new("This is a modal file selection dialog");
4891 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4894 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4896 /* And mark it as a transient dialog */
4897 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4899 g_signal_connect (fs, "destroy",
4900 G_CALLBACK (cmw_destroy_cb), NULL);
4902 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4903 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4904 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4905 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4907 /* wait until destroy calls gtk_main_quit */
4908 gtk_widget_show (fs);
4915 create_modal_window (GtkWidget *widget)
4917 GtkWidget *window = NULL;
4918 GtkWidget *box1,*box2;
4920 GtkWidget *btnColor,*btnFile,*btnClose;
4922 /* Create modal window (Here you can use any window descendent )*/
4923 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4924 gtk_window_set_screen (GTK_WINDOW (window),
4925 gtk_widget_get_screen (widget));
4927 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4929 /* Set window as modal */
4930 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4932 /* Create widgets */
4933 box1 = gtk_vbox_new (FALSE,5);
4934 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4935 box2 = gtk_vbox_new (TRUE,5);
4936 btnColor = gtk_button_new_with_label ("Color");
4937 btnFile = gtk_button_new_with_label ("File Selection");
4938 btnClose = gtk_button_new_with_label ("Close");
4941 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4942 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4945 gtk_container_add (GTK_CONTAINER (window), box1);
4946 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4947 gtk_container_add (GTK_CONTAINER (frame1), box2);
4948 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4949 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4950 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4951 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4953 /* connect signals */
4954 g_signal_connect_swapped (btnClose, "clicked",
4955 G_CALLBACK (gtk_widget_destroy), window);
4957 g_signal_connect (window, "destroy",
4958 G_CALLBACK (cmw_destroy_cb), NULL);
4960 g_signal_connect (btnColor, "clicked",
4961 G_CALLBACK (cmw_color), window);
4962 g_signal_connect (btnFile, "clicked",
4963 G_CALLBACK (cmw_file), window);
4966 gtk_widget_show_all (window);
4968 /* wait until dialog get destroyed */
4977 make_message_dialog (GdkScreen *screen,
4979 GtkMessageType type,
4980 GtkButtonsType buttons,
4981 guint default_response)
4985 gtk_widget_destroy (*dialog);
4990 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4991 "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.)");
4993 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4995 g_signal_connect_swapped (*dialog,
4997 G_CALLBACK (gtk_widget_destroy),
5000 g_signal_connect (*dialog,
5002 G_CALLBACK (gtk_widget_destroyed),
5005 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
5007 gtk_widget_show (*dialog);
5011 create_message_dialog (GtkWidget *widget)
5013 static GtkWidget *info = NULL;
5014 static GtkWidget *warning = NULL;
5015 static GtkWidget *error = NULL;
5016 static GtkWidget *question = NULL;
5017 GdkScreen *screen = gtk_widget_get_screen (widget);
5019 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
5020 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
5021 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
5022 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
5029 static GtkWidget *sw_parent = NULL;
5030 static GtkWidget *sw_float_parent;
5031 static guint sw_destroyed_handler = 0;
5034 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
5036 gtk_widget_reparent (scrollwin, sw_parent);
5038 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5039 sw_float_parent = NULL;
5041 sw_destroyed_handler = 0;
5047 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
5049 gtk_widget_destroy (sw_float_parent);
5051 sw_float_parent = NULL;
5053 sw_destroyed_handler = 0;
5057 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
5061 gtk_widget_reparent (scrollwin, sw_parent);
5062 gtk_widget_destroy (sw_float_parent);
5064 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5065 sw_float_parent = NULL;
5067 sw_destroyed_handler = 0;
5071 sw_parent = scrollwin->parent;
5072 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5073 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
5074 gtk_widget_get_screen (widget));
5076 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
5078 gtk_widget_reparent (scrollwin, sw_float_parent);
5079 gtk_widget_show (sw_float_parent);
5081 sw_destroyed_handler =
5082 g_signal_connect (sw_parent, "destroy",
5083 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
5084 g_signal_connect (sw_float_parent, "delete_event",
5085 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
5090 create_scrolled_windows (GtkWidget *widget)
5092 static GtkWidget *window;
5093 GtkWidget *scrolled_window;
5101 window = gtk_dialog_new ();
5103 gtk_window_set_screen (GTK_WINDOW (window),
5104 gtk_widget_get_screen (widget));
5106 g_signal_connect (window, "destroy",
5107 G_CALLBACK (gtk_widget_destroyed),
5110 gtk_window_set_title (GTK_WINDOW (window), "dialog");
5111 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5114 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
5115 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
5116 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
5117 GTK_POLICY_AUTOMATIC,
5118 GTK_POLICY_AUTOMATIC);
5119 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5120 scrolled_window, TRUE, TRUE, 0);
5121 gtk_widget_show (scrolled_window);
5123 table = gtk_table_new (20, 20, FALSE);
5124 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
5125 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
5126 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
5127 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
5128 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5129 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
5130 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5131 gtk_widget_show (table);
5133 for (i = 0; i < 20; i++)
5134 for (j = 0; j < 20; j++)
5136 sprintf (buffer, "button (%d,%d)\n", i, j);
5137 button = gtk_toggle_button_new_with_label (buffer);
5138 gtk_table_attach_defaults (GTK_TABLE (table), button,
5140 gtk_widget_show (button);
5144 button = gtk_button_new_with_label ("Close");
5145 g_signal_connect_swapped (button, "clicked",
5146 G_CALLBACK (gtk_widget_destroy),
5148 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5149 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5150 button, TRUE, TRUE, 0);
5151 gtk_widget_grab_default (button);
5152 gtk_widget_show (button);
5154 button = gtk_button_new_with_label ("Reparent Out");
5155 g_signal_connect (button, "clicked",
5156 G_CALLBACK (scrolled_windows_remove),
5158 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5159 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5160 button, TRUE, TRUE, 0);
5161 gtk_widget_grab_default (button);
5162 gtk_widget_show (button);
5164 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
5167 if (!GTK_WIDGET_VISIBLE (window))
5168 gtk_widget_show (window);
5170 gtk_widget_destroy (window);
5178 entry_toggle_frame (GtkWidget *checkbutton,
5181 gtk_entry_set_has_frame (GTK_ENTRY(entry),
5182 GTK_TOGGLE_BUTTON(checkbutton)->active);
5186 entry_toggle_sensitive (GtkWidget *checkbutton,
5189 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
5193 entry_props_clicked (GtkWidget *button,
5196 GtkWidget *window = create_prop_editor (entry, 0);
5198 gtk_window_set_title (GTK_WINDOW (window), "Entry Properties");
5202 create_entry (GtkWidget *widget)
5204 static GtkWidget *window = NULL;
5208 GtkWidget *has_frame_check;
5209 GtkWidget *sensitive_check;
5210 GtkWidget *entry, *cb;
5212 GtkWidget *separator;
5213 GList *cbitems = NULL;
5217 cbitems = g_list_append(cbitems, "item0");
5218 cbitems = g_list_append(cbitems, "item1 item1");
5219 cbitems = g_list_append(cbitems, "item2 item2 item2");
5220 cbitems = g_list_append(cbitems, "item3 item3 item3 item3");
5221 cbitems = g_list_append(cbitems, "item4 item4 item4 item4 item4");
5222 cbitems = g_list_append(cbitems, "item5 item5 item5 item5 item5 item5");
5223 cbitems = g_list_append(cbitems, "item6 item6 item6 item6 item6");
5224 cbitems = g_list_append(cbitems, "item7 item7 item7 item7");
5225 cbitems = g_list_append(cbitems, "item8 item8 item8");
5226 cbitems = g_list_append(cbitems, "item9 item9");
5228 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5229 gtk_window_set_screen (GTK_WINDOW (window),
5230 gtk_widget_get_screen (widget));
5232 g_signal_connect (window, "destroy",
5233 G_CALLBACK (gtk_widget_destroyed),
5236 gtk_window_set_title (GTK_WINDOW (window), "entry");
5237 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5240 box1 = gtk_vbox_new (FALSE, 0);
5241 gtk_container_add (GTK_CONTAINER (window), box1);
5244 box2 = gtk_vbox_new (FALSE, 10);
5245 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5246 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5248 hbox = gtk_hbox_new (FALSE, 5);
5249 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5251 entry = gtk_entry_new ();
5252 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");
5253 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
5254 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
5256 button = gtk_button_new_with_mnemonic ("_Props");
5257 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5258 g_signal_connect (button, "clicked",
5259 G_CALLBACK (entry_props_clicked),
5262 cb = gtk_combo_new ();
5263 gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
5264 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO(cb)->entry), "hello world \n\n\n foo");
5265 gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry),
5267 gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0);
5269 sensitive_check = gtk_check_button_new_with_label("Sensitive");
5270 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
5271 g_signal_connect (sensitive_check, "toggled",
5272 G_CALLBACK (entry_toggle_sensitive), entry);
5273 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
5275 has_frame_check = gtk_check_button_new_with_label("Has Frame");
5276 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
5277 g_signal_connect (has_frame_check, "toggled",
5278 G_CALLBACK (entry_toggle_frame), entry);
5279 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
5281 separator = gtk_hseparator_new ();
5282 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5284 box2 = gtk_vbox_new (FALSE, 10);
5285 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5286 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5288 button = gtk_button_new_with_label ("close");
5289 g_signal_connect_swapped (button, "clicked",
5290 G_CALLBACK (gtk_widget_destroy),
5292 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5293 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5294 gtk_widget_grab_default (button);
5297 if (!GTK_WIDGET_VISIBLE (window))
5298 gtk_widget_show_all (window);
5300 gtk_widget_destroy (window);
5304 create_expander (GtkWidget *widget)
5307 GtkWidget *expander;
5309 static GtkWidget *window = NULL;
5313 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5314 gtk_window_set_screen (GTK_WINDOW (window),
5315 gtk_widget_get_screen (widget));
5317 g_signal_connect (window, "destroy",
5318 G_CALLBACK (gtk_widget_destroyed),
5321 gtk_window_set_title (GTK_WINDOW (window), "expander");
5322 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5324 box1 = gtk_vbox_new (FALSE, 0);
5325 gtk_container_add (GTK_CONTAINER (window), box1);
5327 expander = gtk_expander_new ("The Hidden");
5329 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
5331 hidden = gtk_label_new ("Revealed!");
5333 gtk_container_add (GTK_CONTAINER (expander), hidden);
5336 if (!GTK_WIDGET_VISIBLE (window))
5337 gtk_widget_show_all (window);
5339 gtk_widget_destroy (window);
5347 event_box_label_pressed (GtkWidget *widget,
5348 GdkEventButton *event,
5351 g_print ("clicked on event box\n");
5355 event_box_button_clicked (GtkWidget *widget,
5359 g_print ("pushed button\n");
5363 event_box_toggle_visible_window (GtkWidget *checkbutton,
5364 GtkEventBox *event_box)
5366 gtk_event_box_set_visible_window (event_box,
5367 GTK_TOGGLE_BUTTON(checkbutton)->active);
5371 event_box_toggle_above_child (GtkWidget *checkbutton,
5372 GtkEventBox *event_box)
5374 gtk_event_box_set_above_child (event_box,
5375 GTK_TOGGLE_BUTTON(checkbutton)->active);
5379 create_event_box (GtkWidget *widget)
5381 static GtkWidget *window = NULL;
5387 GtkWidget *separator;
5388 GtkWidget *event_box;
5390 GtkWidget *visible_window_check;
5391 GtkWidget *above_child_check;
5400 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5401 gtk_window_set_screen (GTK_WINDOW (window),
5402 gtk_widget_get_screen (widget));
5404 g_signal_connect (window, "destroy",
5405 G_CALLBACK (gtk_widget_destroyed),
5408 gtk_window_set_title (GTK_WINDOW (window), "event box");
5409 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5411 box1 = gtk_vbox_new (FALSE, 0);
5412 gtk_container_add (GTK_CONTAINER (window), box1);
5413 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
5415 hbox = gtk_hbox_new (FALSE, 0);
5416 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
5418 event_box = gtk_event_box_new ();
5419 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
5421 vbox = gtk_vbox_new (FALSE, 0);
5422 gtk_container_add (GTK_CONTAINER (event_box), vbox);
5423 g_signal_connect (event_box, "button_press_event",
5424 G_CALLBACK (event_box_label_pressed),
5427 label = gtk_label_new ("Click on this label");
5428 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
5430 button = gtk_button_new_with_label ("button in eventbox");
5431 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
5432 g_signal_connect (button, "clicked",
5433 G_CALLBACK (event_box_button_clicked),
5437 visible_window_check = gtk_check_button_new_with_label("Visible Window");
5438 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
5439 g_signal_connect (visible_window_check, "toggled",
5440 G_CALLBACK (event_box_toggle_visible_window), event_box);
5441 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
5443 above_child_check = gtk_check_button_new_with_label("Above Child");
5444 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
5445 g_signal_connect (above_child_check, "toggled",
5446 G_CALLBACK (event_box_toggle_above_child), event_box);
5447 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
5449 separator = gtk_hseparator_new ();
5450 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5452 box2 = gtk_vbox_new (FALSE, 10);
5453 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5454 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5456 button = gtk_button_new_with_label ("close");
5457 g_signal_connect_swapped (button, "clicked",
5458 G_CALLBACK (gtk_widget_destroy),
5460 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5461 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5462 gtk_widget_grab_default (button);
5465 if (!GTK_WIDGET_VISIBLE (window))
5466 gtk_widget_show_all (window);
5468 gtk_widget_destroy (window);
5476 #define SIZE_GROUP_INITIAL_SIZE 50
5479 size_group_hsize_changed (GtkSpinButton *spin_button,
5482 gtk_widget_set_size_request (GTK_BIN (button)->child,
5483 gtk_spin_button_get_value_as_int (spin_button),
5488 size_group_vsize_changed (GtkSpinButton *spin_button,
5491 gtk_widget_set_size_request (GTK_BIN (button)->child,
5493 gtk_spin_button_get_value_as_int (spin_button));
5497 create_size_group_window (GdkScreen *screen,
5498 GtkSizeGroup *master_size_group)
5502 GtkWidget *main_button;
5504 GtkWidget *spin_button;
5506 GtkSizeGroup *hgroup1;
5507 GtkSizeGroup *hgroup2;
5508 GtkSizeGroup *vgroup1;
5509 GtkSizeGroup *vgroup2;
5511 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
5517 gtk_window_set_screen (GTK_WINDOW (window), screen);
5519 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
5521 g_signal_connect (window, "response",
5522 G_CALLBACK (gtk_widget_destroy),
5525 table = gtk_table_new (2, 2, FALSE);
5526 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
5528 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
5529 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
5530 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
5531 gtk_widget_set_size_request (table, 250, 250);
5533 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5534 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5535 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5536 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5538 main_button = gtk_button_new_with_label ("X");
5540 gtk_table_attach (GTK_TABLE (table), main_button,
5542 GTK_EXPAND, GTK_EXPAND,
5544 gtk_size_group_add_widget (master_size_group, main_button);
5545 gtk_size_group_add_widget (hgroup1, main_button);
5546 gtk_size_group_add_widget (vgroup1, main_button);
5547 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
5548 SIZE_GROUP_INITIAL_SIZE,
5549 SIZE_GROUP_INITIAL_SIZE);
5551 button = gtk_button_new ();
5552 gtk_table_attach (GTK_TABLE (table), button,
5554 GTK_EXPAND, GTK_EXPAND,
5556 gtk_size_group_add_widget (vgroup1, button);
5557 gtk_size_group_add_widget (vgroup2, button);
5559 button = gtk_button_new ();
5560 gtk_table_attach (GTK_TABLE (table), button,
5562 GTK_EXPAND, GTK_EXPAND,
5564 gtk_size_group_add_widget (hgroup1, button);
5565 gtk_size_group_add_widget (hgroup2, button);
5567 button = gtk_button_new ();
5568 gtk_table_attach (GTK_TABLE (table), button,
5570 GTK_EXPAND, GTK_EXPAND,
5572 gtk_size_group_add_widget (hgroup2, button);
5573 gtk_size_group_add_widget (vgroup2, button);
5575 g_object_unref (hgroup1);
5576 g_object_unref (hgroup2);
5577 g_object_unref (vgroup1);
5578 g_object_unref (vgroup2);
5580 hbox = gtk_hbox_new (FALSE, 5);
5581 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
5583 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5584 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5585 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5586 g_signal_connect (spin_button, "value_changed",
5587 G_CALLBACK (size_group_hsize_changed), main_button);
5589 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5590 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5591 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5592 g_signal_connect (spin_button, "value_changed",
5593 G_CALLBACK (size_group_vsize_changed), main_button);
5599 create_size_groups (GtkWidget *widget)
5601 static GtkWidget *window1 = NULL;
5602 static GtkWidget *window2 = NULL;
5603 static GtkSizeGroup *master_size_group;
5605 if (!master_size_group)
5606 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
5610 window1 = create_size_group_window (gtk_widget_get_screen (widget),
5613 g_signal_connect (window1, "destroy",
5614 G_CALLBACK (gtk_widget_destroyed),
5620 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5623 g_signal_connect (window2, "destroy",
5624 G_CALLBACK (gtk_widget_destroyed),
5628 if (GTK_WIDGET_VISIBLE (window1) && GTK_WIDGET_VISIBLE (window2))
5630 gtk_widget_destroy (window1);
5631 gtk_widget_destroy (window2);
5635 if (!GTK_WIDGET_VISIBLE (window1))
5636 gtk_widget_show_all (window1);
5637 if (!GTK_WIDGET_VISIBLE (window2))
5638 gtk_widget_show_all (window2);
5646 static GtkWidget *spinner1;
5649 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5651 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5655 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5657 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5661 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5663 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5664 gtk_spin_button_get_value_as_int (spin));
5668 get_value (GtkWidget *widget, gpointer data)
5672 GtkSpinButton *spin;
5674 spin = GTK_SPIN_BUTTON (spinner1);
5675 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5676 if (GPOINTER_TO_INT (data) == 1)
5677 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5679 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5680 gtk_label_set_text (label, buf);
5684 get_spin_value (GtkWidget *widget, gpointer data)
5688 GtkSpinButton *spin;
5690 spin = GTK_SPIN_BUTTON (widget);
5691 label = GTK_LABEL (data);
5693 buffer = g_strdup_printf ("%0.*f", spin->digits,
5694 gtk_spin_button_get_value (spin));
5695 gtk_label_set_text (label, buffer);
5701 spin_button_time_output_func (GtkSpinButton *spin_button)
5703 static gchar buf[6];
5707 hours = spin_button->adjustment->value / 60.0;
5708 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5709 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5710 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5711 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5716 spin_button_month_input_func (GtkSpinButton *spin_button,
5720 static gchar *month[12] = { "January", "February", "March", "April",
5721 "May", "June", "July", "August",
5722 "September", "October", "November", "December" };
5724 gboolean found = FALSE;
5726 for (i = 1; i <= 12; i++)
5728 tmp1 = g_ascii_strup (month[i - 1], -1);
5729 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5730 if (strstr (tmp1, tmp2) == tmp1)
5740 return GTK_INPUT_ERROR;
5742 *new_val = (gdouble) i;
5747 spin_button_month_output_func (GtkSpinButton *spin_button)
5750 static gchar *month[12] = { "January", "February", "March", "April",
5751 "May", "June", "July", "August", "September",
5752 "October", "November", "December" };
5754 for (i = 1; i <= 12; i++)
5755 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5757 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5758 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5764 spin_button_hex_input_func (GtkSpinButton *spin_button,
5771 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5772 res = strtol(buf, &err, 16);
5775 return GTK_INPUT_ERROR;
5781 spin_button_hex_output_func (GtkSpinButton *spin_button)
5783 static gchar buf[7];
5786 val = (gint) spin_button->adjustment->value;
5787 if (fabs (val) < 1e-5)
5788 sprintf (buf, "0x00");
5790 sprintf (buf, "0x%.2X", val);
5791 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5792 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5797 create_spins (GtkWidget *widget)
5799 static GtkWidget *window = NULL;
5802 GtkWidget *main_vbox;
5805 GtkWidget *spinner2;
5809 GtkWidget *val_label;
5814 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5815 gtk_window_set_screen (GTK_WINDOW (window),
5816 gtk_widget_get_screen (widget));
5818 g_signal_connect (window, "destroy",
5819 G_CALLBACK (gtk_widget_destroyed),
5822 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5824 main_vbox = gtk_vbox_new (FALSE, 5);
5825 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5826 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5828 frame = gtk_frame_new ("Not accelerated");
5829 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5831 vbox = gtk_vbox_new (FALSE, 0);
5832 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5833 gtk_container_add (GTK_CONTAINER (frame), vbox);
5835 /* Time, month, hex spinners */
5837 hbox = gtk_hbox_new (FALSE, 0);
5838 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5840 vbox2 = gtk_vbox_new (FALSE, 0);
5841 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5843 label = gtk_label_new ("Time :");
5844 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5845 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5847 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5848 spinner = gtk_spin_button_new (adj, 0, 0);
5849 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5850 g_signal_connect (spinner,
5852 G_CALLBACK (spin_button_time_output_func),
5854 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5855 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5856 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5858 vbox2 = gtk_vbox_new (FALSE, 0);
5859 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5861 label = gtk_label_new ("Month :");
5862 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5863 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5865 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5867 spinner = gtk_spin_button_new (adj, 0, 0);
5868 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5869 GTK_UPDATE_IF_VALID);
5870 g_signal_connect (spinner,
5872 G_CALLBACK (spin_button_month_input_func),
5874 g_signal_connect (spinner,
5876 G_CALLBACK (spin_button_month_output_func),
5878 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5879 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5880 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5882 vbox2 = gtk_vbox_new (FALSE, 0);
5883 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5885 label = gtk_label_new ("Hex :");
5886 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5887 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5889 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5890 spinner = gtk_spin_button_new (adj, 0, 0);
5891 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5892 g_signal_connect (spinner,
5894 G_CALLBACK (spin_button_hex_input_func),
5896 g_signal_connect (spinner,
5898 G_CALLBACK (spin_button_hex_output_func),
5900 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5901 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
5902 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5904 frame = gtk_frame_new ("Accelerated");
5905 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5907 vbox = gtk_vbox_new (FALSE, 0);
5908 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5909 gtk_container_add (GTK_CONTAINER (frame), vbox);
5911 hbox = gtk_hbox_new (FALSE, 0);
5912 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5914 vbox2 = gtk_vbox_new (FALSE, 0);
5915 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5917 label = gtk_label_new ("Value :");
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, -10000.0, 10000.0,
5923 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5924 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5925 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
5927 vbox2 = gtk_vbox_new (FALSE, 0);
5928 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5930 label = gtk_label_new ("Digits :");
5931 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5932 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5934 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
5935 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
5936 g_signal_connect (adj, "value_changed",
5937 G_CALLBACK (change_digits),
5939 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
5941 hbox = gtk_hbox_new (FALSE, 0);
5942 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
5944 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
5945 g_signal_connect (button, "clicked",
5946 G_CALLBACK (toggle_snap),
5948 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5949 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5951 button = gtk_check_button_new_with_label ("Numeric only input mode");
5952 g_signal_connect (button, "clicked",
5953 G_CALLBACK (toggle_numeric),
5955 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5956 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5958 val_label = gtk_label_new ("");
5960 hbox = gtk_hbox_new (FALSE, 0);
5961 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5963 button = gtk_button_new_with_label ("Value as Int");
5964 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5965 g_signal_connect (button, "clicked",
5966 G_CALLBACK (get_value),
5967 GINT_TO_POINTER (1));
5968 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5970 button = gtk_button_new_with_label ("Value as Float");
5971 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5972 g_signal_connect (button, "clicked",
5973 G_CALLBACK (get_value),
5974 GINT_TO_POINTER (2));
5975 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5977 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
5978 gtk_label_set_text (GTK_LABEL (val_label), "0");
5980 frame = gtk_frame_new ("Using Convenience Constructor");
5981 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5983 hbox = gtk_hbox_new (FALSE, 0);
5984 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5985 gtk_container_add (GTK_CONTAINER (frame), hbox);
5987 val_label = gtk_label_new ("0.0");
5989 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5990 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5991 g_signal_connect (spinner, "value_changed",
5992 G_CALLBACK (get_spin_value), val_label);
5993 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5994 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5996 hbox = gtk_hbox_new (FALSE, 0);
5997 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5999 button = gtk_button_new_with_label ("Close");
6000 g_signal_connect_swapped (button, "clicked",
6001 G_CALLBACK (gtk_widget_destroy),
6003 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6006 if (!GTK_WIDGET_VISIBLE (window))
6007 gtk_widget_show_all (window);
6009 gtk_widget_destroy (window);
6018 cursor_expose_event (GtkWidget *widget,
6022 GtkDrawingArea *darea;
6023 GdkDrawable *drawable;
6030 g_return_val_if_fail (widget != NULL, TRUE);
6031 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
6033 darea = GTK_DRAWING_AREA (widget);
6034 drawable = widget->window;
6035 white_gc = widget->style->white_gc;
6036 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
6037 black_gc = widget->style->black_gc;
6038 max_width = widget->allocation.width;
6039 max_height = widget->allocation.height;
6041 gdk_draw_rectangle (drawable, white_gc,
6048 gdk_draw_rectangle (drawable, black_gc,
6055 gdk_draw_rectangle (drawable, gray_gc,
6066 set_cursor (GtkWidget *spinner,
6075 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
6078 label = g_object_get_data (G_OBJECT (spinner), "user_data");
6080 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
6081 vals = class->values;
6083 while (vals && vals->value != c)
6086 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
6088 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
6090 g_type_class_unref (class);
6092 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
6093 gdk_window_set_cursor (widget->window, cursor);
6094 gdk_cursor_unref (cursor);
6098 cursor_event (GtkWidget *widget,
6100 GtkSpinButton *spinner)
6102 if ((event->type == GDK_BUTTON_PRESS) &&
6103 ((event->button.button == 1) ||
6104 (event->button.button == 3)))
6106 gtk_spin_button_spin (spinner, event->button.button == 1 ?
6107 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
6114 #ifdef GDK_WINDOWING_X11
6115 #include "x11/gdkx.h"
6118 change_cursor_theme (GtkWidget *widget,
6125 children = gtk_container_get_children (GTK_CONTAINER (data));
6127 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
6128 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
6130 g_list_free (children);
6132 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
6139 create_cursors (GtkWidget *widget)
6141 static GtkWidget *window = NULL;
6144 GtkWidget *main_vbox;
6157 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6158 gtk_window_set_screen (GTK_WINDOW (window),
6159 gtk_widget_get_screen (widget));
6161 g_signal_connect (window, "destroy",
6162 G_CALLBACK (gtk_widget_destroyed),
6165 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
6167 main_vbox = gtk_vbox_new (FALSE, 5);
6168 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
6169 gtk_container_add (GTK_CONTAINER (window), main_vbox);
6172 g_object_new (gtk_vbox_get_type (),
6173 "GtkBox::homogeneous", FALSE,
6174 "GtkBox::spacing", 5,
6175 "GtkContainer::border_width", 10,
6176 "GtkWidget::parent", main_vbox,
6177 "GtkWidget::visible", TRUE,
6180 #ifdef GDK_WINDOWING_X11
6181 hbox = gtk_hbox_new (FALSE, 0);
6182 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6183 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6185 label = gtk_label_new ("Cursor Theme : ");
6186 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6187 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6189 entry = gtk_entry_new ();
6190 gtk_entry_set_text (GTK_ENTRY (entry), "default");
6191 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
6193 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
6194 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
6195 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
6197 g_signal_connect (entry, "changed",
6198 G_CALLBACK (change_cursor_theme), hbox);
6199 g_signal_connect (size, "changed",
6200 G_CALLBACK (change_cursor_theme), hbox);
6203 hbox = gtk_hbox_new (FALSE, 0);
6204 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6205 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6207 label = gtk_label_new ("Cursor Value : ");
6208 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6209 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6211 adj = (GtkAdjustment *) gtk_adjustment_new (0,
6215 spinner = gtk_spin_button_new (adj, 0, 0);
6216 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
6219 g_object_new (gtk_frame_get_type (),
6220 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
6221 "GtkFrame::label_xalign", 0.5,
6222 "GtkFrame::label", "Cursor Area",
6223 "GtkContainer::border_width", 10,
6224 "GtkWidget::parent", vbox,
6225 "GtkWidget::visible", TRUE,
6228 darea = gtk_drawing_area_new ();
6229 gtk_widget_set_size_request (darea, 80, 80);
6230 gtk_container_add (GTK_CONTAINER (frame), darea);
6231 g_signal_connect (darea,
6233 G_CALLBACK (cursor_expose_event),
6235 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
6236 g_signal_connect (darea,
6237 "button_press_event",
6238 G_CALLBACK (cursor_event),
6240 gtk_widget_show (darea);
6242 g_signal_connect (spinner, "changed",
6243 G_CALLBACK (set_cursor),
6246 label = g_object_new (GTK_TYPE_LABEL,
6251 gtk_container_child_set (GTK_CONTAINER (vbox), label,
6254 g_object_set_data (G_OBJECT (spinner), "user_data", label);
6257 g_object_new (gtk_hseparator_get_type (),
6258 "GtkWidget::visible", TRUE,
6260 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
6262 hbox = gtk_hbox_new (FALSE, 0);
6263 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
6264 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
6266 button = gtk_button_new_with_label ("Close");
6267 g_signal_connect_swapped (button, "clicked",
6268 G_CALLBACK (gtk_widget_destroy),
6270 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6272 gtk_widget_show_all (window);
6274 set_cursor (spinner, darea);
6277 gtk_widget_destroy (window);
6285 list_add (GtkWidget *widget,
6290 GtkWidget *list_item;
6291 GtkContainer *container;
6293 container = GTK_CONTAINER (list);
6295 sprintf (buffer, "added item %d", i++);
6296 list_item = gtk_list_item_new_with_label (buffer);
6297 gtk_widget_show (list_item);
6299 gtk_container_add (container, list_item);
6303 list_remove (GtkWidget *widget,
6306 GList *clear_list = NULL;
6307 GList *sel_row = NULL;
6310 if (list->selection_mode == GTK_SELECTION_EXTENDED)
6314 item = GTK_CONTAINER (list)->focus_child;
6315 if (!item && list->selection)
6316 item = list->selection->data;
6320 work = g_list_find (list->children, item);
6321 for (sel_row = work; sel_row; sel_row = sel_row->next)
6322 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
6327 for (sel_row = work; sel_row; sel_row = sel_row->prev)
6328 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
6334 for (work = list->selection; work; work = work->next)
6335 clear_list = g_list_prepend (clear_list, work->data);
6337 clear_list = g_list_reverse (clear_list);
6338 gtk_list_remove_items (GTK_LIST (list), clear_list);
6339 g_list_free (clear_list);
6341 if (list->selection_mode == GTK_SELECTION_EXTENDED && sel_row)
6342 gtk_list_select_child (list, GTK_WIDGET(sel_row->data));
6346 list_clear (GtkWidget *widget,
6349 gtk_list_clear_items (GTK_LIST (list), 0, -1);
6352 static gchar *selection_mode_items[] =
6359 static const GtkSelectionMode selection_modes[] = {
6360 GTK_SELECTION_SINGLE,
6361 GTK_SELECTION_BROWSE,
6362 GTK_SELECTION_MULTIPLE
6365 static GtkWidget *list_omenu;
6368 list_toggle_sel_mode (GtkWidget *widget, gpointer data)
6373 list = GTK_LIST (data);
6375 if (!GTK_WIDGET_MAPPED (widget))
6378 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6380 gtk_list_set_selection_mode (list, selection_modes[i]);
6384 create_list (GtkWidget *widget)
6386 static GtkWidget *window = NULL;
6394 GtkWidget *scrolled_win;
6397 GtkWidget *separator;
6400 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6402 gtk_window_set_screen (GTK_WINDOW (window),
6403 gtk_widget_get_screen (widget));
6405 g_signal_connect (window, "destroy",
6406 G_CALLBACK (gtk_widget_destroyed),
6409 gtk_window_set_title (GTK_WINDOW (window), "list");
6410 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6412 vbox = gtk_vbox_new (FALSE, 0);
6413 gtk_container_add (GTK_CONTAINER (window), vbox);
6415 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6416 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6417 gtk_widget_set_size_request (scrolled_win, -1, 300);
6418 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6419 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6420 GTK_POLICY_AUTOMATIC,
6421 GTK_POLICY_AUTOMATIC);
6423 list = gtk_list_new ();
6424 gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE);
6425 gtk_scrolled_window_add_with_viewport
6426 (GTK_SCROLLED_WINDOW (scrolled_win), list);
6427 gtk_container_set_focus_vadjustment
6428 (GTK_CONTAINER (list),
6429 gtk_scrolled_window_get_vadjustment
6430 (GTK_SCROLLED_WINDOW (scrolled_win)));
6431 gtk_container_set_focus_hadjustment
6432 (GTK_CONTAINER (list),
6433 gtk_scrolled_window_get_hadjustment
6434 (GTK_SCROLLED_WINDOW (scrolled_win)));
6436 if ((infile = fopen("../gtk/gtkenums.h", "r")))
6442 while (fgets (buffer, 256, infile))
6444 if ((pos = strchr (buffer, '\n')))
6446 item = gtk_list_item_new_with_label (buffer);
6447 gtk_container_add (GTK_CONTAINER (list), item);
6454 hbox = gtk_hbox_new (TRUE, 5);
6455 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6456 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6458 button = gtk_button_new_with_label ("Insert Row");
6459 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6460 g_signal_connect (button, "clicked",
6461 G_CALLBACK (list_add),
6464 button = gtk_button_new_with_label ("Clear List");
6465 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6466 g_signal_connect (button, "clicked",
6467 G_CALLBACK (list_clear),
6470 button = gtk_button_new_with_label ("Remove Selection");
6471 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6472 g_signal_connect (button, "clicked",
6473 G_CALLBACK (list_remove),
6476 cbox = gtk_hbox_new (FALSE, 0);
6477 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
6479 hbox = gtk_hbox_new (FALSE, 5);
6480 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6481 gtk_box_pack_start (GTK_BOX (cbox), hbox, TRUE, FALSE, 0);
6483 label = gtk_label_new ("Selection Mode :");
6484 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6486 list_omenu = build_option_menu (selection_mode_items, 3, 3,
6487 list_toggle_sel_mode,
6489 gtk_box_pack_start (GTK_BOX (hbox), list_omenu, FALSE, TRUE, 0);
6491 separator = gtk_hseparator_new ();
6492 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
6494 cbox = gtk_hbox_new (FALSE, 0);
6495 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
6497 button = gtk_button_new_with_label ("close");
6498 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6499 gtk_box_pack_start (GTK_BOX (cbox), button, TRUE, TRUE, 0);
6500 g_signal_connect_swapped (button, "clicked",
6501 G_CALLBACK (gtk_widget_destroy),
6504 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
6505 gtk_widget_grab_default (button);
6508 if (!GTK_WIDGET_VISIBLE (window))
6509 gtk_widget_show_all (window);
6511 gtk_widget_destroy (window);
6518 static char * book_open_xpm[] = {
6541 static char * book_closed_xpm[] = {
6566 static char * mini_page_xpm[] = {
6589 static char * gtk_mini_xpm[] = {
6629 #define TESTGTK_CLIST_COLUMNS 12
6630 static gint clist_rows = 0;
6631 static GtkWidget *clist_omenu;
6634 add1000_clist (GtkWidget *widget, gpointer data)
6637 char text[TESTGTK_CLIST_COLUMNS][50];
6638 char *texts[TESTGTK_CLIST_COLUMNS];
6643 clist = GTK_CLIST (data);
6645 pixmap = gdk_pixmap_create_from_xpm_d (clist->clist_window,
6647 >K_WIDGET (data)->style->white,
6650 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
6653 sprintf (text[i], "Column %d", i);
6657 sprintf (text[1], "Right");
6658 sprintf (text[2], "Center");
6660 gtk_clist_freeze (GTK_CLIST (data));
6661 for (i = 0; i < 1000; i++)
6663 sprintf (text[0], "CListRow %d", rand() % 10000);
6664 row = gtk_clist_append (clist, texts);
6665 gtk_clist_set_pixtext (clist, row, 3, "gtk+", 5, pixmap, mask);
6668 gtk_clist_thaw (GTK_CLIST (data));
6670 g_object_unref (pixmap);
6671 g_object_unref (mask);
6675 add10000_clist (GtkWidget *widget, gpointer data)
6678 char text[TESTGTK_CLIST_COLUMNS][50];
6679 char *texts[TESTGTK_CLIST_COLUMNS];
6681 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
6684 sprintf (text[i], "Column %d", i);
6687 sprintf (text[1], "Right");
6688 sprintf (text[2], "Center");
6690 gtk_clist_freeze (GTK_CLIST (data));
6691 for (i = 0; i < 10000; i++)
6693 sprintf (text[0], "CListRow %d", rand() % 10000);
6694 gtk_clist_append (GTK_CLIST (data), texts);
6696 gtk_clist_thaw (GTK_CLIST (data));
6700 clear_clist (GtkWidget *widget, gpointer data)
6702 gtk_clist_clear (GTK_CLIST (data));
6706 void clist_remove_selection (GtkWidget *widget, GtkCList *clist)
6708 gtk_clist_freeze (clist);
6710 while (clist->selection)
6715 row = GPOINTER_TO_INT (clist->selection->data);
6717 gtk_clist_remove (clist, row);
6719 if (clist->selection_mode == GTK_SELECTION_BROWSE)
6723 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
6724 clist->focus_row >= 0)
6725 gtk_clist_select_row (clist, clist->focus_row, -1);
6727 gtk_clist_thaw (clist);
6730 void toggle_title_buttons (GtkWidget *widget, GtkCList *clist)
6732 if (GTK_TOGGLE_BUTTON (widget)->active)
6733 gtk_clist_column_titles_show (clist);
6735 gtk_clist_column_titles_hide (clist);
6738 void toggle_reorderable (GtkWidget *widget, GtkCList *clist)
6740 gtk_clist_set_reorderable (clist, GTK_TOGGLE_BUTTON (widget)->active);
6744 insert_row_clist (GtkWidget *widget, gpointer data)
6746 static char *text[] =
6748 "This", "is an", "inserted", "row.",
6749 "This", "is an", "inserted", "row.",
6750 "This", "is an", "inserted", "row."
6753 static GtkStyle *style1 = NULL;
6754 static GtkStyle *style2 = NULL;
6755 static GtkStyle *style3 = NULL;
6758 if (GTK_CLIST (data)->focus_row >= 0)
6759 row = gtk_clist_insert (GTK_CLIST (data), GTK_CLIST (data)->focus_row,
6762 row = gtk_clist_prepend (GTK_CLIST (data), text);
6766 GdkColor col1 = { 0, 0, 56000, 0};
6767 GdkColor col2 = { 0, 32000, 0, 56000};
6769 style1 = gtk_style_copy (GTK_WIDGET (data)->style);
6770 style1->base[GTK_STATE_NORMAL] = col1;
6771 style1->base[GTK_STATE_SELECTED] = col2;
6773 style2 = gtk_style_copy (GTK_WIDGET (data)->style);
6774 style2->fg[GTK_STATE_NORMAL] = col1;
6775 style2->fg[GTK_STATE_SELECTED] = col2;
6777 style3 = gtk_style_copy (GTK_WIDGET (data)->style);
6778 style3->fg[GTK_STATE_NORMAL] = col1;
6779 style3->base[GTK_STATE_NORMAL] = col2;
6780 pango_font_description_free (style3->font_desc);
6781 style3->font_desc = pango_font_description_from_string ("courier 12");
6784 gtk_clist_set_cell_style (GTK_CLIST (data), row, 3, style1);
6785 gtk_clist_set_cell_style (GTK_CLIST (data), row, 4, style2);
6786 gtk_clist_set_cell_style (GTK_CLIST (data), row, 0, style3);
6792 clist_warning_test (GtkWidget *button,
6796 static gboolean add_remove = FALSE;
6798 add_remove = !add_remove;
6800 child = gtk_label_new ("Test");
6801 g_object_ref (child);
6802 gtk_object_sink (GTK_OBJECT (child));
6805 gtk_container_add (GTK_CONTAINER (clist), child);
6808 child->parent = clist;
6809 gtk_container_remove (GTK_CONTAINER (clist), child);
6810 child->parent = NULL;
6813 gtk_widget_destroy (child);
6814 g_object_unref (child);
6818 undo_selection (GtkWidget *button, GtkCList *clist)
6820 gtk_clist_undo_selection (clist);
6824 clist_toggle_sel_mode (GtkWidget *widget, gpointer data)
6829 clist = GTK_CLIST (data);
6831 if (!GTK_WIDGET_MAPPED (widget))
6834 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6836 gtk_clist_set_selection_mode (clist, selection_modes[i]);
6840 clist_click_column (GtkCList *clist, gint column, gpointer data)
6843 gtk_clist_set_column_visibility (clist, column, FALSE);
6844 else if (column == clist->sort_column)
6846 if (clist->sort_type == GTK_SORT_ASCENDING)
6847 clist->sort_type = GTK_SORT_DESCENDING;
6849 clist->sort_type = GTK_SORT_ASCENDING;
6852 gtk_clist_set_sort_column (clist, column);
6854 gtk_clist_sort (clist);
6858 create_clist (GtkWidget *widget)
6861 static GtkWidget *window = NULL;
6863 static char *titles[] =
6865 "auto resize", "not resizeable", "max width 100", "min width 50",
6866 "hide column", "Title 5", "Title 6", "Title 7",
6867 "Title 8", "Title 9", "Title 10", "Title 11"
6870 char text[TESTGTK_CLIST_COLUMNS][50];
6871 char *texts[TESTGTK_CLIST_COLUMNS];
6877 GtkWidget *separator;
6878 GtkWidget *scrolled_win;
6881 GtkWidget *undo_button;
6885 GdkColor red_col = { 0, 56000, 0, 0};
6886 GdkColor light_green_col = { 0, 0, 56000, 32000};
6891 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6892 gtk_window_set_screen (GTK_WINDOW (window),
6893 gtk_widget_get_screen (widget));
6895 g_signal_connect (window, "destroy",
6896 G_CALLBACK (gtk_widget_destroyed), &window);
6898 gtk_window_set_title (GTK_WINDOW (window), "clist");
6899 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6901 vbox = gtk_vbox_new (FALSE, 0);
6902 gtk_container_add (GTK_CONTAINER (window), vbox);
6904 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6905 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6906 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6907 GTK_POLICY_AUTOMATIC,
6908 GTK_POLICY_AUTOMATIC);
6910 /* create GtkCList here so we have a pointer to throw at the
6911 * button callbacks -- more is done with it later */
6912 clist = gtk_clist_new_with_titles (TESTGTK_CLIST_COLUMNS, titles);
6913 gtk_container_add (GTK_CONTAINER (scrolled_win), clist);
6914 g_signal_connect (clist, "click_column",
6915 G_CALLBACK (clist_click_column), NULL);
6917 /* control buttons */
6918 hbox = gtk_hbox_new (FALSE, 5);
6919 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6920 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6922 button = gtk_button_new_with_label ("Insert Row");
6923 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6924 g_signal_connect (button, "clicked",
6925 G_CALLBACK (insert_row_clist), clist);
6927 button = gtk_button_new_with_label ("Add 1,000 Rows With Pixmaps");
6928 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6929 g_signal_connect (button, "clicked",
6930 G_CALLBACK (add1000_clist), clist);
6932 button = gtk_button_new_with_label ("Add 10,000 Rows");
6933 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6934 g_signal_connect (button, "clicked",
6935 G_CALLBACK (add10000_clist), clist);
6937 /* second layer of buttons */
6938 hbox = gtk_hbox_new (FALSE, 5);
6939 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6940 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6942 button = gtk_button_new_with_label ("Clear List");
6943 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6944 g_signal_connect (button, "clicked",
6945 G_CALLBACK (clear_clist), clist);
6947 button = gtk_button_new_with_label ("Remove Selection");
6948 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6949 g_signal_connect (button, "clicked",
6950 G_CALLBACK (clist_remove_selection), clist);
6952 undo_button = gtk_button_new_with_label ("Undo Selection");
6953 gtk_box_pack_start (GTK_BOX (hbox), undo_button, TRUE, TRUE, 0);
6954 g_signal_connect (undo_button, "clicked",
6955 G_CALLBACK (undo_selection), clist);
6957 button = gtk_button_new_with_label ("Warning Test");
6958 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6959 g_signal_connect (button, "clicked",
6960 G_CALLBACK (clist_warning_test), clist);
6962 /* third layer of buttons */
6963 hbox = gtk_hbox_new (FALSE, 5);
6964 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6965 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6967 check = gtk_check_button_new_with_label ("Show Title Buttons");
6968 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
6969 g_signal_connect (check, "clicked",
6970 G_CALLBACK (toggle_title_buttons), clist);
6971 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
6973 check = gtk_check_button_new_with_label ("Reorderable");
6974 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
6975 g_signal_connect (check, "clicked",
6976 G_CALLBACK (toggle_reorderable), clist);
6977 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
6979 label = gtk_label_new ("Selection Mode :");
6980 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6982 clist_omenu = build_option_menu (selection_mode_items, 3, 3,
6983 clist_toggle_sel_mode,
6985 gtk_box_pack_start (GTK_BOX (hbox), clist_omenu, FALSE, TRUE, 0);
6988 * the rest of the clist configuration
6991 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6992 gtk_clist_set_row_height (GTK_CLIST (clist), 18);
6993 gtk_widget_set_size_request (clist, -1, 300);
6995 for (i = 1; i < TESTGTK_CLIST_COLUMNS; i++)
6996 gtk_clist_set_column_width (GTK_CLIST (clist), i, 80);
6998 gtk_clist_set_column_auto_resize (GTK_CLIST (clist), 0, TRUE);
6999 gtk_clist_set_column_resizeable (GTK_CLIST (clist), 1, FALSE);
7000 gtk_clist_set_column_max_width (GTK_CLIST (clist), 2, 100);
7001 gtk_clist_set_column_min_width (GTK_CLIST (clist), 3, 50);
7002 gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
7003 gtk_clist_set_column_justification (GTK_CLIST (clist), 1,
7005 gtk_clist_set_column_justification (GTK_CLIST (clist), 2,
7006 GTK_JUSTIFY_CENTER);
7008 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
7011 sprintf (text[i], "Column %d", i);
7014 sprintf (text[1], "Right");
7015 sprintf (text[2], "Center");
7017 style = gtk_style_new ();
7018 style->fg[GTK_STATE_NORMAL] = red_col;
7019 style->base[GTK_STATE_NORMAL] = light_green_col;
7021 pango_font_description_set_size (style->font_desc, 14 * PANGO_SCALE);
7022 pango_font_description_set_weight (style->font_desc, PANGO_WEIGHT_BOLD);
7024 for (i = 0; i < 10; i++)
7026 sprintf (text[0], "CListRow %d", clist_rows++);
7027 gtk_clist_append (GTK_CLIST (clist), texts);
7032 gtk_clist_set_row_style (GTK_CLIST (clist), i, style);
7035 gtk_clist_set_cell_style (GTK_CLIST (clist), i, i % 4, style);
7040 g_object_unref (style);
7042 separator = gtk_hseparator_new ();
7043 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
7045 hbox = gtk_hbox_new (FALSE, 0);
7046 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
7048 button = gtk_button_new_with_label ("close");
7049 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
7050 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7051 g_signal_connect_swapped (button, "clicked",
7052 G_CALLBACK (gtk_widget_destroy),
7055 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7056 gtk_widget_grab_default (button);
7059 if (!GTK_WIDGET_VISIBLE (window))
7060 gtk_widget_show_all (window);
7064 gtk_widget_destroy (window);
7082 static gint books = 0;
7083 static gint pages = 0;
7085 static GtkWidget *book_label;
7086 static GtkWidget *page_label;
7087 static GtkWidget *sel_label;
7088 static GtkWidget *vis_label;
7089 static GtkWidget *omenu1;
7090 static GtkWidget *omenu2;
7091 static GtkWidget *omenu3;
7092 static GtkWidget *omenu4;
7093 static GtkWidget *spin1;
7094 static GtkWidget *spin2;
7095 static GtkWidget *spin3;
7096 static gint line_style;
7099 static CTreePixmaps *
7100 get_ctree_pixmaps (GtkCTree *ctree)
7102 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (ctree));
7103 CTreePixmaps *pixmaps = g_object_get_data (G_OBJECT (screen), "ctree-pixmaps");
7107 GdkColormap *colormap = gdk_screen_get_rgb_colormap (screen);
7108 pixmaps = g_new (CTreePixmaps, 1);
7110 pixmaps->pixmap1 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
7112 NULL, book_closed_xpm);
7113 pixmaps->pixmap2 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
7115 NULL, book_open_xpm);
7116 pixmaps->pixmap3 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
7118 NULL, mini_page_xpm);
7120 g_object_set_data (G_OBJECT (screen), "ctree-pixmaps", pixmaps);
7126 void after_press (GtkCTree *ctree, gpointer data)
7130 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
7131 gtk_label_set_text (GTK_LABEL (sel_label), buf);
7133 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
7134 gtk_label_set_text (GTK_LABEL (vis_label), buf);
7136 sprintf (buf, "%d", books);
7137 gtk_label_set_text (GTK_LABEL (book_label), buf);
7139 sprintf (buf, "%d", pages);
7140 gtk_label_set_text (GTK_LABEL (page_label), buf);
7143 void after_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent,
7144 GtkCTreeNode *sibling, gpointer data)
7150 gtk_ctree_get_node_info (ctree, child, &source,
7151 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7153 gtk_ctree_get_node_info (ctree, parent, &target1,
7154 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7156 gtk_ctree_get_node_info (ctree, sibling, &target2,
7157 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7159 g_print ("Moving \"%s\" to \"%s\" with sibling \"%s\".\n", source,
7160 (parent) ? target1 : "nil", (sibling) ? target2 : "nil");
7163 void count_items (GtkCTree *ctree, GtkCTreeNode *list)
7165 if (GTK_CTREE_ROW (list)->is_leaf)
7171 void expand_all (GtkWidget *widget, GtkCTree *ctree)
7173 gtk_ctree_expand_recursive (ctree, NULL);
7174 after_press (ctree, NULL);
7177 void collapse_all (GtkWidget *widget, GtkCTree *ctree)
7179 gtk_ctree_collapse_recursive (ctree, NULL);
7180 after_press (ctree, NULL);
7183 void select_all (GtkWidget *widget, GtkCTree *ctree)
7185 gtk_ctree_select_recursive (ctree, NULL);
7186 after_press (ctree, NULL);
7189 void change_style (GtkWidget *widget, GtkCTree *ctree)
7191 static GtkStyle *style1 = NULL;
7192 static GtkStyle *style2 = NULL;
7195 GdkColor green_col = { 0, 0, 56000, 0};
7196 GdkColor purple_col = { 0, 32000, 0, 56000};
7198 if (GTK_CLIST (ctree)->focus_row >= 0)
7199 node = GTK_CTREE_NODE
7200 (g_list_nth (GTK_CLIST (ctree)->row_list,GTK_CLIST (ctree)->focus_row));
7202 node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list);
7209 style1 = gtk_style_new ();
7210 style1->base[GTK_STATE_NORMAL] = green_col;
7211 style1->fg[GTK_STATE_SELECTED] = purple_col;
7213 style2 = gtk_style_new ();
7214 style2->base[GTK_STATE_SELECTED] = purple_col;
7215 style2->fg[GTK_STATE_NORMAL] = green_col;
7216 style2->base[GTK_STATE_NORMAL] = purple_col;
7217 pango_font_description_free (style2->font_desc);
7218 style2->font_desc = pango_font_description_from_string ("courier 30");
7221 gtk_ctree_node_set_cell_style (ctree, node, 1, style1);
7222 gtk_ctree_node_set_cell_style (ctree, node, 0, style2);
7224 if (GTK_CTREE_ROW (node)->children)
7225 gtk_ctree_node_set_row_style (ctree, GTK_CTREE_ROW (node)->children,
7229 void unselect_all (GtkWidget *widget, GtkCTree *ctree)
7231 gtk_ctree_unselect_recursive (ctree, NULL);
7232 after_press (ctree, NULL);
7235 void remove_selection (GtkWidget *widget, GtkCTree *ctree)
7240 clist = GTK_CLIST (ctree);
7242 gtk_clist_freeze (clist);
7244 while (clist->selection)
7246 node = clist->selection->data;
7248 if (GTK_CTREE_ROW (node)->is_leaf)
7251 gtk_ctree_post_recursive (ctree, node,
7252 (GtkCTreeFunc) count_items, NULL);
7254 gtk_ctree_remove_node (ctree, node);
7256 if (clist->selection_mode == GTK_SELECTION_BROWSE)
7260 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
7261 clist->focus_row >= 0)
7263 node = gtk_ctree_node_nth (ctree, clist->focus_row);
7266 gtk_ctree_select (ctree, node);
7269 gtk_clist_thaw (clist);
7270 after_press (ctree, NULL);
7273 struct _ExportStruct {
7279 typedef struct _ExportStruct ExportStruct;
7282 gnode2ctree (GtkCTree *ctree,
7285 GtkCTreeNode *cnode,
7289 GdkPixmap *pixmap_closed;
7290 GdkBitmap *mask_closed;
7291 GdkPixmap *pixmap_opened;
7292 GdkBitmap *mask_opened;
7293 CTreePixmaps *pixmaps;
7295 if (!cnode || !gnode || (!(es = gnode->data)))
7298 pixmaps = get_ctree_pixmaps (ctree);
7302 pixmap_closed = pixmaps->pixmap3;
7303 mask_closed = pixmaps->mask3;
7304 pixmap_opened = NULL;
7309 pixmap_closed = pixmaps->pixmap1;
7310 mask_closed = pixmaps->mask1;
7311 pixmap_opened = pixmaps->pixmap2;
7312 mask_opened = pixmaps->mask2;
7315 gtk_ctree_set_node_info (ctree, cnode, es->tree, 2, pixmap_closed,
7316 mask_closed, pixmap_opened, mask_opened,
7317 es->is_leaf, (depth < 3));
7318 gtk_ctree_node_set_text (ctree, cnode, 1, es->info);
7326 ctree2gnode (GtkCTree *ctree,
7329 GtkCTreeNode *cnode,
7334 if (!cnode || !gnode)
7337 es = g_new (ExportStruct, 1);
7339 es->is_leaf = GTK_CTREE_ROW (cnode)->is_leaf;
7340 es->tree = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[0])->text;
7341 es->info = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[1])->text;
7345 void export_ctree (GtkWidget *widget, GtkCTree *ctree)
7347 char *title[] = { "Tree" , "Info" };
7348 static GtkWidget *export_window = NULL;
7349 static GtkCTree *export_ctree;
7351 GtkWidget *scrolled_win;
7359 export_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7361 gtk_window_set_screen (GTK_WINDOW (export_window),
7362 gtk_widget_get_screen (widget));
7364 g_signal_connect (export_window, "destroy",
7365 G_CALLBACK (gtk_widget_destroyed),
7368 gtk_window_set_title (GTK_WINDOW (export_window), "exported ctree");
7369 gtk_container_set_border_width (GTK_CONTAINER (export_window), 5);
7371 vbox = gtk_vbox_new (FALSE, 0);
7372 gtk_container_add (GTK_CONTAINER (export_window), vbox);
7374 button = gtk_button_new_with_label ("Close");
7375 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, TRUE, 0);
7377 g_signal_connect_swapped (button, "clicked",
7378 G_CALLBACK (gtk_widget_destroy),
7381 sep = gtk_hseparator_new ();
7382 gtk_box_pack_end (GTK_BOX (vbox), sep, FALSE, TRUE, 10);
7384 export_ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
7385 gtk_ctree_set_line_style (export_ctree, GTK_CTREE_LINES_DOTTED);
7387 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
7388 gtk_container_add (GTK_CONTAINER (scrolled_win),
7389 GTK_WIDGET (export_ctree));
7390 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
7391 GTK_POLICY_AUTOMATIC,
7392 GTK_POLICY_AUTOMATIC);
7393 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
7394 gtk_clist_set_selection_mode (GTK_CLIST (export_ctree),
7395 GTK_SELECTION_EXTENDED);
7396 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 0, 200);
7397 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 1, 200);
7398 gtk_widget_set_size_request (GTK_WIDGET (export_ctree), 300, 200);
7401 if (!GTK_WIDGET_VISIBLE (export_window))
7402 gtk_widget_show_all (export_window);
7404 gtk_clist_clear (GTK_CLIST (export_ctree));
7406 node = GTK_CTREE_NODE (g_list_nth (GTK_CLIST (ctree)->row_list,
7407 GTK_CLIST (ctree)->focus_row));
7411 gnode = gtk_ctree_export_to_gnode (ctree, NULL, NULL, node,
7415 gtk_ctree_insert_gnode (export_ctree, NULL, NULL, gnode,
7417 g_node_destroy (gnode);
7421 void change_indent (GtkWidget *widget, GtkCTree *ctree)
7423 gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
7426 void change_spacing (GtkWidget *widget, GtkCTree *ctree)
7428 gtk_ctree_set_spacing (ctree, GTK_ADJUSTMENT (widget)->value);
7431 void change_row_height (GtkWidget *widget, GtkCList *clist)
7433 gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value);
7436 void set_background (GtkCTree *ctree, GtkCTreeNode *node, gpointer data)
7438 GtkStyle *style = NULL;
7443 if (ctree->line_style != GTK_CTREE_LINES_TABBED)
7445 if (!GTK_CTREE_ROW (node)->is_leaf)
7446 style = GTK_CTREE_ROW (node)->row.data;
7447 else if (GTK_CTREE_ROW (node)->parent)
7448 style = GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data;
7451 gtk_ctree_node_set_row_style (ctree, node, style);
7455 ctree_toggle_line_style (GtkWidget *widget, gpointer data)
7460 ctree = GTK_CTREE (data);
7462 if (!GTK_WIDGET_MAPPED (widget))
7465 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7467 if ((ctree->line_style == GTK_CTREE_LINES_TABBED &&
7468 ((GtkCTreeLineStyle) i) != GTK_CTREE_LINES_TABBED) ||
7469 (ctree->line_style != GTK_CTREE_LINES_TABBED &&
7470 ((GtkCTreeLineStyle) i) == GTK_CTREE_LINES_TABBED))
7471 gtk_ctree_pre_recursive (ctree, NULL, set_background, NULL);
7472 gtk_ctree_set_line_style (ctree, i);
7477 ctree_toggle_expander_style (GtkWidget *widget, gpointer data)
7482 ctree = GTK_CTREE (data);
7484 if (!GTK_WIDGET_MAPPED (widget))
7487 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7489 gtk_ctree_set_expander_style (ctree, (GtkCTreeExpanderStyle) i);
7493 ctree_toggle_justify (GtkWidget *widget, gpointer data)
7498 ctree = GTK_CTREE (data);
7500 if (!GTK_WIDGET_MAPPED (widget))
7503 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7505 gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column,
7506 (GtkJustification) i);
7510 ctree_toggle_sel_mode (GtkWidget *widget, gpointer data)
7515 ctree = GTK_CTREE (data);
7517 if (!GTK_WIDGET_MAPPED (widget))
7520 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7522 gtk_clist_set_selection_mode (GTK_CLIST (ctree), selection_modes[i]);
7523 after_press (ctree, NULL);
7526 void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
7527 gint num_books, gint num_pages, GtkCTreeNode *parent)
7532 GtkCTreeNode *sibling;
7533 CTreePixmaps *pixmaps;
7540 pixmaps = get_ctree_pixmaps (ctree);
7542 for (i = num_pages + num_books; i > num_books; i--)
7545 sprintf (buf1, "Page %02d", (gint) rand() % 100);
7546 sprintf (buf2, "Item %d-%d", cur_depth, i);
7547 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
7548 pixmaps->pixmap3, pixmaps->mask3, NULL, NULL,
7551 if (parent && ctree->line_style == GTK_CTREE_LINES_TABBED)
7552 gtk_ctree_node_set_row_style (ctree, sibling,
7553 GTK_CTREE_ROW (parent)->row.style);
7556 if (cur_depth == depth)
7559 for (i = num_books; i > 0; i--)
7564 sprintf (buf1, "Book %02d", (gint) rand() % 100);
7565 sprintf (buf2, "Item %d-%d", cur_depth, i);
7566 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
7567 pixmaps->pixmap1, pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2,
7570 style = gtk_style_new ();
7571 switch (cur_depth % 3)
7574 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
7575 style->base[GTK_STATE_NORMAL].green = 0;
7576 style->base[GTK_STATE_NORMAL].blue = 65535 - ((i * 10000) % 65535);
7579 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
7580 style->base[GTK_STATE_NORMAL].green = 65535 - ((i * 10000) % 65535);
7581 style->base[GTK_STATE_NORMAL].blue = 0;
7584 style->base[GTK_STATE_NORMAL].red = 65535 - ((i * 10000) % 65535);
7585 style->base[GTK_STATE_NORMAL].green = 0;
7586 style->base[GTK_STATE_NORMAL].blue = 10000 * (cur_depth % 6);
7589 gtk_ctree_node_set_row_data_full (ctree, sibling, style,
7590 (GDestroyNotify) g_object_unref);
7592 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
7593 gtk_ctree_node_set_row_style (ctree, sibling, style);
7595 build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages,
7600 void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
7603 gchar label1[] = "Root";
7604 gchar label2[] = "";
7605 GtkCTreeNode *parent;
7608 CTreePixmaps *pixmaps;
7610 pixmaps = get_ctree_pixmaps (ctree);
7615 d = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7616 b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7617 p = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin3));
7619 n = ((pow (b, d) - 1) / (b - 1)) * (p + 1);
7623 g_print ("%d total items? Try less\n",n);
7627 gtk_clist_freeze (GTK_CLIST (ctree));
7628 gtk_clist_clear (GTK_CLIST (ctree));
7633 parent = gtk_ctree_insert_node (ctree, NULL, NULL, text, 5, pixmaps->pixmap1,
7634 pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2, FALSE, TRUE);
7636 style = gtk_style_new ();
7637 style->base[GTK_STATE_NORMAL].red = 0;
7638 style->base[GTK_STATE_NORMAL].green = 45000;
7639 style->base[GTK_STATE_NORMAL].blue = 55000;
7640 gtk_ctree_node_set_row_data_full (ctree, parent, style,
7641 (GDestroyNotify) g_object_unref);
7643 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
7644 gtk_ctree_node_set_row_style (ctree, parent, style);
7646 build_recursive (ctree, 1, d, b, p, parent);
7647 gtk_clist_thaw (GTK_CLIST (ctree));
7648 after_press (ctree, NULL);
7652 ctree_click_column (GtkCTree *ctree, gint column, gpointer data)
7656 clist = GTK_CLIST (ctree);
7658 if (column == clist->sort_column)
7660 if (clist->sort_type == GTK_SORT_ASCENDING)
7661 clist->sort_type = GTK_SORT_DESCENDING;
7663 clist->sort_type = GTK_SORT_ASCENDING;
7666 gtk_clist_set_sort_column (clist, column);
7668 gtk_ctree_sort_recursive (ctree, NULL);
7671 void create_ctree (GtkWidget *widget)
7673 static GtkWidget *window = NULL;
7674 GtkTooltips *tooltips;
7676 GtkWidget *scrolled_win;
7689 char *title[] = { "Tree" , "Info" };
7692 static gchar *items1[] =
7700 static gchar *items2[] =
7708 static gchar *items3[] =
7716 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7717 gtk_window_set_screen (GTK_WINDOW (window),
7718 gtk_widget_get_screen (widget));
7720 g_signal_connect (window, "destroy",
7721 G_CALLBACK (gtk_widget_destroyed),
7724 gtk_window_set_title (GTK_WINDOW (window), "GtkCTree");
7725 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7727 tooltips = gtk_tooltips_new ();
7728 g_object_ref (tooltips);
7729 gtk_object_sink (GTK_OBJECT (tooltips));
7731 g_object_set_data_full (G_OBJECT (window), "tooltips", tooltips,
7734 vbox = gtk_vbox_new (FALSE, 0);
7735 gtk_container_add (GTK_CONTAINER (window), vbox);
7737 hbox = gtk_hbox_new (FALSE, 5);
7738 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
7739 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
7741 label = gtk_label_new ("Depth :");
7742 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7744 adj = (GtkAdjustment *) gtk_adjustment_new (4, 1, 10, 1, 5, 0);
7745 spin1 = gtk_spin_button_new (adj, 0, 0);
7746 gtk_box_pack_start (GTK_BOX (hbox), spin1, FALSE, TRUE, 5);
7748 label = gtk_label_new ("Books :");
7749 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7751 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
7752 spin2 = gtk_spin_button_new (adj, 0, 0);
7753 gtk_box_pack_start (GTK_BOX (hbox), spin2, FALSE, TRUE, 5);
7755 label = gtk_label_new ("Pages :");
7756 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7758 adj = (GtkAdjustment *) gtk_adjustment_new (5, 1, 20, 1, 5, 0);
7759 spin3 = gtk_spin_button_new (adj, 0, 0);
7760 gtk_box_pack_start (GTK_BOX (hbox), spin3, FALSE, TRUE, 5);
7762 button = gtk_button_new_with_label ("Close");
7763 gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7765 g_signal_connect_swapped (button, "clicked",
7766 G_CALLBACK (gtk_widget_destroy),
7769 button = gtk_button_new_with_label ("Rebuild Tree");
7770 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7772 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
7773 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
7774 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
7775 GTK_POLICY_AUTOMATIC,
7777 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
7779 ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
7780 gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (ctree));
7782 gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
7783 gtk_clist_set_column_width (GTK_CLIST (ctree), 1, 200);
7784 gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_EXTENDED);
7785 gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
7786 line_style = GTK_CTREE_LINES_DOTTED;
7788 g_signal_connect (button, "clicked",
7789 G_CALLBACK (rebuild_tree), ctree);
7790 g_signal_connect (ctree, "click_column",
7791 G_CALLBACK (ctree_click_column), NULL);
7793 g_signal_connect_after (ctree, "button_press_event",
7794 G_CALLBACK (after_press), NULL);
7795 g_signal_connect_after (ctree, "button_release_event",
7796 G_CALLBACK (after_press), NULL);
7797 g_signal_connect_after (ctree, "tree_move",
7798 G_CALLBACK (after_move), NULL);
7799 g_signal_connect_after (ctree, "end_selection",
7800 G_CALLBACK (after_press), NULL);
7801 g_signal_connect_after (ctree, "toggle_focus_row",
7802 G_CALLBACK (after_press), NULL);
7803 g_signal_connect_after (ctree, "select_all",
7804 G_CALLBACK (after_press), NULL);
7805 g_signal_connect_after (ctree, "unselect_all",
7806 G_CALLBACK (after_press), NULL);
7807 g_signal_connect_after (ctree, "scroll_vertical",
7808 G_CALLBACK (after_press), NULL);
7810 bbox = gtk_hbox_new (FALSE, 5);
7811 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
7812 gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, TRUE, 0);
7814 mbox = gtk_vbox_new (TRUE, 5);
7815 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7817 label = gtk_label_new ("Row Height :");
7818 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7820 label = gtk_label_new ("Indent :");
7821 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7823 label = gtk_label_new ("Spacing :");
7824 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7826 mbox = gtk_vbox_new (TRUE, 5);
7827 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7829 adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0);
7830 spinner = gtk_spin_button_new (adj, 0, 0);
7831 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7832 gtk_tooltips_set_tip (tooltips, spinner,
7833 "Row height of list items", NULL);
7834 g_signal_connect (adj, "value_changed",
7835 G_CALLBACK (change_row_height), ctree);
7836 gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value);
7838 adj = (GtkAdjustment *) gtk_adjustment_new (20, 0, 60, 1, 10, 0);
7839 spinner = gtk_spin_button_new (adj, 0, 0);
7840 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7841 gtk_tooltips_set_tip (tooltips, spinner, "Tree Indentation.", NULL);
7842 g_signal_connect (adj, "value_changed",
7843 G_CALLBACK (change_indent), ctree);
7845 adj = (GtkAdjustment *) gtk_adjustment_new (5, 0, 60, 1, 10, 0);
7846 spinner = gtk_spin_button_new (adj, 0, 0);
7847 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7848 gtk_tooltips_set_tip (tooltips, spinner, "Tree Spacing.", NULL);
7849 g_signal_connect (adj, "value_changed",
7850 G_CALLBACK (change_spacing), ctree);
7852 mbox = gtk_vbox_new (TRUE, 5);
7853 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7855 hbox = gtk_hbox_new (FALSE, 5);
7856 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7858 button = gtk_button_new_with_label ("Expand All");
7859 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7860 g_signal_connect (button, "clicked",
7861 G_CALLBACK (expand_all), ctree);
7863 button = gtk_button_new_with_label ("Collapse All");
7864 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7865 g_signal_connect (button, "clicked",
7866 G_CALLBACK (collapse_all), ctree);
7868 button = gtk_button_new_with_label ("Change Style");
7869 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7870 g_signal_connect (button, "clicked",
7871 G_CALLBACK (change_style), ctree);
7873 button = gtk_button_new_with_label ("Export Tree");
7874 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7875 g_signal_connect (button, "clicked",
7876 G_CALLBACK (export_ctree), ctree);
7878 hbox = gtk_hbox_new (FALSE, 5);
7879 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7881 button = gtk_button_new_with_label ("Select All");
7882 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7883 g_signal_connect (button, "clicked",
7884 G_CALLBACK (select_all), ctree);
7886 button = gtk_button_new_with_label ("Unselect All");
7887 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7888 g_signal_connect (button, "clicked",
7889 G_CALLBACK (unselect_all), ctree);
7891 button = gtk_button_new_with_label ("Remove Selection");
7892 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7893 g_signal_connect (button, "clicked",
7894 G_CALLBACK (remove_selection), ctree);
7896 check = gtk_check_button_new_with_label ("Reorderable");
7897 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
7898 gtk_tooltips_set_tip (tooltips, check,
7899 "Tree items can be reordered by dragging.", NULL);
7900 g_signal_connect (check, "clicked",
7901 G_CALLBACK (toggle_reorderable), ctree);
7902 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
7904 hbox = gtk_hbox_new (TRUE, 5);
7905 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7907 omenu1 = build_option_menu (items1, 4, 2,
7908 ctree_toggle_line_style,
7910 gtk_box_pack_start (GTK_BOX (hbox), omenu1, FALSE, TRUE, 0);
7911 gtk_tooltips_set_tip (tooltips, omenu1, "The tree's line style.", NULL);
7913 omenu2 = build_option_menu (items2, 4, 1,
7914 ctree_toggle_expander_style,
7916 gtk_box_pack_start (GTK_BOX (hbox), omenu2, FALSE, TRUE, 0);
7917 gtk_tooltips_set_tip (tooltips, omenu2, "The tree's expander style.",
7920 omenu3 = build_option_menu (items3, 2, 0,
7921 ctree_toggle_justify, ctree);
7922 gtk_box_pack_start (GTK_BOX (hbox), omenu3, FALSE, TRUE, 0);
7923 gtk_tooltips_set_tip (tooltips, omenu3, "The tree's justification.",
7926 omenu4 = build_option_menu (selection_mode_items, 3, 3,
7927 ctree_toggle_sel_mode, ctree);
7928 gtk_box_pack_start (GTK_BOX (hbox), omenu4, FALSE, TRUE, 0);
7929 gtk_tooltips_set_tip (tooltips, omenu4, "The list's selection mode.",
7932 gtk_widget_realize (window);
7934 gtk_widget_set_size_request (GTK_WIDGET (ctree), -1, 300);
7936 frame = gtk_frame_new (NULL);
7937 gtk_container_set_border_width (GTK_CONTAINER (frame), 0);
7938 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
7939 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
7941 hbox = gtk_hbox_new (TRUE, 2);
7942 gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
7943 gtk_container_add (GTK_CONTAINER (frame), hbox);
7945 frame = gtk_frame_new (NULL);
7946 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
7947 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
7949 hbox2 = gtk_hbox_new (FALSE, 0);
7950 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
7951 gtk_container_add (GTK_CONTAINER (frame), hbox2);
7953 label = gtk_label_new ("Books :");
7954 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
7956 sprintf (buf, "%d", books);
7957 book_label = gtk_label_new (buf);
7958 gtk_box_pack_end (GTK_BOX (hbox2), book_label, FALSE, TRUE, 5);
7960 frame = gtk_frame_new (NULL);
7961 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
7962 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
7964 hbox2 = gtk_hbox_new (FALSE, 0);
7965 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
7966 gtk_container_add (GTK_CONTAINER (frame), hbox2);
7968 label = gtk_label_new ("Pages :");
7969 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
7971 sprintf (buf, "%d", pages);
7972 page_label = gtk_label_new (buf);
7973 gtk_box_pack_end (GTK_BOX (hbox2), page_label, FALSE, TRUE, 5);
7975 frame = gtk_frame_new (NULL);
7976 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
7977 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
7979 hbox2 = gtk_hbox_new (FALSE, 0);
7980 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
7981 gtk_container_add (GTK_CONTAINER (frame), hbox2);
7983 label = gtk_label_new ("Selected :");
7984 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
7986 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
7987 sel_label = gtk_label_new (buf);
7988 gtk_box_pack_end (GTK_BOX (hbox2), sel_label, FALSE, TRUE, 5);
7990 frame = gtk_frame_new (NULL);
7991 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
7992 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
7994 hbox2 = gtk_hbox_new (FALSE, 0);
7995 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
7996 gtk_container_add (GTK_CONTAINER (frame), hbox2);
7998 label = gtk_label_new ("Visible :");
7999 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
8001 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
8002 vis_label = gtk_label_new (buf);
8003 gtk_box_pack_end (GTK_BOX (hbox2), vis_label, FALSE, TRUE, 5);
8005 rebuild_tree (NULL, ctree);
8008 if (!GTK_WIDGET_VISIBLE (window))
8009 gtk_widget_show_all (window);
8011 gtk_widget_destroy (window);
8019 color_selection_ok (GtkWidget *w,
8020 GtkColorSelectionDialog *cs)
8022 GtkColorSelection *colorsel;
8025 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
8027 gtk_color_selection_get_color(colorsel,color);
8028 gtk_color_selection_set_color(colorsel,color);
8032 color_selection_changed (GtkWidget *w,
8033 GtkColorSelectionDialog *cs)
8035 GtkColorSelection *colorsel;
8038 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
8039 gtk_color_selection_get_color(colorsel,color);
8044 opacity_toggled_cb (GtkWidget *w,
8045 GtkColorSelectionDialog *cs)
8047 GtkColorSelection *colorsel;
8049 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
8050 gtk_color_selection_set_has_opacity_control (colorsel,
8051 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
8055 palette_toggled_cb (GtkWidget *w,
8056 GtkColorSelectionDialog *cs)
8058 GtkColorSelection *colorsel;
8060 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
8061 gtk_color_selection_set_has_palette (colorsel,
8062 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
8067 create_color_selection (GtkWidget *widget)
8069 static GtkWidget *window = NULL;
8077 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8078 gtk_window_set_screen (GTK_WINDOW (window),
8079 gtk_widget_get_screen (widget));
8081 g_signal_connect (window, "destroy",
8082 G_CALLBACK (gtk_widget_destroyed),
8085 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
8086 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8088 hbox = gtk_hbox_new (FALSE, 8);
8089 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
8090 gtk_container_add (GTK_CONTAINER (window), hbox);
8092 label = gtk_label_new ("Pick a color");
8093 gtk_container_add (GTK_CONTAINER (hbox), label);
8095 picker = gtk_color_button_new ();
8096 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
8097 gtk_container_add (GTK_CONTAINER (hbox), picker);
8100 if (!GTK_WIDGET_VISIBLE (window))
8101 gtk_widget_show_all (window);
8103 gtk_widget_destroy (window);
8111 show_fileops (GtkWidget *widget,
8112 GtkFileSelection *fs)
8116 show_ops = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8119 gtk_file_selection_show_fileop_buttons (fs);
8121 gtk_file_selection_hide_fileop_buttons (fs);
8125 select_multiple (GtkWidget *widget,
8126 GtkFileSelection *fs)
8128 gboolean select_multiple;
8130 select_multiple = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8131 gtk_file_selection_set_select_multiple (fs, select_multiple);
8135 file_selection_ok (GtkFileSelection *fs)
8140 selections = gtk_file_selection_get_selections (fs);
8142 for (i = 0; selections[i] != NULL; i++)
8143 g_print ("%s\n", selections[i]);
8145 g_strfreev (selections);
8147 gtk_widget_destroy (GTK_WIDGET (fs));
8151 create_file_selection (GtkWidget *widget)
8153 static GtkWidget *window = NULL;
8158 window = gtk_file_selection_new ("file selection dialog");
8159 gtk_window_set_screen (GTK_WINDOW (window),
8160 gtk_widget_get_screen (widget));
8162 gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window));
8164 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
8166 g_signal_connect (window, "destroy",
8167 G_CALLBACK (gtk_widget_destroyed),
8170 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->ok_button,
8172 G_CALLBACK (file_selection_ok),
8174 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->cancel_button,
8176 G_CALLBACK (gtk_widget_destroy),
8179 button = gtk_check_button_new_with_label ("Show Fileops");
8180 g_signal_connect (button, "toggled",
8181 G_CALLBACK (show_fileops),
8183 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
8184 button, FALSE, FALSE, 0);
8185 gtk_widget_show (button);
8187 button = gtk_check_button_new_with_label ("Select Multiple");
8188 g_signal_connect (button, "clicked",
8189 G_CALLBACK (select_multiple),
8191 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
8192 button, FALSE, FALSE, 0);
8193 gtk_widget_show (button);
8196 if (!GTK_WIDGET_VISIBLE (window))
8197 gtk_widget_show (window);
8199 gtk_widget_destroy (window);
8203 flipping_toggled_cb (GtkWidget *widget, gpointer data)
8205 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8206 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
8208 gtk_widget_set_default_direction (new_direction);
8212 set_direction_recurse (GtkWidget *widget,
8215 GtkTextDirection *dir = data;
8217 gtk_widget_set_direction (widget, *dir);
8218 if (GTK_IS_CONTAINER (widget))
8219 gtk_container_foreach (GTK_CONTAINER (widget),
8220 set_direction_recurse,
8225 create_forward_back (const char *title,
8226 GtkTextDirection text_dir)
8228 GtkWidget *frame = gtk_frame_new (title);
8229 GtkWidget *bbox = gtk_hbutton_box_new ();
8230 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
8231 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
8233 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
8235 gtk_container_add (GTK_CONTAINER (frame), bbox);
8236 gtk_container_add (GTK_CONTAINER (bbox), back_button);
8237 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
8239 set_direction_recurse (frame, &text_dir);
8245 create_flipping (GtkWidget *widget)
8247 static GtkWidget *window = NULL;
8248 GtkWidget *check_button, *button;
8252 window = gtk_dialog_new ();
8254 gtk_window_set_screen (GTK_WINDOW (window),
8255 gtk_widget_get_screen (widget));
8257 g_signal_connect (window, "destroy",
8258 G_CALLBACK (gtk_widget_destroyed),
8261 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
8263 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
8264 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8265 check_button, TRUE, TRUE, 0);
8267 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8268 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
8271 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8272 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
8275 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8276 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
8279 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
8280 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
8282 g_signal_connect (check_button, "toggled",
8283 G_CALLBACK (flipping_toggled_cb), NULL);
8285 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
8287 button = gtk_button_new_with_label ("Close");
8288 g_signal_connect_swapped (button, "clicked",
8289 G_CALLBACK (gtk_widget_destroy), window);
8290 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
8291 button, TRUE, TRUE, 0);
8294 if (!GTK_WIDGET_VISIBLE (window))
8295 gtk_widget_show_all (window);
8297 gtk_widget_destroy (window);
8305 make_focus_table (GList **list)
8310 table = gtk_table_new (5, 5, FALSE);
8323 widget = gtk_entry_new ();
8325 widget = gtk_button_new_with_label ("Foo");
8327 *list = g_list_prepend (*list, widget);
8329 gtk_table_attach (GTK_TABLE (table),
8333 GTK_EXPAND | GTK_FILL,
8334 GTK_EXPAND | GTK_FILL,
8343 *list = g_list_reverse (*list);
8349 create_focus (GtkWidget *widget)
8351 static GtkWidget *window = NULL;
8359 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
8365 gtk_window_set_screen (GTK_WINDOW (window),
8366 gtk_widget_get_screen (widget));
8368 g_signal_connect (window, "destroy",
8369 G_CALLBACK (gtk_widget_destroyed),
8372 g_signal_connect (window, "response",
8373 G_CALLBACK (gtk_widget_destroy),
8376 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
8378 frame = gtk_frame_new ("Weird tab focus chain");
8380 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8381 frame, TRUE, TRUE, 0);
8383 table = make_focus_table (&list);
8385 gtk_container_add (GTK_CONTAINER (frame), table);
8387 gtk_container_set_focus_chain (GTK_CONTAINER (table),
8392 frame = gtk_frame_new ("Default tab focus chain");
8394 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8395 frame, TRUE, TRUE, 0);
8398 table = make_focus_table (&list);
8402 gtk_container_add (GTK_CONTAINER (frame), table);
8405 if (!GTK_WIDGET_VISIBLE (window))
8406 gtk_widget_show_all (window);
8408 gtk_widget_destroy (window);
8416 font_selection_ok (GtkWidget *w,
8417 GtkFontSelectionDialog *fs)
8419 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
8421 g_print ("%s\n", s);
8423 gtk_widget_destroy (GTK_WIDGET (fs));
8427 create_font_selection (GtkWidget *widget)
8429 static GtkWidget *window = NULL;
8437 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8438 gtk_window_set_screen (GTK_WINDOW (window),
8439 gtk_widget_get_screen (widget));
8441 g_signal_connect (window, "destroy",
8442 G_CALLBACK (gtk_widget_destroyed),
8445 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
8446 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8448 hbox = gtk_hbox_new (FALSE, 8);
8449 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
8450 gtk_container_add (GTK_CONTAINER (window), hbox);
8452 label = gtk_label_new ("Pick a font");
8453 gtk_container_add (GTK_CONTAINER (hbox), label);
8455 picker = gtk_font_button_new ();
8456 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
8457 gtk_container_add (GTK_CONTAINER (hbox), picker);
8460 if (!GTK_WIDGET_VISIBLE (window))
8461 gtk_widget_show_all (window);
8463 gtk_widget_destroy (window);
8470 static GtkWidget *dialog_window = NULL;
8473 label_toggle (GtkWidget *widget,
8478 *label = gtk_label_new ("Dialog Test");
8479 g_signal_connect (*label,
8481 G_CALLBACK (gtk_widget_destroyed),
8483 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
8484 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
8485 *label, TRUE, TRUE, 0);
8486 gtk_widget_show (*label);
8489 gtk_widget_destroy (*label);
8492 #define RESPONSE_TOGGLE_SEPARATOR 1
8495 print_response (GtkWidget *dialog,
8499 g_print ("response signal received (%d)\n", response_id);
8501 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
8503 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
8504 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
8509 create_dialog (GtkWidget *widget)
8511 static GtkWidget *label;
8516 /* This is a terrible example; it's much simpler to create
8517 * dialogs than this. Don't use testgtk for example code,
8521 dialog_window = gtk_dialog_new ();
8522 gtk_window_set_screen (GTK_WINDOW (dialog_window),
8523 gtk_widget_get_screen (widget));
8525 g_signal_connect (dialog_window,
8527 G_CALLBACK (print_response),
8530 g_signal_connect (dialog_window, "destroy",
8531 G_CALLBACK (gtk_widget_destroyed),
8534 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
8535 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
8537 button = gtk_button_new_with_label ("OK");
8538 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8539 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8540 button, TRUE, TRUE, 0);
8541 gtk_widget_grab_default (button);
8542 gtk_widget_show (button);
8544 button = gtk_button_new_with_label ("Toggle");
8545 g_signal_connect (button, "clicked",
8546 G_CALLBACK (label_toggle),
8548 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8549 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8550 button, TRUE, TRUE, 0);
8551 gtk_widget_show (button);
8555 button = gtk_button_new_with_label ("Separator");
8557 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8559 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
8561 RESPONSE_TOGGLE_SEPARATOR);
8562 gtk_widget_show (button);
8565 if (!GTK_WIDGET_VISIBLE (dialog_window))
8566 gtk_widget_show (dialog_window);
8568 gtk_widget_destroy (dialog_window);
8571 /* Display & Screen test
8577 GtkWidget *radio_dpy;
8578 GtkWidget *toplevel;
8579 GtkWidget *dialog_window;
8580 GList *valid_display_list;
8581 } ScreenDisplaySelection;
8584 display_name_cmp (gconstpointer a,
8587 return g_ascii_strcasecmp (a,b);
8591 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
8594 GdkDisplay *display = gtk_widget_get_display (widget);
8596 GdkScreen *new_screen = NULL;
8597 GdkScreen *current_screen = gtk_widget_get_screen (widget);
8599 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
8601 display_name = g_strdup (gtk_entry_get_text (data->entry));
8602 display = gdk_display_open (display_name);
8606 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
8607 GTK_DIALOG_DESTROY_WITH_PARENT,
8610 "The display :\n%s\ncannot be opened",
8612 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
8613 gtk_widget_show (dialog);
8614 g_signal_connect (dialog, "response",
8615 G_CALLBACK (gtk_widget_destroy),
8620 if (!g_list_find_custom (data->valid_display_list,
8623 data->valid_display_list = g_list_append (data->valid_display_list,
8626 new_screen = gdk_display_get_default_screen (display);
8631 gint number_of_screens = gdk_display_get_n_screens (display);
8632 gint screen_num = gdk_screen_get_number (current_screen);
8633 if ((screen_num +1) < number_of_screens)
8634 new_screen = gdk_display_get_screen (display, screen_num + 1);
8636 new_screen = gdk_display_get_screen (display, 0);
8641 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
8642 gtk_widget_destroy (data->dialog_window);
8647 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
8649 gtk_widget_destroy (data);
8653 create_display_screen (GtkWidget *widget)
8655 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
8656 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
8658 ScreenDisplaySelection *scr_dpy_data;
8659 GdkScreen *screen = gtk_widget_get_screen (widget);
8660 static GList *valid_display_list = NULL;
8662 GdkDisplay *display = gdk_screen_get_display (screen);
8664 window = g_object_new (gtk_window_get_type (),
8667 "type", GTK_WINDOW_TOPLEVEL,
8669 "Screen or Display selection",
8670 "border_width", 10, NULL);
8671 g_signal_connect (window, "destroy",
8672 G_CALLBACK (gtk_widget_destroy), NULL);
8674 vbox = gtk_vbox_new (FALSE, 3);
8675 gtk_container_add (GTK_CONTAINER (window), vbox);
8677 frame = gtk_frame_new ("Select screen or display");
8678 gtk_container_add (GTK_CONTAINER (vbox), frame);
8680 table = gtk_table_new (2, 2, TRUE);
8681 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
8682 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
8684 gtk_container_add (GTK_CONTAINER (frame), table);
8686 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
8687 if (gdk_display_get_n_screens(display) > 1)
8688 radio_scr = gtk_radio_button_new_with_label
8689 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
8692 radio_scr = gtk_radio_button_new_with_label
8693 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
8694 "only one screen on the current display");
8695 gtk_widget_set_sensitive (radio_scr, FALSE);
8697 combo_dpy = gtk_combo_new ();
8698 if (!valid_display_list)
8699 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
8701 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
8703 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
8704 "<hostname>:<X Server Num>.<Screen Num>");
8706 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
8707 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
8708 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
8710 bbox = gtk_hbutton_box_new ();
8711 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
8712 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
8714 gtk_container_add (GTK_CONTAINER (vbox), bbox);
8716 gtk_container_add (GTK_CONTAINER (bbox), applyb);
8717 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
8719 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
8721 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
8722 scr_dpy_data->radio_dpy = radio_dpy;
8723 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
8724 scr_dpy_data->dialog_window = window;
8725 scr_dpy_data->valid_display_list = valid_display_list;
8727 g_signal_connect (cancelb, "clicked",
8728 G_CALLBACK (screen_display_destroy_diag), window);
8729 g_signal_connect (applyb, "clicked",
8730 G_CALLBACK (screen_display_check), scr_dpy_data);
8731 gtk_widget_show_all (window);
8736 static gboolean event_watcher_enter_id = 0;
8737 static gboolean event_watcher_leave_id = 0;
8740 event_watcher (GSignalInvocationHint *ihint,
8741 guint n_param_values,
8742 const GValue *param_values,
8745 g_print ("Watch: \"%s\" emitted for %s\n",
8746 g_signal_name (ihint->signal_id),
8747 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
8753 event_watcher_down (void)
8755 if (event_watcher_enter_id)
8759 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
8760 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
8761 event_watcher_enter_id = 0;
8762 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
8763 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
8764 event_watcher_leave_id = 0;
8769 event_watcher_toggle (void)
8771 if (event_watcher_enter_id)
8772 event_watcher_down ();
8777 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
8778 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8779 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
8780 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8785 create_event_watcher (GtkWidget *widget)
8791 dialog_window = gtk_dialog_new ();
8792 gtk_window_set_screen (GTK_WINDOW (dialog_window),
8793 gtk_widget_get_screen (widget));
8795 g_signal_connect (dialog_window, "destroy",
8796 G_CALLBACK (gtk_widget_destroyed),
8798 g_signal_connect (dialog_window, "destroy",
8799 G_CALLBACK (event_watcher_down),
8802 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
8803 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
8804 gtk_widget_set_size_request (dialog_window, 200, 110);
8806 button = gtk_toggle_button_new_with_label ("Activate Watch");
8807 g_signal_connect (button, "clicked",
8808 G_CALLBACK (event_watcher_toggle),
8810 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
8811 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
8812 button, TRUE, TRUE, 0);
8813 gtk_widget_show (button);
8815 button = gtk_button_new_with_label ("Close");
8816 g_signal_connect_swapped (button, "clicked",
8817 G_CALLBACK (gtk_widget_destroy),
8819 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8820 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8821 button, TRUE, TRUE, 0);
8822 gtk_widget_grab_default (button);
8823 gtk_widget_show (button);
8826 if (!GTK_WIDGET_VISIBLE (dialog_window))
8827 gtk_widget_show (dialog_window);
8829 gtk_widget_destroy (dialog_window);
8837 reformat_value (GtkScale *scale,
8840 return g_strdup_printf ("-->%0.*g<--",
8841 gtk_scale_get_digits (scale), value);
8845 create_range_controls (GtkWidget *widget)
8847 static GtkWidget *window = NULL;
8851 GtkWidget *scrollbar;
8853 GtkWidget *separator;
8854 GtkObject *adjustment;
8859 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8861 gtk_window_set_screen (GTK_WINDOW (window),
8862 gtk_widget_get_screen (widget));
8864 g_signal_connect (window, "destroy",
8865 G_CALLBACK (gtk_widget_destroyed),
8868 gtk_window_set_title (GTK_WINDOW (window), "range controls");
8869 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8872 box1 = gtk_vbox_new (FALSE, 0);
8873 gtk_container_add (GTK_CONTAINER (window), box1);
8874 gtk_widget_show (box1);
8877 box2 = gtk_vbox_new (FALSE, 10);
8878 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8879 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
8880 gtk_widget_show (box2);
8883 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
8885 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
8886 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
8887 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
8888 gtk_scale_set_digits (GTK_SCALE (scale), 1);
8889 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8890 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
8891 gtk_widget_show (scale);
8893 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
8894 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
8895 GTK_UPDATE_CONTINUOUS);
8896 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
8897 gtk_widget_show (scrollbar);
8899 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
8900 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8901 g_signal_connect (scale,
8903 G_CALLBACK (reformat_value),
8905 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
8906 gtk_widget_show (scale);
8908 hbox = gtk_hbox_new (FALSE, 0);
8910 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8911 gtk_widget_set_size_request (scale, -1, 200);
8912 gtk_scale_set_digits (GTK_SCALE (scale), 2);
8913 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8914 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8915 gtk_widget_show (scale);
8917 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8918 gtk_widget_set_size_request (scale, -1, 200);
8919 gtk_scale_set_digits (GTK_SCALE (scale), 2);
8920 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8921 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
8922 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8923 gtk_widget_show (scale);
8925 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8926 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8927 g_signal_connect (scale,
8929 G_CALLBACK (reformat_value),
8931 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8932 gtk_widget_show (scale);
8935 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
8936 gtk_widget_show (hbox);
8938 separator = gtk_hseparator_new ();
8939 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
8940 gtk_widget_show (separator);
8943 box2 = gtk_vbox_new (FALSE, 10);
8944 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8945 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8946 gtk_widget_show (box2);
8949 button = gtk_button_new_with_label ("close");
8950 g_signal_connect_swapped (button, "clicked",
8951 G_CALLBACK (gtk_widget_destroy),
8953 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8954 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8955 gtk_widget_grab_default (button);
8956 gtk_widget_show (button);
8959 if (!GTK_WIDGET_VISIBLE (window))
8960 gtk_widget_show (window);
8962 gtk_widget_destroy (window);
8970 create_rulers (GtkWidget *widget)
8972 static GtkWidget *window = NULL;
8978 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8980 gtk_window_set_screen (GTK_WINDOW (window),
8981 gtk_widget_get_screen (widget));
8983 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
8985 g_signal_connect (window, "destroy",
8986 G_CALLBACK (gtk_widget_destroyed),
8989 gtk_window_set_title (GTK_WINDOW (window), "rulers");
8990 gtk_widget_set_size_request (window, 300, 300);
8991 gtk_widget_set_events (window,
8992 GDK_POINTER_MOTION_MASK
8993 | GDK_POINTER_MOTION_HINT_MASK);
8994 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8996 table = gtk_table_new (2, 2, FALSE);
8997 gtk_container_add (GTK_CONTAINER (window), table);
8998 gtk_widget_show (table);
9000 ruler = gtk_hruler_new ();
9001 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
9002 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
9004 g_signal_connect_swapped (window,
9005 "motion_notify_event",
9006 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
9009 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
9010 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
9011 gtk_widget_show (ruler);
9014 ruler = gtk_vruler_new ();
9015 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
9017 g_signal_connect_swapped (window,
9018 "motion_notify_event",
9019 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
9022 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
9023 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
9024 gtk_widget_show (ruler);
9027 if (!GTK_WIDGET_VISIBLE (window))
9028 gtk_widget_show (window);
9030 gtk_widget_destroy (window);
9034 text_toggle_editable (GtkWidget *checkbutton,
9037 gtk_text_set_editable(GTK_TEXT(text),
9038 GTK_TOGGLE_BUTTON(checkbutton)->active);
9042 text_toggle_word_wrap (GtkWidget *checkbutton,
9045 gtk_text_set_word_wrap(GTK_TEXT(text),
9046 GTK_TOGGLE_BUTTON(checkbutton)->active);
9053 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
9054 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
9055 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
9056 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
9057 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
9058 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
9059 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
9060 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
9063 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
9069 text_insert_random (GtkWidget *w, GtkText *text)
9073 for (i=0; i<10; i++)
9075 c = 'A' + rand() % ('Z' - 'A');
9076 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
9077 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
9082 create_text (GtkWidget *widget)
9086 static GtkWidget *window = NULL;
9092 GtkWidget *separator;
9093 GtkWidget *scrolled_window;
9100 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9101 gtk_window_set_screen (GTK_WINDOW (window),
9102 gtk_widget_get_screen (widget));
9104 gtk_widget_set_name (window, "text window");
9105 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
9106 gtk_widget_set_size_request (window, 500, 500);
9108 g_signal_connect (window, "destroy",
9109 G_CALLBACK (gtk_widget_destroyed),
9112 gtk_window_set_title (GTK_WINDOW (window), "test");
9113 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9116 box1 = gtk_vbox_new (FALSE, 0);
9117 gtk_container_add (GTK_CONTAINER (window), box1);
9118 gtk_widget_show (box1);
9121 box2 = gtk_vbox_new (FALSE, 10);
9122 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9123 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
9124 gtk_widget_show (box2);
9127 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
9128 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
9129 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
9132 gtk_widget_show (scrolled_window);
9134 text = gtk_text_new (NULL, NULL);
9135 gtk_text_set_editable (GTK_TEXT (text), TRUE);
9136 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
9137 gtk_widget_grab_focus (text);
9138 gtk_widget_show (text);
9141 gtk_text_freeze (GTK_TEXT (text));
9143 for (i=0; i<ntext_colors; i++)
9145 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
9146 text_colors[i].name, -1);
9147 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
9149 for (j=0; j<ntext_colors; j++)
9151 gtk_text_insert (GTK_TEXT (text), NULL,
9152 &text_colors[j].color, &text_colors[i].color,
9155 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
9158 infile = fopen("testgtk.c", "r");
9163 int nbytes_read, nbytes_alloc;
9166 nbytes_alloc = 1024;
9167 buffer = g_new (char, nbytes_alloc);
9171 if (nbytes_alloc < nbytes_read + 1024)
9174 buffer = g_realloc (buffer, nbytes_alloc);
9176 len = fread (buffer + nbytes_read, 1, 1024, infile);
9182 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
9183 NULL, buffer, nbytes_read);
9188 gtk_text_thaw (GTK_TEXT (text));
9190 hbox = gtk_hbutton_box_new ();
9191 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
9192 gtk_widget_show (hbox);
9194 check = gtk_check_button_new_with_label("Editable");
9195 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
9196 g_signal_connect (check, "toggled",
9197 G_CALLBACK (text_toggle_editable), text);
9198 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
9199 gtk_widget_show (check);
9201 check = gtk_check_button_new_with_label("Wrap Words");
9202 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
9203 g_signal_connect (check, "toggled",
9204 G_CALLBACK (text_toggle_word_wrap), text);
9205 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
9206 gtk_widget_show (check);
9208 separator = gtk_hseparator_new ();
9209 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9210 gtk_widget_show (separator);
9213 box2 = gtk_vbox_new (FALSE, 10);
9214 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9215 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9216 gtk_widget_show (box2);
9219 button = gtk_button_new_with_label ("insert random");
9220 g_signal_connect (button, "clicked",
9221 G_CALLBACK (text_insert_random),
9223 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9224 gtk_widget_show (button);
9226 button = gtk_button_new_with_label ("close");
9227 g_signal_connect_swapped (button, "clicked",
9228 G_CALLBACK (gtk_widget_destroy),
9230 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9231 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9232 gtk_widget_grab_default (button);
9233 gtk_widget_show (button);
9236 if (!GTK_WIDGET_VISIBLE (window))
9237 gtk_widget_show (window);
9239 gtk_widget_destroy (window);
9246 GdkPixbuf *book_open;
9247 GdkPixbuf *book_closed;
9248 GtkWidget *sample_notebook;
9251 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
9253 GtkWidget *page_widget;
9256 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
9258 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
9259 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
9261 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
9262 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
9266 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
9268 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
9269 gint old_page_num = gtk_notebook_get_current_page (notebook);
9271 if (page_num == old_page_num)
9274 set_page_image (notebook, page_num, book_open);
9276 if (old_page_num != -1)
9277 set_page_image (notebook, old_page_num, book_closed);
9281 tab_fill (GtkToggleButton *button, GtkWidget *child)
9284 GtkPackType pack_type;
9286 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9287 &expand, NULL, &pack_type);
9288 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9289 expand, button->active, pack_type);
9293 tab_expand (GtkToggleButton *button, GtkWidget *child)
9296 GtkPackType pack_type;
9298 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9299 NULL, &fill, &pack_type);
9300 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9301 button->active, fill, pack_type);
9305 tab_pack (GtkToggleButton *button, GtkWidget *child)
9311 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9312 &expand, &fill, NULL);
9313 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9314 expand, fill, button->active);
9318 create_pages (GtkNotebook *notebook, gint start, gint end)
9320 GtkWidget *child = NULL;
9325 GtkWidget *label_box;
9326 GtkWidget *menu_box;
9330 char accel_buffer[32];
9332 for (i = start; i <= end; i++)
9334 sprintf (buffer, "Page %d", i);
9335 sprintf (accel_buffer, "Page _%d", i);
9337 child = gtk_frame_new (buffer);
9338 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
9340 vbox = gtk_vbox_new (TRUE,0);
9341 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9342 gtk_container_add (GTK_CONTAINER (child), vbox);
9344 hbox = gtk_hbox_new (TRUE,0);
9345 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
9347 button = gtk_check_button_new_with_label ("Fill Tab");
9348 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9349 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
9350 g_signal_connect (button, "toggled",
9351 G_CALLBACK (tab_fill), child);
9353 button = gtk_check_button_new_with_label ("Expand Tab");
9354 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9355 g_signal_connect (button, "toggled",
9356 G_CALLBACK (tab_expand), child);
9358 button = gtk_check_button_new_with_label ("Pack end");
9359 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9360 g_signal_connect (button, "toggled",
9361 G_CALLBACK (tab_pack), child);
9363 button = gtk_button_new_with_label ("Hide Page");
9364 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
9365 g_signal_connect_swapped (button, "clicked",
9366 G_CALLBACK (gtk_widget_hide),
9369 gtk_widget_show_all (child);
9371 label_box = gtk_hbox_new (FALSE, 0);
9372 pixwid = gtk_image_new_from_pixbuf (book_closed);
9373 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
9375 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
9376 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
9377 label = gtk_label_new_with_mnemonic (accel_buffer);
9378 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
9379 gtk_widget_show_all (label_box);
9382 menu_box = gtk_hbox_new (FALSE, 0);
9383 pixwid = gtk_image_new_from_pixbuf (book_closed);
9384 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
9386 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
9387 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
9388 label = gtk_label_new (buffer);
9389 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
9390 gtk_widget_show_all (menu_box);
9392 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
9397 rotate_notebook (GtkButton *button,
9398 GtkNotebook *notebook)
9400 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
9404 show_all_pages (GtkButton *button,
9405 GtkNotebook *notebook)
9407 gtk_container_foreach (GTK_CONTAINER (notebook),
9408 (GtkCallback) gtk_widget_show, NULL);
9412 notebook_type_changed (GtkWidget *optionmenu,
9415 GtkNotebook *notebook;
9425 notebook = GTK_NOTEBOOK (data);
9427 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
9432 /* standard notebook */
9433 gtk_notebook_set_show_tabs (notebook, TRUE);
9434 gtk_notebook_set_show_border (notebook, TRUE);
9435 gtk_notebook_set_scrollable (notebook, FALSE);
9439 /* notabs notebook */
9440 gtk_notebook_set_show_tabs (notebook, FALSE);
9441 gtk_notebook_set_show_border (notebook, TRUE);
9446 gtk_notebook_set_show_tabs (notebook, FALSE);
9447 gtk_notebook_set_show_border (notebook, FALSE);
9452 gtk_notebook_set_show_tabs (notebook, TRUE);
9453 gtk_notebook_set_show_border (notebook, TRUE);
9454 gtk_notebook_set_scrollable (notebook, TRUE);
9455 if (g_list_length (notebook->children) == 5)
9456 create_pages (notebook, 6, 15);
9462 if (g_list_length (notebook->children) == 15)
9463 for (i = 0; i < 10; i++)
9464 gtk_notebook_remove_page (notebook, 5);
9468 notebook_popup (GtkToggleButton *button,
9469 GtkNotebook *notebook)
9472 gtk_notebook_popup_enable (notebook);
9474 gtk_notebook_popup_disable (notebook);
9478 notebook_homogeneous (GtkToggleButton *button,
9479 GtkNotebook *notebook)
9481 g_object_set (notebook, "homogeneous", button->active, NULL);
9485 create_notebook (GtkWidget *widget)
9487 static GtkWidget *window = NULL;
9491 GtkWidget *separator;
9495 static gchar *items[] =
9505 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9506 gtk_window_set_screen (GTK_WINDOW (window),
9507 gtk_widget_get_screen (widget));
9509 g_signal_connect (window, "destroy",
9510 G_CALLBACK (gtk_widget_destroyed),
9513 gtk_window_set_title (GTK_WINDOW (window), "notebook");
9514 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9516 box1 = gtk_vbox_new (FALSE, 0);
9517 gtk_container_add (GTK_CONTAINER (window), box1);
9519 sample_notebook = gtk_notebook_new ();
9520 g_signal_connect (sample_notebook, "switch_page",
9521 G_CALLBACK (page_switch), NULL);
9522 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
9523 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
9524 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
9526 gtk_widget_realize (sample_notebook);
9529 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
9532 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
9534 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
9536 separator = gtk_hseparator_new ();
9537 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
9539 box2 = gtk_hbox_new (FALSE, 5);
9540 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9541 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9543 button = gtk_check_button_new_with_label ("popup menu");
9544 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
9545 g_signal_connect (button, "clicked",
9546 G_CALLBACK (notebook_popup),
9549 button = gtk_check_button_new_with_label ("homogeneous tabs");
9550 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
9551 g_signal_connect (button, "clicked",
9552 G_CALLBACK (notebook_homogeneous),
9555 box2 = gtk_hbox_new (FALSE, 5);
9556 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9557 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9559 label = gtk_label_new ("Notebook Style :");
9560 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
9562 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
9563 notebook_type_changed,
9565 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
9567 button = gtk_button_new_with_label ("Show all Pages");
9568 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
9569 g_signal_connect (button, "clicked",
9570 G_CALLBACK (show_all_pages), sample_notebook);
9572 box2 = gtk_hbox_new (TRUE, 10);
9573 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9574 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9576 button = gtk_button_new_with_label ("prev");
9577 g_signal_connect_swapped (button, "clicked",
9578 G_CALLBACK (gtk_notebook_prev_page),
9580 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9582 button = gtk_button_new_with_label ("next");
9583 g_signal_connect_swapped (button, "clicked",
9584 G_CALLBACK (gtk_notebook_next_page),
9586 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9588 button = gtk_button_new_with_label ("rotate");
9589 g_signal_connect (button, "clicked",
9590 G_CALLBACK (rotate_notebook), sample_notebook);
9591 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9593 separator = gtk_hseparator_new ();
9594 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
9596 button = gtk_button_new_with_label ("close");
9597 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
9598 g_signal_connect_swapped (button, "clicked",
9599 G_CALLBACK (gtk_widget_destroy),
9601 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
9602 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9603 gtk_widget_grab_default (button);
9606 if (!GTK_WIDGET_VISIBLE (window))
9607 gtk_widget_show_all (window);
9609 gtk_widget_destroy (window);
9617 toggle_resize (GtkWidget *widget, GtkWidget *child)
9619 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
9620 GValue value = { 0, };
9621 g_value_init (&value, G_TYPE_BOOLEAN);
9622 gtk_container_child_get_property (container, child, "resize", &value);
9623 g_value_set_boolean (&value, !g_value_get_boolean (&value));
9624 gtk_container_child_set_property (container, child, "resize", &value);
9628 toggle_shrink (GtkWidget *widget, GtkWidget *child)
9630 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
9631 GValue value = { 0, };
9632 g_value_init (&value, G_TYPE_BOOLEAN);
9633 gtk_container_child_get_property (container, child, "shrink", &value);
9634 g_value_set_boolean (&value, !g_value_get_boolean (&value));
9635 gtk_container_child_set_property (container, child, "shrink", &value);
9639 paned_props_clicked (GtkWidget *button,
9642 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
9644 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
9648 create_pane_options (GtkPaned *paned,
9649 const gchar *frame_label,
9650 const gchar *label1,
9651 const gchar *label2)
9657 GtkWidget *check_button;
9659 frame = gtk_frame_new (frame_label);
9660 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
9662 table = gtk_table_new (4, 2, 4);
9663 gtk_container_add (GTK_CONTAINER (frame), table);
9665 label = gtk_label_new (label1);
9666 gtk_table_attach_defaults (GTK_TABLE (table), label,
9669 check_button = gtk_check_button_new_with_label ("Resize");
9670 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9672 g_signal_connect (check_button, "toggled",
9673 G_CALLBACK (toggle_resize),
9676 check_button = gtk_check_button_new_with_label ("Shrink");
9677 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9679 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9681 g_signal_connect (check_button, "toggled",
9682 G_CALLBACK (toggle_shrink),
9685 label = gtk_label_new (label2);
9686 gtk_table_attach_defaults (GTK_TABLE (table), label,
9689 check_button = gtk_check_button_new_with_label ("Resize");
9690 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9692 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9694 g_signal_connect (check_button, "toggled",
9695 G_CALLBACK (toggle_resize),
9698 check_button = gtk_check_button_new_with_label ("Shrink");
9699 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9701 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9703 g_signal_connect (check_button, "toggled",
9704 G_CALLBACK (toggle_shrink),
9707 button = gtk_button_new_with_mnemonic ("_Properties");
9708 gtk_table_attach_defaults (GTK_TABLE (table), button,
9710 g_signal_connect (button, "clicked",
9711 G_CALLBACK (paned_props_clicked),
9718 create_panes (GtkWidget *widget)
9720 static GtkWidget *window = NULL;
9729 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9731 gtk_window_set_screen (GTK_WINDOW (window),
9732 gtk_widget_get_screen (widget));
9734 g_signal_connect (window, "destroy",
9735 G_CALLBACK (gtk_widget_destroyed),
9738 gtk_window_set_title (GTK_WINDOW (window), "Panes");
9739 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9741 vbox = gtk_vbox_new (FALSE, 0);
9742 gtk_container_add (GTK_CONTAINER (window), vbox);
9744 vpaned = gtk_vpaned_new ();
9745 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
9746 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
9748 hpaned = gtk_hpaned_new ();
9749 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
9751 frame = gtk_frame_new (NULL);
9752 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9753 gtk_widget_set_size_request (frame, 60, 60);
9754 gtk_paned_add1 (GTK_PANED (hpaned), frame);
9756 button = gtk_button_new_with_label ("Hi there");
9757 gtk_container_add (GTK_CONTAINER(frame), button);
9759 frame = gtk_frame_new (NULL);
9760 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9761 gtk_widget_set_size_request (frame, 80, 60);
9762 gtk_paned_add2 (GTK_PANED (hpaned), frame);
9764 frame = gtk_frame_new (NULL);
9765 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9766 gtk_widget_set_size_request (frame, 60, 80);
9767 gtk_paned_add2 (GTK_PANED (vpaned), frame);
9769 /* Now create toggle buttons to control sizing */
9771 gtk_box_pack_start (GTK_BOX (vbox),
9772 create_pane_options (GTK_PANED (hpaned),
9778 gtk_box_pack_start (GTK_BOX (vbox),
9779 create_pane_options (GTK_PANED (vpaned),
9785 gtk_widget_show_all (vbox);
9788 if (!GTK_WIDGET_VISIBLE (window))
9789 gtk_widget_show (window);
9791 gtk_widget_destroy (window);
9795 * Paned keyboard navigation
9799 paned_keyboard_window1 (GtkWidget *widget)
9822 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9823 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
9824 gtk_window_set_screen (GTK_WINDOW (window1),
9825 gtk_widget_get_screen (widget));
9827 hpaned1 = gtk_hpaned_new ();
9828 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
9830 frame1 = gtk_frame_new (NULL);
9831 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
9832 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
9834 vbox1 = gtk_vbox_new (FALSE, 0);
9835 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
9837 button7 = gtk_button_new_with_label ("button7");
9838 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
9840 button8 = gtk_button_new_with_label ("button8");
9841 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
9843 button9 = gtk_button_new_with_label ("button9");
9844 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
9846 vpaned1 = gtk_vpaned_new ();
9847 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
9849 frame2 = gtk_frame_new (NULL);
9850 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
9851 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
9853 frame5 = gtk_frame_new (NULL);
9854 gtk_container_add (GTK_CONTAINER (frame2), frame5);
9856 hbox1 = gtk_hbox_new (FALSE, 0);
9857 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
9859 button5 = gtk_button_new_with_label ("button5");
9860 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
9862 button6 = gtk_button_new_with_label ("button6");
9863 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
9865 frame3 = gtk_frame_new (NULL);
9866 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
9867 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
9869 frame4 = gtk_frame_new ("Buttons");
9870 gtk_container_add (GTK_CONTAINER (frame3), frame4);
9871 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
9873 table1 = gtk_table_new (2, 2, FALSE);
9874 gtk_container_add (GTK_CONTAINER (frame4), table1);
9875 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
9877 button1 = gtk_button_new_with_label ("button1");
9878 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
9879 (GtkAttachOptions) (GTK_FILL),
9880 (GtkAttachOptions) (0), 0, 0);
9882 button2 = gtk_button_new_with_label ("button2");
9883 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
9884 (GtkAttachOptions) (GTK_FILL),
9885 (GtkAttachOptions) (0), 0, 0);
9887 button3 = gtk_button_new_with_label ("button3");
9888 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
9889 (GtkAttachOptions) (GTK_FILL),
9890 (GtkAttachOptions) (0), 0, 0);
9892 button4 = gtk_button_new_with_label ("button4");
9893 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
9894 (GtkAttachOptions) (GTK_FILL),
9895 (GtkAttachOptions) (0), 0, 0);
9901 paned_keyboard_window2 (GtkWidget *widget)
9906 GtkWidget *button13;
9910 GtkWidget *button12;
9912 GtkWidget *button11;
9913 GtkWidget *button10;
9915 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9916 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
9918 gtk_window_set_screen (GTK_WINDOW (window2),
9919 gtk_widget_get_screen (widget));
9921 hpaned2 = gtk_hpaned_new ();
9922 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
9924 frame6 = gtk_frame_new (NULL);
9925 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
9926 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
9928 button13 = gtk_button_new_with_label ("button13");
9929 gtk_container_add (GTK_CONTAINER (frame6), button13);
9931 hbox2 = gtk_hbox_new (FALSE, 0);
9932 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
9934 vpaned2 = gtk_vpaned_new ();
9935 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
9937 frame7 = gtk_frame_new (NULL);
9938 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
9939 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
9941 button12 = gtk_button_new_with_label ("button12");
9942 gtk_container_add (GTK_CONTAINER (frame7), button12);
9944 frame8 = gtk_frame_new (NULL);
9945 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
9946 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
9948 button11 = gtk_button_new_with_label ("button11");
9949 gtk_container_add (GTK_CONTAINER (frame8), button11);
9951 button10 = gtk_button_new_with_label ("button10");
9952 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
9958 paned_keyboard_window3 (GtkWidget *widget)
9965 GtkWidget *button14;
9968 GtkWidget *button15;
9971 GtkWidget *button16;
9973 GtkWidget *button17;
9975 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9976 g_object_set_data (G_OBJECT (window3), "window3", window3);
9977 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
9979 gtk_window_set_screen (GTK_WINDOW (window3),
9980 gtk_widget_get_screen (widget));
9983 vbox2 = gtk_vbox_new (FALSE, 0);
9984 gtk_container_add (GTK_CONTAINER (window3), vbox2);
9986 label1 = gtk_label_new ("Three panes nested inside each other");
9987 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
9989 hpaned3 = gtk_hpaned_new ();
9990 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
9992 frame9 = gtk_frame_new (NULL);
9993 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
9994 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
9996 button14 = gtk_button_new_with_label ("button14");
9997 gtk_container_add (GTK_CONTAINER (frame9), button14);
9999 hpaned4 = gtk_hpaned_new ();
10000 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
10002 frame10 = gtk_frame_new (NULL);
10003 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
10004 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
10006 button15 = gtk_button_new_with_label ("button15");
10007 gtk_container_add (GTK_CONTAINER (frame10), button15);
10009 hpaned5 = gtk_hpaned_new ();
10010 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
10012 frame11 = gtk_frame_new (NULL);
10013 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
10014 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
10016 button16 = gtk_button_new_with_label ("button16");
10017 gtk_container_add (GTK_CONTAINER (frame11), button16);
10019 frame12 = gtk_frame_new (NULL);
10020 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
10021 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
10023 button17 = gtk_button_new_with_label ("button17");
10024 gtk_container_add (GTK_CONTAINER (frame12), button17);
10030 paned_keyboard_window4 (GtkWidget *widget)
10032 GtkWidget *window4;
10035 GtkWidget *hpaned6;
10036 GtkWidget *vpaned3;
10037 GtkWidget *button19;
10038 GtkWidget *button18;
10040 GtkWidget *vpaned4;
10041 GtkWidget *button21;
10042 GtkWidget *button20;
10043 GtkWidget *vpaned5;
10044 GtkWidget *button23;
10045 GtkWidget *button22;
10046 GtkWidget *vpaned6;
10047 GtkWidget *button25;
10048 GtkWidget *button24;
10050 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10051 g_object_set_data (G_OBJECT (window4), "window4", window4);
10052 gtk_window_set_title (GTK_WINDOW (window4), "window4");
10054 gtk_window_set_screen (GTK_WINDOW (window4),
10055 gtk_widget_get_screen (widget));
10057 vbox3 = gtk_vbox_new (FALSE, 0);
10058 gtk_container_add (GTK_CONTAINER (window4), vbox3);
10060 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
10061 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
10062 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
10064 hpaned6 = gtk_hpaned_new ();
10065 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
10067 vpaned3 = gtk_vpaned_new ();
10068 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
10070 button19 = gtk_button_new_with_label ("button19");
10071 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
10073 button18 = gtk_button_new_with_label ("button18");
10074 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
10076 hbox3 = gtk_hbox_new (FALSE, 0);
10077 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
10079 vpaned4 = gtk_vpaned_new ();
10080 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
10082 button21 = gtk_button_new_with_label ("button21");
10083 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
10085 button20 = gtk_button_new_with_label ("button20");
10086 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
10088 vpaned5 = gtk_vpaned_new ();
10089 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
10091 button23 = gtk_button_new_with_label ("button23");
10092 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
10094 button22 = gtk_button_new_with_label ("button22");
10095 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
10097 vpaned6 = gtk_vpaned_new ();
10098 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
10100 button25 = gtk_button_new_with_label ("button25");
10101 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
10103 button24 = gtk_button_new_with_label ("button24");
10104 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
10110 create_paned_keyboard_navigation (GtkWidget *widget)
10112 static GtkWidget *window1 = NULL;
10113 static GtkWidget *window2 = NULL;
10114 static GtkWidget *window3 = NULL;
10115 static GtkWidget *window4 = NULL;
10118 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
10120 gtk_widget_destroy (window1);
10121 gtk_widget_destroy (window2);
10122 gtk_widget_destroy (window3);
10123 gtk_widget_destroy (window4);
10128 window1 = paned_keyboard_window1 (widget);
10129 g_signal_connect (window1, "destroy",
10130 G_CALLBACK (gtk_widget_destroyed),
10136 window2 = paned_keyboard_window2 (widget);
10137 g_signal_connect (window2, "destroy",
10138 G_CALLBACK (gtk_widget_destroyed),
10144 window3 = paned_keyboard_window3 (widget);
10145 g_signal_connect (window3, "destroy",
10146 G_CALLBACK (gtk_widget_destroyed),
10152 window4 = paned_keyboard_window4 (widget);
10153 g_signal_connect (window4, "destroy",
10154 G_CALLBACK (gtk_widget_destroyed),
10158 if (GTK_WIDGET_VISIBLE (window1))
10159 gtk_widget_destroy (GTK_WIDGET (window1));
10161 gtk_widget_show_all (GTK_WIDGET (window1));
10163 if (GTK_WIDGET_VISIBLE (window2))
10164 gtk_widget_destroy (GTK_WIDGET (window2));
10166 gtk_widget_show_all (GTK_WIDGET (window2));
10168 if (GTK_WIDGET_VISIBLE (window3))
10169 gtk_widget_destroy (GTK_WIDGET (window3));
10171 gtk_widget_show_all (GTK_WIDGET (window3));
10173 if (GTK_WIDGET_VISIBLE (window4))
10174 gtk_widget_destroy (GTK_WIDGET (window4));
10176 gtk_widget_show_all (GTK_WIDGET (window4));
10184 typedef struct _cursoroffset {gint x,y;} CursorOffset;
10187 shape_pressed (GtkWidget *widget, GdkEventButton *event)
10191 /* ignore double and triple click */
10192 if (event->type != GDK_BUTTON_PRESS)
10195 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
10196 p->x = (int) event->x;
10197 p->y = (int) event->y;
10199 gtk_grab_add (widget);
10200 gdk_pointer_grab (widget->window, TRUE,
10201 GDK_BUTTON_RELEASE_MASK |
10202 GDK_BUTTON_MOTION_MASK |
10203 GDK_POINTER_MOTION_HINT_MASK,
10208 shape_released (GtkWidget *widget)
10210 gtk_grab_remove (widget);
10211 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10216 shape_motion (GtkWidget *widget,
10217 GdkEventMotion *event)
10221 GdkModifierType mask;
10223 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
10226 * Can't use event->x / event->y here
10227 * because I need absolute coordinates.
10229 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
10230 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
10234 shape_create_icon (GdkScreen *screen,
10245 CursorOffset* icon_pos;
10247 GdkBitmap *gdk_pixmap_mask;
10248 GdkPixmap *gdk_pixmap;
10251 style = gtk_widget_get_default_style ();
10252 gc = style->black_gc;
10255 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
10257 window = gtk_window_new (window_type);
10258 gtk_window_set_screen (GTK_WINDOW (window), screen);
10260 fixed = gtk_fixed_new ();
10261 gtk_widget_set_size_request (fixed, 100, 100);
10262 gtk_container_add (GTK_CONTAINER (window), fixed);
10263 gtk_widget_show (fixed);
10265 gtk_widget_set_events (window,
10266 gtk_widget_get_events (window) |
10267 GDK_BUTTON_MOTION_MASK |
10268 GDK_POINTER_MOTION_HINT_MASK |
10269 GDK_BUTTON_PRESS_MASK);
10271 gtk_widget_realize (window);
10272 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
10273 &style->bg[GTK_STATE_NORMAL],
10276 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
10277 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
10278 gtk_widget_show (pixmap);
10280 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
10282 g_object_unref (gdk_pixmap_mask);
10283 g_object_unref (gdk_pixmap);
10285 g_signal_connect (window, "button_press_event",
10286 G_CALLBACK (shape_pressed), NULL);
10287 g_signal_connect (window, "button_release_event",
10288 G_CALLBACK (shape_released), NULL);
10289 g_signal_connect (window, "motion_notify_event",
10290 G_CALLBACK (shape_motion), NULL);
10292 icon_pos = g_new (CursorOffset, 1);
10293 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
10295 gtk_widget_set_uposition (window, x, y);
10296 gtk_widget_show (window);
10302 create_shapes (GtkWidget *widget)
10304 /* Variables used by the Drag/Drop and Shape Window demos */
10305 static GtkWidget *modeller = NULL;
10306 static GtkWidget *sheets = NULL;
10307 static GtkWidget *rings = NULL;
10308 static GtkWidget *with_region = NULL;
10309 GdkScreen *screen = gtk_widget_get_screen (widget);
10311 if (!(file_exists ("Modeller.xpm") &&
10312 file_exists ("FilesQueue.xpm") &&
10313 file_exists ("3DRings.xpm")))
10319 modeller = shape_create_icon (screen, "Modeller.xpm",
10320 440, 140, 0,0, GTK_WINDOW_POPUP);
10322 g_signal_connect (modeller, "destroy",
10323 G_CALLBACK (gtk_widget_destroyed),
10327 gtk_widget_destroy (modeller);
10331 sheets = shape_create_icon (screen, "FilesQueue.xpm",
10332 580, 170, 0,0, GTK_WINDOW_POPUP);
10334 g_signal_connect (sheets, "destroy",
10335 G_CALLBACK (gtk_widget_destroyed),
10340 gtk_widget_destroy (sheets);
10344 rings = shape_create_icon (screen, "3DRings.xpm",
10345 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
10347 g_signal_connect (rings, "destroy",
10348 G_CALLBACK (gtk_widget_destroyed),
10352 gtk_widget_destroy (rings);
10359 with_region = shape_create_icon (screen, "3DRings.xpm",
10360 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
10362 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
10364 g_signal_connect (with_region, "destroy",
10365 G_CALLBACK (gtk_widget_destroyed),
10368 /* reset shape from mask to a region */
10371 region = gdk_region_new ();
10383 gdk_region_union_with_rect (region, &rect);
10391 gdk_window_shape_combine_region (with_region->window,
10396 gtk_widget_destroy (with_region);
10404 create_wmhints (GtkWidget *widget)
10406 static GtkWidget *window = NULL;
10408 GtkWidget *separator;
10413 GdkBitmap *circles;
10417 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10419 gtk_window_set_screen (GTK_WINDOW (window),
10420 gtk_widget_get_screen (widget));
10422 g_signal_connect (window, "destroy",
10423 G_CALLBACK (gtk_widget_destroyed),
10426 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
10427 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10429 gtk_widget_realize (window);
10431 circles = gdk_bitmap_create_from_data (window->window,
10432 (gchar *) circles_bits,
10435 gdk_window_set_icon (window->window, NULL,
10438 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
10440 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
10441 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
10443 box1 = gtk_vbox_new (FALSE, 0);
10444 gtk_container_add (GTK_CONTAINER (window), box1);
10445 gtk_widget_show (box1);
10447 label = gtk_label_new ("Try iconizing me!");
10448 gtk_widget_set_size_request (label, 150, 50);
10449 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
10450 gtk_widget_show (label);
10453 separator = gtk_hseparator_new ();
10454 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10455 gtk_widget_show (separator);
10458 box2 = gtk_vbox_new (FALSE, 10);
10459 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10460 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10461 gtk_widget_show (box2);
10464 button = gtk_button_new_with_label ("close");
10466 g_signal_connect_swapped (button, "clicked",
10467 G_CALLBACK (gtk_widget_destroy),
10470 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10471 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
10472 gtk_widget_grab_default (button);
10473 gtk_widget_show (button);
10476 if (!GTK_WIDGET_VISIBLE (window))
10477 gtk_widget_show (window);
10479 gtk_widget_destroy (window);
10484 * Window state tracking
10488 window_state_callback (GtkWidget *widget,
10489 GdkEventWindowState *event,
10492 GtkWidget *label = data;
10495 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
10496 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
10497 "withdrawn" : "not withdrawn", ", ",
10498 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
10499 "iconified" : "not iconified", ", ",
10500 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
10501 "sticky" : "not sticky", ", ",
10502 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
10503 "maximized" : "not maximized", ", ",
10504 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
10505 "fullscreen" : "not fullscreen",
10506 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
10507 "above" : "not above", ", ",
10508 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
10509 "below" : "not below", ", ",
10512 gtk_label_set_text (GTK_LABEL (label), msg);
10520 tracking_label (GtkWidget *window)
10526 hbox = gtk_hbox_new (FALSE, 5);
10528 g_signal_connect_object (hbox,
10530 G_CALLBACK (gtk_widget_destroy),
10532 G_CONNECT_SWAPPED);
10534 label = gtk_label_new ("<no window state events received>");
10535 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
10536 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
10538 g_signal_connect (window,
10539 "window_state_event",
10540 G_CALLBACK (window_state_callback),
10543 button = gtk_button_new_with_label ("Deiconify");
10544 g_signal_connect_object (button,
10546 G_CALLBACK (gtk_window_deiconify),
10548 G_CONNECT_SWAPPED);
10549 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10551 button = gtk_button_new_with_label ("Iconify");
10552 g_signal_connect_object (button,
10554 G_CALLBACK (gtk_window_iconify),
10556 G_CONNECT_SWAPPED);
10557 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10559 button = gtk_button_new_with_label ("Fullscreen");
10560 g_signal_connect_object (button,
10562 G_CALLBACK (gtk_window_fullscreen),
10564 G_CONNECT_SWAPPED);
10565 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10567 button = gtk_button_new_with_label ("Unfullscreen");
10568 g_signal_connect_object (button,
10570 G_CALLBACK (gtk_window_unfullscreen),
10572 G_CONNECT_SWAPPED);
10573 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10575 button = gtk_button_new_with_label ("Present");
10576 g_signal_connect_object (button,
10578 G_CALLBACK (gtk_window_present),
10580 G_CONNECT_SWAPPED);
10581 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10583 button = gtk_button_new_with_label ("Show");
10584 g_signal_connect_object (button,
10586 G_CALLBACK (gtk_widget_show),
10588 G_CONNECT_SWAPPED);
10589 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10591 gtk_widget_show_all (hbox);
10597 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
10599 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
10601 gtk_window_set_keep_above (GTK_WINDOW (data),
10602 gtk_toggle_button_get_active (togglebutton));
10604 if (gtk_toggle_button_get_active (togglebutton))
10605 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10609 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
10611 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
10613 gtk_window_set_keep_below (GTK_WINDOW (data),
10614 gtk_toggle_button_get_active (togglebutton));
10616 if (gtk_toggle_button_get_active (togglebutton))
10617 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10622 get_state_controls (GtkWidget *window)
10626 GtkWidget *button_above;
10627 GtkWidget *button_below;
10629 vbox = gtk_vbox_new (FALSE, 0);
10631 button = gtk_button_new_with_label ("Stick");
10632 g_signal_connect_object (button,
10634 G_CALLBACK (gtk_window_stick),
10636 G_CONNECT_SWAPPED);
10637 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10639 button = gtk_button_new_with_label ("Unstick");
10640 g_signal_connect_object (button,
10642 G_CALLBACK (gtk_window_unstick),
10644 G_CONNECT_SWAPPED);
10645 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10647 button = gtk_button_new_with_label ("Maximize");
10648 g_signal_connect_object (button,
10650 G_CALLBACK (gtk_window_maximize),
10652 G_CONNECT_SWAPPED);
10653 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10655 button = gtk_button_new_with_label ("Unmaximize");
10656 g_signal_connect_object (button,
10658 G_CALLBACK (gtk_window_unmaximize),
10660 G_CONNECT_SWAPPED);
10661 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10663 button = gtk_button_new_with_label ("Iconify");
10664 g_signal_connect_object (button,
10666 G_CALLBACK (gtk_window_iconify),
10668 G_CONNECT_SWAPPED);
10669 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10671 button = gtk_button_new_with_label ("Fullscreen");
10672 g_signal_connect_object (button,
10674 G_CALLBACK (gtk_window_fullscreen),
10676 G_CONNECT_SWAPPED);
10677 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10679 button = gtk_button_new_with_label ("Unfullscreen");
10680 g_signal_connect_object (button,
10682 G_CALLBACK (gtk_window_unfullscreen),
10684 G_CONNECT_SWAPPED);
10685 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10687 button_above = gtk_toggle_button_new_with_label ("Keep above");
10688 g_signal_connect (button_above,
10690 G_CALLBACK (keep_window_above),
10692 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
10694 button_below = gtk_toggle_button_new_with_label ("Keep below");
10695 g_signal_connect (button_below,
10697 G_CALLBACK (keep_window_below),
10699 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
10701 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
10702 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
10704 button = gtk_button_new_with_label ("Hide (withdraw)");
10705 g_signal_connect_object (button,
10707 G_CALLBACK (gtk_widget_hide),
10709 G_CONNECT_SWAPPED);
10710 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10712 gtk_widget_show_all (vbox);
10718 create_window_states (GtkWidget *widget)
10720 static GtkWidget *window = NULL;
10723 GtkWidget *iconified;
10725 GtkWidget *controls;
10729 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10730 gtk_window_set_screen (GTK_WINDOW (window),
10731 gtk_widget_get_screen (widget));
10733 g_signal_connect (window, "destroy",
10734 G_CALLBACK (gtk_widget_destroyed),
10737 gtk_window_set_title (GTK_WINDOW (window), "Window states");
10739 box1 = gtk_vbox_new (FALSE, 0);
10740 gtk_container_add (GTK_CONTAINER (window), box1);
10742 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10744 gtk_window_set_screen (GTK_WINDOW (iconified),
10745 gtk_widget_get_screen (widget));
10747 g_signal_connect_object (iconified, "destroy",
10748 G_CALLBACK (gtk_widget_destroy),
10750 G_CONNECT_SWAPPED);
10751 gtk_window_iconify (GTK_WINDOW (iconified));
10752 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
10753 controls = get_state_controls (iconified);
10754 gtk_container_add (GTK_CONTAINER (iconified), controls);
10756 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10758 gtk_window_set_screen (GTK_WINDOW (normal),
10759 gtk_widget_get_screen (widget));
10761 g_signal_connect_object (normal, "destroy",
10762 G_CALLBACK (gtk_widget_destroy),
10764 G_CONNECT_SWAPPED);
10766 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
10767 controls = get_state_controls (normal);
10768 gtk_container_add (GTK_CONTAINER (normal), controls);
10770 label = tracking_label (iconified);
10771 gtk_container_add (GTK_CONTAINER (box1), label);
10773 label = tracking_label (normal);
10774 gtk_container_add (GTK_CONTAINER (box1), label);
10776 gtk_widget_show_all (iconified);
10777 gtk_widget_show_all (normal);
10778 gtk_widget_show_all (box1);
10781 if (!GTK_WIDGET_VISIBLE (window))
10782 gtk_widget_show (window);
10784 gtk_widget_destroy (window);
10792 configure_event_callback (GtkWidget *widget,
10793 GdkEventConfigure *event,
10796 GtkWidget *label = data;
10800 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
10802 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
10803 "position: %d, %d",
10804 event->x, event->y, event->width, event->height,
10807 gtk_label_set_text (GTK_LABEL (label), msg);
10815 get_ints (GtkWidget *window,
10822 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
10823 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
10825 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
10826 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
10830 set_size_callback (GtkWidget *widget,
10835 get_ints (data, &w, &h);
10837 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
10841 unset_default_size_callback (GtkWidget *widget,
10844 gtk_window_set_default_size (g_object_get_data (data, "target"),
10849 set_default_size_callback (GtkWidget *widget,
10854 get_ints (data, &w, &h);
10856 gtk_window_set_default_size (g_object_get_data (data, "target"),
10861 unset_size_request_callback (GtkWidget *widget,
10864 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10869 set_size_request_callback (GtkWidget *widget,
10874 get_ints (data, &w, &h);
10876 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10881 set_location_callback (GtkWidget *widget,
10886 get_ints (data, &x, &y);
10888 gtk_window_move (g_object_get_data (data, "target"), x, y);
10892 move_to_position_callback (GtkWidget *widget,
10898 window = g_object_get_data (data, "target");
10900 gtk_window_get_position (window, &x, &y);
10902 gtk_window_move (window, x, y);
10906 set_geometry_callback (GtkWidget *entry,
10912 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
10914 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
10916 if (!gtk_window_parse_geometry (target, text))
10917 g_print ("Bad geometry string '%s'\n", text);
10923 allow_shrink_callback (GtkWidget *widget,
10926 g_object_set (g_object_get_data (data, "target"),
10928 GTK_TOGGLE_BUTTON (widget)->active,
10933 allow_grow_callback (GtkWidget *widget,
10936 g_object_set (g_object_get_data (data, "target"),
10938 GTK_TOGGLE_BUTTON (widget)->active,
10943 gravity_selected (GtkWidget *widget,
10946 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
10947 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
10951 pos_selected (GtkWidget *widget,
10954 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
10955 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
10959 move_gravity_window_to_current_position (GtkWidget *widget,
10965 window = GTK_WINDOW (data);
10967 gtk_window_get_position (window, &x, &y);
10969 gtk_window_move (window, x, y);
10973 get_screen_corner (GtkWindow *window,
10978 GdkScreen * screen = gtk_window_get_screen (window);
10980 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
10982 switch (gtk_window_get_gravity (window))
10984 case GDK_GRAVITY_SOUTH_EAST:
10985 *x = gdk_screen_get_width (screen) - w;
10986 *y = gdk_screen_get_height (screen) - h;
10989 case GDK_GRAVITY_NORTH_EAST:
10990 *x = gdk_screen_get_width (screen) - w;
10994 case GDK_GRAVITY_SOUTH_WEST:
10996 *y = gdk_screen_get_height (screen) - h;
10999 case GDK_GRAVITY_NORTH_WEST:
11004 case GDK_GRAVITY_SOUTH:
11005 *x = (gdk_screen_get_width (screen) - w) / 2;
11006 *y = gdk_screen_get_height (screen) - h;
11009 case GDK_GRAVITY_NORTH:
11010 *x = (gdk_screen_get_width (screen) - w) / 2;
11014 case GDK_GRAVITY_WEST:
11016 *y = (gdk_screen_get_height (screen) - h) / 2;
11019 case GDK_GRAVITY_EAST:
11020 *x = gdk_screen_get_width (screen) - w;
11021 *y = (gdk_screen_get_height (screen) - h) / 2;
11024 case GDK_GRAVITY_CENTER:
11025 *x = (gdk_screen_get_width (screen) - w) / 2;
11026 *y = (gdk_screen_get_height (screen) - h) / 2;
11029 case GDK_GRAVITY_STATIC:
11030 /* pick some random numbers */
11036 g_assert_not_reached ();
11042 move_gravity_window_to_starting_position (GtkWidget *widget,
11048 window = GTK_WINDOW (data);
11050 get_screen_corner (window,
11053 gtk_window_move (window, x, y);
11057 make_gravity_window (GtkWidget *destroy_with,
11058 GdkGravity gravity,
11059 const gchar *title)
11066 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11068 gtk_window_set_screen (GTK_WINDOW (window),
11069 gtk_widget_get_screen (destroy_with));
11071 vbox = gtk_vbox_new (FALSE, 0);
11072 gtk_widget_show (vbox);
11074 gtk_container_add (GTK_CONTAINER (window), vbox);
11075 gtk_window_set_title (GTK_WINDOW (window), title);
11076 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
11078 g_signal_connect_object (destroy_with,
11080 G_CALLBACK (gtk_widget_destroy),
11082 G_CONNECT_SWAPPED);
11085 button = gtk_button_new_with_mnemonic ("_Move to current position");
11087 g_signal_connect (button, "clicked",
11088 G_CALLBACK (move_gravity_window_to_current_position),
11091 gtk_container_add (GTK_CONTAINER (vbox), button);
11092 gtk_widget_show (button);
11094 button = gtk_button_new_with_mnemonic ("Move to _starting position");
11096 g_signal_connect (button, "clicked",
11097 G_CALLBACK (move_gravity_window_to_starting_position),
11100 gtk_container_add (GTK_CONTAINER (vbox), button);
11101 gtk_widget_show (button);
11103 /* Pretend this is the result of --geometry.
11104 * DO NOT COPY THIS CODE unless you are setting --geometry results,
11105 * and in that case you probably should just use gtk_window_parse_geometry().
11106 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
11107 * you are parsing --geometry or equivalent.
11109 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11111 GDK_HINT_USER_POS);
11113 gtk_window_set_default_size (GTK_WINDOW (window),
11116 get_screen_corner (GTK_WINDOW (window), &x, &y);
11118 gtk_window_move (GTK_WINDOW (window),
11125 do_gravity_test (GtkWidget *widget,
11128 GtkWidget *destroy_with = data;
11131 /* We put a window at each gravity point on the screen. */
11132 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
11134 gtk_widget_show (window);
11136 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
11138 gtk_widget_show (window);
11140 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
11142 gtk_widget_show (window);
11144 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
11146 gtk_widget_show (window);
11148 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
11150 gtk_widget_show (window);
11152 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
11154 gtk_widget_show (window);
11157 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
11159 gtk_widget_show (window);
11162 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
11164 gtk_widget_show (window);
11166 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
11168 gtk_widget_show (window);
11170 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
11172 gtk_widget_show (window);
11176 window_controls (GtkWidget *window)
11178 GtkWidget *control_window;
11183 GtkAdjustment *adj;
11189 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11191 gtk_window_set_screen (GTK_WINDOW (control_window),
11192 gtk_widget_get_screen (window));
11194 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
11196 g_object_set_data (G_OBJECT (control_window),
11200 g_signal_connect_object (control_window,
11202 G_CALLBACK (gtk_widget_destroy),
11204 G_CONNECT_SWAPPED);
11206 vbox = gtk_vbox_new (FALSE, 5);
11208 gtk_container_add (GTK_CONTAINER (control_window), vbox);
11210 label = gtk_label_new ("<no configure events>");
11211 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11213 g_signal_connect (window,
11215 G_CALLBACK (configure_event_callback),
11218 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
11220 spin = gtk_spin_button_new (adj, 0, 0);
11222 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
11224 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
11226 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
11228 spin = gtk_spin_button_new (adj, 0, 0);
11230 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
11232 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
11234 entry = gtk_entry_new ();
11235 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11237 g_signal_connect (entry, "changed",
11238 G_CALLBACK (set_geometry_callback),
11241 button = gtk_button_new_with_label ("Show gravity test windows");
11242 g_signal_connect_swapped (button,
11244 G_CALLBACK (do_gravity_test),
11246 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11248 button = gtk_button_new_with_label ("Reshow with initial size");
11249 g_signal_connect_object (button,
11251 G_CALLBACK (gtk_window_reshow_with_initial_size),
11253 G_CONNECT_SWAPPED);
11254 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11256 button = gtk_button_new_with_label ("Queue resize");
11257 g_signal_connect_object (button,
11259 G_CALLBACK (gtk_widget_queue_resize),
11261 G_CONNECT_SWAPPED);
11262 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11264 button = gtk_button_new_with_label ("Resize");
11265 g_signal_connect (button,
11267 G_CALLBACK (set_size_callback),
11269 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11271 button = gtk_button_new_with_label ("Set default size");
11272 g_signal_connect (button,
11274 G_CALLBACK (set_default_size_callback),
11276 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11278 button = gtk_button_new_with_label ("Unset default size");
11279 g_signal_connect (button,
11281 G_CALLBACK (unset_default_size_callback),
11283 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11285 button = gtk_button_new_with_label ("Set size request");
11286 g_signal_connect (button,
11288 G_CALLBACK (set_size_request_callback),
11290 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11292 button = gtk_button_new_with_label ("Unset size request");
11293 g_signal_connect (button,
11295 G_CALLBACK (unset_size_request_callback),
11297 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11299 button = gtk_button_new_with_label ("Move");
11300 g_signal_connect (button,
11302 G_CALLBACK (set_location_callback),
11304 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11306 button = gtk_button_new_with_label ("Move to current position");
11307 g_signal_connect (button,
11309 G_CALLBACK (move_to_position_callback),
11311 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11313 button = gtk_check_button_new_with_label ("Allow shrink");
11314 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
11315 g_signal_connect (button,
11317 G_CALLBACK (allow_shrink_callback),
11319 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11321 button = gtk_check_button_new_with_label ("Allow grow");
11322 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
11323 g_signal_connect (button,
11325 G_CALLBACK (allow_grow_callback),
11327 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11329 button = gtk_button_new_with_mnemonic ("_Show");
11330 g_signal_connect_object (button,
11332 G_CALLBACK (gtk_widget_show),
11334 G_CONNECT_SWAPPED);
11335 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11337 button = gtk_button_new_with_mnemonic ("_Hide");
11338 g_signal_connect_object (button,
11340 G_CALLBACK (gtk_widget_hide),
11342 G_CONNECT_SWAPPED);
11343 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11345 menu = gtk_menu_new ();
11351 static gchar *names[] = {
11352 "GDK_GRAVITY_NORTH_WEST",
11353 "GDK_GRAVITY_NORTH",
11354 "GDK_GRAVITY_NORTH_EAST",
11355 "GDK_GRAVITY_WEST",
11356 "GDK_GRAVITY_CENTER",
11357 "GDK_GRAVITY_EAST",
11358 "GDK_GRAVITY_SOUTH_WEST",
11359 "GDK_GRAVITY_SOUTH",
11360 "GDK_GRAVITY_SOUTH_EAST",
11361 "GDK_GRAVITY_STATIC",
11365 g_assert (names[i]);
11367 mi = gtk_menu_item_new_with_label (names[i]);
11369 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
11374 gtk_widget_show_all (menu);
11376 om = gtk_option_menu_new ();
11377 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
11380 g_signal_connect (om,
11382 G_CALLBACK (gravity_selected),
11385 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
11388 menu = gtk_menu_new ();
11394 static gchar *names[] = {
11395 "GTK_WIN_POS_NONE",
11396 "GTK_WIN_POS_CENTER",
11397 "GTK_WIN_POS_MOUSE",
11398 "GTK_WIN_POS_CENTER_ALWAYS",
11399 "GTK_WIN_POS_CENTER_ON_PARENT",
11403 g_assert (names[i]);
11405 mi = gtk_menu_item_new_with_label (names[i]);
11407 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
11412 gtk_widget_show_all (menu);
11414 om = gtk_option_menu_new ();
11415 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
11418 g_signal_connect (om,
11420 G_CALLBACK (pos_selected),
11423 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
11425 gtk_widget_show_all (vbox);
11427 return control_window;
11431 create_window_sizing (GtkWidget *widget)
11433 static GtkWidget *window = NULL;
11434 static GtkWidget *target_window = NULL;
11436 if (!target_window)
11440 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11441 gtk_window_set_screen (GTK_WINDOW (target_window),
11442 gtk_widget_get_screen (widget));
11443 label = gtk_label_new (NULL);
11444 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");
11445 gtk_container_add (GTK_CONTAINER (target_window), label);
11446 gtk_widget_show (label);
11448 g_signal_connect (target_window, "destroy",
11449 G_CALLBACK (gtk_widget_destroyed),
11452 window = window_controls (target_window);
11454 g_signal_connect (window, "destroy",
11455 G_CALLBACK (gtk_widget_destroyed),
11458 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
11461 /* don't show target window by default, we want to allow testing
11462 * of behavior on first show.
11465 if (!GTK_WIDGET_VISIBLE (window))
11466 gtk_widget_show (window);
11468 gtk_widget_destroy (window);
11475 typedef struct _ProgressData {
11478 GtkWidget *block_spin;
11479 GtkWidget *x_align_spin;
11480 GtkWidget *y_align_spin;
11481 GtkWidget *step_spin;
11482 GtkWidget *act_blocks_spin;
11492 progress_timeout (gpointer data)
11495 GtkAdjustment *adj;
11497 adj = GTK_PROGRESS (data)->adjustment;
11499 new_val = adj->value + 1;
11500 if (new_val > adj->upper)
11501 new_val = adj->lower;
11503 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
11509 destroy_progress (GtkWidget *widget,
11510 ProgressData **pdata)
11512 gtk_timeout_remove ((*pdata)->timer);
11513 (*pdata)->timer = 0;
11514 (*pdata)->window = NULL;
11520 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
11522 ProgressData *pdata;
11525 pdata = (ProgressData *) data;
11527 if (!GTK_WIDGET_MAPPED (widget))
11530 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11532 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
11533 (GtkProgressBarOrientation) i);
11537 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
11539 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
11540 GTK_TOGGLE_BUTTON (widget)->active);
11541 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
11542 gtk_widget_set_sensitive (pdata->x_align_spin,
11543 GTK_TOGGLE_BUTTON (widget)->active);
11544 gtk_widget_set_sensitive (pdata->y_align_spin,
11545 GTK_TOGGLE_BUTTON (widget)->active);
11549 progressbar_toggle_ellipsize (GtkWidget *widget,
11552 ProgressData *pdata = data;
11553 if (GTK_WIDGET_DRAWABLE (widget))
11555 gint i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11556 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
11561 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
11563 ProgressData *pdata;
11566 pdata = (ProgressData *) data;
11568 if (!GTK_WIDGET_MAPPED (widget))
11571 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11574 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
11576 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
11578 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
11579 (GtkProgressBarStyle) i);
11583 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
11587 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
11588 sprintf (buf, "???");
11590 sprintf (buf, "%.0f%%", 100 *
11591 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
11592 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
11596 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
11598 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
11599 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
11600 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
11604 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
11606 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
11607 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
11611 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
11613 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
11614 gtk_spin_button_get_value_as_int
11615 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
11619 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
11621 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
11622 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
11623 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
11627 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
11629 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
11630 GTK_TOGGLE_BUTTON (widget)->active);
11631 gtk_widget_set_sensitive (pdata->step_spin,
11632 GTK_TOGGLE_BUTTON (widget)->active);
11633 gtk_widget_set_sensitive (pdata->act_blocks_spin,
11634 GTK_TOGGLE_BUTTON (widget)->active);
11638 entry_changed (GtkWidget *widget, ProgressData *pdata)
11640 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
11641 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
11645 create_progress_bar (GtkWidget *widget)
11656 GtkAdjustment *adj;
11657 static ProgressData *pdata = NULL;
11659 static gchar *items1[] =
11667 static gchar *items2[] =
11673 static char *ellipsize_items[] = {
11674 "None", // PANGO_ELLIPSIZE_NONE,
11675 "Start", // PANGO_ELLIPSIZE_START,
11676 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
11677 "End", // PANGO_ELLIPSIZE_END
11681 pdata = g_new0 (ProgressData, 1);
11683 if (!pdata->window)
11685 pdata->window = gtk_dialog_new ();
11687 gtk_window_set_screen (GTK_WINDOW (pdata->window),
11688 gtk_widget_get_screen (widget));
11690 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
11692 g_signal_connect (pdata->window, "destroy",
11693 G_CALLBACK (destroy_progress),
11698 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
11699 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
11701 vbox = gtk_vbox_new (FALSE, 5);
11702 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11703 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
11704 vbox, FALSE, TRUE, 0);
11706 frame = gtk_frame_new ("Progress");
11707 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
11709 vbox2 = gtk_vbox_new (FALSE, 5);
11710 gtk_container_add (GTK_CONTAINER (frame), vbox2);
11712 align = gtk_alignment_new (0.5, 0.5, 0, 0);
11713 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
11715 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
11716 g_signal_connect (adj, "value_changed",
11717 G_CALLBACK (progress_value_changed), pdata);
11719 pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
11721 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
11723 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
11724 "%v from [%l,%u] (=%p%%)");
11725 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
11726 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
11728 align = gtk_alignment_new (0.5, 0.5, 0, 0);
11729 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
11731 hbox = gtk_hbox_new (FALSE, 5);
11732 gtk_container_add (GTK_CONTAINER (align), hbox);
11733 label = gtk_label_new ("Label updated by user :");
11734 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11735 pdata->label = gtk_label_new ("");
11736 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
11738 frame = gtk_frame_new ("Options");
11739 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
11741 vbox2 = gtk_vbox_new (FALSE, 5);
11742 gtk_container_add (GTK_CONTAINER (frame), vbox2);
11744 tab = gtk_table_new (7, 2, FALSE);
11745 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
11747 label = gtk_label_new ("Orientation :");
11748 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
11749 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11751 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11753 pdata->omenu1 = build_option_menu (items1, 4, 0,
11754 progressbar_toggle_orientation,
11756 hbox = gtk_hbox_new (FALSE, 0);
11757 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
11758 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11760 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
11762 check = gtk_check_button_new_with_label ("Show text");
11763 g_signal_connect (check, "clicked",
11764 G_CALLBACK (toggle_show_text),
11766 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
11767 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11770 hbox = gtk_hbox_new (FALSE, 0);
11771 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
11772 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11775 label = gtk_label_new ("Format : ");
11776 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11778 pdata->entry = gtk_entry_new ();
11779 g_signal_connect (pdata->entry, "changed",
11780 G_CALLBACK (entry_changed),
11782 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
11783 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
11784 gtk_widget_set_size_request (pdata->entry, 100, -1);
11785 gtk_widget_set_sensitive (pdata->entry, FALSE);
11787 label = gtk_label_new ("Text align :");
11788 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
11789 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11791 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11793 hbox = gtk_hbox_new (FALSE, 0);
11794 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
11795 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11798 label = gtk_label_new ("x :");
11799 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11801 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11802 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
11803 g_signal_connect (adj, "value_changed",
11804 G_CALLBACK (adjust_align), pdata);
11805 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
11806 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
11808 label = gtk_label_new ("y :");
11809 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11811 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11812 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
11813 g_signal_connect (adj, "value_changed",
11814 G_CALLBACK (adjust_align), pdata);
11815 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
11816 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
11818 label = gtk_label_new ("Ellipsize text :");
11819 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
11820 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11822 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11823 pdata->elmenu = build_option_menu (ellipsize_items,
11824 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
11825 2, // PANGO_ELLIPSIZE_MIDDLE
11826 progressbar_toggle_ellipsize,
11828 hbox = gtk_hbox_new (FALSE, 0);
11829 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
11830 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11832 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
11834 label = gtk_label_new ("Bar Style :");
11835 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 13, 14,
11836 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11838 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11840 pdata->omenu2 = build_option_menu (items2, 2, 0,
11841 progressbar_toggle_bar_style,
11843 hbox = gtk_hbox_new (FALSE, 0);
11844 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 13, 14,
11845 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11847 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
11849 label = gtk_label_new ("Block count :");
11850 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 14, 15,
11851 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11853 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11855 hbox = gtk_hbox_new (FALSE, 0);
11856 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 14, 15,
11857 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11859 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
11860 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
11861 g_signal_connect (adj, "value_changed",
11862 G_CALLBACK (adjust_blocks), pdata);
11863 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
11864 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
11866 check = gtk_check_button_new_with_label ("Activity mode");
11867 g_signal_connect (check, "clicked",
11868 G_CALLBACK (toggle_activity_mode), pdata);
11869 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
11870 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11873 hbox = gtk_hbox_new (FALSE, 0);
11874 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 15, 16,
11875 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11877 label = gtk_label_new ("Step size : ");
11878 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11879 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
11880 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
11881 g_signal_connect (adj, "value_changed",
11882 G_CALLBACK (adjust_step), pdata);
11883 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
11884 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
11886 hbox = gtk_hbox_new (FALSE, 0);
11887 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 16, 17,
11888 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11890 label = gtk_label_new ("Blocks : ");
11891 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11892 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
11893 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
11894 g_signal_connect (adj, "value_changed",
11895 G_CALLBACK (adjust_act_blocks), pdata);
11896 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
11898 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
11900 button = gtk_button_new_with_label ("close");
11901 g_signal_connect_swapped (button, "clicked",
11902 G_CALLBACK (gtk_widget_destroy),
11904 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11905 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
11906 button, TRUE, TRUE, 0);
11907 gtk_widget_grab_default (button);
11910 if (!GTK_WIDGET_VISIBLE (pdata->window))
11911 gtk_widget_show_all (pdata->window);
11913 gtk_widget_destroy (pdata->window);
11925 GtkWidget *res_widget;
11929 find_widget (GtkWidget *widget, FindWidgetData *data)
11931 GtkAllocation new_allocation;
11935 new_allocation = widget->allocation;
11937 if (data->found || !GTK_WIDGET_MAPPED (widget))
11940 /* Note that in the following code, we only count the
11941 * position as being inside a WINDOW widget if it is inside
11942 * widget->window; points that are outside of widget->window
11943 * but within the allocation are not counted. This is consistent
11944 * with the way we highlight drag targets.
11946 if (!GTK_WIDGET_NO_WINDOW (widget))
11948 new_allocation.x = 0;
11949 new_allocation.y = 0;
11952 if (widget->parent && !data->first)
11954 GdkWindow *window = widget->window;
11955 while (window != widget->parent->window)
11957 gint tx, ty, twidth, theight;
11958 gdk_drawable_get_size (window, &twidth, &theight);
11960 if (new_allocation.x < 0)
11962 new_allocation.width += new_allocation.x;
11963 new_allocation.x = 0;
11965 if (new_allocation.y < 0)
11967 new_allocation.height += new_allocation.y;
11968 new_allocation.y = 0;
11970 if (new_allocation.x + new_allocation.width > twidth)
11971 new_allocation.width = twidth - new_allocation.x;
11972 if (new_allocation.y + new_allocation.height > theight)
11973 new_allocation.height = theight - new_allocation.y;
11975 gdk_window_get_position (window, &tx, &ty);
11976 new_allocation.x += tx;
11978 new_allocation.y += ty;
11981 window = gdk_window_get_parent (window);
11985 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
11986 (data->x < new_allocation.x + new_allocation.width) &&
11987 (data->y < new_allocation.y + new_allocation.height))
11989 /* First, check if the drag is in a valid drop site in
11990 * one of our children
11992 if (GTK_IS_CONTAINER (widget))
11994 FindWidgetData new_data = *data;
11996 new_data.x -= x_offset;
11997 new_data.y -= y_offset;
11998 new_data.found = FALSE;
11999 new_data.first = FALSE;
12001 gtk_container_forall (GTK_CONTAINER (widget),
12002 (GtkCallback)find_widget,
12005 data->found = new_data.found;
12007 data->res_widget = new_data.res_widget;
12010 /* If not, and this widget is registered as a drop site, check to
12011 * emit "drag_motion" to check if we are actually in
12016 data->found = TRUE;
12017 data->res_widget = widget;
12023 find_widget_at_pointer (GdkDisplay *display)
12025 GtkWidget *widget = NULL;
12026 GdkWindow *pointer_window;
12028 FindWidgetData data;
12030 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
12032 if (pointer_window)
12033 gdk_window_get_user_data (pointer_window, (gpointer) &widget);
12037 gdk_window_get_pointer (widget->window,
12042 data.found = FALSE;
12045 find_widget (widget, &data);
12047 return data.res_widget;
12053 struct PropertiesData {
12054 GtkWidget **window;
12061 destroy_properties (GtkWidget *widget,
12062 struct PropertiesData *data)
12066 *data->window = NULL;
12067 data->window = NULL;
12072 gdk_cursor_unref (data->cursor);
12073 data->cursor = NULL;
12078 g_signal_handler_disconnect (widget, data->handler);
12086 property_query_event (GtkWidget *widget,
12088 struct PropertiesData *data)
12090 GtkWidget *res_widget = NULL;
12092 if (!data->in_query)
12095 if (event->type == GDK_BUTTON_RELEASE)
12097 gtk_grab_remove (widget);
12098 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
12101 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
12104 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
12105 gtk_widget_get_screen (widget));
12106 create_prop_editor (G_OBJECT (res_widget), 0);
12109 data->in_query = FALSE;
12116 query_properties (GtkButton *button,
12117 struct PropertiesData *data)
12121 g_signal_connect (button, "event",
12122 G_CALLBACK (property_query_event), data);
12126 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
12129 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
12131 GDK_BUTTON_RELEASE_MASK,
12136 gtk_grab_add (GTK_WIDGET (button));
12138 data->in_query = TRUE;
12142 create_properties (GtkWidget *widget)
12144 static GtkWidget *window = NULL;
12148 struct PropertiesData *data;
12150 data = g_new (struct PropertiesData, 1);
12151 data->window = &window;
12152 data->in_query = FALSE;
12153 data->cursor = NULL;
12158 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12160 gtk_window_set_screen (GTK_WINDOW (window),
12161 gtk_widget_get_screen (widget));
12163 data->handler = g_signal_connect (window, "destroy",
12164 G_CALLBACK (destroy_properties),
12167 gtk_window_set_title (GTK_WINDOW (window), "test properties");
12168 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12170 vbox = gtk_vbox_new (FALSE, 1);
12171 gtk_container_add (GTK_CONTAINER (window), vbox);
12173 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
12174 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
12176 button = gtk_button_new_with_label ("Query properties");
12177 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12178 g_signal_connect (button, "clicked",
12179 G_CALLBACK (query_properties),
12183 if (!GTK_WIDGET_VISIBLE (window))
12184 gtk_widget_show_all (window);
12186 gtk_widget_destroy (window);
12190 struct SnapshotData {
12191 GtkWidget *toplevel_button;
12192 GtkWidget **window;
12195 gboolean is_toplevel;
12200 destroy_snapshot_data (GtkWidget *widget,
12201 struct SnapshotData *data)
12204 *data->window = NULL;
12208 gdk_cursor_unref (data->cursor);
12209 data->cursor = NULL;
12214 g_signal_handler_disconnect (widget, data->handler);
12222 snapshot_widget_event (GtkWidget *widget,
12224 struct SnapshotData *data)
12226 GtkWidget *res_widget = NULL;
12228 if (!data->in_query)
12231 if (event->type == GDK_BUTTON_RELEASE)
12233 gtk_grab_remove (widget);
12234 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
12237 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
12238 if (data->is_toplevel && res_widget)
12239 res_widget = gtk_widget_get_toplevel (res_widget);
12243 GtkWidget *window, *image;
12245 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12246 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
12247 gtk_widget_realize (window);
12248 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
12250 /* this branch is needed to convert ARGB -> RGB */
12253 gdk_drawable_get_size (pixmap, &width, &height);
12254 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
12255 gtk_widget_get_colormap (res_widget),
12259 image = gtk_image_new_from_pixbuf (pixbuf);
12260 g_object_unref (pixbuf);
12263 image = gtk_image_new_from_pixmap (pixmap, NULL);
12264 gtk_container_add (GTK_CONTAINER (window), image);
12265 g_object_unref (pixmap);
12266 gtk_widget_show_all (window);
12269 data->in_query = FALSE;
12276 snapshot_widget (GtkButton *button,
12277 struct SnapshotData *data)
12281 g_signal_connect (button, "event",
12282 G_CALLBACK (snapshot_widget_event), data);
12284 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
12287 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
12290 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
12292 GDK_BUTTON_RELEASE_MASK,
12297 gtk_grab_add (GTK_WIDGET (button));
12299 data->in_query = TRUE;
12303 create_snapshot (GtkWidget *widget)
12305 static GtkWidget *window = NULL;
12308 struct SnapshotData *data;
12310 data = g_new (struct SnapshotData, 1);
12311 data->window = &window;
12312 data->in_query = FALSE;
12313 data->cursor = NULL;
12318 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12320 gtk_window_set_screen (GTK_WINDOW (window),
12321 gtk_widget_get_screen (widget));
12323 data->handler = g_signal_connect (window, "destroy",
12324 G_CALLBACK (destroy_snapshot_data),
12327 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
12328 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12330 vbox = gtk_vbox_new (FALSE, 1);
12331 gtk_container_add (GTK_CONTAINER (window), vbox);
12333 button = gtk_button_new_with_label ("Snapshot widget");
12334 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12335 g_signal_connect (button, "clicked",
12336 G_CALLBACK (snapshot_widget),
12339 button = gtk_button_new_with_label ("Snapshot toplevel");
12340 data->toplevel_button = button;
12341 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12342 g_signal_connect (button, "clicked",
12343 G_CALLBACK (snapshot_widget),
12347 if (!GTK_WIDGET_VISIBLE (window))
12348 gtk_widget_show_all (window);
12350 gtk_widget_destroy (window);
12360 static int color_idle = 0;
12363 color_idle_func (GtkWidget *preview)
12365 static int count = 1;
12369 for (i = 0; i < 256; i++)
12371 for (j = 0, k = 0; j < 256; j++)
12373 buf[k+0] = i + count;
12375 buf[k+2] = j + count;
12379 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12384 gtk_widget_queue_draw (preview);
12385 gdk_window_process_updates (preview->window, TRUE);
12391 color_preview_destroy (GtkWidget *widget,
12392 GtkWidget **window)
12394 gtk_idle_remove (color_idle);
12401 create_color_preview (GtkWidget *widget)
12403 static GtkWidget *window = NULL;
12404 GtkWidget *preview;
12410 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12412 gtk_window_set_screen (GTK_WINDOW (window),
12413 gtk_widget_get_screen (widget));
12415 g_signal_connect (window, "destroy",
12416 G_CALLBACK (color_preview_destroy),
12419 gtk_window_set_title (GTK_WINDOW (window), "test");
12420 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12422 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
12423 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
12424 gtk_container_add (GTK_CONTAINER (window), preview);
12426 for (i = 0; i < 256; i++)
12428 for (j = 0, k = 0; j < 256; j++)
12436 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12439 color_idle = gtk_idle_add ((GtkFunction) color_idle_func, preview);
12442 if (!GTK_WIDGET_VISIBLE (window))
12443 gtk_widget_show_all (window);
12445 gtk_widget_destroy (window);
12452 static int gray_idle = 0;
12455 gray_idle_func (GtkWidget *preview)
12457 static int count = 1;
12461 for (i = 0; i < 256; i++)
12463 for (j = 0; j < 256; j++)
12464 buf[j] = i + j + count;
12466 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12471 gtk_widget_draw (preview, NULL);
12477 gray_preview_destroy (GtkWidget *widget,
12478 GtkWidget **window)
12480 gtk_idle_remove (gray_idle);
12487 create_gray_preview (GtkWidget *widget)
12489 static GtkWidget *window = NULL;
12490 GtkWidget *preview;
12496 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12498 gtk_window_set_screen (GTK_WINDOW (window),
12499 gtk_widget_get_screen (widget));
12501 g_signal_connect (window, "destroy",
12502 G_CALLBACK (gray_preview_destroy),
12505 gtk_window_set_title (GTK_WINDOW (window), "test");
12506 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12508 preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
12509 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
12510 gtk_container_add (GTK_CONTAINER (window), preview);
12512 for (i = 0; i < 256; i++)
12514 for (j = 0; j < 256; j++)
12517 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12520 gray_idle = gtk_idle_add ((GtkFunction) gray_idle_func, preview);
12523 if (!GTK_WIDGET_VISIBLE (window))
12524 gtk_widget_show_all (window);
12526 gtk_widget_destroy (window);
12535 selection_test_received (GtkWidget *list, GtkSelectionData *data)
12538 GtkWidget *list_item;
12542 if (data->length < 0)
12544 g_print ("Selection retrieval failed\n");
12547 if (data->type != GDK_SELECTION_TYPE_ATOM)
12549 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
12553 /* Clear out any current list items */
12555 gtk_list_clear_items (GTK_LIST(list), 0, -1);
12557 /* Add new items to list */
12559 atoms = (GdkAtom *)data->data;
12562 l = data->length / sizeof (GdkAtom);
12563 for (i = 0; i < l; i++)
12566 name = gdk_atom_name (atoms[i]);
12569 list_item = gtk_list_item_new_with_label (name);
12573 list_item = gtk_list_item_new_with_label ("(bad atom)");
12575 gtk_widget_show (list_item);
12576 item_list = g_list_append (item_list, list_item);
12579 gtk_list_append_items (GTK_LIST (list), item_list);
12585 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
12587 static GdkAtom targets_atom = GDK_NONE;
12589 if (targets_atom == GDK_NONE)
12590 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
12592 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
12597 create_selection_test (GtkWidget *widget)
12599 static GtkWidget *window = NULL;
12602 GtkWidget *scrolled_win;
12608 window = gtk_dialog_new ();
12610 gtk_window_set_screen (GTK_WINDOW (window),
12611 gtk_widget_get_screen (widget));
12613 g_signal_connect (window, "destroy",
12614 G_CALLBACK (gtk_widget_destroyed),
12617 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
12618 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12620 /* Create the list */
12622 vbox = gtk_vbox_new (FALSE, 5);
12623 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
12624 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
12627 label = gtk_label_new ("Gets available targets for current selection");
12628 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12630 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
12631 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
12632 GTK_POLICY_AUTOMATIC,
12633 GTK_POLICY_AUTOMATIC);
12634 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
12635 gtk_widget_set_size_request (scrolled_win, 100, 200);
12637 list = gtk_list_new ();
12638 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
12640 g_signal_connect (list, "selection_received",
12641 G_CALLBACK (selection_test_received), NULL);
12643 /* .. And create some buttons */
12644 button = gtk_button_new_with_label ("Get Targets");
12645 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12646 button, TRUE, TRUE, 0);
12648 g_signal_connect (button, "clicked",
12649 G_CALLBACK (selection_test_get_targets), list);
12651 button = gtk_button_new_with_label ("Quit");
12652 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12653 button, TRUE, TRUE, 0);
12655 g_signal_connect_swapped (button, "clicked",
12656 G_CALLBACK (gtk_widget_destroy),
12660 if (!GTK_WIDGET_VISIBLE (window))
12661 gtk_widget_show_all (window);
12663 gtk_widget_destroy (window);
12671 create_gamma_curve (GtkWidget *widget)
12673 static GtkWidget *window = NULL, *curve;
12674 static int count = 0;
12681 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12682 gtk_window_set_screen (GTK_WINDOW (window),
12683 gtk_widget_get_screen (widget));
12685 gtk_window_set_title (GTK_WINDOW (window), "test");
12686 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12688 g_signal_connect (window, "destroy",
12689 G_CALLBACK(gtk_widget_destroyed),
12692 curve = gtk_gamma_curve_new ();
12693 gtk_container_add (GTK_CONTAINER (window), curve);
12694 gtk_widget_show (curve);
12697 max = 127 + (count % 2)*128;
12698 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
12700 for (i = 0; i < max; ++i)
12701 vec[i] = (127 / sqrt (max)) * sqrt (i);
12702 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
12705 if (!GTK_WIDGET_VISIBLE (window))
12706 gtk_widget_show (window);
12707 else if (count % 4 == 3)
12709 gtk_widget_destroy (window);
12720 static int scroll_test_pos = 0.0;
12723 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
12724 GtkAdjustment *adj)
12727 gint imin, imax, jmin, jmax;
12729 imin = (event->area.x) / 10;
12730 imax = (event->area.x + event->area.width + 9) / 10;
12732 jmin = ((int)adj->value + event->area.y) / 10;
12733 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
12735 gdk_window_clear_area (widget->window,
12736 event->area.x, event->area.y,
12737 event->area.width, event->area.height);
12739 for (i=imin; i<imax; i++)
12740 for (j=jmin; j<jmax; j++)
12742 gdk_draw_rectangle (widget->window,
12743 widget->style->black_gc,
12745 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
12751 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
12752 GtkAdjustment *adj)
12754 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
12755 -adj->page_increment / 2:
12756 adj->page_increment / 2);
12757 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
12758 gtk_adjustment_set_value (adj, new_value);
12764 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
12765 GtkAdjustment *adj)
12767 adj->page_increment = 0.9 * widget->allocation.height;
12768 adj->page_size = widget->allocation.height;
12770 g_signal_emit_by_name (adj, "changed");
12774 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
12776 /* gint source_min = (int)adj->value - scroll_test_pos; */
12779 dy = scroll_test_pos - (int)adj->value;
12780 scroll_test_pos = adj->value;
12782 if (!GTK_WIDGET_DRAWABLE (widget))
12784 gdk_window_scroll (widget->window, 0, dy);
12785 gdk_window_process_updates (widget->window, FALSE);
12790 create_scroll_test (GtkWidget *widget)
12792 static GtkWidget *window = NULL;
12794 GtkWidget *drawing_area;
12795 GtkWidget *scrollbar;
12797 GtkAdjustment *adj;
12798 GdkGeometry geometry;
12799 GdkWindowHints geometry_mask;
12803 window = gtk_dialog_new ();
12805 gtk_window_set_screen (GTK_WINDOW (window),
12806 gtk_widget_get_screen (widget));
12808 g_signal_connect (window, "destroy",
12809 G_CALLBACK (gtk_widget_destroyed),
12812 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
12813 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12815 hbox = gtk_hbox_new (FALSE, 0);
12816 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
12818 gtk_widget_show (hbox);
12820 drawing_area = gtk_drawing_area_new ();
12821 gtk_widget_set_size_request (drawing_area, 200, 200);
12822 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
12823 gtk_widget_show (drawing_area);
12825 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
12827 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
12828 scroll_test_pos = 0.0;
12830 scrollbar = gtk_vscrollbar_new (adj);
12831 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
12832 gtk_widget_show (scrollbar);
12834 g_signal_connect (drawing_area, "expose_event",
12835 G_CALLBACK (scroll_test_expose), adj);
12836 g_signal_connect (drawing_area, "configure_event",
12837 G_CALLBACK (scroll_test_configure), adj);
12838 g_signal_connect (drawing_area, "scroll_event",
12839 G_CALLBACK (scroll_test_scroll), adj);
12841 g_signal_connect (adj, "value_changed",
12842 G_CALLBACK (scroll_test_adjustment_changed),
12845 /* .. And create some buttons */
12847 button = gtk_button_new_with_label ("Quit");
12848 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12849 button, TRUE, TRUE, 0);
12851 g_signal_connect_swapped (button, "clicked",
12852 G_CALLBACK (gtk_widget_destroy),
12854 gtk_widget_show (button);
12856 /* Set up gridded geometry */
12858 geometry_mask = GDK_HINT_MIN_SIZE |
12859 GDK_HINT_BASE_SIZE |
12860 GDK_HINT_RESIZE_INC;
12862 geometry.min_width = 20;
12863 geometry.min_height = 20;
12864 geometry.base_width = 0;
12865 geometry.base_height = 0;
12866 geometry.width_inc = 10;
12867 geometry.height_inc = 10;
12869 gtk_window_set_geometry_hints (GTK_WINDOW (window),
12870 drawing_area, &geometry, geometry_mask);
12873 if (!GTK_WIDGET_VISIBLE (window))
12874 gtk_widget_show (window);
12876 gtk_widget_destroy (window);
12883 static int timer = 0;
12886 timeout_test (GtkWidget *label)
12888 static int count = 0;
12889 static char buffer[32];
12891 sprintf (buffer, "count: %d", ++count);
12892 gtk_label_set_text (GTK_LABEL (label), buffer);
12898 start_timeout_test (GtkWidget *widget,
12903 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
12908 stop_timeout_test (GtkWidget *widget,
12913 gtk_timeout_remove (timer);
12919 destroy_timeout_test (GtkWidget *widget,
12920 GtkWidget **window)
12922 stop_timeout_test (NULL, NULL);
12928 create_timeout_test (GtkWidget *widget)
12930 static GtkWidget *window = NULL;
12936 window = gtk_dialog_new ();
12938 gtk_window_set_screen (GTK_WINDOW (window),
12939 gtk_widget_get_screen (widget));
12941 g_signal_connect (window, "destroy",
12942 G_CALLBACK (destroy_timeout_test),
12945 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
12946 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12948 label = gtk_label_new ("count: 0");
12949 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
12950 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
12951 label, TRUE, TRUE, 0);
12952 gtk_widget_show (label);
12954 button = gtk_button_new_with_label ("close");
12955 g_signal_connect_swapped (button, "clicked",
12956 G_CALLBACK (gtk_widget_destroy),
12958 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12959 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12960 button, TRUE, TRUE, 0);
12961 gtk_widget_grab_default (button);
12962 gtk_widget_show (button);
12964 button = gtk_button_new_with_label ("start");
12965 g_signal_connect (button, "clicked",
12966 G_CALLBACK(start_timeout_test),
12968 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12969 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12970 button, TRUE, TRUE, 0);
12971 gtk_widget_show (button);
12973 button = gtk_button_new_with_label ("stop");
12974 g_signal_connect (button, "clicked",
12975 G_CALLBACK (stop_timeout_test),
12977 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12978 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12979 button, TRUE, TRUE, 0);
12980 gtk_widget_show (button);
12983 if (!GTK_WIDGET_VISIBLE (window))
12984 gtk_widget_show (window);
12986 gtk_widget_destroy (window);
12993 static int idle_id = 0;
12996 idle_test (GtkWidget *label)
12998 static int count = 0;
12999 static char buffer[32];
13001 sprintf (buffer, "count: %d", ++count);
13002 gtk_label_set_text (GTK_LABEL (label), buffer);
13008 start_idle_test (GtkWidget *widget,
13013 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
13018 stop_idle_test (GtkWidget *widget,
13023 gtk_idle_remove (idle_id);
13029 destroy_idle_test (GtkWidget *widget,
13030 GtkWidget **window)
13032 stop_idle_test (NULL, NULL);
13038 toggle_idle_container (GObject *button,
13039 GtkContainer *container)
13041 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
13045 create_idle_test (GtkWidget *widget)
13047 static GtkWidget *window = NULL;
13050 GtkWidget *container;
13054 GtkWidget *button2;
13058 window = gtk_dialog_new ();
13060 gtk_window_set_screen (GTK_WINDOW (window),
13061 gtk_widget_get_screen (widget));
13063 g_signal_connect (window, "destroy",
13064 G_CALLBACK (destroy_idle_test),
13067 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
13068 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
13070 label = gtk_label_new ("count: 0");
13071 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
13072 gtk_widget_show (label);
13075 g_object_new (GTK_TYPE_HBOX,
13077 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
13078 * "GtkWidget::visible", TRUE,
13083 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
13084 container, TRUE, TRUE, 0);
13087 g_object_new (GTK_TYPE_FRAME,
13089 "label", "Label Container",
13091 "parent", GTK_DIALOG (window)->vbox,
13094 g_object_new (GTK_TYPE_VBOX,
13099 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
13100 "label", "Resize-Parent",
13101 "user_data", (void*)GTK_RESIZE_PARENT,
13105 "signal::clicked", toggle_idle_container, container,
13107 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
13108 "label", "Resize-Queue",
13109 "user_data", (void*)GTK_RESIZE_QUEUE,
13114 g_object_connect (button,
13115 "signal::clicked", toggle_idle_container, container,
13117 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
13118 "label", "Resize-Immediate",
13119 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
13121 g_object_connect (button2,
13122 "signal::clicked", toggle_idle_container, container,
13124 g_object_set (button2,
13130 button = gtk_button_new_with_label ("close");
13131 g_signal_connect_swapped (button, "clicked",
13132 G_CALLBACK (gtk_widget_destroy),
13134 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13135 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13136 button, TRUE, TRUE, 0);
13137 gtk_widget_grab_default (button);
13138 gtk_widget_show (button);
13140 button = gtk_button_new_with_label ("start");
13141 g_signal_connect (button, "clicked",
13142 G_CALLBACK (start_idle_test),
13144 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13145 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13146 button, TRUE, TRUE, 0);
13147 gtk_widget_show (button);
13149 button = gtk_button_new_with_label ("stop");
13150 g_signal_connect (button, "clicked",
13151 G_CALLBACK (stop_idle_test),
13153 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13154 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13155 button, TRUE, TRUE, 0);
13156 gtk_widget_show (button);
13159 if (!GTK_WIDGET_VISIBLE (window))
13160 gtk_widget_show (window);
13162 gtk_widget_destroy (window);
13170 reload_all_rc_files (void)
13172 static GdkAtom atom_rcfiles = GDK_NONE;
13174 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
13178 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
13180 for(i = 0; i < 5; i++)
13181 send_event->client.data.l[i] = 0;
13182 send_event->client.data_format = 32;
13183 send_event->client.message_type = atom_rcfiles;
13184 gdk_event_send_clientmessage_toall (send_event);
13186 gdk_event_free (send_event);
13190 create_rc_file (GtkWidget *widget)
13192 static GtkWidget *window = NULL;
13200 window = gtk_dialog_new ();
13202 gtk_window_set_screen (GTK_WINDOW (window),
13203 gtk_widget_get_screen (widget));
13205 g_signal_connect (window, "destroy",
13206 G_CALLBACK (gtk_widget_destroyed),
13209 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
13210 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
13212 vbox = gtk_vbox_new (FALSE, 0);
13213 gtk_container_add (GTK_CONTAINER (frame), vbox);
13215 label = gtk_label_new ("This label should be red");
13216 gtk_widget_set_name (label, "testgtk-red-label");
13217 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13219 label = gtk_label_new ("This label should be green");
13220 gtk_widget_set_name (label, "testgtk-green-label");
13221 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13223 label = gtk_label_new ("This label should be blue");
13224 gtk_widget_set_name (label, "testgtk-blue-label");
13225 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13227 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
13228 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
13230 button = gtk_button_new_with_label ("Reload");
13231 g_signal_connect (button, "clicked",
13232 G_CALLBACK (gtk_rc_reparse_all), NULL);
13233 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13234 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13235 button, TRUE, TRUE, 0);
13236 gtk_widget_grab_default (button);
13238 button = gtk_button_new_with_label ("Reload All");
13239 g_signal_connect (button, "clicked",
13240 G_CALLBACK (reload_all_rc_files), NULL);
13241 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13242 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13243 button, TRUE, TRUE, 0);
13245 button = gtk_button_new_with_label ("Close");
13246 g_signal_connect_swapped (button, "clicked",
13247 G_CALLBACK (gtk_widget_destroy),
13249 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13250 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13251 button, TRUE, TRUE, 0);
13254 if (!GTK_WIDGET_VISIBLE (window))
13255 gtk_widget_show_all (window);
13257 gtk_widget_destroy (window);
13261 * Test of recursive mainloop
13265 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
13272 create_mainloop (GtkWidget *widget)
13274 static GtkWidget *window = NULL;
13280 window = gtk_dialog_new ();
13282 gtk_window_set_screen (GTK_WINDOW (window),
13283 gtk_widget_get_screen (widget));
13285 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
13287 g_signal_connect (window, "destroy",
13288 G_CALLBACK (mainloop_destroyed),
13291 label = gtk_label_new ("In recursive main loop...");
13292 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
13294 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
13296 gtk_widget_show (label);
13298 button = gtk_button_new_with_label ("Leave");
13299 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
13302 g_signal_connect_swapped (button, "clicked",
13303 G_CALLBACK (gtk_widget_destroy),
13306 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13307 gtk_widget_grab_default (button);
13309 gtk_widget_show (button);
13312 if (!GTK_WIDGET_VISIBLE (window))
13314 gtk_widget_show (window);
13316 g_print ("create_mainloop: start\n");
13318 g_print ("create_mainloop: done\n");
13321 gtk_widget_destroy (window);
13325 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
13330 gint imin, imax, jmin, jmax;
13332 layout = GTK_LAYOUT (widget);
13334 if (event->window != layout->bin_window)
13337 imin = (event->area.x) / 10;
13338 imax = (event->area.x + event->area.width + 9) / 10;
13340 jmin = (event->area.y) / 10;
13341 jmax = (event->area.y + event->area.height + 9) / 10;
13343 for (i=imin; i<imax; i++)
13344 for (j=jmin; j<jmax; j++)
13346 gdk_draw_rectangle (layout->bin_window,
13347 widget->style->black_gc,
13355 void create_layout (GtkWidget *widget)
13357 static GtkWidget *window = NULL;
13359 GtkWidget *scrolledwindow;
13368 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13369 gtk_window_set_screen (GTK_WINDOW (window),
13370 gtk_widget_get_screen (widget));
13372 g_signal_connect (window, "destroy",
13373 G_CALLBACK (gtk_widget_destroyed),
13376 gtk_window_set_title (GTK_WINDOW (window), "Layout");
13377 gtk_widget_set_size_request (window, 200, 200);
13379 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
13380 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
13382 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
13383 GTK_CORNER_TOP_RIGHT);
13385 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
13387 layout = gtk_layout_new (NULL, NULL);
13388 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
13390 /* We set step sizes here since GtkLayout does not set
13393 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
13394 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
13396 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
13397 g_signal_connect (layout, "expose_event",
13398 G_CALLBACK (layout_expose_handler), NULL);
13400 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
13402 for (i=0 ; i < 16 ; i++)
13403 for (j=0 ; j < 16 ; j++)
13405 sprintf(buf, "Button %d, %d", i, j);
13407 button = gtk_button_new_with_label (buf);
13409 button = gtk_label_new (buf);
13411 gtk_layout_put (GTK_LAYOUT (layout), button,
13415 for (i=16; i < 1280; i++)
13417 sprintf(buf, "Button %d, %d", i, 0);
13419 button = gtk_button_new_with_label (buf);
13421 button = gtk_label_new (buf);
13423 gtk_layout_put (GTK_LAYOUT (layout), button,
13428 if (!GTK_WIDGET_VISIBLE (window))
13429 gtk_widget_show_all (window);
13431 gtk_widget_destroy (window);
13435 create_styles (GtkWidget *widget)
13437 static GtkWidget *window = NULL;
13442 static GdkColor red = { 0, 0xffff, 0, 0 };
13443 static GdkColor green = { 0, 0, 0xffff, 0 };
13444 static GdkColor blue = { 0, 0, 0, 0xffff };
13445 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
13446 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
13447 PangoFontDescription *font_desc;
13449 GtkRcStyle *rc_style;
13453 window = gtk_dialog_new ();
13454 gtk_window_set_screen (GTK_WINDOW (window),
13455 gtk_widget_get_screen (widget));
13457 g_signal_connect (window, "destroy",
13458 G_CALLBACK (gtk_widget_destroyed),
13462 button = gtk_button_new_with_label ("Close");
13463 g_signal_connect_swapped (button, "clicked",
13464 G_CALLBACK (gtk_widget_destroy),
13466 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13467 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13468 button, TRUE, TRUE, 0);
13469 gtk_widget_show (button);
13471 vbox = gtk_vbox_new (FALSE, 5);
13472 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
13473 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
13475 label = gtk_label_new ("Font:");
13476 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13477 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13479 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
13481 button = gtk_button_new_with_label ("Some Text");
13482 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
13483 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13485 label = gtk_label_new ("Foreground:");
13486 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13487 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13489 button = gtk_button_new_with_label ("Some Text");
13490 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
13491 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13493 label = gtk_label_new ("Background:");
13494 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13495 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13497 button = gtk_button_new_with_label ("Some Text");
13498 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
13499 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13501 label = gtk_label_new ("Text:");
13502 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13503 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13505 entry = gtk_entry_new ();
13506 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13507 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
13508 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13510 label = gtk_label_new ("Base:");
13511 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13512 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13514 entry = gtk_entry_new ();
13515 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13516 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
13517 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13519 label = gtk_label_new ("Cursor:");
13520 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13521 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13523 entry = gtk_entry_new ();
13524 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13525 gtk_widget_modify_cursor (entry, &red, &red);
13526 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13528 label = gtk_label_new ("Multiple:");
13529 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13530 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13532 button = gtk_button_new_with_label ("Some Text");
13534 rc_style = gtk_rc_style_new ();
13536 rc_style->font_desc = pango_font_description_copy (font_desc);
13537 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
13538 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
13539 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
13540 rc_style->fg[GTK_STATE_NORMAL] = yellow;
13541 rc_style->bg[GTK_STATE_NORMAL] = blue;
13542 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
13543 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
13544 rc_style->fg[GTK_STATE_ACTIVE] = red;
13545 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
13546 rc_style->xthickness = 5;
13547 rc_style->ythickness = 5;
13549 gtk_widget_modify_style (button, rc_style);
13550 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
13552 g_object_unref (rc_style);
13554 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13557 if (!GTK_WIDGET_VISIBLE (window))
13558 gtk_widget_show_all (window);
13560 gtk_widget_destroy (window);
13564 * Main Window and Exit
13568 do_exit (GtkWidget *widget, GtkWidget *window)
13570 gtk_widget_destroy (window);
13576 void (*func) (GtkWidget *widget);
13577 gboolean do_not_benchmark;
13580 { "alpha window", create_alpha_window },
13582 /* dog slow on NT, no working at all on 9x */
13583 { "big windows", create_big_windows, TRUE },
13585 { "big windows", create_big_windows },
13587 { "button box", create_button_box },
13588 { "buttons", create_buttons },
13589 { "check buttons", create_check_buttons },
13590 { "clist", create_clist},
13591 { "color selection", create_color_selection },
13592 { "composited window", create_composited_window },
13593 { "ctree", create_ctree },
13594 { "cursors", create_cursors },
13595 { "dialog", create_dialog, TRUE },
13596 { "display & screen", create_display_screen, TRUE },
13597 { "entry", create_entry },
13598 { "event box", create_event_box },
13599 { "event watcher", create_event_watcher },
13600 { "expander", create_expander },
13601 { "file selection", create_file_selection },
13602 { "flipping", create_flipping },
13603 { "focus", create_focus },
13604 { "font selection", create_font_selection },
13605 { "gamma curve", create_gamma_curve, TRUE },
13606 { "gridded geometry", create_gridded_geometry },
13607 { "handle box", create_handle_box },
13608 { "image from drawable", create_get_image },
13609 { "image", create_image },
13610 { "item factory", create_item_factory },
13611 { "key lookup", create_key_lookup },
13612 { "labels", create_labels },
13613 { "layout", create_layout },
13614 { "list", create_list },
13615 { "menus", create_menus },
13616 { "message dialog", create_message_dialog },
13617 { "modal window", create_modal_window, TRUE },
13618 { "notebook", create_notebook },
13619 { "panes", create_panes },
13620 { "paned keyboard", create_paned_keyboard_navigation },
13621 { "pixmap", create_pixmap },
13622 { "preview color", create_color_preview, TRUE },
13623 { "preview gray", create_gray_preview, TRUE },
13624 { "progress bar", create_progress_bar },
13625 { "properties", create_properties },
13626 { "radio buttons", create_radio_buttons },
13627 { "range controls", create_range_controls },
13628 { "rc file", create_rc_file },
13629 { "reparent", create_reparent },
13630 { "resize grips", create_resize_grips },
13631 { "rotated label", create_rotated_label },
13632 { "rotated text", create_rotated_text },
13633 { "rulers", create_rulers },
13634 { "saved position", create_saved_position },
13635 { "scrolled windows", create_scrolled_windows },
13636 { "shapes", create_shapes },
13637 { "size groups", create_size_groups },
13638 { "snapshot", create_snapshot },
13639 { "spinbutton", create_spins },
13640 { "statusbar", create_statusbar },
13641 { "styles", create_styles },
13642 { "test idle", create_idle_test },
13643 { "test mainloop", create_mainloop, TRUE },
13644 { "test scrolling", create_scroll_test },
13645 { "test selection", create_selection_test },
13646 { "test timeout", create_timeout_test },
13647 { "text", create_text },
13648 { "toggle buttons", create_toggle_buttons },
13649 { "toolbar", create_toolbar },
13650 { "tooltips", create_tooltips },
13651 { "tree", create_tree_mode_window},
13652 { "WM hints", create_wmhints },
13653 { "window sizing", create_window_sizing },
13654 { "window states", create_window_states }
13656 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
13659 create_main_window (void)
13664 GtkWidget *scrolled_window;
13668 GtkWidget *separator;
13669 GdkGeometry geometry;
13672 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13673 gtk_widget_set_name (window, "main window");
13674 gtk_widget_set_uposition (window, 50, 20);
13675 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
13677 geometry.min_width = -1;
13678 geometry.min_height = -1;
13679 geometry.max_width = -1;
13680 geometry.max_height = G_MAXSHORT;
13681 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
13683 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
13685 g_signal_connect (window, "destroy",
13686 G_CALLBACK (gtk_main_quit),
13688 g_signal_connect (window, "delete-event",
13689 G_CALLBACK (gtk_false),
13692 box1 = gtk_vbox_new (FALSE, 0);
13693 gtk_container_add (GTK_CONTAINER (window), box1);
13695 if (gtk_micro_version > 0)
13700 gtk_micro_version);
13705 gtk_minor_version);
13707 label = gtk_label_new (buffer);
13708 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
13709 gtk_widget_set_name (label, "testgtk-version-label");
13711 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
13712 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
13713 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
13715 GTK_POLICY_AUTOMATIC);
13716 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
13718 box2 = gtk_vbox_new (FALSE, 0);
13719 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
13720 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
13721 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
13722 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
13723 gtk_widget_show (box2);
13725 for (i = 0; i < nbuttons; i++)
13727 button = gtk_button_new_with_label (buttons[i].label);
13728 if (buttons[i].func)
13729 g_signal_connect (button,
13731 G_CALLBACK(buttons[i].func),
13734 gtk_widget_set_sensitive (button, FALSE);
13735 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
13738 separator = gtk_hseparator_new ();
13739 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
13741 box2 = gtk_vbox_new (FALSE, 10);
13742 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
13743 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
13745 button = gtk_button_new_with_mnemonic ("_Close");
13746 g_signal_connect (button, "clicked",
13747 G_CALLBACK (do_exit),
13749 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
13750 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13751 gtk_widget_grab_default (button);
13753 gtk_widget_show_all (window);
13759 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
13760 G_FILE_TEST_EXISTS))
13762 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
13763 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
13768 pad (const char *str, int to)
13770 static char buf[256];
13771 int len = strlen (str);
13774 for (i = 0; i < to; i++)
13779 memcpy (buf, str, len);
13785 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
13787 fn (widget); /* on */
13788 while (g_main_context_iteration (NULL, FALSE));
13789 fn (widget); /* off */
13790 while (g_main_context_iteration (NULL, FALSE));
13794 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
13800 static gboolean printed_headers = FALSE;
13802 if (!printed_headers) {
13803 g_print ("Test Iters First Other\n");
13804 g_print ("-------------------- ----- ---------- ----------\n");
13805 printed_headers = TRUE;
13808 g_get_current_time (&tv0);
13809 bench_iteration (widget, fn);
13810 g_get_current_time (&tv1);
13812 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
13813 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
13815 g_get_current_time (&tv0);
13816 for (n = 0; n < num - 1; n++)
13817 bench_iteration (widget, fn);
13818 g_get_current_time (&tv1);
13819 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
13820 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
13822 g_print ("%s %5d ", pad (name, 20), num);
13824 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
13826 g_print ("%10.1f\n", dt_first);
13830 do_bench (char* what, int num)
13834 void (* fn) (GtkWidget *widget);
13836 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13838 if (g_ascii_strcasecmp (what, "ALL") == 0)
13840 for (i = 0; i < nbuttons; i++)
13842 if (!buttons[i].do_not_benchmark)
13843 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
13850 for (i = 0; i < nbuttons; i++)
13852 if (strcmp (buttons[i].label, what) == 0)
13854 fn = buttons[i].func;
13860 g_print ("Can't bench: \"%s\" not found.\n", what);
13862 do_real_bench (widget, fn, buttons[i].label, num);
13869 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
13874 main (int argc, char *argv[])
13876 GtkBindingSet *binding_set;
13878 gboolean done_benchmarks = FALSE;
13880 srand (time (NULL));
13884 /* Check to see if we are being run from the correct
13887 if (file_exists ("testgtkrc"))
13888 gtk_rc_add_default_file ("testgtkrc");
13890 g_set_application_name ("GTK+ Test Program");
13892 gtk_init (&argc, &argv);
13894 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
13903 for (i = 1; i < argc; i++)
13905 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
13912 nextarg = strchr (argv[i], '=');
13923 count = strchr (nextarg, ':');
13926 what = g_strndup (nextarg, count - nextarg);
13928 num = atoi (count);
13933 what = g_strdup (nextarg);
13935 do_bench (what, num ? num : 1);
13936 done_benchmarks = TRUE;
13941 if (done_benchmarks)
13946 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
13947 gtk_binding_entry_add_signal (binding_set,
13948 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
13951 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
13953 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
13957 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
13958 " fg[NORMAL] = \"#ff0000\"\n"
13959 " font = \"Sans 18\"\n"
13961 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
13963 create_main_window ();
13969 while (g_main_context_pending (NULL))
13970 g_main_context_iteration (NULL, FALSE);
13973 while (g_main_context_pending (NULL))
13974 g_main_context_iteration (NULL, FALSE);