1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
27 #undef GTK_DISABLE_DEPRECATED
43 #define GTK_ENABLE_BROKEN
46 #include "gdk/gdkkeysyms.h"
49 #define sleep(n) _sleep(n)
52 #include "prop-editor.h"
54 #include "circles.xbm"
58 file_exists (const char *filename)
62 return stat (filename, &statbuf) == 0;
66 shape_create_icon (GdkScreen *screen,
75 build_option_menu (gchar *items[],
78 void (*func) (GtkWidget *widget, gpointer data),
81 /* macro, structure and variables used by tree window demos */
82 #define DEFAULT_NUMBER_OF_ITEM 3
83 #define DEFAULT_RECURSION_LEVEL 3
86 GSList* selection_mode_group;
87 GtkWidget* single_button;
88 GtkWidget* browse_button;
89 GtkWidget* multiple_button;
90 GtkWidget* draw_line_button;
91 GtkWidget* view_line_button;
92 GtkWidget* no_root_item_button;
93 GtkWidget* nb_item_spinner;
94 GtkWidget* recursion_spinner;
95 } sTreeSampleSelection;
97 typedef struct sTreeButtons {
99 GtkWidget* add_button;
100 GtkWidget* remove_button;
101 GtkWidget* subtree_button;
103 /* end of tree section */
106 build_option_menu (gchar *items[],
109 void (*func)(GtkWidget *widget, gpointer data),
114 GtkWidget *menu_item;
118 omenu = gtk_option_menu_new ();
119 g_signal_connect (omenu, "changed",
120 G_CALLBACK (func), data);
122 menu = gtk_menu_new ();
125 for (i = 0; i < num_items; i++)
127 menu_item = gtk_radio_menu_item_new_with_label (group, items[i]);
128 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menu_item));
129 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
131 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
132 gtk_widget_show (menu_item);
135 gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
136 gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), history);
142 destroy_tooltips (GtkWidget *widget, GtkWindow **window)
144 GtkTooltips *tt = g_object_get_data (G_OBJECT (*window), "tooltips");
151 * Windows with an alpha channel
156 on_alpha_window_expose (GtkWidget *widget,
157 GdkEventExpose *expose)
160 cairo_pattern_t *pattern;
163 cr = gdk_cairo_create (widget->window);
165 radius = MIN (widget->allocation.width, widget->allocation.height) / 2;
166 pattern = cairo_pattern_create_radial (widget->allocation.width / 2,
167 widget->allocation.height / 2,
169 widget->allocation.width / 2,
170 widget->allocation.height / 2,
173 if (gdk_screen_get_rgba_colormap (gtk_widget_get_screen (widget)) &&
174 gtk_widget_is_composited (widget))
175 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
177 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
179 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
182 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
183 1.0, 0.75, 0.0, 1.0); /* solid orange */
184 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
185 1.0, 0.75, 0.0, 0.0); /* transparent orange */
187 cairo_set_source (cr, pattern);
188 cairo_pattern_destroy (pattern);
190 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
199 build_alpha_widgets (void)
202 GtkWidget *radio_button;
207 table = gtk_table_new (1, 1, FALSE);
209 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
210 gtk_table_attach (GTK_TABLE (table),
213 GTK_EXPAND | GTK_FILL, 0,
216 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
217 gtk_table_attach (GTK_TABLE (table),
220 GTK_EXPAND | GTK_FILL, 0,
223 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
224 gtk_table_attach (GTK_TABLE (table),
227 GTK_EXPAND | GTK_FILL, 0,
230 gtk_table_attach (GTK_TABLE (table),
231 gtk_check_button_new_with_label ("Sedentary"),
233 GTK_EXPAND | GTK_FILL, 0,
235 gtk_table_attach (GTK_TABLE (table),
236 gtk_check_button_new_with_label ("Nocturnal"),
238 GTK_EXPAND | GTK_FILL, 0,
240 gtk_table_attach (GTK_TABLE (table),
241 gtk_check_button_new_with_label ("Compulsive"),
243 GTK_EXPAND | GTK_FILL, 0,
246 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
247 gtk_table_attach (GTK_TABLE (table),
250 GTK_EXPAND | GTK_FILL, 0,
253 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
254 gtk_table_attach (GTK_TABLE (table),
257 GTK_EXPAND | GTK_FILL, 0,
260 hbox = gtk_hbox_new (FALSE, 0);
261 label = gtk_label_new (NULL);
262 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
263 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
264 entry = gtk_entry_new ();
265 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
266 gtk_table_attach (GTK_TABLE (table),
269 GTK_EXPAND | GTK_FILL, 0,
276 on_alpha_drawing_expose (GtkWidget *widget,
277 GdkEventExpose *expose)
279 int x = widget->allocation.x;
280 int y = widget->allocation.y;
281 int width = widget->allocation.width;
282 int height = widget->allocation.height;
288 buffer = g_malloc (64 * 64 * 4);
290 gdk_draw_rectangle (widget->window, widget->style->black_gc, FALSE,
292 width - 1, height - 1);
295 for (i = 0; i < 64; i++) {
296 for (j = 0; j < 64; j++) {
300 *(p++) = MIN (255, ((32 - i) * (32 - i) + (32 - j) * (32 - j)) / 8);
305 gdk_draw_rgb_32_image (widget->window, widget->style->black_gc,
306 x + 18, y + (height - 64) /2,
307 64, 64, GDK_RGB_DITHER_NORMAL, buffer, 64 * 4);
309 pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, TRUE,
310 8, 64, 64, 4 * 64, NULL, NULL);
312 gdk_draw_pixbuf (widget->window, widget->style->black_gc, pixbuf,
313 0, 0, x + width - 18 - 64, y + (height - 64) /2,
314 64, 64, GDK_RGB_DITHER_NORMAL, 0, 0);
316 g_object_unref (pixbuf);
324 build_alpha_drawing ()
328 hbox = gtk_hbox_new (FALSE, 0);
329 gtk_widget_set_size_request (hbox, 100, 100);
331 g_signal_connect (hbox, "expose-event",
332 G_CALLBACK (on_alpha_drawing_expose), NULL);
338 on_alpha_screen_changed (GtkWidget *widget,
339 GdkScreen *old_screen,
342 GdkScreen *screen = gtk_widget_get_screen (widget);
343 GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
347 colormap = gdk_screen_get_rgb_colormap (screen);
348 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
352 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
355 gtk_widget_set_colormap (widget, colormap);
359 on_composited_changed (GtkWidget *window,
362 gboolean is_composited = gtk_widget_is_composited (window);
365 gtk_label_set_text (label, "Composited");
367 gtk_label_set_text (label, "Not composited");
371 create_alpha_window (GtkWidget *widget)
373 static GtkWidget *window;
380 window = gtk_dialog_new_with_buttons ("Alpha Window",
381 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
385 gtk_widget_set_app_paintable (window, TRUE);
386 g_signal_connect (window, "expose-event",
387 G_CALLBACK (on_alpha_window_expose), NULL);
389 vbox = gtk_vbox_new (FALSE, 8);
390 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
391 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
394 label = gtk_label_new (NULL);
395 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
396 on_alpha_screen_changed (window, NULL, label);
397 g_signal_connect (window, "screen-changed",
398 G_CALLBACK (on_alpha_screen_changed), label);
400 label = gtk_label_new (NULL);
401 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
402 on_composited_changed (window, GTK_LABEL (label));
403 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
405 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
406 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_drawing (), TRUE, TRUE, 0);
408 g_signal_connect (window, "destroy",
409 G_CALLBACK (gtk_widget_destroyed),
412 g_signal_connect (window, "response",
413 G_CALLBACK (gtk_widget_destroy),
417 if (!GTK_WIDGET_VISIBLE (window))
418 gtk_widget_show_all (window);
420 gtk_widget_destroy (window);
424 * Composited non-toplevel window
427 /* The expose event handler for the event box.
429 * This function simply draws a transparency onto a widget on the area
430 * for which it receives expose events. This is intended to give the
431 * event box a "transparent" background.
433 * In order for this to work properly, the widget must have an RGBA
434 * colourmap. The widget should also be set as app-paintable since it
435 * doesn't make sense for GTK to draw a background if we are drawing it
436 * (and because GTK might actually replace our transparency with its
437 * default background colour).
440 transparent_expose (GtkWidget *widget,
441 GdkEventExpose *event)
445 cr = gdk_cairo_create (widget->window);
446 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
447 gdk_cairo_region (cr, event->region);
454 /* The expose event handler for the window.
456 * This function performs the actual compositing of the event box onto
457 * the already-existing background of the window at 50% normal opacity.
459 * In this case we do not want app-paintable to be set on the widget
460 * since we want it to draw its own (red) background. Because of this,
461 * however, we must ensure that we use g_signal_register_after so that
462 * this handler is called after the red has been drawn. If it was
463 * called before then GTK would just blindly paint over our work.
466 window_expose_event (GtkWidget *widget,
467 GdkEventExpose *event)
473 /* get our child (in this case, the event box) */
474 child = gtk_bin_get_child (GTK_BIN (widget));
476 /* create a cairo context to draw to the window */
477 cr = gdk_cairo_create (widget->window);
479 /* the source data is the (composited) event box */
480 gdk_cairo_set_source_pixmap (cr, child->window,
482 child->allocation.y);
484 /* draw no more than our expose event intersects our child */
485 region = gdk_region_rectangle (&child->allocation);
486 gdk_region_intersect (region, event->region);
487 gdk_cairo_region (cr, region);
490 /* composite, with a 50% opacity */
491 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
492 cairo_paint_with_alpha (cr, 0.5);
501 create_composited_window (GtkWidget *widget)
503 static GtkWidget *window;
507 GtkWidget *event, *button;
512 /* make the widgets */
513 button = gtk_button_new_with_label ("A Button");
514 event = gtk_event_box_new ();
515 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
517 /* put a red background on the window */
518 gdk_color_parse ("red", &red);
519 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
521 /* set the colourmap for the event box.
522 * must be done before the event box is realised.
524 screen = gtk_widget_get_screen (event);
525 rgba = gdk_screen_get_rgba_colormap (screen);
526 gtk_widget_set_colormap (event, rgba);
528 /* set our event box to have a fully-transparent background
529 * drawn on it. currently there is no way to simply tell gtk
530 * that "transparency" is the background colour for a widget.
532 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
533 g_signal_connect (event, "expose-event",
534 G_CALLBACK (transparent_expose), NULL);
536 /* put them inside one another */
537 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
538 gtk_container_add (GTK_CONTAINER (window), event);
539 gtk_container_add (GTK_CONTAINER (event), button);
541 /* realise and show everything */
542 gtk_widget_realize (button);
544 /* set the event box GdkWindow to be composited.
545 * obviously must be performed after event box is realised.
547 gdk_window_set_composited (event->window, TRUE);
549 /* set up the compositing handler.
550 * note that we do _after so that the normal (red) background is drawn
551 * by gtk before our compositing occurs.
553 g_signal_connect_after (window, "expose-event",
554 G_CALLBACK (window_expose_event), NULL);
557 if (!GTK_WIDGET_VISIBLE (window))
558 gtk_widget_show_all (window);
560 gtk_widget_destroy (window);
564 * Big windows and guffaw scrolling
568 pattern_expose (GtkWidget *widget,
569 GdkEventExpose *event,
573 GdkWindow *window = event->window;
575 color = g_object_get_data (G_OBJECT (window), "pattern-color");
578 GdkGC *tmp_gc = gdk_gc_new (window);
579 gdk_gc_set_rgb_fg_color (tmp_gc, color);
581 gdk_draw_rectangle (window, tmp_gc, TRUE,
582 event->area.x, event->area.y,
583 event->area.width, event->area.height);
585 g_object_unref (tmp_gc);
592 pattern_set_bg (GtkWidget *widget,
596 static const GdkColor colors[] = {
597 { 0, 0x4444, 0x4444, 0xffff },
598 { 0, 0x8888, 0x8888, 0xffff },
599 { 0, 0xaaaa, 0xaaaa, 0xffff }
602 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
603 gdk_window_set_user_data (child, widget);
607 create_pattern (GtkWidget *widget,
618 while (2 * h <= height)
623 while (2 * w <= width)
625 if ((i + j) % 2 == 0)
630 GdkWindowAttr attributes;
632 attributes.window_type = GDK_WINDOW_CHILD;
635 attributes.width = w;
636 attributes.height = h;
637 attributes.wclass = GDK_INPUT_OUTPUT;
638 attributes.event_mask = GDK_EXPOSURE_MASK;
639 attributes.visual = gtk_widget_get_visual (widget);
640 attributes.colormap = gtk_widget_get_colormap (widget);
642 child = gdk_window_new (parent, &attributes,
643 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
645 pattern_set_bg (widget, child, level);
648 create_pattern (widget, child, level + 1, w, h);
650 gdk_window_show (child);
660 #define PATTERN_SIZE (1 << 18)
663 pattern_hadj_changed (GtkAdjustment *adj,
666 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
667 gint new_value = adj->value;
669 if (GTK_WIDGET_REALIZED (darea))
671 gdk_window_scroll (darea->window, *old_value - new_value, 0);
672 *old_value = new_value;
677 pattern_vadj_changed (GtkAdjustment *adj,
680 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
681 gint new_value = adj->value;
683 if (GTK_WIDGET_REALIZED (darea))
685 gdk_window_scroll (darea->window, 0, *old_value - new_value);
686 *old_value = new_value;
691 pattern_realize (GtkWidget *widget,
694 pattern_set_bg (widget, widget->window, 0);
695 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
699 create_big_windows (GtkWidget *widget)
701 static GtkWidget *window = NULL;
702 GtkWidget *darea, *table, *scrollbar;
706 static gint current_x;
707 static gint current_y;
714 window = gtk_dialog_new_with_buttons ("Big Windows",
720 gtk_window_set_screen (GTK_WINDOW (window),
721 gtk_widget_get_screen (widget));
723 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
725 g_signal_connect (window, "destroy",
726 G_CALLBACK (gtk_widget_destroyed),
729 g_signal_connect (window, "response",
730 G_CALLBACK (gtk_widget_destroy),
733 table = gtk_table_new (2, 2, FALSE);
734 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
735 table, TRUE, TRUE, 0);
737 darea = gtk_drawing_area_new ();
739 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
740 g_signal_connect (hadj, "value_changed",
741 G_CALLBACK (pattern_hadj_changed), darea);
742 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
744 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
745 g_signal_connect (vadj, "value_changed",
746 G_CALLBACK (pattern_vadj_changed), darea);
747 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
749 g_signal_connect (darea, "realize",
750 G_CALLBACK (pattern_realize),
752 g_signal_connect (darea, "expose_event",
753 G_CALLBACK (pattern_expose),
756 eventbox = gtk_event_box_new ();
757 gtk_table_attach (GTK_TABLE (table), eventbox,
759 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
762 gtk_container_add (GTK_CONTAINER (eventbox), darea);
764 scrollbar = gtk_hscrollbar_new (hadj);
765 gtk_table_attach (GTK_TABLE (table), scrollbar,
767 GTK_FILL | GTK_EXPAND, GTK_FILL,
770 scrollbar = gtk_vscrollbar_new (vadj);
771 gtk_table_attach (GTK_TABLE (table), scrollbar,
773 GTK_FILL, GTK_EXPAND | GTK_FILL,
778 if (!GTK_WIDGET_VISIBLE (window))
779 gtk_widget_show_all (window);
781 gtk_widget_hide (window);
789 button_window (GtkWidget *widget,
792 if (!GTK_WIDGET_VISIBLE (button))
793 gtk_widget_show (button);
795 gtk_widget_hide (button);
799 create_buttons (GtkWidget *widget)
801 static GtkWidget *window = NULL;
805 GtkWidget *button[10];
806 GtkWidget *separator;
810 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
811 gtk_window_set_screen (GTK_WINDOW (window),
812 gtk_widget_get_screen (widget));
814 g_signal_connect (window, "destroy",
815 G_CALLBACK (gtk_widget_destroyed),
818 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
819 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
821 box1 = gtk_vbox_new (FALSE, 0);
822 gtk_container_add (GTK_CONTAINER (window), box1);
824 table = gtk_table_new (3, 3, FALSE);
825 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
826 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
827 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
828 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
830 button[0] = gtk_button_new_with_label ("button1");
831 button[1] = gtk_button_new_with_mnemonic ("_button2");
832 button[2] = gtk_button_new_with_mnemonic ("_button3");
833 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
834 button[4] = gtk_button_new_with_label ("button5");
835 button[5] = gtk_button_new_with_label ("button6");
836 button[6] = gtk_button_new_with_label ("button7");
837 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
838 button[8] = gtk_button_new_with_label ("button9");
840 g_signal_connect (button[0], "clicked",
841 G_CALLBACK (button_window),
844 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
845 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
847 g_signal_connect (button[1], "clicked",
848 G_CALLBACK (button_window),
851 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
852 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
854 g_signal_connect (button[2], "clicked",
855 G_CALLBACK (button_window),
857 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
858 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
860 g_signal_connect (button[3], "clicked",
861 G_CALLBACK (button_window),
863 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
864 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
866 g_signal_connect (button[4], "clicked",
867 G_CALLBACK (button_window),
869 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
870 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
872 g_signal_connect (button[5], "clicked",
873 G_CALLBACK (button_window),
875 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
876 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
878 g_signal_connect (button[6], "clicked",
879 G_CALLBACK (button_window),
881 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
882 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
884 g_signal_connect (button[7], "clicked",
885 G_CALLBACK (button_window),
887 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
888 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
890 g_signal_connect (button[8], "clicked",
891 G_CALLBACK (button_window),
893 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
894 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
896 separator = gtk_hseparator_new ();
897 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
899 box2 = gtk_vbox_new (FALSE, 10);
900 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
901 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
903 button[9] = gtk_button_new_with_label ("close");
904 g_signal_connect_swapped (button[9], "clicked",
905 G_CALLBACK (gtk_widget_destroy),
907 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
908 GTK_WIDGET_SET_FLAGS (button[9], GTK_CAN_DEFAULT);
909 gtk_widget_grab_default (button[9]);
912 if (!GTK_WIDGET_VISIBLE (window))
913 gtk_widget_show_all (window);
915 gtk_widget_destroy (window);
923 create_toggle_buttons (GtkWidget *widget)
925 static GtkWidget *window = NULL;
929 GtkWidget *separator;
933 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
934 gtk_window_set_screen (GTK_WINDOW (window),
935 gtk_widget_get_screen (widget));
937 g_signal_connect (window, "destroy",
938 G_CALLBACK (gtk_widget_destroyed),
941 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
942 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
944 box1 = gtk_vbox_new (FALSE, 0);
945 gtk_container_add (GTK_CONTAINER (window), box1);
947 box2 = gtk_vbox_new (FALSE, 10);
948 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
949 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
951 button = gtk_toggle_button_new_with_label ("button1");
952 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
954 button = gtk_toggle_button_new_with_label ("button2");
955 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
957 button = gtk_toggle_button_new_with_label ("button3");
958 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
960 button = gtk_toggle_button_new_with_label ("inconsistent");
961 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
962 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
964 separator = gtk_hseparator_new ();
965 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
967 box2 = gtk_vbox_new (FALSE, 10);
968 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
969 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
971 button = gtk_button_new_with_label ("close");
972 g_signal_connect_swapped (button, "clicked",
973 G_CALLBACK (gtk_widget_destroy),
975 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
976 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
977 gtk_widget_grab_default (button);
980 if (!GTK_WIDGET_VISIBLE (window))
981 gtk_widget_show_all (window);
983 gtk_widget_destroy (window);
987 create_widget_grid (GType widget_type)
990 GtkWidget *group_widget = NULL;
993 table = gtk_table_new (FALSE, 3, 3);
995 for (i = 0; i < 5; i++)
997 for (j = 0; j < 5; j++)
1002 if (i == 0 && j == 0)
1008 tmp = g_strdup_printf ("%d", j);
1009 widget = gtk_label_new (tmp);
1014 tmp = g_strdup_printf ("%c", 'A' + i - 1);
1015 widget = gtk_label_new (tmp);
1020 widget = g_object_new (widget_type, NULL);
1022 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
1025 group_widget = widget;
1027 g_object_set (widget, "group", group_widget, NULL);
1032 gtk_table_attach (GTK_TABLE (table), widget,
1047 create_check_buttons (GtkWidget *widget)
1049 static GtkWidget *window = NULL;
1053 GtkWidget *separator;
1058 window = gtk_dialog_new_with_buttons ("Check Buttons",
1064 gtk_window_set_screen (GTK_WINDOW (window),
1065 gtk_widget_get_screen (widget));
1067 g_signal_connect (window, "destroy",
1068 G_CALLBACK (gtk_widget_destroyed),
1070 g_signal_connect (window, "response",
1071 G_CALLBACK (gtk_widget_destroy),
1074 box1 = GTK_DIALOG (window)->vbox;
1076 box2 = gtk_vbox_new (FALSE, 10);
1077 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1078 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1080 button = gtk_check_button_new_with_mnemonic ("_button1");
1081 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1083 button = gtk_check_button_new_with_label ("button2");
1084 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1086 button = gtk_check_button_new_with_label ("button3");
1087 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1089 button = gtk_check_button_new_with_label ("inconsistent");
1090 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1091 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1093 separator = gtk_hseparator_new ();
1094 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1096 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
1097 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1098 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1101 if (!GTK_WIDGET_VISIBLE (window))
1102 gtk_widget_show_all (window);
1104 gtk_widget_destroy (window);
1112 create_radio_buttons (GtkWidget *widget)
1114 static GtkWidget *window = NULL;
1118 GtkWidget *separator;
1123 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1129 gtk_window_set_screen (GTK_WINDOW (window),
1130 gtk_widget_get_screen (widget));
1132 g_signal_connect (window, "destroy",
1133 G_CALLBACK (gtk_widget_destroyed),
1135 g_signal_connect (window, "response",
1136 G_CALLBACK (gtk_widget_destroy),
1139 box1 = GTK_DIALOG (window)->vbox;
1141 box2 = gtk_vbox_new (FALSE, 10);
1142 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1143 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1145 button = gtk_radio_button_new_with_label (NULL, "button1");
1146 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1148 button = gtk_radio_button_new_with_label (
1149 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1151 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1152 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1154 button = gtk_radio_button_new_with_label (
1155 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1157 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1159 button = gtk_radio_button_new_with_label (
1160 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1162 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1163 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1165 separator = gtk_hseparator_new ();
1166 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1168 box2 = gtk_vbox_new (FALSE, 10);
1169 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1170 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1172 button = gtk_radio_button_new_with_label (NULL, "button4");
1173 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1174 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1176 button = gtk_radio_button_new_with_label (
1177 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1179 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1180 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1181 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1183 button = gtk_radio_button_new_with_label (
1184 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1186 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1187 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1189 separator = gtk_hseparator_new ();
1190 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1192 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1193 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1194 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1197 if (!GTK_WIDGET_VISIBLE (window))
1198 gtk_widget_show_all (window);
1200 gtk_widget_destroy (window);
1208 create_bbox (gint horizontal,
1219 frame = gtk_frame_new (title);
1222 bbox = gtk_hbutton_box_new ();
1224 bbox = gtk_vbutton_box_new ();
1226 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1227 gtk_container_add (GTK_CONTAINER (frame), bbox);
1229 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1230 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1231 gtk_button_box_set_child_size (GTK_BUTTON_BOX (bbox), child_w, child_h);
1233 button = gtk_button_new_with_label ("OK");
1234 gtk_container_add (GTK_CONTAINER (bbox), button);
1236 button = gtk_button_new_with_label ("Cancel");
1237 gtk_container_add (GTK_CONTAINER (bbox), button);
1239 button = gtk_button_new_with_label ("Help");
1240 gtk_container_add (GTK_CONTAINER (bbox), button);
1246 create_button_box (GtkWidget *widget)
1248 static GtkWidget* window = NULL;
1249 GtkWidget *main_vbox;
1252 GtkWidget *frame_horz;
1253 GtkWidget *frame_vert;
1257 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1258 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1259 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1261 g_signal_connect (window, "destroy",
1262 G_CALLBACK (gtk_widget_destroyed),
1265 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1267 main_vbox = gtk_vbox_new (FALSE, 0);
1268 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1270 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1271 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1273 vbox = gtk_vbox_new (FALSE, 0);
1274 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1275 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1277 gtk_box_pack_start (GTK_BOX (vbox),
1278 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1281 gtk_box_pack_start (GTK_BOX (vbox),
1282 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1285 gtk_box_pack_start (GTK_BOX (vbox),
1286 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1289 gtk_box_pack_start (GTK_BOX (vbox),
1290 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1293 gtk_box_pack_start (GTK_BOX (vbox),
1294 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1297 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1298 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1300 hbox = gtk_hbox_new (FALSE, 0);
1301 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1302 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1304 gtk_box_pack_start (GTK_BOX (hbox),
1305 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1308 gtk_box_pack_start (GTK_BOX (hbox),
1309 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1312 gtk_box_pack_start (GTK_BOX (hbox),
1313 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1316 gtk_box_pack_start (GTK_BOX (hbox),
1317 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1320 gtk_box_pack_start (GTK_BOX (hbox),
1321 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1325 if (!GTK_WIDGET_VISIBLE (window))
1326 gtk_widget_show_all (window);
1328 gtk_widget_destroy (window);
1336 new_pixmap (char *filename,
1338 GdkColor *background)
1344 if (strcmp (filename, "test.xpm") == 0 ||
1345 !file_exists (filename))
1347 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask,
1352 pixmap = gdk_pixmap_create_from_xpm (window, &mask,
1356 wpixmap = gtk_image_new_from_pixmap (pixmap, mask);
1363 set_toolbar_small_stock (GtkWidget *widget,
1366 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1370 set_toolbar_large_stock (GtkWidget *widget,
1373 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1377 set_toolbar_horizontal (GtkWidget *widget,
1380 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_HORIZONTAL);
1384 set_toolbar_vertical (GtkWidget *widget,
1387 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_VERTICAL);
1391 set_toolbar_icons (GtkWidget *widget,
1394 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1398 set_toolbar_text (GtkWidget *widget,
1401 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1405 set_toolbar_both (GtkWidget *widget,
1408 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1412 set_toolbar_both_horiz (GtkWidget *widget,
1415 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1419 set_toolbar_enable (GtkWidget *widget,
1422 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), TRUE);
1426 set_toolbar_disable (GtkWidget *widget,
1429 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), FALSE);
1433 create_toolbar (GtkWidget *widget)
1435 static GtkWidget *window = NULL;
1441 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1442 gtk_window_set_screen (GTK_WINDOW (window),
1443 gtk_widget_get_screen (widget));
1445 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1447 g_signal_connect (window, "destroy",
1448 G_CALLBACK (gtk_widget_destroyed),
1451 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1452 gtk_widget_realize (window);
1454 toolbar = gtk_toolbar_new ();
1456 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1458 "Stock icon: New", "Toolbar/New",
1459 G_CALLBACK (set_toolbar_small_stock), toolbar, -1);
1461 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1463 "Stock icon: Open", "Toolbar/Open",
1464 G_CALLBACK (set_toolbar_large_stock), toolbar, -1);
1466 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1467 "Horizontal", "Horizontal toolbar layout", "Toolbar/Horizontal",
1468 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1469 G_CALLBACK (set_toolbar_horizontal), toolbar);
1470 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1471 "Vertical", "Vertical toolbar layout", "Toolbar/Vertical",
1472 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1473 G_CALLBACK (set_toolbar_vertical), toolbar);
1475 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1477 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1478 "Icons", "Only show toolbar icons", "Toolbar/IconsOnly",
1479 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1480 G_CALLBACK (set_toolbar_icons), toolbar);
1481 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1482 "Text", "Only show toolbar text", "Toolbar/TextOnly",
1483 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1484 G_CALLBACK (set_toolbar_text), toolbar);
1485 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1486 "Both", "Show toolbar icons and text", "Toolbar/Both",
1487 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1488 G_CALLBACK (set_toolbar_both), toolbar);
1489 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1490 "Both (horizontal)",
1491 "Show toolbar icons and text in a horizontal fashion",
1492 "Toolbar/BothHoriz",
1493 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1494 G_CALLBACK (set_toolbar_both_horiz), toolbar);
1496 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1498 entry = gtk_entry_new ();
1500 gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), entry, "This is an unusable GtkEntry ;)", "Hey don't click me!!!");
1502 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1505 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1507 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1508 "Enable", "Enable tooltips", NULL,
1509 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1510 G_CALLBACK (set_toolbar_enable), toolbar);
1511 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1512 "Disable", "Disable tooltips", NULL,
1513 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1514 G_CALLBACK (set_toolbar_disable), toolbar);
1516 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1518 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1519 "Frobate", "Frobate tooltip", NULL,
1520 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1522 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1523 "Baz", "Baz tooltip", NULL,
1524 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1527 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1529 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1530 "Blah", "Blah tooltip", NULL,
1531 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1533 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1534 "Bar", "Bar tooltip", NULL,
1535 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1538 gtk_container_add (GTK_CONTAINER (window), toolbar);
1540 gtk_widget_set_size_request (toolbar, 200, -1);
1543 if (!GTK_WIDGET_VISIBLE (window))
1544 gtk_widget_show_all (window);
1546 gtk_widget_destroy (window);
1550 make_toolbar (GtkWidget *window)
1554 if (!GTK_WIDGET_REALIZED (window))
1555 gtk_widget_realize (window);
1557 toolbar = gtk_toolbar_new ();
1559 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1560 "Horizontal", "Horizontal toolbar layout", NULL,
1561 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1562 G_CALLBACK (set_toolbar_horizontal), toolbar);
1563 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1564 "Vertical", "Vertical toolbar layout", NULL,
1565 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1566 G_CALLBACK (set_toolbar_vertical), toolbar);
1568 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1570 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1571 "Icons", "Only show toolbar icons", NULL,
1572 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1573 G_CALLBACK (set_toolbar_icons), toolbar);
1574 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1575 "Text", "Only show toolbar text", NULL,
1576 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1577 G_CALLBACK (set_toolbar_text), toolbar);
1578 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1579 "Both", "Show toolbar icons and text", NULL,
1580 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1581 G_CALLBACK (set_toolbar_both), toolbar);
1583 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1585 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1586 "Woot", "Woot woot woot", NULL,
1587 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1589 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1590 "Blah", "Blah blah blah", "Toolbar/Big",
1591 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1594 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1596 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1597 "Enable", "Enable tooltips", NULL,
1598 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1599 G_CALLBACK (set_toolbar_enable), toolbar);
1600 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1601 "Disable", "Disable tooltips", NULL,
1602 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1603 G_CALLBACK (set_toolbar_disable), toolbar);
1605 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1607 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1608 "Hoo", "Hoo tooltip", NULL,
1609 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1611 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1612 "Woo", "Woo tooltip", NULL,
1613 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1623 static guint statusbar_counter = 1;
1626 statusbar_push (GtkWidget *button,
1627 GtkStatusbar *statusbar)
1631 sprintf (text, "something %d", statusbar_counter++);
1633 gtk_statusbar_push (statusbar, 1, text);
1637 statusbar_push_long (GtkWidget *button,
1638 GtkStatusbar *statusbar)
1642 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\").");
1644 gtk_statusbar_push (statusbar, 1, text);
1648 statusbar_pop (GtkWidget *button,
1649 GtkStatusbar *statusbar)
1651 gtk_statusbar_pop (statusbar, 1);
1655 statusbar_steal (GtkWidget *button,
1656 GtkStatusbar *statusbar)
1658 gtk_statusbar_remove (statusbar, 1, 4);
1662 statusbar_popped (GtkStatusbar *statusbar,
1666 if (!statusbar->messages)
1667 statusbar_counter = 1;
1671 statusbar_contexts (GtkStatusbar *statusbar)
1675 string = "any context";
1676 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1678 gtk_statusbar_get_context_id (statusbar, string));
1680 string = "idle messages";
1681 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1683 gtk_statusbar_get_context_id (statusbar, string));
1685 string = "some text";
1686 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1688 gtk_statusbar_get_context_id (statusbar, string));
1690 string = "hit the mouse";
1691 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1693 gtk_statusbar_get_context_id (statusbar, string));
1695 string = "hit the mouse2";
1696 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1698 gtk_statusbar_get_context_id (statusbar, string));
1702 create_statusbar (GtkWidget *widget)
1704 static GtkWidget *window = NULL;
1708 GtkWidget *separator;
1709 GtkWidget *statusbar;
1713 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1714 gtk_window_set_screen (GTK_WINDOW (window),
1715 gtk_widget_get_screen (widget));
1717 g_signal_connect (window, "destroy",
1718 G_CALLBACK (gtk_widget_destroyed),
1721 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1722 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1724 box1 = gtk_vbox_new (FALSE, 0);
1725 gtk_container_add (GTK_CONTAINER (window), box1);
1727 box2 = gtk_vbox_new (FALSE, 10);
1728 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1729 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1731 statusbar = gtk_statusbar_new ();
1732 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1733 g_signal_connect (statusbar,
1735 G_CALLBACK (statusbar_popped),
1738 button = gtk_widget_new (gtk_button_get_type (),
1739 "label", "push something",
1743 g_object_connect (button,
1744 "signal::clicked", statusbar_push, statusbar,
1747 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1752 "signal_after::clicked", statusbar_pop, statusbar,
1755 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1756 "label", "steal #4",
1760 "signal_after::clicked", statusbar_steal, statusbar,
1763 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1764 "label", "test contexts",
1768 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1771 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1772 "label", "push something long",
1776 "signal_after::clicked", statusbar_push_long, statusbar,
1779 separator = gtk_hseparator_new ();
1780 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1782 box2 = gtk_vbox_new (FALSE, 10);
1783 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1784 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1786 button = gtk_button_new_with_label ("close");
1787 g_signal_connect_swapped (button, "clicked",
1788 G_CALLBACK (gtk_widget_destroy),
1790 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1791 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1792 gtk_widget_grab_default (button);
1795 if (!GTK_WIDGET_VISIBLE (window))
1796 gtk_widget_show_all (window);
1798 gtk_widget_destroy (window);
1806 cb_tree_destroy_event(GtkWidget* w)
1808 sTreeButtons* tree_buttons;
1810 /* free buttons structure associate at this tree */
1811 tree_buttons = g_object_get_data (G_OBJECT (w), "user_data");
1812 g_free (tree_buttons);
1816 cb_add_new_item(GtkWidget* w, GtkTree* tree)
1818 sTreeButtons* tree_buttons;
1819 GList* selected_list;
1820 GtkWidget* selected_item;
1822 GtkWidget* item_new;
1825 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1827 selected_list = GTK_TREE_SELECTION_OLD(tree);
1829 if(selected_list == NULL)
1831 /* there is no item in tree */
1832 subtree = GTK_WIDGET(tree);
1836 /* list can have only one element */
1837 selected_item = GTK_WIDGET(selected_list->data);
1839 subtree = GTK_TREE_ITEM_SUBTREE(selected_item);
1843 /* current selected item have not subtree ... create it */
1844 subtree = gtk_tree_new();
1845 gtk_tree_item_set_subtree(GTK_TREE_ITEM(selected_item),
1850 /* at this point, we know which subtree will be used to add new item */
1851 /* create a new item */
1852 sprintf(buffer, "item add %d", tree_buttons->nb_item_add);
1853 item_new = gtk_tree_item_new_with_label(buffer);
1854 gtk_tree_append(GTK_TREE(subtree), item_new);
1855 gtk_widget_show(item_new);
1857 tree_buttons->nb_item_add++;
1861 cb_remove_item(GtkWidget*w, GtkTree* tree)
1863 GList* selected_list;
1866 selected_list = GTK_TREE_SELECTION_OLD(tree);
1870 while (selected_list)
1872 clear_list = g_list_prepend (clear_list, selected_list->data);
1873 selected_list = selected_list->next;
1876 clear_list = g_list_reverse (clear_list);
1877 gtk_tree_remove_items(tree, clear_list);
1879 g_list_free (clear_list);
1883 cb_remove_subtree(GtkWidget*w, GtkTree* tree)
1885 GList* selected_list;
1888 selected_list = GTK_TREE_SELECTION_OLD(tree);
1892 item = GTK_TREE_ITEM (selected_list->data);
1894 gtk_tree_item_remove_subtree (item);
1899 cb_tree_changed(GtkTree* tree)
1901 sTreeButtons* tree_buttons;
1902 GList* selected_list;
1905 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1907 selected_list = GTK_TREE_SELECTION_OLD(tree);
1908 nb_selected = g_list_length(selected_list);
1910 if(nb_selected == 0)
1912 if(tree->children == NULL)
1913 gtk_widget_set_sensitive(tree_buttons->add_button, TRUE);
1915 gtk_widget_set_sensitive(tree_buttons->add_button, FALSE);
1916 gtk_widget_set_sensitive(tree_buttons->remove_button, FALSE);
1917 gtk_widget_set_sensitive(tree_buttons->subtree_button, FALSE);
1921 gtk_widget_set_sensitive(tree_buttons->remove_button, TRUE);
1922 gtk_widget_set_sensitive(tree_buttons->add_button, (nb_selected == 1));
1923 gtk_widget_set_sensitive(tree_buttons->subtree_button, (nb_selected == 1));
1928 create_subtree(GtkWidget* item, guint level, guint nb_item_max, guint recursion_level_max)
1930 GtkWidget* item_subtree;
1931 GtkWidget* item_new;
1936 if(level == recursion_level_max) return;
1940 /* query with no root item */
1942 item_subtree = item;
1947 /* query with no root item */
1948 /* create subtree and associate it with current item */
1949 item_subtree = gtk_tree_new();
1953 for(nb_item = 0; nb_item < nb_item_max; nb_item++)
1955 sprintf(buffer, "item %d-%d", level, nb_item);
1956 item_new = gtk_tree_item_new_with_label(buffer);
1957 gtk_tree_append(GTK_TREE(item_subtree), item_new);
1958 create_subtree(item_new, level+1, nb_item_max, recursion_level_max);
1959 gtk_widget_show(item_new);
1963 gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), item_subtree);
1967 create_tree_sample(GdkScreen *screen, guint selection_mode,
1968 guint draw_line, guint view_line, guint no_root_item,
1969 guint nb_item_max, guint recursion_level_max)
1974 GtkWidget* separator;
1976 GtkWidget* scrolled_win;
1977 GtkWidget* root_tree;
1978 GtkWidget* root_item;
1979 sTreeButtons* tree_buttons;
1981 /* create tree buttons struct */
1982 if ((tree_buttons = g_malloc (sizeof (sTreeButtons))) == NULL)
1984 g_error("can't allocate memory for tree structure !\n");
1987 tree_buttons->nb_item_add = 0;
1989 /* create top level window */
1990 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1991 gtk_window_set_screen (GTK_WINDOW (window), screen);
1992 gtk_window_set_title(GTK_WINDOW(window), "Tree Sample");
1993 g_signal_connect (window, "destroy",
1994 G_CALLBACK (cb_tree_destroy_event), NULL);
1995 g_object_set_data (G_OBJECT (window), "user_data", tree_buttons);
1997 box1 = gtk_vbox_new(FALSE, 0);
1998 gtk_container_add(GTK_CONTAINER(window), box1);
1999 gtk_widget_show(box1);
2001 /* create tree box */
2002 box2 = gtk_vbox_new(FALSE, 0);
2003 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
2004 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2005 gtk_widget_show(box2);
2007 /* create scrolled window */
2008 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
2009 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
2010 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2011 gtk_box_pack_start (GTK_BOX (box2), scrolled_win, TRUE, TRUE, 0);
2012 gtk_widget_set_size_request (scrolled_win, 200, 200);
2013 gtk_widget_show (scrolled_win);
2015 /* create root tree widget */
2016 root_tree = gtk_tree_new();
2017 g_signal_connect (root_tree, "selection_changed",
2018 G_CALLBACK (cb_tree_changed),
2020 g_object_set_data (G_OBJECT (root_tree), "user_data", tree_buttons);
2021 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), root_tree);
2022 gtk_tree_set_selection_mode(GTK_TREE(root_tree), selection_mode);
2023 gtk_tree_set_view_lines(GTK_TREE(root_tree), draw_line);
2024 gtk_tree_set_view_mode(GTK_TREE(root_tree), !view_line);
2025 gtk_widget_show(root_tree);
2029 /* set root tree to subtree function with root item variable */
2030 root_item = GTK_WIDGET(root_tree);
2034 /* create root tree item widget */
2035 root_item = gtk_tree_item_new_with_label("root item");
2036 gtk_tree_append(GTK_TREE(root_tree), root_item);
2037 gtk_widget_show(root_item);
2039 create_subtree(root_item, -no_root_item, nb_item_max, recursion_level_max);
2041 box2 = gtk_vbox_new(FALSE, 0);
2042 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
2043 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2044 gtk_widget_show(box2);
2046 button = gtk_button_new_with_label("Add Item");
2047 gtk_widget_set_sensitive(button, FALSE);
2048 g_signal_connect (button, "clicked",
2049 G_CALLBACK (cb_add_new_item),
2051 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2052 gtk_widget_show(button);
2053 tree_buttons->add_button = button;
2055 button = gtk_button_new_with_label("Remove Item(s)");
2056 gtk_widget_set_sensitive(button, FALSE);
2057 g_signal_connect (button, "clicked",
2058 G_CALLBACK (cb_remove_item),
2060 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2061 gtk_widget_show(button);
2062 tree_buttons->remove_button = button;
2064 button = gtk_button_new_with_label("Remove Subtree");
2065 gtk_widget_set_sensitive(button, FALSE);
2066 g_signal_connect (button, "clicked",
2067 G_CALLBACK (cb_remove_subtree),
2069 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2070 gtk_widget_show(button);
2071 tree_buttons->subtree_button = button;
2073 /* create separator */
2074 separator = gtk_hseparator_new();
2075 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
2076 gtk_widget_show(separator);
2078 /* create button box */
2079 box2 = gtk_vbox_new(FALSE, 0);
2080 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
2081 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2082 gtk_widget_show(box2);
2084 button = gtk_button_new_with_label("Close");
2085 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2086 g_signal_connect_swapped (button, "clicked",
2087 G_CALLBACK (gtk_widget_destroy),
2089 gtk_widget_show(button);
2091 gtk_widget_show(window);
2095 cb_create_tree(GtkWidget* w)
2097 guint selection_mode = GTK_SELECTION_SINGLE;
2102 guint recursion_level;
2104 /* get selection mode choice */
2105 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.single_button)->active)
2106 selection_mode = GTK_SELECTION_SINGLE;
2108 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.browse_button)->active)
2109 selection_mode = GTK_SELECTION_BROWSE;
2111 selection_mode = GTK_SELECTION_MULTIPLE;
2113 /* get options choice */
2114 draw_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.draw_line_button)->active;
2115 view_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.view_line_button)->active;
2116 no_root_item = GTK_TOGGLE_BUTTON(sTreeSampleSelection.no_root_item_button)->active;
2119 nb_item = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.nb_item_spinner));
2120 recursion_level = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.recursion_spinner));
2122 if (pow (nb_item, recursion_level) > 10000)
2124 g_print ("%g total items? That will take a very long time. Try less\n",
2125 pow (nb_item, recursion_level));
2129 create_tree_sample(gtk_widget_get_screen (w),
2130 selection_mode, draw_line,
2131 view_line, no_root_item, nb_item, recursion_level);
2135 create_tree_mode_window(GtkWidget *widget)
2137 static GtkWidget* window;
2145 GtkWidget* separator;
2152 /* create toplevel window */
2153 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2154 gtk_window_set_screen (GTK_WINDOW (window),
2155 gtk_widget_get_screen (widget));
2156 gtk_window_set_title(GTK_WINDOW(window), "Set Tree Parameters");
2157 g_signal_connect (window, "destroy",
2158 G_CALLBACK (gtk_widget_destroyed),
2160 box1 = gtk_vbox_new(FALSE, 0);
2161 gtk_container_add(GTK_CONTAINER(window), box1);
2163 /* create upper box - selection box */
2164 box2 = gtk_vbox_new(FALSE, 5);
2165 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
2166 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2168 box3 = gtk_hbox_new(FALSE, 5);
2169 gtk_box_pack_start(GTK_BOX(box2), box3, TRUE, TRUE, 0);
2171 /* create selection mode frame */
2172 frame = gtk_frame_new("Selection Mode");
2173 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
2175 box4 = gtk_vbox_new(FALSE, 0);
2176 gtk_container_add(GTK_CONTAINER(frame), box4);
2177 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
2179 /* create radio button */
2180 button = gtk_radio_button_new_with_label(NULL, "SINGLE");
2181 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2182 sTreeSampleSelection.single_button = button;
2184 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
2186 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2187 sTreeSampleSelection.browse_button = button;
2189 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
2191 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2192 sTreeSampleSelection.multiple_button = button;
2194 sTreeSampleSelection.selection_mode_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
2196 /* create option mode frame */
2197 frame = gtk_frame_new("Options");
2198 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
2200 box4 = gtk_vbox_new(FALSE, 0);
2201 gtk_container_add(GTK_CONTAINER(frame), box4);
2202 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
2204 /* create check button */
2205 button = gtk_check_button_new_with_label("Draw line");
2206 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2207 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
2208 sTreeSampleSelection.draw_line_button = button;
2210 button = gtk_check_button_new_with_label("View Line mode");
2211 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2212 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
2213 sTreeSampleSelection.view_line_button = button;
2215 button = gtk_check_button_new_with_label("Without Root item");
2216 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
2217 sTreeSampleSelection.no_root_item_button = button;
2219 /* create recursion parameter */
2220 frame = gtk_frame_new("Size Parameters");
2221 gtk_box_pack_start(GTK_BOX(box2), frame, TRUE, TRUE, 0);
2223 box4 = gtk_hbox_new(FALSE, 5);
2224 gtk_container_add(GTK_CONTAINER(frame), box4);
2225 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
2227 /* create number of item spin button */
2228 box5 = gtk_hbox_new(FALSE, 5);
2229 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
2231 label = gtk_label_new("Number of items : ");
2232 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2233 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
2235 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_NUMBER_OF_ITEM, 1.0, 255.0, 1.0,
2237 spinner = gtk_spin_button_new (adj, 0, 0);
2238 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
2239 sTreeSampleSelection.nb_item_spinner = spinner;
2241 /* create recursion level spin button */
2242 box5 = gtk_hbox_new(FALSE, 5);
2243 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
2245 label = gtk_label_new("Depth : ");
2246 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2247 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
2249 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_RECURSION_LEVEL, 0.0, 255.0, 1.0,
2251 spinner = gtk_spin_button_new (adj, 0, 0);
2252 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
2253 sTreeSampleSelection.recursion_spinner = spinner;
2255 /* create horizontal separator */
2256 separator = gtk_hseparator_new();
2257 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
2259 /* create bottom button box */
2260 box2 = gtk_hbox_new(TRUE, 10);
2261 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
2262 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
2264 button = gtk_button_new_with_label("Create Tree");
2265 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2266 g_signal_connect (button, "clicked",
2267 G_CALLBACK (cb_create_tree), NULL);
2269 button = gtk_button_new_with_label("Close");
2270 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
2271 g_signal_connect_swapped (button, "clicked",
2272 G_CALLBACK (gtk_widget_destroy),
2275 if (!GTK_WIDGET_VISIBLE (window))
2276 gtk_widget_show_all (window);
2278 gtk_widget_destroy (window);
2284 #define GRID_SIZE 20
2285 #define DEFAULT_GEOMETRY "10x10"
2288 gridded_geometry_expose (GtkWidget *widget,
2289 GdkEventExpose *event)
2293 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
2294 0, 0, widget->allocation.width, widget->allocation.height);
2296 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
2297 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
2299 if ((i + j) % 2 == 0)
2300 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
2301 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
2308 gridded_geometry_subresponse (GtkDialog *dialog,
2310 gchar *geometry_string)
2312 if (response_id == GTK_RESPONSE_NONE)
2314 gtk_widget_destroy (GTK_WIDGET (dialog));
2318 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
2320 g_print ("Can't parse geometry string %s\n", geometry_string);
2321 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
2327 gridded_geometry_response (GtkDialog *dialog,
2331 if (response_id == GTK_RESPONSE_NONE)
2333 gtk_widget_destroy (GTK_WIDGET (dialog));
2337 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
2338 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
2340 GtkWidget *drawing_area;
2342 GdkGeometry geometry;
2344 window = gtk_dialog_new_with_buttons (title,
2347 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
2350 gtk_window_set_screen (GTK_WINDOW (window),
2351 gtk_widget_get_screen (GTK_WIDGET (dialog)));
2353 g_signal_connect (window, "response",
2354 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
2356 box = gtk_vbox_new (FALSE, 0);
2357 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), box, TRUE, TRUE, 0);
2359 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
2361 drawing_area = gtk_drawing_area_new ();
2362 g_signal_connect (drawing_area, "expose_event",
2363 G_CALLBACK (gridded_geometry_expose), NULL);
2364 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
2366 /* Gross hack to work around bug 68668... if we set the size request
2367 * large enough, then the current
2369 * request_of_window - request_of_geometry_widget
2371 * method of getting the base size works more or less works.
2373 gtk_widget_set_size_request (drawing_area, 2000, 2000);
2375 geometry.base_width = 0;
2376 geometry.base_height = 0;
2377 geometry.min_width = 2 * GRID_SIZE;
2378 geometry.min_height = 2 * GRID_SIZE;
2379 geometry.width_inc = GRID_SIZE;
2380 geometry.height_inc = GRID_SIZE;
2382 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
2384 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
2386 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
2388 g_print ("Can't parse geometry string %s\n", geometry_string);
2389 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
2392 gtk_widget_show_all (window);
2397 create_gridded_geometry (GtkWidget *widget)
2399 static GtkWidget *window = NULL;
2405 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
2408 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
2411 gtk_window_set_screen (GTK_WINDOW (window),
2412 gtk_widget_get_screen (widget));
2414 label = gtk_label_new ("Geometry string:");
2415 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0);
2417 entry = gtk_entry_new ();
2418 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
2419 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), entry, FALSE, FALSE, 0);
2421 g_signal_connect (window, "response",
2422 G_CALLBACK (gridded_geometry_response), entry);
2423 g_object_add_weak_pointer (G_OBJECT (window), (gpointer) &window);
2425 gtk_widget_show_all (window);
2428 gtk_widget_destroy (window);
2436 handle_box_child_signal (GtkHandleBox *hb,
2438 const gchar *action)
2440 printf ("%s: child <%s> %sed\n",
2441 g_type_name (G_OBJECT_TYPE (hb)),
2442 g_type_name (G_OBJECT_TYPE (child)),
2447 create_handle_box (GtkWidget *widget)
2449 static GtkWidget* window = NULL;
2450 GtkWidget *handle_box;
2451 GtkWidget *handle_box2;
2456 GtkWidget *separator;
2460 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2462 gtk_window_set_screen (GTK_WINDOW (window),
2463 gtk_widget_get_screen (widget));
2464 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
2465 gtk_window_set_title (GTK_WINDOW (window),
2467 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2469 g_signal_connect (window, "destroy",
2470 G_CALLBACK (gtk_widget_destroyed),
2473 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
2475 vbox = gtk_vbox_new (FALSE, 0);
2476 gtk_container_add (GTK_CONTAINER (window), vbox);
2477 gtk_widget_show (vbox);
2479 label = gtk_label_new ("Above");
2480 gtk_container_add (GTK_CONTAINER (vbox), label);
2481 gtk_widget_show (label);
2483 separator = gtk_hseparator_new ();
2484 gtk_container_add (GTK_CONTAINER (vbox), separator);
2485 gtk_widget_show (separator);
2487 hbox = gtk_hbox_new (FALSE, 10);
2488 gtk_container_add (GTK_CONTAINER (vbox), hbox);
2489 gtk_widget_show (hbox);
2491 separator = gtk_hseparator_new ();
2492 gtk_container_add (GTK_CONTAINER (vbox), separator);
2493 gtk_widget_show (separator);
2495 label = gtk_label_new ("Below");
2496 gtk_container_add (GTK_CONTAINER (vbox), label);
2497 gtk_widget_show (label);
2499 handle_box = gtk_handle_box_new ();
2500 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2501 g_signal_connect (handle_box,
2503 G_CALLBACK (handle_box_child_signal),
2505 g_signal_connect (handle_box,
2507 G_CALLBACK (handle_box_child_signal),
2509 gtk_widget_show (handle_box);
2511 toolbar = make_toolbar (window);
2513 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2514 gtk_widget_show (toolbar);
2516 handle_box = gtk_handle_box_new ();
2517 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2518 g_signal_connect (handle_box,
2520 G_CALLBACK (handle_box_child_signal),
2522 g_signal_connect (handle_box,
2524 G_CALLBACK (handle_box_child_signal),
2526 gtk_widget_show (handle_box);
2528 handle_box2 = gtk_handle_box_new ();
2529 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2530 g_signal_connect (handle_box2,
2532 G_CALLBACK (handle_box_child_signal),
2534 g_signal_connect (handle_box2,
2536 G_CALLBACK (handle_box_child_signal),
2538 gtk_widget_show (handle_box2);
2540 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
2541 label = gtk_label_new ("Fooo!");
2542 gtk_container_add (GTK_CONTAINER (hbox), label);
2543 gtk_widget_show (label);
2544 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
2547 if (!GTK_WIDGET_VISIBLE (window))
2548 gtk_widget_show (window);
2550 gtk_widget_destroy (window);
2554 * Test for getting an image from a drawable
2565 take_snapshot (GtkWidget *button,
2568 struct GetImageData *gid = data;
2569 GdkRectangle visible;
2571 int height_fraction;
2574 GdkColor color = { 0, 30000, 0, 0 };
2575 GdkRectangle target;
2578 /* Do some begin_paint_rect on some random rects, draw some
2579 * distinctive stuff into those rects, then take the snapshot.
2580 * figure out whether any rects were overlapped and report to
2584 visible = gid->sw->allocation;
2586 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2587 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2589 width_fraction = visible.width / 4;
2590 height_fraction = visible.height / 4;
2592 gc = gdk_gc_new (gid->src->window);
2593 black_gc = gid->src->style->black_gc;
2595 gdk_gc_set_rgb_fg_color (gc, &color);
2598 target.x = visible.x + width_fraction;
2599 target.y = visible.y + height_fraction * 3;
2600 target.width = width_fraction;
2601 target.height = height_fraction / 2;
2603 gdk_window_begin_paint_rect (gid->src->window,
2606 gdk_draw_rectangle (gid->src->window,
2610 target.width, target.height);
2612 gdk_draw_rectangle (gid->src->window,
2615 target.x + 10, target.y + 10,
2616 target.width - 20, target.height - 20);
2618 target.x = visible.x + width_fraction;
2619 target.y = visible.y + height_fraction;
2620 target.width = width_fraction;
2621 target.height = height_fraction;
2623 gdk_window_begin_paint_rect (gid->src->window,
2626 gdk_draw_rectangle (gid->src->window,
2630 target.width, target.height);
2632 gdk_draw_rectangle (gid->src->window,
2635 target.x + 10, target.y + 10,
2636 target.width - 20, target.height - 20);
2638 target.x = visible.x + width_fraction * 3;
2639 target.y = visible.y + height_fraction;
2640 target.width = width_fraction / 2;
2641 target.height = height_fraction;
2643 gdk_window_begin_paint_rect (gid->src->window,
2646 gdk_draw_rectangle (gid->src->window,
2650 target.width, target.height);
2652 gdk_draw_rectangle (gid->src->window,
2655 target.x + 10, target.y + 10,
2656 target.width - 20, target.height - 20);
2658 target.x = visible.x + width_fraction * 2;
2659 target.y = visible.y + height_fraction * 2;
2660 target.width = width_fraction / 4;
2661 target.height = height_fraction / 4;
2663 gdk_window_begin_paint_rect (gid->src->window,
2666 gdk_draw_rectangle (gid->src->window,
2670 target.width, target.height);
2672 gdk_draw_rectangle (gid->src->window,
2675 target.x + 10, target.y + 10,
2676 target.width - 20, target.height - 20);
2678 target.x += target.width / 2;
2679 target.y += target.width / 2;
2681 gdk_window_begin_paint_rect (gid->src->window,
2684 gdk_draw_rectangle (gid->src->window,
2688 target.width, target.height);
2690 gdk_draw_rectangle (gid->src->window,
2693 target.x + 10, target.y + 10,
2694 target.width - 20, target.height - 20);
2696 /* Screen shot area */
2698 target.x = visible.x + width_fraction * 1.5;
2699 target.y = visible.y + height_fraction * 1.5;
2700 target.width = width_fraction * 2;
2701 target.height = height_fraction * 2;
2703 shot = gdk_drawable_get_image (gid->src->window,
2705 target.width, target.height);
2707 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2710 g_object_unref (shot);
2712 gdk_window_end_paint (gid->src->window);
2713 gdk_window_end_paint (gid->src->window);
2714 gdk_window_end_paint (gid->src->window);
2715 gdk_window_end_paint (gid->src->window);
2716 gdk_window_end_paint (gid->src->window);
2718 gdk_draw_rectangle (gid->src->window,
2719 gid->src->style->black_gc,
2722 target.width, target.height);
2724 g_object_unref (gc);
2728 image_source_expose (GtkWidget *da,
2729 GdkEventExpose *event,
2732 int x = event->area.x;
2733 GdkColor red = { 0, 65535, 0, 0 };
2734 GdkColor green = { 0, 0, 65535, 0 };
2735 GdkColor blue = { 0, 0, 0, 65535 };
2738 gc = gdk_gc_new (event->window);
2740 while (x < (event->area.x + event->area.width))
2747 gdk_gc_set_rgb_fg_color (gc, &red);
2753 gdk_gc_set_rgb_fg_color (gc, &green);
2759 gdk_gc_set_rgb_fg_color (gc, &blue);
2763 g_assert_not_reached ();
2767 gdk_draw_line (event->window,
2770 x, event->area.y + event->area.height);
2775 g_object_unref (gc);
2781 create_get_image (GtkWidget *widget)
2783 static GtkWidget *window = NULL;
2786 gtk_widget_destroy (window);
2795 struct GetImageData *gid;
2797 gid = g_new (struct GetImageData, 1);
2799 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2801 gtk_window_set_screen (GTK_WINDOW (window),
2802 gtk_widget_get_screen (widget));
2804 g_signal_connect (window,
2806 G_CALLBACK (gtk_widget_destroyed),
2809 g_object_set_data_full (G_OBJECT (window),
2810 "testgtk-get-image-data",
2814 hbox = gtk_hbox_new (FALSE, 0);
2816 gtk_container_add (GTK_CONTAINER (window), hbox);
2818 sw = gtk_scrolled_window_new (NULL, NULL);
2819 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2820 GTK_POLICY_AUTOMATIC,
2821 GTK_POLICY_AUTOMATIC);
2825 gtk_widget_set_size_request (sw, 400, 400);
2827 src = gtk_drawing_area_new ();
2828 gtk_widget_set_size_request (src, 10000, 10000);
2830 g_signal_connect (src,
2832 G_CALLBACK (image_source_expose),
2837 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2840 gtk_box_pack_start (GTK_BOX (hbox),
2844 vbox = gtk_vbox_new (FALSE, 3);
2846 snap = gtk_widget_new (GTK_TYPE_IMAGE, NULL);
2850 sw = gtk_scrolled_window_new (NULL, NULL);
2851 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2852 GTK_POLICY_AUTOMATIC,
2853 GTK_POLICY_AUTOMATIC);
2854 gtk_widget_set_size_request (sw, 300, 300);
2856 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2858 gtk_box_pack_end (GTK_BOX (vbox), sw, FALSE, FALSE, 5);
2860 button = gtk_button_new_with_label ("Get image from drawable");
2862 g_signal_connect (button,
2864 G_CALLBACK (take_snapshot),
2867 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2869 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2871 gtk_widget_show_all (window);
2879 sensitivity_toggled (GtkWidget *toggle,
2882 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2886 create_sensitivity_control (GtkWidget *widget)
2890 button = gtk_toggle_button_new_with_label ("Sensitive");
2892 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2893 GTK_WIDGET_IS_SENSITIVE (widget));
2895 g_signal_connect (button,
2897 G_CALLBACK (sensitivity_toggled),
2900 gtk_widget_show_all (button);
2906 set_selectable_recursive (GtkWidget *widget,
2909 if (GTK_IS_CONTAINER (widget))
2914 children = gtk_container_get_children (GTK_CONTAINER (widget));
2918 set_selectable_recursive (tmp->data, setting);
2922 g_list_free (children);
2924 else if (GTK_IS_LABEL (widget))
2926 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2931 selectable_toggled (GtkWidget *toggle,
2934 set_selectable_recursive (widget,
2935 GTK_TOGGLE_BUTTON (toggle)->active);
2939 create_selectable_control (GtkWidget *widget)
2943 button = gtk_toggle_button_new_with_label ("Selectable");
2945 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2948 g_signal_connect (button,
2950 G_CALLBACK (selectable_toggled),
2953 gtk_widget_show_all (button);
2958 void create_labels (GtkWidget *widget)
2960 static GtkWidget *window = NULL;
2969 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2971 gtk_window_set_screen (GTK_WINDOW (window),
2972 gtk_widget_get_screen (widget));
2974 g_signal_connect (window, "destroy",
2975 G_CALLBACK (gtk_widget_destroyed),
2978 gtk_window_set_title (GTK_WINDOW (window), "Label");
2980 vbox = gtk_vbox_new (FALSE, 5);
2982 hbox = gtk_hbox_new (FALSE, 5);
2983 gtk_container_add (GTK_CONTAINER (window), vbox);
2985 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2987 button = create_sensitivity_control (hbox);
2989 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2991 button = create_selectable_control (hbox);
2993 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2995 vbox = gtk_vbox_new (FALSE, 5);
2997 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2998 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
3000 frame = gtk_frame_new ("Normal Label");
3001 label = gtk_label_new ("This is a Normal label");
3002 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
3003 gtk_container_add (GTK_CONTAINER (frame), label);
3004 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3006 frame = gtk_frame_new ("Multi-line Label");
3007 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
3008 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
3009 gtk_container_add (GTK_CONTAINER (frame), label);
3010 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3012 frame = gtk_frame_new ("Left Justified Label");
3013 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
3014 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
3015 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3016 gtk_container_add (GTK_CONTAINER (frame), label);
3017 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3019 frame = gtk_frame_new ("Right Justified Label");
3020 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
3021 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
3022 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
3023 gtk_container_add (GTK_CONTAINER (frame), label);
3024 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3026 frame = gtk_frame_new ("Internationalized Label");
3027 label = gtk_label_new (NULL);
3028 gtk_label_set_markup (GTK_LABEL (label),
3029 "French (Fran\303\247ais) Bonjour, Salut\n"
3030 "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"
3031 "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"
3032 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
3033 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
3034 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
3035 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3036 gtk_container_add (GTK_CONTAINER (frame), label);
3037 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3039 frame = gtk_frame_new ("Bidirection Label");
3040 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"
3041 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
3042 gtk_container_add (GTK_CONTAINER (frame), label);
3043 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3045 vbox = gtk_vbox_new (FALSE, 5);
3046 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
3047 frame = gtk_frame_new ("Line wrapped label");
3048 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
3049 "up the entire "/* big space to test spacing */\
3050 "width allocated to it, but automatically wraps the words to fit. "\
3051 "The time has come, for all good men, to come to the aid of their party. "\
3052 "The sixth sheik's six sheep's sick.\n"\
3053 " It supports multiple paragraphs correctly, and correctly adds "\
3054 "many extra spaces. ");
3056 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
3057 gtk_container_add (GTK_CONTAINER (frame), label);
3058 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3060 frame = gtk_frame_new ("Filled, wrapped label");
3061 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
3062 "up the entire width allocated to it. Here is a seneance to prove "\
3063 "my point. Here is another sentence. "\
3064 "Here comes the sun, do de do de do.\n"\
3065 " This is a new paragraph.\n"\
3066 " This is another newer, longer, better paragraph. It is coming to an end, "\
3068 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
3069 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
3070 gtk_container_add (GTK_CONTAINER (frame), label);
3071 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3073 frame = gtk_frame_new ("Underlined label");
3074 label = gtk_label_new ("This label is underlined!\n"
3075 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
3076 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3077 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
3078 gtk_container_add (GTK_CONTAINER (frame), label);
3079 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3081 frame = gtk_frame_new ("Markup label");
3082 label = gtk_label_new (NULL);
3084 /* There's also a gtk_label_set_markup() without accel if you
3085 * don't have an accelerator key
3087 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
3088 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
3089 "<b>markup</b> _such as "
3090 "<big><i>Big Italics</i></big>\n"
3091 "<tt>Monospace font</tt>\n"
3092 "<u>Underline!</u>\n"
3094 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
3095 "and nothing on this line,\n"
3098 "or even on this one\n"
3099 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
3100 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
3101 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
3103 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
3105 gtk_container_add (GTK_CONTAINER (frame), label);
3106 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
3109 if (!GTK_WIDGET_VISIBLE (window))
3110 gtk_widget_show_all (window);
3112 gtk_widget_destroy (window);
3116 on_angle_scale_changed (GtkRange *range,
3119 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
3123 create_rotated_label (GtkWidget *widget)
3125 static GtkWidget *window = NULL;
3129 GtkWidget *scale_label;
3130 GtkWidget *scale_hbox;
3134 window = gtk_dialog_new_with_buttons ("Rotated Label",
3135 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
3136 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3139 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3141 gtk_window_set_screen (GTK_WINDOW (window),
3142 gtk_widget_get_screen (widget));
3144 g_signal_connect (window, "response",
3145 G_CALLBACK (gtk_object_destroy), NULL);
3146 g_signal_connect (window, "destroy",
3147 G_CALLBACK (gtk_widget_destroyed), &window);
3149 vbox = gtk_vbox_new (FALSE, 5);
3150 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0);
3151 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
3153 label = gtk_label_new (NULL);
3154 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
3155 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
3157 scale_hbox = gtk_hbox_new (FALSE, 0);
3158 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
3160 scale_label = gtk_label_new (NULL);
3161 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
3162 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
3164 hscale = gtk_hscale_new_with_range (0, 360, 5);
3165 g_signal_connect (hscale, "value-changed",
3166 G_CALLBACK (on_angle_scale_changed), label);
3168 gtk_range_set_value (GTK_RANGE (hscale), 45);
3169 gtk_widget_set_usize (hscale, 200, -1);
3170 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
3173 if (!GTK_WIDGET_VISIBLE (window))
3174 gtk_widget_show_all (window);
3176 gtk_widget_destroy (window);
3179 #define DEFAULT_TEXT_RADIUS 200
3182 on_rotated_text_unrealize (GtkWidget *widget)
3184 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
3188 on_rotated_text_expose (GtkWidget *widget,
3189 GdkEventExpose *event,
3190 GdkPixbuf *tile_pixbuf)
3192 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
3193 "had", "10,000", "men" };
3194 PangoRenderer *renderer;
3199 PangoMatrix matrix = PANGO_MATRIX_INIT;
3200 PangoLayout *layout;
3201 PangoContext *context;
3202 PangoFontDescription *desc;
3204 gc = g_object_get_data (G_OBJECT (widget), "text-gc");
3207 static GdkColor black = { 0, 0, 0, 0 };
3209 gc = gdk_gc_new (widget->window);
3210 gdk_gc_set_rgb_fg_color (gc, &black);
3216 gint width = gdk_pixbuf_get_width (tile_pixbuf);
3217 gint height = gdk_pixbuf_get_height (tile_pixbuf);
3219 tile = gdk_pixmap_new (widget->window, width, height, -1);
3220 gdk_draw_pixbuf (tile, gc, tile_pixbuf,
3221 0, 0, 0, 0, width, height,
3222 GDK_RGB_DITHER_NORMAL, 0, 0);
3224 gdk_gc_set_tile (gc, tile);
3225 gdk_gc_set_fill (gc, GDK_TILED);
3227 g_object_unref (tile);
3230 g_object_set_data_full (G_OBJECT (widget), "text-gc", gc, (GDestroyNotify)g_object_unref);
3233 renderer = gdk_pango_renderer_get_default (gtk_widget_get_screen (widget));
3234 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), widget->window);
3235 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), gc);
3237 radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
3239 pango_matrix_translate (&matrix,
3240 radius + (widget->allocation.width - 2 * radius) / 2,
3241 radius + (widget->allocation.height - 2 * radius) / 2);
3242 pango_matrix_scale (&matrix, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
3244 context = gtk_widget_get_pango_context (widget);
3245 layout = pango_layout_new (context);
3246 desc = pango_font_description_from_string ("Sans Bold 30");
3247 pango_layout_set_font_description (layout, desc);
3248 pango_font_description_free (desc);
3250 n_words = G_N_ELEMENTS (words);
3251 for (i = 0; i < n_words; i++)
3253 PangoMatrix rotated_matrix = matrix;
3256 pango_matrix_rotate (&rotated_matrix, - (360. * i) / n_words);
3258 pango_context_set_matrix (context, &rotated_matrix);
3259 pango_layout_context_changed (layout);
3260 pango_layout_set_text (layout, words[i], -1);
3262 pango_layout_get_size (layout, &width, &height);
3264 pango_renderer_draw_layout (renderer, layout,
3265 - width / 2, - DEFAULT_TEXT_RADIUS * PANGO_SCALE);
3268 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL);
3269 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL);
3271 g_object_unref (layout);
3277 create_rotated_text (GtkWidget *widget)
3279 static GtkWidget *window = NULL;
3283 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
3284 GtkRequisition requisition;
3285 GtkWidget *drawing_area;
3286 GdkPixbuf *tile_pixbuf;
3288 window = gtk_dialog_new_with_buttons ("Rotated Text",
3289 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
3290 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3293 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3295 gtk_window_set_screen (GTK_WINDOW (window),
3296 gtk_widget_get_screen (widget));
3298 g_signal_connect (window, "response",
3299 G_CALLBACK (gtk_object_destroy), NULL);
3300 g_signal_connect (window, "destroy",
3301 G_CALLBACK (gtk_widget_destroyed), &window);
3303 drawing_area = gtk_drawing_area_new ();
3304 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), drawing_area, TRUE, TRUE, 0);
3305 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
3307 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
3309 g_signal_connect (drawing_area, "expose-event",
3310 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
3311 g_signal_connect (drawing_area, "unrealize",
3312 G_CALLBACK (on_rotated_text_unrealize), NULL);
3314 gtk_widget_show_all (GTK_BIN (window)->child);
3316 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
3317 gtk_widget_size_request (window, &requisition);
3318 gtk_widget_set_size_request (drawing_area, -1, -1);
3319 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
3322 if (!GTK_WIDGET_VISIBLE (window))
3323 gtk_widget_show (window);
3325 gtk_widget_destroy (window);
3333 reparent_label (GtkWidget *widget,
3334 GtkWidget *new_parent)
3338 label = g_object_get_data (G_OBJECT (widget), "user_data");
3340 gtk_widget_reparent (label, new_parent);
3344 set_parent_signal (GtkWidget *child,
3345 GtkWidget *old_parent,
3348 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
3349 g_type_name (G_OBJECT_TYPE (child)),
3350 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
3351 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
3352 GPOINTER_TO_INT (func_data));
3356 create_reparent (GtkWidget *widget)
3358 static GtkWidget *window = NULL;
3365 GtkWidget *separator;
3366 GtkWidget *event_box;
3370 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3372 gtk_window_set_screen (GTK_WINDOW (window),
3373 gtk_widget_get_screen (widget));
3375 g_signal_connect (window, "destroy",
3376 G_CALLBACK (gtk_widget_destroyed),
3379 gtk_window_set_title (GTK_WINDOW (window), "reparent");
3380 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3382 box1 = gtk_vbox_new (FALSE, 0);
3383 gtk_container_add (GTK_CONTAINER (window), box1);
3385 box2 = gtk_hbox_new (FALSE, 5);
3386 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3387 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3389 label = gtk_label_new ("Hello World");
3391 frame = gtk_frame_new ("Frame 1");
3392 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
3394 box3 = gtk_vbox_new (FALSE, 5);
3395 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
3396 gtk_container_add (GTK_CONTAINER (frame), box3);
3398 button = gtk_button_new_with_label ("switch");
3399 g_object_set_data (G_OBJECT (button), "user_data", label);
3400 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
3402 event_box = gtk_event_box_new ();
3403 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
3404 gtk_container_add (GTK_CONTAINER (event_box), label);
3406 g_signal_connect (button, "clicked",
3407 G_CALLBACK (reparent_label),
3410 g_signal_connect (label, "parent_set",
3411 G_CALLBACK (set_parent_signal),
3412 GINT_TO_POINTER (42));
3414 frame = gtk_frame_new ("Frame 2");
3415 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
3417 box3 = gtk_vbox_new (FALSE, 5);
3418 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
3419 gtk_container_add (GTK_CONTAINER (frame), box3);
3421 button = gtk_button_new_with_label ("switch");
3422 g_object_set_data (G_OBJECT (button), "user_data", label);
3423 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
3425 event_box = gtk_event_box_new ();
3426 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
3428 g_signal_connect (button, "clicked",
3429 G_CALLBACK (reparent_label),
3432 separator = gtk_hseparator_new ();
3433 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3435 box2 = gtk_vbox_new (FALSE, 10);
3436 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3437 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3439 button = gtk_button_new_with_label ("close");
3440 g_signal_connect_swapped (button, "clicked",
3441 G_CALLBACK (gtk_widget_destroy), window);
3442 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3443 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3444 gtk_widget_grab_default (button);
3447 if (!GTK_WIDGET_VISIBLE (window))
3448 gtk_widget_show_all (window);
3450 gtk_widget_destroy (window);
3457 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
3459 if (event->type == GDK_BUTTON_PRESS)
3461 if (event->button == 1)
3462 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
3463 event->button, event->x_root, event->y_root,
3465 else if (event->button == 2)
3466 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
3467 event->button, event->x_root, event->y_root,
3474 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
3476 gtk_paint_resize_grip (area->style,
3478 GTK_WIDGET_STATE (area),
3484 area->allocation.width,
3485 area->allocation.height);
3491 create_resize_grips (GtkWidget *widget)
3493 static GtkWidget *window = NULL;
3495 GtkWidget *hbox, *vbox;
3498 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3500 gtk_window_set_screen (GTK_WINDOW (window),
3501 gtk_widget_get_screen (widget));
3503 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
3505 g_signal_connect (window, "destroy",
3506 G_CALLBACK (gtk_widget_destroyed),
3509 vbox = gtk_vbox_new (FALSE, 0);
3510 gtk_container_add (GTK_CONTAINER (window), vbox);
3512 hbox = gtk_hbox_new (FALSE, 0);
3513 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3516 area = gtk_drawing_area_new ();
3517 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3518 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3519 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3520 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3521 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3522 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3525 area = gtk_drawing_area_new ();
3526 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3527 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3528 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3529 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3530 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3531 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3534 area = gtk_drawing_area_new ();
3535 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3536 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3537 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3538 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3539 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3540 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3542 hbox = gtk_hbox_new (FALSE, 0);
3543 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3546 area = gtk_drawing_area_new ();
3547 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3548 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3549 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3550 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3551 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3552 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3555 area = gtk_drawing_area_new ();
3556 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3559 area = gtk_drawing_area_new ();
3560 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3561 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3562 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3563 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3564 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3565 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3568 hbox = gtk_hbox_new (FALSE, 0);
3569 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3572 area = gtk_drawing_area_new ();
3573 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3574 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3575 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3576 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3577 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3578 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3580 area = gtk_drawing_area_new ();
3581 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3582 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3583 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3584 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3585 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3586 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3589 area = gtk_drawing_area_new ();
3590 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3591 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3592 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3593 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3594 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3595 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3598 if (!GTK_WIDGET_VISIBLE (window))
3599 gtk_widget_show_all (window);
3601 gtk_widget_destroy (window);
3607 gint upositionx = 0;
3608 gint upositiony = 0;
3611 uposition_configure (GtkWidget *window)
3617 lx = g_object_get_data (G_OBJECT (window), "x");
3618 ly = g_object_get_data (G_OBJECT (window), "y");
3620 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
3621 sprintf (buffer, "%d", upositionx);
3622 gtk_label_set_text (lx, buffer);
3623 sprintf (buffer, "%d", upositiony);
3624 gtk_label_set_text (ly, buffer);
3630 uposition_stop_configure (GtkToggleButton *toggle,
3634 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
3636 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
3640 create_saved_position (GtkWidget *widget)
3642 static GtkWidget *window = NULL;
3647 GtkWidget *main_vbox;
3655 window = g_object_connect (gtk_widget_new (GTK_TYPE_WINDOW,
3656 "type", GTK_WINDOW_TOPLEVEL,
3657 "title", "Saved Position",
3659 "signal::configure_event", uposition_configure, NULL,
3662 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3664 gtk_window_set_screen (GTK_WINDOW (window),
3665 gtk_widget_get_screen (widget));
3668 g_signal_connect (window, "destroy",
3669 G_CALLBACK (gtk_widget_destroyed),
3672 main_vbox = gtk_vbox_new (FALSE, 5);
3673 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3674 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3677 gtk_widget_new (gtk_vbox_get_type (),
3678 "GtkBox::homogeneous", FALSE,
3679 "GtkBox::spacing", 5,
3680 "GtkContainer::border_width", 10,
3681 "GtkWidget::parent", main_vbox,
3682 "GtkWidget::visible", TRUE,
3683 "child", g_object_connect (gtk_widget_new (GTK_TYPE_TOGGLE_BUTTON,
3684 "label", "Stop Events",
3688 "signal::clicked", uposition_stop_configure, window,
3692 hbox = gtk_hbox_new (FALSE, 0);
3693 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3694 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3696 label = gtk_label_new ("X Origin : ");
3697 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3698 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3700 x_label = gtk_label_new ("");
3701 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3702 g_object_set_data (G_OBJECT (window), "x", x_label);
3704 hbox = gtk_hbox_new (FALSE, 0);
3705 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3706 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3708 label = gtk_label_new ("Y Origin : ");
3709 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3710 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3712 y_label = gtk_label_new ("");
3713 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3714 g_object_set_data (G_OBJECT (window), "y", y_label);
3717 gtk_widget_new (gtk_hseparator_get_type (),
3718 "GtkWidget::visible", TRUE,
3720 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3722 hbox = gtk_hbox_new (FALSE, 0);
3723 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3724 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3726 button = gtk_button_new_with_label ("Close");
3727 g_signal_connect_swapped (button, "clicked",
3728 G_CALLBACK (gtk_widget_destroy),
3730 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3731 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3732 gtk_widget_grab_default (button);
3734 gtk_widget_show_all (window);
3737 gtk_widget_destroy (window);
3745 create_pixmap (GtkWidget *widget)
3747 static GtkWidget *window = NULL;
3753 GtkWidget *separator;
3754 GtkWidget *pixmapwid;
3758 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3760 gtk_window_set_screen (GTK_WINDOW (window),
3761 gtk_widget_get_screen (widget));
3763 g_signal_connect (window, "destroy",
3764 G_CALLBACK (gtk_widget_destroyed),
3767 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3768 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3769 gtk_widget_realize(window);
3771 box1 = gtk_vbox_new (FALSE, 0);
3772 gtk_container_add (GTK_CONTAINER (window), box1);
3774 box2 = gtk_vbox_new (FALSE, 10);
3775 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3776 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3778 button = gtk_button_new ();
3779 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3781 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3783 label = gtk_label_new ("Pixmap\ntest");
3784 box3 = gtk_hbox_new (FALSE, 0);
3785 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3786 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3787 gtk_container_add (GTK_CONTAINER (box3), label);
3788 gtk_container_add (GTK_CONTAINER (button), box3);
3790 button = gtk_button_new ();
3791 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3793 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3795 label = gtk_label_new ("Pixmap\ntest");
3796 box3 = gtk_hbox_new (FALSE, 0);
3797 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3798 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3799 gtk_container_add (GTK_CONTAINER (box3), label);
3800 gtk_container_add (GTK_CONTAINER (button), box3);
3802 gtk_widget_set_sensitive (button, FALSE);
3804 separator = gtk_hseparator_new ();
3805 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3807 box2 = gtk_vbox_new (FALSE, 10);
3808 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3809 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3811 button = gtk_button_new_with_label ("close");
3812 g_signal_connect_swapped (button, "clicked",
3813 G_CALLBACK (gtk_widget_destroy),
3815 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3816 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3817 gtk_widget_grab_default (button);
3820 if (!GTK_WIDGET_VISIBLE (window))
3821 gtk_widget_show_all (window);
3823 gtk_widget_destroy (window);
3827 tips_query_widget_entered (GtkTipsQuery *tips_query,
3829 const gchar *tip_text,
3830 const gchar *tip_private,
3833 if (GTK_TOGGLE_BUTTON (toggle)->active)
3835 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3836 /* don't let GtkTipsQuery reset its label */
3837 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3842 tips_query_widget_selected (GtkWidget *tips_query,
3844 const gchar *tip_text,
3845 const gchar *tip_private,
3846 GdkEventButton *event,
3850 g_print ("Help \"%s\" requested for <%s>\n",
3851 tip_private ? tip_private : "None",
3852 g_type_name (G_OBJECT_TYPE (widget)));
3857 create_tooltips (GtkWidget *widget)
3859 static GtkWidget *window = NULL;
3866 GtkWidget *tips_query;
3867 GtkWidget *separator;
3868 GtkTooltips *tooltips;
3873 gtk_widget_new (gtk_window_get_type (),
3874 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3875 "GtkContainer::border_width", 0,
3876 "GtkWindow::title", "Tooltips",
3877 "GtkWindow::allow_shrink", TRUE,
3878 "GtkWindow::allow_grow", FALSE,
3881 gtk_window_set_screen (GTK_WINDOW (window),
3882 gtk_widget_get_screen (widget));
3884 g_signal_connect (window, "destroy",
3885 G_CALLBACK (destroy_tooltips),
3888 tooltips=gtk_tooltips_new();
3889 g_object_ref (tooltips);
3890 gtk_object_sink (GTK_OBJECT (tooltips));
3891 g_object_set_data (G_OBJECT (window), "tooltips", tooltips);
3893 box1 = gtk_vbox_new (FALSE, 0);
3894 gtk_container_add (GTK_CONTAINER (window), box1);
3896 box2 = gtk_vbox_new (FALSE, 10);
3897 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3898 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3900 button = gtk_toggle_button_new_with_label ("button1");
3901 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3903 gtk_tooltips_set_tip (tooltips,
3906 "ContextHelp/buttons/1");
3908 button = gtk_toggle_button_new_with_label ("button2");
3909 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3911 gtk_tooltips_set_tip (tooltips,
3913 "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.",
3914 "ContextHelp/buttons/2_long");
3916 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3917 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3919 gtk_tooltips_set_tip (tooltips,
3921 "Toggle TipsQuery view.",
3925 gtk_widget_new (gtk_vbox_get_type (),
3926 "homogeneous", FALSE,
3932 tips_query = gtk_tips_query_new ();
3935 gtk_widget_new (gtk_button_get_type (),
3940 g_object_connect (button,
3941 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3943 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3944 gtk_tooltips_set_tip (tooltips,
3946 "Start the Tooltips Inspector",
3947 "ContextHelp/buttons/?");
3950 g_object_set (g_object_connect (tips_query,
3951 "signal::widget_entered", tips_query_widget_entered, toggle,
3952 "signal::widget_selected", tips_query_widget_selected, NULL,
3959 frame = gtk_widget_new (gtk_frame_get_type (),
3960 "label", "ToolTips Inspector",
3961 "label_xalign", (double) 0.5,
3967 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3969 separator = gtk_hseparator_new ();
3970 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3972 box2 = gtk_vbox_new (FALSE, 10);
3973 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3974 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3976 button = gtk_button_new_with_label ("close");
3977 g_signal_connect_swapped (button, "clicked",
3978 G_CALLBACK (gtk_widget_destroy),
3980 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3981 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3982 gtk_widget_grab_default (button);
3984 gtk_tooltips_set_tip (tooltips, button, "Push this button to close window", "ContextHelp/buttons/Close");
3987 if (!GTK_WIDGET_VISIBLE (window))
3988 gtk_widget_show_all (window);
3990 gtk_widget_destroy (window);
3998 pack_image (GtkWidget *box,
4002 gtk_box_pack_start (GTK_BOX (box),
4003 gtk_label_new (text),
4006 gtk_box_pack_start (GTK_BOX (box),
4012 create_image (GtkWidget *widget)
4014 static GtkWidget *window = NULL;
4022 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4024 gtk_window_set_screen (GTK_WINDOW (window),
4025 gtk_widget_get_screen (widget));
4027 /* this is bogus for testing drawing when allocation < request,
4028 * don't copy into real code
4030 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
4032 g_signal_connect (window, "destroy",
4033 G_CALLBACK (gtk_widget_destroyed),
4036 vbox = gtk_vbox_new (FALSE, 5);
4038 gtk_container_add (GTK_CONTAINER (window), vbox);
4040 pack_image (vbox, "Stock Warning Dialog",
4041 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
4042 GTK_ICON_SIZE_DIALOG));
4044 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
4045 gtk_widget_get_colormap (window),
4050 pack_image (vbox, "Pixmap",
4051 gtk_image_new_from_pixmap (pixmap, mask));
4054 if (!GTK_WIDGET_VISIBLE (window))
4055 gtk_widget_show_all (window);
4057 gtk_widget_destroy (window);
4065 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
4068 GtkWidget *menuitem;
4077 menu = gtk_menu_new ();
4078 gtk_menu_set_screen (GTK_MENU (menu), screen);
4084 menuitem = gtk_tearoff_menu_item_new ();
4085 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4086 gtk_widget_show (menuitem);
4089 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
4090 GTK_ICON_SIZE_MENU);
4091 gtk_widget_show (image);
4092 menuitem = gtk_image_menu_item_new_with_label ("Image item");
4093 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4094 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4095 gtk_widget_show (menuitem);
4097 for (i = 0, j = 1; i < length; i++, j++)
4099 sprintf (buf, "item %2d - %d", depth, j);
4101 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
4102 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
4106 gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
4109 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4110 gtk_widget_show (menuitem);
4112 gtk_widget_set_sensitive (menuitem, FALSE);
4115 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
4119 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
4120 create_menu (screen, depth - 1, 5, TRUE));
4127 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
4130 GtkWidget *menuitem;
4136 menu = gtk_menu_new ();
4137 gtk_menu_set_screen (GTK_MENU (menu), screen);
4142 menuitem = gtk_tearoff_menu_item_new ();
4143 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4144 gtk_widget_show (menuitem);
4148 menuitem = gtk_menu_item_new_with_label ("items");
4149 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4151 submenu = gtk_menu_new ();
4152 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4153 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4154 gtk_widget_show (menuitem);
4157 /* now fill the items submenu */
4158 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4159 GTK_ICON_SIZE_MENU);
4160 gtk_widget_show (image);
4161 menuitem = gtk_image_menu_item_new_with_label ("Image");
4162 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4163 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4164 gtk_widget_show (menuitem);
4166 menuitem = gtk_menu_item_new_with_label ("x");
4167 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
4168 gtk_widget_show (menuitem);
4170 menuitem = gtk_menu_item_new_with_label ("x");
4171 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
4172 gtk_widget_show (menuitem);
4174 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4175 GTK_ICON_SIZE_MENU);
4176 gtk_widget_show (image);
4177 menuitem = gtk_image_menu_item_new_with_label ("Image");
4178 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4179 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4180 gtk_widget_show (menuitem);
4182 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4183 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
4184 gtk_widget_show (menuitem);
4186 menuitem = gtk_menu_item_new_with_label ("x");
4187 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
4188 gtk_widget_show (menuitem);
4190 menuitem = gtk_menu_item_new_with_label ("x");
4191 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
4192 gtk_widget_show (menuitem);
4194 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
4195 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
4196 gtk_widget_show (menuitem);
4198 menuitem = gtk_check_menu_item_new_with_label ("Check");
4199 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
4200 gtk_widget_show (menuitem);
4202 menuitem = gtk_menu_item_new_with_label ("x");
4203 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
4204 gtk_widget_show (menuitem);
4206 menuitem = gtk_menu_item_new_with_label ("x");
4207 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
4208 gtk_widget_show (menuitem);
4210 menuitem = gtk_check_menu_item_new_with_label ("Check");
4211 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
4212 gtk_widget_show (menuitem);
4214 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4215 gtk_widget_show (menuitem);
4216 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
4218 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4219 gtk_widget_show (menuitem);
4220 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
4222 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4223 gtk_widget_show (menuitem);
4224 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
4226 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4227 gtk_widget_show (menuitem);
4228 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
4230 /* end of items submenu */
4232 menuitem = gtk_menu_item_new_with_label ("spanning");
4233 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
4235 submenu = gtk_menu_new ();
4236 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4237 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4238 gtk_widget_show (menuitem);
4241 /* now fill the spanning submenu */
4242 menuitem = gtk_menu_item_new_with_label ("a");
4243 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
4244 gtk_widget_show (menuitem);
4246 menuitem = gtk_menu_item_new_with_label ("b");
4247 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
4248 gtk_widget_show (menuitem);
4250 menuitem = gtk_menu_item_new_with_label ("c");
4251 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
4252 gtk_widget_show (menuitem);
4254 menuitem = gtk_menu_item_new_with_label ("d");
4255 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
4256 gtk_widget_show (menuitem);
4258 menuitem = gtk_menu_item_new_with_label ("e");
4259 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
4260 gtk_widget_show (menuitem);
4261 /* end of spanning submenu */
4263 menuitem = gtk_menu_item_new_with_label ("left");
4264 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
4265 submenu = gtk_menu_new ();
4266 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4267 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4268 gtk_widget_show (menuitem);
4270 menuitem = gtk_menu_item_new_with_label ("Empty");
4271 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4272 submenu = gtk_menu_new ();
4273 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4274 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4275 gtk_widget_show (menuitem);
4277 menuitem = gtk_menu_item_new_with_label ("right");
4278 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
4279 submenu = gtk_menu_new ();
4280 gtk_menu_set_screen (GTK_MENU (submenu), screen);
4281 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
4282 gtk_widget_show (menuitem);
4284 menuitem = gtk_menu_item_new_with_label ("Empty");
4285 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
4286 gtk_widget_show (menuitem);
4290 for (; j < rows; j++)
4291 for (i = 0; i < cols; i++)
4293 sprintf (buf, "(%d %d)", i, j);
4294 menuitem = gtk_menu_item_new_with_label (buf);
4295 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
4296 gtk_widget_show (menuitem);
4299 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
4300 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
4301 gtk_widget_show (menuitem);
4302 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
4303 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
4304 gtk_widget_show (menuitem);
4305 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
4306 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
4307 gtk_widget_show (menuitem);
4308 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
4309 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
4310 gtk_widget_show (menuitem);
4316 create_menus (GtkWidget *widget)
4318 static GtkWidget *window = NULL;
4322 GtkWidget *optionmenu;
4323 GtkWidget *separator;
4329 GtkWidget *menuitem;
4330 GtkAccelGroup *accel_group;
4332 GdkScreen *screen = gtk_widget_get_screen (widget);
4334 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4336 gtk_window_set_screen (GTK_WINDOW (window), screen);
4338 g_signal_connect (window, "destroy",
4339 G_CALLBACK (gtk_widget_destroyed),
4341 g_signal_connect (window, "delete-event",
4342 G_CALLBACK (gtk_true),
4345 accel_group = gtk_accel_group_new ();
4346 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4348 gtk_window_set_title (GTK_WINDOW (window), "menus");
4349 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4352 box1 = gtk_vbox_new (FALSE, 0);
4353 gtk_container_add (GTK_CONTAINER (window), box1);
4354 gtk_widget_show (box1);
4356 menubar = gtk_menu_bar_new ();
4357 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4358 gtk_widget_show (menubar);
4360 menu = create_menu (screen, 2, 50, TRUE);
4362 menuitem = gtk_menu_item_new_with_label ("test\nline2");
4363 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4364 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4365 gtk_widget_show (menuitem);
4367 menu = create_table_menu (screen, 2, 50, TRUE);
4369 menuitem = gtk_menu_item_new_with_label ("table");
4370 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4371 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4372 gtk_widget_show (menuitem);
4374 menuitem = gtk_menu_item_new_with_label ("foo");
4375 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
4376 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4377 gtk_widget_show (menuitem);
4379 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
4380 GTK_ICON_SIZE_MENU);
4381 gtk_widget_show (image);
4382 menuitem = gtk_image_menu_item_new_with_label ("Help");
4383 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
4384 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
4385 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
4386 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4387 gtk_widget_show (menuitem);
4389 menubar = gtk_menu_bar_new ();
4390 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
4391 gtk_widget_show (menubar);
4393 menu = create_menu (screen, 2, 10, TRUE);
4395 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
4396 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
4397 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
4398 gtk_widget_show (menuitem);
4400 box2 = gtk_vbox_new (FALSE, 10);
4401 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4402 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4403 gtk_widget_show (box2);
4405 menu = create_menu (screen, 1, 5, FALSE);
4406 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
4408 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
4409 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4410 gtk_widget_show (menuitem);
4412 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
4413 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4414 gtk_widget_show (menuitem);
4415 gtk_widget_add_accelerator (menuitem,
4421 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
4422 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4423 gtk_widget_show (menuitem);
4424 gtk_widget_add_accelerator (menuitem,
4429 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4430 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
4431 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4432 gtk_widget_show (menuitem);
4433 gtk_widget_add_accelerator (menuitem,
4439 gtk_widget_add_accelerator (menuitem,
4446 optionmenu = gtk_option_menu_new ();
4447 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
4448 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
4449 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
4450 gtk_widget_show (optionmenu);
4452 separator = gtk_hseparator_new ();
4453 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4454 gtk_widget_show (separator);
4456 box2 = gtk_vbox_new (FALSE, 10);
4457 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4458 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4459 gtk_widget_show (box2);
4461 button = gtk_button_new_with_label ("close");
4462 g_signal_connect_swapped (button, "clicked",
4463 G_CALLBACK (gtk_widget_destroy),
4465 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4466 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4467 gtk_widget_grab_default (button);
4468 gtk_widget_show (button);
4471 if (!GTK_WIDGET_VISIBLE (window))
4472 gtk_widget_show (window);
4474 gtk_widget_destroy (window);
4478 gtk_ifactory_cb (gpointer callback_data,
4479 guint callback_action,
4482 g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
4485 /* GdkPixbuf RGBA C-Source image dump */
4487 static const guint8 apple[] =
4489 /* Pixbuf magic (0x47646b50) */
4491 /* length: header (24) + pixel_data (2304) */
4493 /* pixdata_type (0x1010002) */
4495 /* rowstride (96) */
4502 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4503 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4504 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4505 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
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\26\24"
4509 "\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"
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`m"
4511 "[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"
4512 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4513 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`l[Blza\373s\202d\354w\206g\372p~c"
4514 "\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"
4515 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4516 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
4517 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
4518 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0eq"
4519 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
4520 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
4521 "\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["
4522 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
4523 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
4524 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
4525 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
4526 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
4527 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
4528 "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"
4529 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
4530 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
4531 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
4532 "\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"
4533 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
4534 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
4535 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
4536 "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"
4537 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
4538 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
4539 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
4540 "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"
4541 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
4542 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
4543 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4544 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4545 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4546 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4547 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4548 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4549 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4550 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4551 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4552 "\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>"
4553 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4554 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4555 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4556 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\205W\312\216\220`\377\230"
4557 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4558 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4559 "\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"
4560 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4561 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4562 "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"
4563 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4564 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4565 "\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"
4566 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4567 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4568 "\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"
4569 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4570 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4571 "\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"
4572 "\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"
4573 "\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"
4574 "\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"
4575 "\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"
4576 "\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"
4577 "\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"
4578 "\0\0\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"
4579 "\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"
4580 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4584 dump_accels (gpointer callback_data,
4585 guint callback_action,
4588 gtk_accel_map_save_fd (1 /* stdout */);
4591 static GtkItemFactoryEntry menu_items[] =
4593 { "/_File", NULL, NULL, 0, "<Branch>" },
4594 { "/File/tearoff1", NULL, gtk_ifactory_cb, 0, "<Tearoff>" },
4595 { "/File/_New", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_NEW },
4596 { "/File/_Open", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
4597 { "/File/_Save", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4598 { "/File/Save _As...", "<control>A", gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
4599 { "/File/_Dump \"_Accels\"", NULL, dump_accels, 0 },
4600 { "/File/\\/Test__Escaping/And\\/\n\tWei\\\\rdly",
4601 NULL, gtk_ifactory_cb, 0 },
4602 { "/File/sep1", NULL, gtk_ifactory_cb, 0, "<Separator>" },
4603 { "/File/_Quit", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
4605 { "/_Preferences", NULL, 0, 0, "<Branch>" },
4606 { "/_Preferences/_Color", NULL, 0, 0, "<Branch>" },
4607 { "/_Preferences/Color/_Red", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4608 { "/_Preferences/Color/_Green", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4609 { "/_Preferences/Color/_Blue", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
4610 { "/_Preferences/_Shape", NULL, 0, 0, "<Branch>" },
4611 { "/_Preferences/Shape/_Square", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
4612 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
4613 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
4614 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
4615 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
4616 { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple },
4617 { "/_Preferences/Coffee", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4618 { "/_Preferences/Toast", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4619 { "/_Preferences/Marshmallow Froot Loops", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
4621 /* For testing deletion of menus */
4622 { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
4623 { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
4624 { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
4626 { "/_Help", NULL, 0, 0, "<LastBranch>" },
4627 { "/Help/_Help", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_HELP},
4628 { "/Help/_About", NULL, gtk_ifactory_cb, 0 },
4632 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
4635 create_item_factory (GtkWidget *widget)
4637 static GtkWidget *window = NULL;
4643 GtkWidget *separator;
4646 GtkAccelGroup *accel_group;
4647 GtkItemFactory *item_factory;
4648 GtkTooltips *tooltips;
4650 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4652 gtk_window_set_screen (GTK_WINDOW (window),
4653 gtk_widget_get_screen (widget));
4655 g_signal_connect (window, "destroy",
4656 G_CALLBACK(gtk_widget_destroyed),
4658 g_signal_connect (window, "delete-event",
4659 G_CALLBACK (gtk_true),
4662 accel_group = gtk_accel_group_new ();
4663 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
4664 g_object_set_data_full (G_OBJECT (window),
4668 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4669 gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
4670 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4671 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
4673 /* preselect /Preferences/Shape/Oval over the other radios
4675 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4676 "/Preferences/Shape/Oval")),
4679 /* preselect /Preferences/Coffee
4681 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4682 "/Preferences/Coffee")),
4685 /* preselect /Preferences/Marshmallow Froot Loops and set it insensitive
4687 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
4688 "/Preferences/Marshmallow Froot Loops")),
4690 gtk_widget_set_sensitive (GTK_WIDGET (gtk_item_factory_get_item (item_factory,
4691 "/Preferences/Marshmallow Froot Loops")),
4694 /* Test how tooltips (ugh) work on menu items
4696 tooltips = gtk_tooltips_new ();
4697 g_object_ref (tooltips);
4698 gtk_object_sink (GTK_OBJECT (tooltips));
4699 g_object_set_data_full (G_OBJECT (window), "testgtk-tooltips",
4700 tooltips, (GDestroyNotify)g_object_unref);
4702 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/New"),
4703 "Create a new file", NULL);
4704 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Open"),
4705 "Open a file", NULL);
4706 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Save"),
4708 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/Preferences/Color"),
4709 "Modify color", NULL);
4711 box1 = gtk_vbox_new (FALSE, 0);
4712 gtk_container_add (GTK_CONTAINER (window), box1);
4714 gtk_box_pack_start (GTK_BOX (box1),
4715 gtk_item_factory_get_widget (item_factory, "<main>"),
4718 label = gtk_label_new ("Type\n<alt>\nto start");
4719 gtk_widget_set_size_request (label, 200, 200);
4720 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
4721 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
4724 separator = gtk_hseparator_new ();
4725 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4728 box2 = gtk_vbox_new (FALSE, 10);
4729 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4730 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4732 button = gtk_button_new_with_label ("close");
4733 g_signal_connect_swapped (button, "clicked",
4734 G_CALLBACK (gtk_widget_destroy),
4736 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4737 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4738 gtk_widget_grab_default (button);
4740 gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
4742 gtk_widget_show_all (window);
4745 gtk_widget_destroy (window);
4749 accel_button_new (GtkAccelGroup *accel_group,
4754 GdkModifierType modifiers;
4758 gtk_accelerator_parse (accel, &keyval, &modifiers);
4761 button = gtk_button_new ();
4762 gtk_widget_add_accelerator (button, "activate", accel_group,
4763 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4765 label = gtk_accel_label_new (text);
4766 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4767 gtk_widget_show (label);
4769 gtk_container_add (GTK_CONTAINER (button), label);
4775 create_key_lookup (GtkWidget *widget)
4777 static GtkWidget *window = NULL;
4781 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4784 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4785 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4788 gtk_window_set_screen (GTK_WINDOW (window),
4789 gtk_widget_get_screen (widget));
4791 /* We have to expand it so the accel labels will draw their labels
4793 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4795 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4797 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4798 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4799 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4800 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4801 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4802 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4803 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4804 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4805 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4806 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4807 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4808 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4809 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4810 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4811 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4812 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4813 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4814 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4815 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4816 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4817 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4818 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4819 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4820 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4821 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4822 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4823 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4824 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4826 g_object_add_weak_pointer (G_OBJECT (window), (gpointer) &window);
4827 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4829 gtk_widget_show_all (window);
4832 gtk_widget_destroy (window);
4841 cmw_destroy_cb(GtkWidget *widget)
4843 /* This is needed to get out of gtk_main */
4850 cmw_color (GtkWidget *widget, GtkWidget *parent)
4854 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4856 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4858 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4862 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4864 /* And mark it as a transient dialog */
4865 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4867 g_signal_connect (csd, "destroy",
4868 G_CALLBACK (cmw_destroy_cb), NULL);
4870 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4871 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4872 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4873 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4875 /* wait until destroy calls gtk_main_quit */
4876 gtk_widget_show (csd);
4881 cmw_file (GtkWidget *widget, GtkWidget *parent)
4885 fs = gtk_file_selection_new("This is a modal file selection dialog");
4887 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4890 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4892 /* And mark it as a transient dialog */
4893 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4895 g_signal_connect (fs, "destroy",
4896 G_CALLBACK (cmw_destroy_cb), NULL);
4898 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4899 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4900 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4901 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4903 /* wait until destroy calls gtk_main_quit */
4904 gtk_widget_show (fs);
4911 create_modal_window (GtkWidget *widget)
4913 GtkWidget *window = NULL;
4914 GtkWidget *box1,*box2;
4916 GtkWidget *btnColor,*btnFile,*btnClose;
4918 /* Create modal window (Here you can use any window descendent )*/
4919 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4920 gtk_window_set_screen (GTK_WINDOW (window),
4921 gtk_widget_get_screen (widget));
4923 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4925 /* Set window as modal */
4926 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4928 /* Create widgets */
4929 box1 = gtk_vbox_new (FALSE,5);
4930 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4931 box2 = gtk_vbox_new (TRUE,5);
4932 btnColor = gtk_button_new_with_label ("Color");
4933 btnFile = gtk_button_new_with_label ("File Selection");
4934 btnClose = gtk_button_new_with_label ("Close");
4937 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4938 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4941 gtk_container_add (GTK_CONTAINER (window), box1);
4942 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4943 gtk_container_add (GTK_CONTAINER (frame1), box2);
4944 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4945 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4946 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4947 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4949 /* connect signals */
4950 g_signal_connect_swapped (btnClose, "clicked",
4951 G_CALLBACK (gtk_widget_destroy), window);
4953 g_signal_connect (window, "destroy",
4954 G_CALLBACK (cmw_destroy_cb), NULL);
4956 g_signal_connect (btnColor, "clicked",
4957 G_CALLBACK (cmw_color), window);
4958 g_signal_connect (btnFile, "clicked",
4959 G_CALLBACK (cmw_file), window);
4962 gtk_widget_show_all (window);
4964 /* wait until dialog get destroyed */
4973 make_message_dialog (GdkScreen *screen,
4975 GtkMessageType type,
4976 GtkButtonsType buttons,
4977 guint default_response)
4981 gtk_widget_destroy (*dialog);
4986 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4987 "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.)");
4989 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4991 g_signal_connect_swapped (*dialog,
4993 G_CALLBACK (gtk_widget_destroy),
4996 g_signal_connect (*dialog,
4998 G_CALLBACK (gtk_widget_destroyed),
5001 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
5003 gtk_widget_show (*dialog);
5007 create_message_dialog (GtkWidget *widget)
5009 static GtkWidget *info = NULL;
5010 static GtkWidget *warning = NULL;
5011 static GtkWidget *error = NULL;
5012 static GtkWidget *question = NULL;
5013 GdkScreen *screen = gtk_widget_get_screen (widget);
5015 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
5016 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
5017 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
5018 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
5025 static GtkWidget *sw_parent = NULL;
5026 static GtkWidget *sw_float_parent;
5027 static guint sw_destroyed_handler = 0;
5030 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
5032 gtk_widget_reparent (scrollwin, sw_parent);
5034 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5035 sw_float_parent = NULL;
5037 sw_destroyed_handler = 0;
5043 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
5045 gtk_widget_destroy (sw_float_parent);
5047 sw_float_parent = NULL;
5049 sw_destroyed_handler = 0;
5053 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
5057 gtk_widget_reparent (scrollwin, sw_parent);
5058 gtk_widget_destroy (sw_float_parent);
5060 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
5061 sw_float_parent = NULL;
5063 sw_destroyed_handler = 0;
5067 sw_parent = scrollwin->parent;
5068 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5069 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
5070 gtk_widget_get_screen (widget));
5072 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
5074 gtk_widget_reparent (scrollwin, sw_float_parent);
5075 gtk_widget_show (sw_float_parent);
5077 sw_destroyed_handler =
5078 g_signal_connect (sw_parent, "destroy",
5079 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
5080 g_signal_connect (sw_float_parent, "delete_event",
5081 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
5086 create_scrolled_windows (GtkWidget *widget)
5088 static GtkWidget *window;
5089 GtkWidget *scrolled_window;
5097 window = gtk_dialog_new ();
5099 gtk_window_set_screen (GTK_WINDOW (window),
5100 gtk_widget_get_screen (widget));
5102 g_signal_connect (window, "destroy",
5103 G_CALLBACK (gtk_widget_destroyed),
5106 gtk_window_set_title (GTK_WINDOW (window), "dialog");
5107 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5110 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
5111 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
5112 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
5113 GTK_POLICY_AUTOMATIC,
5114 GTK_POLICY_AUTOMATIC);
5115 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5116 scrolled_window, TRUE, TRUE, 0);
5117 gtk_widget_show (scrolled_window);
5119 table = gtk_table_new (20, 20, FALSE);
5120 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
5121 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
5122 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
5123 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
5124 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5125 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
5126 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
5127 gtk_widget_show (table);
5129 for (i = 0; i < 20; i++)
5130 for (j = 0; j < 20; j++)
5132 sprintf (buffer, "button (%d,%d)\n", i, j);
5133 button = gtk_toggle_button_new_with_label (buffer);
5134 gtk_table_attach_defaults (GTK_TABLE (table), button,
5136 gtk_widget_show (button);
5140 button = gtk_button_new_with_label ("Close");
5141 g_signal_connect_swapped (button, "clicked",
5142 G_CALLBACK (gtk_widget_destroy),
5144 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5145 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5146 button, TRUE, TRUE, 0);
5147 gtk_widget_grab_default (button);
5148 gtk_widget_show (button);
5150 button = gtk_button_new_with_label ("Reparent Out");
5151 g_signal_connect (button, "clicked",
5152 G_CALLBACK (scrolled_windows_remove),
5154 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5155 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5156 button, TRUE, TRUE, 0);
5157 gtk_widget_grab_default (button);
5158 gtk_widget_show (button);
5160 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
5163 if (!GTK_WIDGET_VISIBLE (window))
5164 gtk_widget_show (window);
5166 gtk_widget_destroy (window);
5174 entry_toggle_frame (GtkWidget *checkbutton,
5177 gtk_entry_set_has_frame (GTK_ENTRY(entry),
5178 GTK_TOGGLE_BUTTON(checkbutton)->active);
5182 entry_toggle_sensitive (GtkWidget *checkbutton,
5185 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
5189 entry_props_clicked (GtkWidget *button,
5192 GtkWidget *window = create_prop_editor (entry, 0);
5194 gtk_window_set_title (GTK_WINDOW (window), "Entry Properties");
5198 create_entry (GtkWidget *widget)
5200 static GtkWidget *window = NULL;
5204 GtkWidget *has_frame_check;
5205 GtkWidget *sensitive_check;
5206 GtkWidget *entry, *cb;
5208 GtkWidget *separator;
5209 GList *cbitems = NULL;
5213 cbitems = g_list_append(cbitems, "item0");
5214 cbitems = g_list_append(cbitems, "item1 item1");
5215 cbitems = g_list_append(cbitems, "item2 item2 item2");
5216 cbitems = g_list_append(cbitems, "item3 item3 item3 item3");
5217 cbitems = g_list_append(cbitems, "item4 item4 item4 item4 item4");
5218 cbitems = g_list_append(cbitems, "item5 item5 item5 item5 item5 item5");
5219 cbitems = g_list_append(cbitems, "item6 item6 item6 item6 item6");
5220 cbitems = g_list_append(cbitems, "item7 item7 item7 item7");
5221 cbitems = g_list_append(cbitems, "item8 item8 item8");
5222 cbitems = g_list_append(cbitems, "item9 item9");
5224 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5225 gtk_window_set_screen (GTK_WINDOW (window),
5226 gtk_widget_get_screen (widget));
5228 g_signal_connect (window, "destroy",
5229 G_CALLBACK (gtk_widget_destroyed),
5232 gtk_window_set_title (GTK_WINDOW (window), "entry");
5233 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5236 box1 = gtk_vbox_new (FALSE, 0);
5237 gtk_container_add (GTK_CONTAINER (window), box1);
5240 box2 = gtk_vbox_new (FALSE, 10);
5241 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5242 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5244 hbox = gtk_hbox_new (FALSE, 5);
5245 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5247 entry = gtk_entry_new ();
5248 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");
5249 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
5250 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
5252 button = gtk_button_new_with_mnemonic ("_Props");
5253 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5254 g_signal_connect (button, "clicked",
5255 G_CALLBACK (entry_props_clicked),
5258 cb = gtk_combo_new ();
5259 gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
5260 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO(cb)->entry), "hello world \n\n\n foo");
5261 gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry),
5263 gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0);
5265 sensitive_check = gtk_check_button_new_with_label("Sensitive");
5266 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
5267 g_signal_connect (sensitive_check, "toggled",
5268 G_CALLBACK (entry_toggle_sensitive), entry);
5269 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
5271 has_frame_check = gtk_check_button_new_with_label("Has Frame");
5272 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
5273 g_signal_connect (has_frame_check, "toggled",
5274 G_CALLBACK (entry_toggle_frame), entry);
5275 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
5277 separator = gtk_hseparator_new ();
5278 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5280 box2 = gtk_vbox_new (FALSE, 10);
5281 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5282 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5284 button = gtk_button_new_with_label ("close");
5285 g_signal_connect_swapped (button, "clicked",
5286 G_CALLBACK (gtk_widget_destroy),
5288 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5289 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5290 gtk_widget_grab_default (button);
5293 if (!GTK_WIDGET_VISIBLE (window))
5294 gtk_widget_show_all (window);
5296 gtk_widget_destroy (window);
5300 create_expander (GtkWidget *widget)
5303 GtkWidget *expander;
5305 static GtkWidget *window = NULL;
5309 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5310 gtk_window_set_screen (GTK_WINDOW (window),
5311 gtk_widget_get_screen (widget));
5313 g_signal_connect (window, "destroy",
5314 G_CALLBACK (gtk_widget_destroyed),
5317 gtk_window_set_title (GTK_WINDOW (window), "expander");
5318 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5320 box1 = gtk_vbox_new (FALSE, 0);
5321 gtk_container_add (GTK_CONTAINER (window), box1);
5323 expander = gtk_expander_new ("The Hidden");
5325 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
5327 hidden = gtk_label_new ("Revealed!");
5329 gtk_container_add (GTK_CONTAINER (expander), hidden);
5332 if (!GTK_WIDGET_VISIBLE (window))
5333 gtk_widget_show_all (window);
5335 gtk_widget_destroy (window);
5343 event_box_label_pressed (GtkWidget *widget,
5344 GdkEventButton *event,
5347 g_print ("clicked on event box\n");
5351 event_box_button_clicked (GtkWidget *widget,
5355 g_print ("pushed button\n");
5359 event_box_toggle_visible_window (GtkWidget *checkbutton,
5360 GtkEventBox *event_box)
5362 gtk_event_box_set_visible_window (event_box,
5363 GTK_TOGGLE_BUTTON(checkbutton)->active);
5367 event_box_toggle_above_child (GtkWidget *checkbutton,
5368 GtkEventBox *event_box)
5370 gtk_event_box_set_above_child (event_box,
5371 GTK_TOGGLE_BUTTON(checkbutton)->active);
5375 create_event_box (GtkWidget *widget)
5377 static GtkWidget *window = NULL;
5383 GtkWidget *separator;
5384 GtkWidget *event_box;
5386 GtkWidget *visible_window_check;
5387 GtkWidget *above_child_check;
5396 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5397 gtk_window_set_screen (GTK_WINDOW (window),
5398 gtk_widget_get_screen (widget));
5400 g_signal_connect (window, "destroy",
5401 G_CALLBACK (gtk_widget_destroyed),
5404 gtk_window_set_title (GTK_WINDOW (window), "event box");
5405 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5407 box1 = gtk_vbox_new (FALSE, 0);
5408 gtk_container_add (GTK_CONTAINER (window), box1);
5409 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
5411 hbox = gtk_hbox_new (FALSE, 0);
5412 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
5414 event_box = gtk_event_box_new ();
5415 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
5417 vbox = gtk_vbox_new (FALSE, 0);
5418 gtk_container_add (GTK_CONTAINER (event_box), vbox);
5419 g_signal_connect (event_box, "button_press_event",
5420 G_CALLBACK (event_box_label_pressed),
5423 label = gtk_label_new ("Click on this label");
5424 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
5426 button = gtk_button_new_with_label ("button in eventbox");
5427 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
5428 g_signal_connect (button, "clicked",
5429 G_CALLBACK (event_box_button_clicked),
5433 visible_window_check = gtk_check_button_new_with_label("Visible Window");
5434 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
5435 g_signal_connect (visible_window_check, "toggled",
5436 G_CALLBACK (event_box_toggle_visible_window), event_box);
5437 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
5439 above_child_check = gtk_check_button_new_with_label("Above Child");
5440 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
5441 g_signal_connect (above_child_check, "toggled",
5442 G_CALLBACK (event_box_toggle_above_child), event_box);
5443 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
5445 separator = gtk_hseparator_new ();
5446 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5448 box2 = gtk_vbox_new (FALSE, 10);
5449 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5450 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5452 button = gtk_button_new_with_label ("close");
5453 g_signal_connect_swapped (button, "clicked",
5454 G_CALLBACK (gtk_widget_destroy),
5456 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5457 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5458 gtk_widget_grab_default (button);
5461 if (!GTK_WIDGET_VISIBLE (window))
5462 gtk_widget_show_all (window);
5464 gtk_widget_destroy (window);
5472 #define SIZE_GROUP_INITIAL_SIZE 50
5475 size_group_hsize_changed (GtkSpinButton *spin_button,
5478 gtk_widget_set_size_request (GTK_BIN (button)->child,
5479 gtk_spin_button_get_value_as_int (spin_button),
5484 size_group_vsize_changed (GtkSpinButton *spin_button,
5487 gtk_widget_set_size_request (GTK_BIN (button)->child,
5489 gtk_spin_button_get_value_as_int (spin_button));
5493 create_size_group_window (GdkScreen *screen,
5494 GtkSizeGroup *master_size_group)
5498 GtkWidget *main_button;
5500 GtkWidget *spin_button;
5502 GtkSizeGroup *hgroup1;
5503 GtkSizeGroup *hgroup2;
5504 GtkSizeGroup *vgroup1;
5505 GtkSizeGroup *vgroup2;
5507 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
5513 gtk_window_set_screen (GTK_WINDOW (window), screen);
5515 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
5517 g_signal_connect (window, "response",
5518 G_CALLBACK (gtk_widget_destroy),
5521 table = gtk_table_new (2, 2, FALSE);
5522 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
5524 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
5525 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
5526 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
5527 gtk_widget_set_size_request (table, 250, 250);
5529 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5530 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
5531 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5532 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
5534 main_button = gtk_button_new_with_label ("X");
5536 gtk_table_attach (GTK_TABLE (table), main_button,
5538 GTK_EXPAND, GTK_EXPAND,
5540 gtk_size_group_add_widget (master_size_group, main_button);
5541 gtk_size_group_add_widget (hgroup1, main_button);
5542 gtk_size_group_add_widget (vgroup1, main_button);
5543 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
5544 SIZE_GROUP_INITIAL_SIZE,
5545 SIZE_GROUP_INITIAL_SIZE);
5547 button = gtk_button_new ();
5548 gtk_table_attach (GTK_TABLE (table), button,
5550 GTK_EXPAND, GTK_EXPAND,
5552 gtk_size_group_add_widget (vgroup1, button);
5553 gtk_size_group_add_widget (vgroup2, button);
5555 button = gtk_button_new ();
5556 gtk_table_attach (GTK_TABLE (table), button,
5558 GTK_EXPAND, GTK_EXPAND,
5560 gtk_size_group_add_widget (hgroup1, button);
5561 gtk_size_group_add_widget (hgroup2, button);
5563 button = gtk_button_new ();
5564 gtk_table_attach (GTK_TABLE (table), button,
5566 GTK_EXPAND, GTK_EXPAND,
5568 gtk_size_group_add_widget (hgroup2, button);
5569 gtk_size_group_add_widget (vgroup2, button);
5571 g_object_unref (hgroup1);
5572 g_object_unref (hgroup2);
5573 g_object_unref (vgroup1);
5574 g_object_unref (vgroup2);
5576 hbox = gtk_hbox_new (FALSE, 5);
5577 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
5579 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5580 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5581 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5582 g_signal_connect (spin_button, "value_changed",
5583 G_CALLBACK (size_group_hsize_changed), main_button);
5585 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5586 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5587 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5588 g_signal_connect (spin_button, "value_changed",
5589 G_CALLBACK (size_group_vsize_changed), main_button);
5595 create_size_groups (GtkWidget *widget)
5597 static GtkWidget *window1 = NULL;
5598 static GtkWidget *window2 = NULL;
5599 static GtkSizeGroup *master_size_group;
5601 if (!master_size_group)
5602 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
5606 window1 = create_size_group_window (gtk_widget_get_screen (widget),
5609 g_signal_connect (window1, "destroy",
5610 G_CALLBACK (gtk_widget_destroyed),
5616 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5619 g_signal_connect (window2, "destroy",
5620 G_CALLBACK (gtk_widget_destroyed),
5624 if (GTK_WIDGET_VISIBLE (window1) && GTK_WIDGET_VISIBLE (window2))
5626 gtk_widget_destroy (window1);
5627 gtk_widget_destroy (window2);
5631 if (!GTK_WIDGET_VISIBLE (window1))
5632 gtk_widget_show_all (window1);
5633 if (!GTK_WIDGET_VISIBLE (window2))
5634 gtk_widget_show_all (window2);
5642 static GtkWidget *spinner1;
5645 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5647 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5651 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5653 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5657 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5659 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5660 gtk_spin_button_get_value_as_int (spin));
5664 get_value (GtkWidget *widget, gpointer data)
5668 GtkSpinButton *spin;
5670 spin = GTK_SPIN_BUTTON (spinner1);
5671 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5672 if (GPOINTER_TO_INT (data) == 1)
5673 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5675 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5676 gtk_label_set_text (label, buf);
5680 get_spin_value (GtkWidget *widget, gpointer data)
5684 GtkSpinButton *spin;
5686 spin = GTK_SPIN_BUTTON (widget);
5687 label = GTK_LABEL (data);
5689 buffer = g_strdup_printf ("%0.*f", spin->digits,
5690 gtk_spin_button_get_value (spin));
5691 gtk_label_set_text (label, buffer);
5697 spin_button_time_output_func (GtkSpinButton *spin_button)
5699 static gchar buf[6];
5703 hours = spin_button->adjustment->value / 60.0;
5704 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5705 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5706 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5707 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5712 spin_button_month_input_func (GtkSpinButton *spin_button,
5716 static gchar *month[12] = { "January", "February", "March", "April",
5717 "May", "June", "July", "August",
5718 "September", "October", "November", "December" };
5720 gboolean found = FALSE;
5722 for (i = 1; i <= 12; i++)
5724 tmp1 = g_ascii_strup (month[i - 1], -1);
5725 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5726 if (strstr (tmp1, tmp2) == tmp1)
5736 return GTK_INPUT_ERROR;
5738 *new_val = (gdouble) i;
5743 spin_button_month_output_func (GtkSpinButton *spin_button)
5746 static gchar *month[12] = { "January", "February", "March", "April",
5747 "May", "June", "July", "August", "September",
5748 "October", "November", "December" };
5750 for (i = 1; i <= 12; i++)
5751 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5753 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5754 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5760 spin_button_hex_input_func (GtkSpinButton *spin_button,
5767 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5768 res = strtol(buf, &err, 16);
5771 return GTK_INPUT_ERROR;
5777 spin_button_hex_output_func (GtkSpinButton *spin_button)
5779 static gchar buf[7];
5782 val = (gint) spin_button->adjustment->value;
5783 if (fabs (val) < 1e-5)
5784 sprintf (buf, "0x00");
5786 sprintf (buf, "0x%.2X", val);
5787 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5788 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5793 create_spins (GtkWidget *widget)
5795 static GtkWidget *window = NULL;
5798 GtkWidget *main_vbox;
5801 GtkWidget *spinner2;
5805 GtkWidget *val_label;
5810 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5811 gtk_window_set_screen (GTK_WINDOW (window),
5812 gtk_widget_get_screen (widget));
5814 g_signal_connect (window, "destroy",
5815 G_CALLBACK (gtk_widget_destroyed),
5818 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5820 main_vbox = gtk_vbox_new (FALSE, 5);
5821 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5822 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5824 frame = gtk_frame_new ("Not accelerated");
5825 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5827 vbox = gtk_vbox_new (FALSE, 0);
5828 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5829 gtk_container_add (GTK_CONTAINER (frame), vbox);
5831 /* Time, month, hex spinners */
5833 hbox = gtk_hbox_new (FALSE, 0);
5834 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5836 vbox2 = gtk_vbox_new (FALSE, 0);
5837 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5839 label = gtk_label_new ("Time :");
5840 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5841 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5843 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5844 spinner = gtk_spin_button_new (adj, 0, 0);
5845 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5846 g_signal_connect (spinner,
5848 G_CALLBACK (spin_button_time_output_func),
5850 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5851 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5852 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5854 vbox2 = gtk_vbox_new (FALSE, 0);
5855 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5857 label = gtk_label_new ("Month :");
5858 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5859 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5861 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5863 spinner = gtk_spin_button_new (adj, 0, 0);
5864 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5865 GTK_UPDATE_IF_VALID);
5866 g_signal_connect (spinner,
5868 G_CALLBACK (spin_button_month_input_func),
5870 g_signal_connect (spinner,
5872 G_CALLBACK (spin_button_month_output_func),
5874 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5875 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5876 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5878 vbox2 = gtk_vbox_new (FALSE, 0);
5879 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5881 label = gtk_label_new ("Hex :");
5882 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5883 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5885 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5886 spinner = gtk_spin_button_new (adj, 0, 0);
5887 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5888 g_signal_connect (spinner,
5890 G_CALLBACK (spin_button_hex_input_func),
5892 g_signal_connect (spinner,
5894 G_CALLBACK (spin_button_hex_output_func),
5896 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5897 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
5898 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5900 frame = gtk_frame_new ("Accelerated");
5901 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5903 vbox = gtk_vbox_new (FALSE, 0);
5904 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5905 gtk_container_add (GTK_CONTAINER (frame), vbox);
5907 hbox = gtk_hbox_new (FALSE, 0);
5908 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5910 vbox2 = gtk_vbox_new (FALSE, 0);
5911 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5913 label = gtk_label_new ("Value :");
5914 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5915 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5917 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
5919 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5920 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5921 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
5923 vbox2 = gtk_vbox_new (FALSE, 0);
5924 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5926 label = gtk_label_new ("Digits :");
5927 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5928 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5930 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
5931 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
5932 g_signal_connect (adj, "value_changed",
5933 G_CALLBACK (change_digits),
5935 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
5937 hbox = gtk_hbox_new (FALSE, 0);
5938 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
5940 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
5941 g_signal_connect (button, "clicked",
5942 G_CALLBACK (toggle_snap),
5944 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5945 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5947 button = gtk_check_button_new_with_label ("Numeric only input mode");
5948 g_signal_connect (button, "clicked",
5949 G_CALLBACK (toggle_numeric),
5951 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5952 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5954 val_label = gtk_label_new ("");
5956 hbox = gtk_hbox_new (FALSE, 0);
5957 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5959 button = gtk_button_new_with_label ("Value as Int");
5960 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5961 g_signal_connect (button, "clicked",
5962 G_CALLBACK (get_value),
5963 GINT_TO_POINTER (1));
5964 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5966 button = gtk_button_new_with_label ("Value as Float");
5967 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5968 g_signal_connect (button, "clicked",
5969 G_CALLBACK (get_value),
5970 GINT_TO_POINTER (2));
5971 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5973 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
5974 gtk_label_set_text (GTK_LABEL (val_label), "0");
5976 frame = gtk_frame_new ("Using Convenience Constructor");
5977 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5979 hbox = gtk_hbox_new (FALSE, 0);
5980 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5981 gtk_container_add (GTK_CONTAINER (frame), hbox);
5983 val_label = gtk_label_new ("0.0");
5985 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5986 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5987 g_signal_connect (spinner, "value_changed",
5988 G_CALLBACK (get_spin_value), val_label);
5989 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5990 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5992 hbox = gtk_hbox_new (FALSE, 0);
5993 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5995 button = gtk_button_new_with_label ("Close");
5996 g_signal_connect_swapped (button, "clicked",
5997 G_CALLBACK (gtk_widget_destroy),
5999 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6002 if (!GTK_WIDGET_VISIBLE (window))
6003 gtk_widget_show_all (window);
6005 gtk_widget_destroy (window);
6014 cursor_expose_event (GtkWidget *widget,
6018 GtkDrawingArea *darea;
6019 GdkDrawable *drawable;
6026 g_return_val_if_fail (widget != NULL, TRUE);
6027 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
6029 darea = GTK_DRAWING_AREA (widget);
6030 drawable = widget->window;
6031 white_gc = widget->style->white_gc;
6032 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
6033 black_gc = widget->style->black_gc;
6034 max_width = widget->allocation.width;
6035 max_height = widget->allocation.height;
6037 gdk_draw_rectangle (drawable, white_gc,
6044 gdk_draw_rectangle (drawable, black_gc,
6051 gdk_draw_rectangle (drawable, gray_gc,
6062 set_cursor (GtkWidget *spinner,
6071 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
6074 label = g_object_get_data (G_OBJECT (spinner), "user_data");
6076 class = gtk_type_class (GDK_TYPE_CURSOR_TYPE);
6077 vals = class->values;
6079 while (vals && vals->value != c)
6082 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
6084 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
6086 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
6087 gdk_window_set_cursor (widget->window, cursor);
6088 gdk_cursor_unref (cursor);
6092 cursor_event (GtkWidget *widget,
6094 GtkSpinButton *spinner)
6096 if ((event->type == GDK_BUTTON_PRESS) &&
6097 ((event->button.button == 1) ||
6098 (event->button.button == 3)))
6100 gtk_spin_button_spin (spinner, event->button.button == 1 ?
6101 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
6108 #ifdef GDK_WINDOWING_X11
6109 #include "x11/gdkx.h"
6112 change_cursor_theme (GtkWidget *widget,
6119 children = gtk_container_get_children (GTK_CONTAINER (data));
6121 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
6122 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
6124 g_list_free (children);
6126 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
6133 create_cursors (GtkWidget *widget)
6135 static GtkWidget *window = NULL;
6138 GtkWidget *main_vbox;
6151 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6152 gtk_window_set_screen (GTK_WINDOW (window),
6153 gtk_widget_get_screen (widget));
6155 g_signal_connect (window, "destroy",
6156 G_CALLBACK (gtk_widget_destroyed),
6159 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
6161 main_vbox = gtk_vbox_new (FALSE, 5);
6162 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
6163 gtk_container_add (GTK_CONTAINER (window), main_vbox);
6166 gtk_widget_new (gtk_vbox_get_type (),
6167 "GtkBox::homogeneous", FALSE,
6168 "GtkBox::spacing", 5,
6169 "GtkContainer::border_width", 10,
6170 "GtkWidget::parent", main_vbox,
6171 "GtkWidget::visible", TRUE,
6174 #ifdef GDK_WINDOWING_X11
6175 hbox = gtk_hbox_new (FALSE, 0);
6176 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6177 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6179 label = gtk_label_new ("Cursor Theme : ");
6180 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6181 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6183 entry = gtk_entry_new ();
6184 gtk_entry_set_text (GTK_ENTRY (entry), "default");
6185 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
6187 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
6188 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
6189 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
6191 g_signal_connect (entry, "changed",
6192 G_CALLBACK (change_cursor_theme), hbox);
6193 g_signal_connect (size, "changed",
6194 G_CALLBACK (change_cursor_theme), hbox);
6197 hbox = gtk_hbox_new (FALSE, 0);
6198 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6199 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6201 label = gtk_label_new ("Cursor Value : ");
6202 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
6203 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6205 adj = (GtkAdjustment *) gtk_adjustment_new (0,
6209 spinner = gtk_spin_button_new (adj, 0, 0);
6210 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
6213 gtk_widget_new (gtk_frame_get_type (),
6214 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
6215 "GtkFrame::label_xalign", 0.5,
6216 "GtkFrame::label", "Cursor Area",
6217 "GtkContainer::border_width", 10,
6218 "GtkWidget::parent", vbox,
6219 "GtkWidget::visible", TRUE,
6222 darea = gtk_drawing_area_new ();
6223 gtk_widget_set_size_request (darea, 80, 80);
6224 gtk_container_add (GTK_CONTAINER (frame), darea);
6225 g_signal_connect (darea,
6227 G_CALLBACK (cursor_expose_event),
6229 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
6230 g_signal_connect (darea,
6231 "button_press_event",
6232 G_CALLBACK (cursor_event),
6234 gtk_widget_show (darea);
6236 g_signal_connect (spinner, "changed",
6237 G_CALLBACK (set_cursor),
6240 label = gtk_widget_new (GTK_TYPE_LABEL,
6245 gtk_container_child_set (GTK_CONTAINER (vbox), label,
6248 g_object_set_data (G_OBJECT (spinner), "user_data", label);
6251 gtk_widget_new (gtk_hseparator_get_type (),
6252 "GtkWidget::visible", TRUE,
6254 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
6256 hbox = gtk_hbox_new (FALSE, 0);
6257 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
6258 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
6260 button = gtk_button_new_with_label ("Close");
6261 g_signal_connect_swapped (button, "clicked",
6262 G_CALLBACK (gtk_widget_destroy),
6264 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6266 gtk_widget_show_all (window);
6268 set_cursor (spinner, darea);
6271 gtk_widget_destroy (window);
6279 list_add (GtkWidget *widget,
6284 GtkWidget *list_item;
6285 GtkContainer *container;
6287 container = GTK_CONTAINER (list);
6289 sprintf (buffer, "added item %d", i++);
6290 list_item = gtk_list_item_new_with_label (buffer);
6291 gtk_widget_show (list_item);
6293 gtk_container_add (container, list_item);
6297 list_remove (GtkWidget *widget,
6300 GList *clear_list = NULL;
6301 GList *sel_row = NULL;
6304 if (list->selection_mode == GTK_SELECTION_EXTENDED)
6308 item = GTK_CONTAINER (list)->focus_child;
6309 if (!item && list->selection)
6310 item = list->selection->data;
6314 work = g_list_find (list->children, item);
6315 for (sel_row = work; sel_row; sel_row = sel_row->next)
6316 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
6321 for (sel_row = work; sel_row; sel_row = sel_row->prev)
6322 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
6328 for (work = list->selection; work; work = work->next)
6329 clear_list = g_list_prepend (clear_list, work->data);
6331 clear_list = g_list_reverse (clear_list);
6332 gtk_list_remove_items (GTK_LIST (list), clear_list);
6333 g_list_free (clear_list);
6335 if (list->selection_mode == GTK_SELECTION_EXTENDED && sel_row)
6336 gtk_list_select_child (list, GTK_WIDGET(sel_row->data));
6340 list_clear (GtkWidget *widget,
6343 gtk_list_clear_items (GTK_LIST (list), 0, -1);
6346 static gchar *selection_mode_items[] =
6353 static const GtkSelectionMode selection_modes[] = {
6354 GTK_SELECTION_SINGLE,
6355 GTK_SELECTION_BROWSE,
6356 GTK_SELECTION_MULTIPLE
6359 static GtkWidget *list_omenu;
6362 list_toggle_sel_mode (GtkWidget *widget, gpointer data)
6367 list = GTK_LIST (data);
6369 if (!GTK_WIDGET_MAPPED (widget))
6372 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6374 gtk_list_set_selection_mode (list, selection_modes[i]);
6378 create_list (GtkWidget *widget)
6380 static GtkWidget *window = NULL;
6388 GtkWidget *scrolled_win;
6391 GtkWidget *separator;
6394 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6396 gtk_window_set_screen (GTK_WINDOW (window),
6397 gtk_widget_get_screen (widget));
6399 g_signal_connect (window, "destroy",
6400 G_CALLBACK (gtk_widget_destroyed),
6403 gtk_window_set_title (GTK_WINDOW (window), "list");
6404 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6406 vbox = gtk_vbox_new (FALSE, 0);
6407 gtk_container_add (GTK_CONTAINER (window), vbox);
6409 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6410 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6411 gtk_widget_set_size_request (scrolled_win, -1, 300);
6412 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6413 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6414 GTK_POLICY_AUTOMATIC,
6415 GTK_POLICY_AUTOMATIC);
6417 list = gtk_list_new ();
6418 gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE);
6419 gtk_scrolled_window_add_with_viewport
6420 (GTK_SCROLLED_WINDOW (scrolled_win), list);
6421 gtk_container_set_focus_vadjustment
6422 (GTK_CONTAINER (list),
6423 gtk_scrolled_window_get_vadjustment
6424 (GTK_SCROLLED_WINDOW (scrolled_win)));
6425 gtk_container_set_focus_hadjustment
6426 (GTK_CONTAINER (list),
6427 gtk_scrolled_window_get_hadjustment
6428 (GTK_SCROLLED_WINDOW (scrolled_win)));
6430 if ((infile = fopen("../gtk/gtkenums.h", "r")))
6436 while (fgets (buffer, 256, infile))
6438 if ((pos = strchr (buffer, '\n')))
6440 item = gtk_list_item_new_with_label (buffer);
6441 gtk_container_add (GTK_CONTAINER (list), item);
6448 hbox = gtk_hbox_new (TRUE, 5);
6449 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6450 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6452 button = gtk_button_new_with_label ("Insert Row");
6453 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6454 g_signal_connect (button, "clicked",
6455 G_CALLBACK (list_add),
6458 button = gtk_button_new_with_label ("Clear List");
6459 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6460 g_signal_connect (button, "clicked",
6461 G_CALLBACK (list_clear),
6464 button = gtk_button_new_with_label ("Remove Selection");
6465 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6466 g_signal_connect (button, "clicked",
6467 G_CALLBACK (list_remove),
6470 cbox = gtk_hbox_new (FALSE, 0);
6471 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
6473 hbox = gtk_hbox_new (FALSE, 5);
6474 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6475 gtk_box_pack_start (GTK_BOX (cbox), hbox, TRUE, FALSE, 0);
6477 label = gtk_label_new ("Selection Mode :");
6478 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6480 list_omenu = build_option_menu (selection_mode_items, 3, 3,
6481 list_toggle_sel_mode,
6483 gtk_box_pack_start (GTK_BOX (hbox), list_omenu, FALSE, TRUE, 0);
6485 separator = gtk_hseparator_new ();
6486 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
6488 cbox = gtk_hbox_new (FALSE, 0);
6489 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
6491 button = gtk_button_new_with_label ("close");
6492 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6493 gtk_box_pack_start (GTK_BOX (cbox), button, TRUE, TRUE, 0);
6494 g_signal_connect_swapped (button, "clicked",
6495 G_CALLBACK (gtk_widget_destroy),
6498 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
6499 gtk_widget_grab_default (button);
6502 if (!GTK_WIDGET_VISIBLE (window))
6503 gtk_widget_show_all (window);
6505 gtk_widget_destroy (window);
6512 static char * book_open_xpm[] = {
6535 static char * book_closed_xpm[] = {
6560 static char * mini_page_xpm[] = {
6583 static char * gtk_mini_xpm[] = {
6623 #define TESTGTK_CLIST_COLUMNS 12
6624 static gint clist_rows = 0;
6625 static GtkWidget *clist_omenu;
6628 add1000_clist (GtkWidget *widget, gpointer data)
6631 char text[TESTGTK_CLIST_COLUMNS][50];
6632 char *texts[TESTGTK_CLIST_COLUMNS];
6637 clist = GTK_CLIST (data);
6639 pixmap = gdk_pixmap_create_from_xpm_d (clist->clist_window,
6641 >K_WIDGET (data)->style->white,
6644 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
6647 sprintf (text[i], "Column %d", i);
6651 sprintf (text[1], "Right");
6652 sprintf (text[2], "Center");
6654 gtk_clist_freeze (GTK_CLIST (data));
6655 for (i = 0; i < 1000; i++)
6657 sprintf (text[0], "CListRow %d", rand() % 10000);
6658 row = gtk_clist_append (clist, texts);
6659 gtk_clist_set_pixtext (clist, row, 3, "gtk+", 5, pixmap, mask);
6662 gtk_clist_thaw (GTK_CLIST (data));
6664 g_object_unref (pixmap);
6665 g_object_unref (mask);
6669 add10000_clist (GtkWidget *widget, gpointer data)
6672 char text[TESTGTK_CLIST_COLUMNS][50];
6673 char *texts[TESTGTK_CLIST_COLUMNS];
6675 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
6678 sprintf (text[i], "Column %d", i);
6681 sprintf (text[1], "Right");
6682 sprintf (text[2], "Center");
6684 gtk_clist_freeze (GTK_CLIST (data));
6685 for (i = 0; i < 10000; i++)
6687 sprintf (text[0], "CListRow %d", rand() % 10000);
6688 gtk_clist_append (GTK_CLIST (data), texts);
6690 gtk_clist_thaw (GTK_CLIST (data));
6694 clear_clist (GtkWidget *widget, gpointer data)
6696 gtk_clist_clear (GTK_CLIST (data));
6700 void clist_remove_selection (GtkWidget *widget, GtkCList *clist)
6702 gtk_clist_freeze (clist);
6704 while (clist->selection)
6709 row = GPOINTER_TO_INT (clist->selection->data);
6711 gtk_clist_remove (clist, row);
6713 if (clist->selection_mode == GTK_SELECTION_BROWSE)
6717 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
6718 clist->focus_row >= 0)
6719 gtk_clist_select_row (clist, clist->focus_row, -1);
6721 gtk_clist_thaw (clist);
6724 void toggle_title_buttons (GtkWidget *widget, GtkCList *clist)
6726 if (GTK_TOGGLE_BUTTON (widget)->active)
6727 gtk_clist_column_titles_show (clist);
6729 gtk_clist_column_titles_hide (clist);
6732 void toggle_reorderable (GtkWidget *widget, GtkCList *clist)
6734 gtk_clist_set_reorderable (clist, GTK_TOGGLE_BUTTON (widget)->active);
6738 insert_row_clist (GtkWidget *widget, gpointer data)
6740 static char *text[] =
6742 "This", "is an", "inserted", "row.",
6743 "This", "is an", "inserted", "row.",
6744 "This", "is an", "inserted", "row."
6747 static GtkStyle *style1 = NULL;
6748 static GtkStyle *style2 = NULL;
6749 static GtkStyle *style3 = NULL;
6752 if (GTK_CLIST (data)->focus_row >= 0)
6753 row = gtk_clist_insert (GTK_CLIST (data), GTK_CLIST (data)->focus_row,
6756 row = gtk_clist_prepend (GTK_CLIST (data), text);
6770 style1 = gtk_style_copy (GTK_WIDGET (data)->style);
6771 style1->base[GTK_STATE_NORMAL] = col1;
6772 style1->base[GTK_STATE_SELECTED] = col2;
6774 style2 = gtk_style_copy (GTK_WIDGET (data)->style);
6775 style2->fg[GTK_STATE_NORMAL] = col1;
6776 style2->fg[GTK_STATE_SELECTED] = col2;
6778 style3 = gtk_style_copy (GTK_WIDGET (data)->style);
6779 style3->fg[GTK_STATE_NORMAL] = col1;
6780 style3->base[GTK_STATE_NORMAL] = col2;
6781 pango_font_description_free (style3->font_desc);
6782 style3->font_desc = pango_font_description_from_string ("courier 12");
6785 gtk_clist_set_cell_style (GTK_CLIST (data), row, 3, style1);
6786 gtk_clist_set_cell_style (GTK_CLIST (data), row, 4, style2);
6787 gtk_clist_set_cell_style (GTK_CLIST (data), row, 0, style3);
6793 clist_warning_test (GtkWidget *button,
6797 static gboolean add_remove = FALSE;
6799 add_remove = !add_remove;
6801 child = gtk_label_new ("Test");
6802 g_object_ref (child);
6803 gtk_object_sink (GTK_OBJECT (child));
6806 gtk_container_add (GTK_CONTAINER (clist), child);
6809 child->parent = clist;
6810 gtk_container_remove (GTK_CONTAINER (clist), child);
6811 child->parent = NULL;
6814 gtk_widget_destroy (child);
6815 gtk_widget_unref (child);
6819 undo_selection (GtkWidget *button, GtkCList *clist)
6821 gtk_clist_undo_selection (clist);
6825 clist_toggle_sel_mode (GtkWidget *widget, gpointer data)
6830 clist = GTK_CLIST (data);
6832 if (!GTK_WIDGET_MAPPED (widget))
6835 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6837 gtk_clist_set_selection_mode (clist, selection_modes[i]);
6841 clist_click_column (GtkCList *clist, gint column, gpointer data)
6844 gtk_clist_set_column_visibility (clist, column, FALSE);
6845 else if (column == clist->sort_column)
6847 if (clist->sort_type == GTK_SORT_ASCENDING)
6848 clist->sort_type = GTK_SORT_DESCENDING;
6850 clist->sort_type = GTK_SORT_ASCENDING;
6853 gtk_clist_set_sort_column (clist, column);
6855 gtk_clist_sort (clist);
6859 create_clist (GtkWidget *widget)
6862 static GtkWidget *window = NULL;
6864 static char *titles[] =
6866 "auto resize", "not resizeable", "max width 100", "min width 50",
6867 "hide column", "Title 5", "Title 6", "Title 7",
6868 "Title 8", "Title 9", "Title 10", "Title 11"
6871 char text[TESTGTK_CLIST_COLUMNS][50];
6872 char *texts[TESTGTK_CLIST_COLUMNS];
6878 GtkWidget *separator;
6879 GtkWidget *scrolled_win;
6882 GtkWidget *undo_button;
6892 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6893 gtk_window_set_screen (GTK_WINDOW (window),
6894 gtk_widget_get_screen (widget));
6896 g_signal_connect (window, "destroy",
6897 G_CALLBACK (gtk_widget_destroyed), &window);
6899 gtk_window_set_title (GTK_WINDOW (window), "clist");
6900 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6902 vbox = gtk_vbox_new (FALSE, 0);
6903 gtk_container_add (GTK_CONTAINER (window), vbox);
6905 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6906 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6907 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6908 GTK_POLICY_AUTOMATIC,
6909 GTK_POLICY_AUTOMATIC);
6911 /* create GtkCList here so we have a pointer to throw at the
6912 * button callbacks -- more is done with it later */
6913 clist = gtk_clist_new_with_titles (TESTGTK_CLIST_COLUMNS, titles);
6914 gtk_container_add (GTK_CONTAINER (scrolled_win), clist);
6915 g_signal_connect (clist, "click_column",
6916 G_CALLBACK (clist_click_column), NULL);
6918 /* control buttons */
6919 hbox = gtk_hbox_new (FALSE, 5);
6920 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6921 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6923 button = gtk_button_new_with_label ("Insert Row");
6924 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6925 g_signal_connect (button, "clicked",
6926 G_CALLBACK (insert_row_clist), clist);
6928 button = gtk_button_new_with_label ("Add 1,000 Rows With Pixmaps");
6929 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6930 g_signal_connect (button, "clicked",
6931 G_CALLBACK (add1000_clist), clist);
6933 button = gtk_button_new_with_label ("Add 10,000 Rows");
6934 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6935 g_signal_connect (button, "clicked",
6936 G_CALLBACK (add10000_clist), clist);
6938 /* second layer of buttons */
6939 hbox = gtk_hbox_new (FALSE, 5);
6940 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6941 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6943 button = gtk_button_new_with_label ("Clear List");
6944 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6945 g_signal_connect (button, "clicked",
6946 G_CALLBACK (clear_clist), clist);
6948 button = gtk_button_new_with_label ("Remove Selection");
6949 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6950 g_signal_connect (button, "clicked",
6951 G_CALLBACK (clist_remove_selection), clist);
6953 undo_button = gtk_button_new_with_label ("Undo Selection");
6954 gtk_box_pack_start (GTK_BOX (hbox), undo_button, TRUE, TRUE, 0);
6955 g_signal_connect (undo_button, "clicked",
6956 G_CALLBACK (undo_selection), clist);
6958 button = gtk_button_new_with_label ("Warning Test");
6959 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6960 g_signal_connect (button, "clicked",
6961 G_CALLBACK (clist_warning_test), clist);
6963 /* third layer of buttons */
6964 hbox = gtk_hbox_new (FALSE, 5);
6965 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6966 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6968 check = gtk_check_button_new_with_label ("Show Title Buttons");
6969 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
6970 g_signal_connect (check, "clicked",
6971 G_CALLBACK (toggle_title_buttons), clist);
6972 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
6974 check = gtk_check_button_new_with_label ("Reorderable");
6975 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
6976 g_signal_connect (check, "clicked",
6977 G_CALLBACK (toggle_reorderable), clist);
6978 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
6980 label = gtk_label_new ("Selection Mode :");
6981 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6983 clist_omenu = build_option_menu (selection_mode_items, 3, 3,
6984 clist_toggle_sel_mode,
6986 gtk_box_pack_start (GTK_BOX (hbox), clist_omenu, FALSE, TRUE, 0);
6989 * the rest of the clist configuration
6992 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6993 gtk_clist_set_row_height (GTK_CLIST (clist), 18);
6994 gtk_widget_set_size_request (clist, -1, 300);
6996 for (i = 1; i < TESTGTK_CLIST_COLUMNS; i++)
6997 gtk_clist_set_column_width (GTK_CLIST (clist), i, 80);
6999 gtk_clist_set_column_auto_resize (GTK_CLIST (clist), 0, TRUE);
7000 gtk_clist_set_column_resizeable (GTK_CLIST (clist), 1, FALSE);
7001 gtk_clist_set_column_max_width (GTK_CLIST (clist), 2, 100);
7002 gtk_clist_set_column_min_width (GTK_CLIST (clist), 3, 50);
7003 gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
7004 gtk_clist_set_column_justification (GTK_CLIST (clist), 1,
7006 gtk_clist_set_column_justification (GTK_CLIST (clist), 2,
7007 GTK_JUSTIFY_CENTER);
7009 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
7012 sprintf (text[i], "Column %d", i);
7015 sprintf (text[1], "Right");
7016 sprintf (text[2], "Center");
7025 style = gtk_style_new ();
7026 style->fg[GTK_STATE_NORMAL] = col1;
7027 style->base[GTK_STATE_NORMAL] = col2;
7029 pango_font_description_set_size (style->font_desc, 14 * PANGO_SCALE);
7030 pango_font_description_set_weight (style->font_desc, PANGO_WEIGHT_BOLD);
7032 for (i = 0; i < 10; i++)
7034 sprintf (text[0], "CListRow %d", clist_rows++);
7035 gtk_clist_append (GTK_CLIST (clist), texts);
7040 gtk_clist_set_row_style (GTK_CLIST (clist), i, style);
7043 gtk_clist_set_cell_style (GTK_CLIST (clist), i, i % 4, style);
7048 gtk_style_unref (style);
7050 separator = gtk_hseparator_new ();
7051 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
7053 hbox = gtk_hbox_new (FALSE, 0);
7054 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
7056 button = gtk_button_new_with_label ("close");
7057 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
7058 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7059 g_signal_connect_swapped (button, "clicked",
7060 G_CALLBACK (gtk_widget_destroy),
7063 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7064 gtk_widget_grab_default (button);
7067 if (!GTK_WIDGET_VISIBLE (window))
7068 gtk_widget_show_all (window);
7072 gtk_widget_destroy (window);
7090 static gint books = 0;
7091 static gint pages = 0;
7093 static GtkWidget *book_label;
7094 static GtkWidget *page_label;
7095 static GtkWidget *sel_label;
7096 static GtkWidget *vis_label;
7097 static GtkWidget *omenu1;
7098 static GtkWidget *omenu2;
7099 static GtkWidget *omenu3;
7100 static GtkWidget *omenu4;
7101 static GtkWidget *spin1;
7102 static GtkWidget *spin2;
7103 static GtkWidget *spin3;
7104 static gint line_style;
7107 static CTreePixmaps *
7108 get_ctree_pixmaps (GtkCTree *ctree)
7110 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (ctree));
7111 CTreePixmaps *pixmaps = g_object_get_data (G_OBJECT (screen), "ctree-pixmaps");
7115 GdkColormap *colormap = gdk_screen_get_rgb_colormap (screen);
7116 pixmaps = g_new (CTreePixmaps, 1);
7118 pixmaps->pixmap1 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
7120 NULL, book_closed_xpm);
7121 pixmaps->pixmap2 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
7123 NULL, book_open_xpm);
7124 pixmaps->pixmap3 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
7126 NULL, mini_page_xpm);
7128 g_object_set_data (G_OBJECT (screen), "ctree-pixmaps", pixmaps);
7134 void after_press (GtkCTree *ctree, gpointer data)
7138 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
7139 gtk_label_set_text (GTK_LABEL (sel_label), buf);
7141 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
7142 gtk_label_set_text (GTK_LABEL (vis_label), buf);
7144 sprintf (buf, "%d", books);
7145 gtk_label_set_text (GTK_LABEL (book_label), buf);
7147 sprintf (buf, "%d", pages);
7148 gtk_label_set_text (GTK_LABEL (page_label), buf);
7151 void after_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent,
7152 GtkCTreeNode *sibling, gpointer data)
7158 gtk_ctree_get_node_info (ctree, child, &source,
7159 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7161 gtk_ctree_get_node_info (ctree, parent, &target1,
7162 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7164 gtk_ctree_get_node_info (ctree, sibling, &target2,
7165 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7167 g_print ("Moving \"%s\" to \"%s\" with sibling \"%s\".\n", source,
7168 (parent) ? target1 : "nil", (sibling) ? target2 : "nil");
7171 void count_items (GtkCTree *ctree, GtkCTreeNode *list)
7173 if (GTK_CTREE_ROW (list)->is_leaf)
7179 void expand_all (GtkWidget *widget, GtkCTree *ctree)
7181 gtk_ctree_expand_recursive (ctree, NULL);
7182 after_press (ctree, NULL);
7185 void collapse_all (GtkWidget *widget, GtkCTree *ctree)
7187 gtk_ctree_collapse_recursive (ctree, NULL);
7188 after_press (ctree, NULL);
7191 void select_all (GtkWidget *widget, GtkCTree *ctree)
7193 gtk_ctree_select_recursive (ctree, NULL);
7194 after_press (ctree, NULL);
7197 void change_style (GtkWidget *widget, GtkCTree *ctree)
7199 static GtkStyle *style1 = NULL;
7200 static GtkStyle *style2 = NULL;
7206 if (GTK_CLIST (ctree)->focus_row >= 0)
7207 node = GTK_CTREE_NODE
7208 (g_list_nth (GTK_CLIST (ctree)->row_list,GTK_CLIST (ctree)->focus_row));
7210 node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list);
7224 style1 = gtk_style_new ();
7225 style1->base[GTK_STATE_NORMAL] = col1;
7226 style1->fg[GTK_STATE_SELECTED] = col2;
7228 style2 = gtk_style_new ();
7229 style2->base[GTK_STATE_SELECTED] = col2;
7230 style2->fg[GTK_STATE_NORMAL] = col1;
7231 style2->base[GTK_STATE_NORMAL] = col2;
7232 pango_font_description_free (style2->font_desc);
7233 style2->font_desc = pango_font_description_from_string ("courier 30");
7236 gtk_ctree_node_set_cell_style (ctree, node, 1, style1);
7237 gtk_ctree_node_set_cell_style (ctree, node, 0, style2);
7239 if (GTK_CTREE_ROW (node)->children)
7240 gtk_ctree_node_set_row_style (ctree, GTK_CTREE_ROW (node)->children,
7244 void unselect_all (GtkWidget *widget, GtkCTree *ctree)
7246 gtk_ctree_unselect_recursive (ctree, NULL);
7247 after_press (ctree, NULL);
7250 void remove_selection (GtkWidget *widget, GtkCTree *ctree)
7255 clist = GTK_CLIST (ctree);
7257 gtk_clist_freeze (clist);
7259 while (clist->selection)
7261 node = clist->selection->data;
7263 if (GTK_CTREE_ROW (node)->is_leaf)
7266 gtk_ctree_post_recursive (ctree, node,
7267 (GtkCTreeFunc) count_items, NULL);
7269 gtk_ctree_remove_node (ctree, node);
7271 if (clist->selection_mode == GTK_SELECTION_BROWSE)
7275 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
7276 clist->focus_row >= 0)
7278 node = gtk_ctree_node_nth (ctree, clist->focus_row);
7281 gtk_ctree_select (ctree, node);
7284 gtk_clist_thaw (clist);
7285 after_press (ctree, NULL);
7288 struct _ExportStruct {
7294 typedef struct _ExportStruct ExportStruct;
7297 gnode2ctree (GtkCTree *ctree,
7300 GtkCTreeNode *cnode,
7304 GdkPixmap *pixmap_closed;
7305 GdkBitmap *mask_closed;
7306 GdkPixmap *pixmap_opened;
7307 GdkBitmap *mask_opened;
7308 CTreePixmaps *pixmaps;
7310 if (!cnode || !gnode || (!(es = gnode->data)))
7313 pixmaps = get_ctree_pixmaps (ctree);
7317 pixmap_closed = pixmaps->pixmap3;
7318 mask_closed = pixmaps->mask3;
7319 pixmap_opened = NULL;
7324 pixmap_closed = pixmaps->pixmap1;
7325 mask_closed = pixmaps->mask1;
7326 pixmap_opened = pixmaps->pixmap2;
7327 mask_opened = pixmaps->mask2;
7330 gtk_ctree_set_node_info (ctree, cnode, es->tree, 2, pixmap_closed,
7331 mask_closed, pixmap_opened, mask_opened,
7332 es->is_leaf, (depth < 3));
7333 gtk_ctree_node_set_text (ctree, cnode, 1, es->info);
7341 ctree2gnode (GtkCTree *ctree,
7344 GtkCTreeNode *cnode,
7349 if (!cnode || !gnode)
7352 es = g_new (ExportStruct, 1);
7354 es->is_leaf = GTK_CTREE_ROW (cnode)->is_leaf;
7355 es->tree = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[0])->text;
7356 es->info = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[1])->text;
7360 void export_ctree (GtkWidget *widget, GtkCTree *ctree)
7362 char *title[] = { "Tree" , "Info" };
7363 static GtkWidget *export_window = NULL;
7364 static GtkCTree *export_ctree;
7366 GtkWidget *scrolled_win;
7374 export_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7376 gtk_window_set_screen (GTK_WINDOW (export_window),
7377 gtk_widget_get_screen (widget));
7379 g_signal_connect (export_window, "destroy",
7380 G_CALLBACK (gtk_widget_destroyed),
7383 gtk_window_set_title (GTK_WINDOW (export_window), "exported ctree");
7384 gtk_container_set_border_width (GTK_CONTAINER (export_window), 5);
7386 vbox = gtk_vbox_new (FALSE, 0);
7387 gtk_container_add (GTK_CONTAINER (export_window), vbox);
7389 button = gtk_button_new_with_label ("Close");
7390 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, TRUE, 0);
7392 g_signal_connect_swapped (button, "clicked",
7393 G_CALLBACK (gtk_widget_destroy),
7396 sep = gtk_hseparator_new ();
7397 gtk_box_pack_end (GTK_BOX (vbox), sep, FALSE, TRUE, 10);
7399 export_ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
7400 gtk_ctree_set_line_style (export_ctree, GTK_CTREE_LINES_DOTTED);
7402 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
7403 gtk_container_add (GTK_CONTAINER (scrolled_win),
7404 GTK_WIDGET (export_ctree));
7405 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
7406 GTK_POLICY_AUTOMATIC,
7407 GTK_POLICY_AUTOMATIC);
7408 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
7409 gtk_clist_set_selection_mode (GTK_CLIST (export_ctree),
7410 GTK_SELECTION_EXTENDED);
7411 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 0, 200);
7412 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 1, 200);
7413 gtk_widget_set_size_request (GTK_WIDGET (export_ctree), 300, 200);
7416 if (!GTK_WIDGET_VISIBLE (export_window))
7417 gtk_widget_show_all (export_window);
7419 gtk_clist_clear (GTK_CLIST (export_ctree));
7421 node = GTK_CTREE_NODE (g_list_nth (GTK_CLIST (ctree)->row_list,
7422 GTK_CLIST (ctree)->focus_row));
7426 gnode = gtk_ctree_export_to_gnode (ctree, NULL, NULL, node,
7430 gtk_ctree_insert_gnode (export_ctree, NULL, NULL, gnode,
7432 g_node_destroy (gnode);
7436 void change_indent (GtkWidget *widget, GtkCTree *ctree)
7438 gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
7441 void change_spacing (GtkWidget *widget, GtkCTree *ctree)
7443 gtk_ctree_set_spacing (ctree, GTK_ADJUSTMENT (widget)->value);
7446 void change_row_height (GtkWidget *widget, GtkCList *clist)
7448 gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value);
7451 void set_background (GtkCTree *ctree, GtkCTreeNode *node, gpointer data)
7453 GtkStyle *style = NULL;
7458 if (ctree->line_style != GTK_CTREE_LINES_TABBED)
7460 if (!GTK_CTREE_ROW (node)->is_leaf)
7461 style = GTK_CTREE_ROW (node)->row.data;
7462 else if (GTK_CTREE_ROW (node)->parent)
7463 style = GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data;
7466 gtk_ctree_node_set_row_style (ctree, node, style);
7470 ctree_toggle_line_style (GtkWidget *widget, gpointer data)
7475 ctree = GTK_CTREE (data);
7477 if (!GTK_WIDGET_MAPPED (widget))
7480 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7482 if ((ctree->line_style == GTK_CTREE_LINES_TABBED &&
7483 ((GtkCTreeLineStyle) i) != GTK_CTREE_LINES_TABBED) ||
7484 (ctree->line_style != GTK_CTREE_LINES_TABBED &&
7485 ((GtkCTreeLineStyle) i) == GTK_CTREE_LINES_TABBED))
7486 gtk_ctree_pre_recursive (ctree, NULL, set_background, NULL);
7487 gtk_ctree_set_line_style (ctree, i);
7492 ctree_toggle_expander_style (GtkWidget *widget, gpointer data)
7497 ctree = GTK_CTREE (data);
7499 if (!GTK_WIDGET_MAPPED (widget))
7502 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7504 gtk_ctree_set_expander_style (ctree, (GtkCTreeExpanderStyle) i);
7508 ctree_toggle_justify (GtkWidget *widget, gpointer data)
7513 ctree = GTK_CTREE (data);
7515 if (!GTK_WIDGET_MAPPED (widget))
7518 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7520 gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column,
7521 (GtkJustification) i);
7525 ctree_toggle_sel_mode (GtkWidget *widget, gpointer data)
7530 ctree = GTK_CTREE (data);
7532 if (!GTK_WIDGET_MAPPED (widget))
7535 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
7537 gtk_clist_set_selection_mode (GTK_CLIST (ctree), selection_modes[i]);
7538 after_press (ctree, NULL);
7541 void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
7542 gint num_books, gint num_pages, GtkCTreeNode *parent)
7547 GtkCTreeNode *sibling;
7548 CTreePixmaps *pixmaps;
7555 pixmaps = get_ctree_pixmaps (ctree);
7557 for (i = num_pages + num_books; i > num_books; i--)
7560 sprintf (buf1, "Page %02d", (gint) rand() % 100);
7561 sprintf (buf2, "Item %d-%d", cur_depth, i);
7562 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
7563 pixmaps->pixmap3, pixmaps->mask3, NULL, NULL,
7566 if (parent && ctree->line_style == GTK_CTREE_LINES_TABBED)
7567 gtk_ctree_node_set_row_style (ctree, sibling,
7568 GTK_CTREE_ROW (parent)->row.style);
7571 if (cur_depth == depth)
7574 for (i = num_books; i > 0; i--)
7579 sprintf (buf1, "Book %02d", (gint) rand() % 100);
7580 sprintf (buf2, "Item %d-%d", cur_depth, i);
7581 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
7582 pixmaps->pixmap1, pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2,
7585 style = gtk_style_new ();
7586 switch (cur_depth % 3)
7589 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
7590 style->base[GTK_STATE_NORMAL].green = 0;
7591 style->base[GTK_STATE_NORMAL].blue = 65535 - ((i * 10000) % 65535);
7594 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
7595 style->base[GTK_STATE_NORMAL].green = 65535 - ((i * 10000) % 65535);
7596 style->base[GTK_STATE_NORMAL].blue = 0;
7599 style->base[GTK_STATE_NORMAL].red = 65535 - ((i * 10000) % 65535);
7600 style->base[GTK_STATE_NORMAL].green = 0;
7601 style->base[GTK_STATE_NORMAL].blue = 10000 * (cur_depth % 6);
7604 gtk_ctree_node_set_row_data_full (ctree, sibling, style,
7605 (GtkDestroyNotify) gtk_style_unref);
7607 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
7608 gtk_ctree_node_set_row_style (ctree, sibling, style);
7610 build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages,
7615 void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
7618 gchar label1[] = "Root";
7619 gchar label2[] = "";
7620 GtkCTreeNode *parent;
7623 CTreePixmaps *pixmaps;
7625 pixmaps = get_ctree_pixmaps (ctree);
7630 d = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7631 b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7632 p = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin3));
7634 n = ((pow (b, d) - 1) / (b - 1)) * (p + 1);
7638 g_print ("%d total items? Try less\n",n);
7642 gtk_clist_freeze (GTK_CLIST (ctree));
7643 gtk_clist_clear (GTK_CLIST (ctree));
7648 parent = gtk_ctree_insert_node (ctree, NULL, NULL, text, 5, pixmaps->pixmap1,
7649 pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2, FALSE, TRUE);
7651 style = gtk_style_new ();
7652 style->base[GTK_STATE_NORMAL].red = 0;
7653 style->base[GTK_STATE_NORMAL].green = 45000;
7654 style->base[GTK_STATE_NORMAL].blue = 55000;
7655 gtk_ctree_node_set_row_data_full (ctree, parent, style,
7656 (GtkDestroyNotify) gtk_style_unref);
7658 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
7659 gtk_ctree_node_set_row_style (ctree, parent, style);
7661 build_recursive (ctree, 1, d, b, p, parent);
7662 gtk_clist_thaw (GTK_CLIST (ctree));
7663 after_press (ctree, NULL);
7667 ctree_click_column (GtkCTree *ctree, gint column, gpointer data)
7671 clist = GTK_CLIST (ctree);
7673 if (column == clist->sort_column)
7675 if (clist->sort_type == GTK_SORT_ASCENDING)
7676 clist->sort_type = GTK_SORT_DESCENDING;
7678 clist->sort_type = GTK_SORT_ASCENDING;
7681 gtk_clist_set_sort_column (clist, column);
7683 gtk_ctree_sort_recursive (ctree, NULL);
7686 void create_ctree (GtkWidget *widget)
7688 static GtkWidget *window = NULL;
7689 GtkTooltips *tooltips;
7691 GtkWidget *scrolled_win;
7704 char *title[] = { "Tree" , "Info" };
7707 static gchar *items1[] =
7715 static gchar *items2[] =
7723 static gchar *items3[] =
7731 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7732 gtk_window_set_screen (GTK_WINDOW (window),
7733 gtk_widget_get_screen (widget));
7735 g_signal_connect (window, "destroy",
7736 G_CALLBACK (gtk_widget_destroyed),
7739 gtk_window_set_title (GTK_WINDOW (window), "GtkCTree");
7740 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7742 tooltips = gtk_tooltips_new ();
7743 g_object_ref (tooltips);
7744 gtk_object_sink (GTK_OBJECT (tooltips));
7746 g_object_set_data_full (G_OBJECT (window), "tooltips", tooltips,
7749 vbox = gtk_vbox_new (FALSE, 0);
7750 gtk_container_add (GTK_CONTAINER (window), vbox);
7752 hbox = gtk_hbox_new (FALSE, 5);
7753 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
7754 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
7756 label = gtk_label_new ("Depth :");
7757 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7759 adj = (GtkAdjustment *) gtk_adjustment_new (4, 1, 10, 1, 5, 0);
7760 spin1 = gtk_spin_button_new (adj, 0, 0);
7761 gtk_box_pack_start (GTK_BOX (hbox), spin1, FALSE, TRUE, 5);
7763 label = gtk_label_new ("Books :");
7764 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7766 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
7767 spin2 = gtk_spin_button_new (adj, 0, 0);
7768 gtk_box_pack_start (GTK_BOX (hbox), spin2, FALSE, TRUE, 5);
7770 label = gtk_label_new ("Pages :");
7771 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
7773 adj = (GtkAdjustment *) gtk_adjustment_new (5, 1, 20, 1, 5, 0);
7774 spin3 = gtk_spin_button_new (adj, 0, 0);
7775 gtk_box_pack_start (GTK_BOX (hbox), spin3, FALSE, TRUE, 5);
7777 button = gtk_button_new_with_label ("Close");
7778 gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7780 g_signal_connect_swapped (button, "clicked",
7781 G_CALLBACK (gtk_widget_destroy),
7784 button = gtk_button_new_with_label ("Rebuild Tree");
7785 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7787 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
7788 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
7789 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
7790 GTK_POLICY_AUTOMATIC,
7792 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
7794 ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
7795 gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (ctree));
7797 gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
7798 gtk_clist_set_column_width (GTK_CLIST (ctree), 1, 200);
7799 gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_EXTENDED);
7800 gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
7801 line_style = GTK_CTREE_LINES_DOTTED;
7803 g_signal_connect (button, "clicked",
7804 G_CALLBACK (rebuild_tree), ctree);
7805 g_signal_connect (ctree, "click_column",
7806 G_CALLBACK (ctree_click_column), NULL);
7808 g_signal_connect_after (ctree, "button_press_event",
7809 G_CALLBACK (after_press), NULL);
7810 g_signal_connect_after (ctree, "button_release_event",
7811 G_CALLBACK (after_press), NULL);
7812 g_signal_connect_after (ctree, "tree_move",
7813 G_CALLBACK (after_move), NULL);
7814 g_signal_connect_after (ctree, "end_selection",
7815 G_CALLBACK (after_press), NULL);
7816 g_signal_connect_after (ctree, "toggle_focus_row",
7817 G_CALLBACK (after_press), NULL);
7818 g_signal_connect_after (ctree, "select_all",
7819 G_CALLBACK (after_press), NULL);
7820 g_signal_connect_after (ctree, "unselect_all",
7821 G_CALLBACK (after_press), NULL);
7822 g_signal_connect_after (ctree, "scroll_vertical",
7823 G_CALLBACK (after_press), NULL);
7825 bbox = gtk_hbox_new (FALSE, 5);
7826 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
7827 gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, TRUE, 0);
7829 mbox = gtk_vbox_new (TRUE, 5);
7830 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7832 label = gtk_label_new ("Row Height :");
7833 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7835 label = gtk_label_new ("Indent :");
7836 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7838 label = gtk_label_new ("Spacing :");
7839 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7841 mbox = gtk_vbox_new (TRUE, 5);
7842 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7844 adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0);
7845 spinner = gtk_spin_button_new (adj, 0, 0);
7846 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7847 gtk_tooltips_set_tip (tooltips, spinner,
7848 "Row height of list items", NULL);
7849 g_signal_connect (adj, "value_changed",
7850 G_CALLBACK (change_row_height), ctree);
7851 gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value);
7853 adj = (GtkAdjustment *) gtk_adjustment_new (20, 0, 60, 1, 10, 0);
7854 spinner = gtk_spin_button_new (adj, 0, 0);
7855 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7856 gtk_tooltips_set_tip (tooltips, spinner, "Tree Indentation.", NULL);
7857 g_signal_connect (adj, "value_changed",
7858 G_CALLBACK (change_indent), ctree);
7860 adj = (GtkAdjustment *) gtk_adjustment_new (5, 0, 60, 1, 10, 0);
7861 spinner = gtk_spin_button_new (adj, 0, 0);
7862 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7863 gtk_tooltips_set_tip (tooltips, spinner, "Tree Spacing.", NULL);
7864 g_signal_connect (adj, "value_changed",
7865 G_CALLBACK (change_spacing), ctree);
7867 mbox = gtk_vbox_new (TRUE, 5);
7868 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7870 hbox = gtk_hbox_new (FALSE, 5);
7871 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7873 button = gtk_button_new_with_label ("Expand All");
7874 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7875 g_signal_connect (button, "clicked",
7876 G_CALLBACK (expand_all), ctree);
7878 button = gtk_button_new_with_label ("Collapse All");
7879 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7880 g_signal_connect (button, "clicked",
7881 G_CALLBACK (collapse_all), ctree);
7883 button = gtk_button_new_with_label ("Change Style");
7884 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7885 g_signal_connect (button, "clicked",
7886 G_CALLBACK (change_style), ctree);
7888 button = gtk_button_new_with_label ("Export Tree");
7889 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7890 g_signal_connect (button, "clicked",
7891 G_CALLBACK (export_ctree), ctree);
7893 hbox = gtk_hbox_new (FALSE, 5);
7894 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7896 button = gtk_button_new_with_label ("Select All");
7897 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7898 g_signal_connect (button, "clicked",
7899 G_CALLBACK (select_all), ctree);
7901 button = gtk_button_new_with_label ("Unselect All");
7902 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7903 g_signal_connect (button, "clicked",
7904 G_CALLBACK (unselect_all), ctree);
7906 button = gtk_button_new_with_label ("Remove Selection");
7907 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7908 g_signal_connect (button, "clicked",
7909 G_CALLBACK (remove_selection), ctree);
7911 check = gtk_check_button_new_with_label ("Reorderable");
7912 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
7913 gtk_tooltips_set_tip (tooltips, check,
7914 "Tree items can be reordered by dragging.", NULL);
7915 g_signal_connect (check, "clicked",
7916 G_CALLBACK (toggle_reorderable), ctree);
7917 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
7919 hbox = gtk_hbox_new (TRUE, 5);
7920 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7922 omenu1 = build_option_menu (items1, 4, 2,
7923 ctree_toggle_line_style,
7925 gtk_box_pack_start (GTK_BOX (hbox), omenu1, FALSE, TRUE, 0);
7926 gtk_tooltips_set_tip (tooltips, omenu1, "The tree's line style.", NULL);
7928 omenu2 = build_option_menu (items2, 4, 1,
7929 ctree_toggle_expander_style,
7931 gtk_box_pack_start (GTK_BOX (hbox), omenu2, FALSE, TRUE, 0);
7932 gtk_tooltips_set_tip (tooltips, omenu2, "The tree's expander style.",
7935 omenu3 = build_option_menu (items3, 2, 0,
7936 ctree_toggle_justify, ctree);
7937 gtk_box_pack_start (GTK_BOX (hbox), omenu3, FALSE, TRUE, 0);
7938 gtk_tooltips_set_tip (tooltips, omenu3, "The tree's justification.",
7941 omenu4 = build_option_menu (selection_mode_items, 3, 3,
7942 ctree_toggle_sel_mode, ctree);
7943 gtk_box_pack_start (GTK_BOX (hbox), omenu4, FALSE, TRUE, 0);
7944 gtk_tooltips_set_tip (tooltips, omenu4, "The list's selection mode.",
7947 gtk_widget_realize (window);
7949 gtk_widget_set_size_request (GTK_WIDGET (ctree), -1, 300);
7951 frame = gtk_frame_new (NULL);
7952 gtk_container_set_border_width (GTK_CONTAINER (frame), 0);
7953 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
7954 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
7956 hbox = gtk_hbox_new (TRUE, 2);
7957 gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
7958 gtk_container_add (GTK_CONTAINER (frame), hbox);
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 ("Books :");
7969 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
7971 sprintf (buf, "%d", books);
7972 book_label = gtk_label_new (buf);
7973 gtk_box_pack_end (GTK_BOX (hbox2), book_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 ("Pages :");
7984 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
7986 sprintf (buf, "%d", pages);
7987 page_label = gtk_label_new (buf);
7988 gtk_box_pack_end (GTK_BOX (hbox2), page_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 ("Selected :");
7999 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
8001 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
8002 sel_label = gtk_label_new (buf);
8003 gtk_box_pack_end (GTK_BOX (hbox2), sel_label, FALSE, TRUE, 5);
8005 frame = gtk_frame_new (NULL);
8006 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
8007 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
8009 hbox2 = gtk_hbox_new (FALSE, 0);
8010 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
8011 gtk_container_add (GTK_CONTAINER (frame), hbox2);
8013 label = gtk_label_new ("Visible :");
8014 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
8016 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
8017 vis_label = gtk_label_new (buf);
8018 gtk_box_pack_end (GTK_BOX (hbox2), vis_label, FALSE, TRUE, 5);
8020 rebuild_tree (NULL, ctree);
8023 if (!GTK_WIDGET_VISIBLE (window))
8024 gtk_widget_show_all (window);
8026 gtk_widget_destroy (window);
8034 color_selection_ok (GtkWidget *w,
8035 GtkColorSelectionDialog *cs)
8037 GtkColorSelection *colorsel;
8040 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
8042 gtk_color_selection_get_color(colorsel,color);
8043 gtk_color_selection_set_color(colorsel,color);
8047 color_selection_changed (GtkWidget *w,
8048 GtkColorSelectionDialog *cs)
8050 GtkColorSelection *colorsel;
8053 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
8054 gtk_color_selection_get_color(colorsel,color);
8059 opacity_toggled_cb (GtkWidget *w,
8060 GtkColorSelectionDialog *cs)
8062 GtkColorSelection *colorsel;
8064 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
8065 gtk_color_selection_set_has_opacity_control (colorsel,
8066 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
8070 palette_toggled_cb (GtkWidget *w,
8071 GtkColorSelectionDialog *cs)
8073 GtkColorSelection *colorsel;
8075 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
8076 gtk_color_selection_set_has_palette (colorsel,
8077 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
8082 create_color_selection (GtkWidget *widget)
8084 static GtkWidget *window = NULL;
8092 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8093 gtk_window_set_screen (GTK_WINDOW (window),
8094 gtk_widget_get_screen (widget));
8096 g_signal_connect (window, "destroy",
8097 G_CALLBACK (gtk_widget_destroyed),
8100 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
8101 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8103 hbox = gtk_hbox_new (FALSE, 8);
8104 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
8105 gtk_container_add (GTK_CONTAINER (window), hbox);
8107 label = gtk_label_new ("Pick a color");
8108 gtk_container_add (GTK_CONTAINER (hbox), label);
8110 picker = gtk_color_button_new ();
8111 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
8112 gtk_container_add (GTK_CONTAINER (hbox), picker);
8115 if (!GTK_WIDGET_VISIBLE (window))
8116 gtk_widget_show_all (window);
8118 gtk_widget_destroy (window);
8126 show_fileops (GtkWidget *widget,
8127 GtkFileSelection *fs)
8131 show_ops = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8134 gtk_file_selection_show_fileop_buttons (fs);
8136 gtk_file_selection_hide_fileop_buttons (fs);
8140 select_multiple (GtkWidget *widget,
8141 GtkFileSelection *fs)
8143 gboolean select_multiple;
8145 select_multiple = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8146 gtk_file_selection_set_select_multiple (fs, select_multiple);
8150 file_selection_ok (GtkFileSelection *fs)
8155 selections = gtk_file_selection_get_selections (fs);
8157 for (i = 0; selections[i] != NULL; i++)
8158 g_print ("%s\n", selections[i]);
8160 g_strfreev (selections);
8162 gtk_widget_destroy (GTK_WIDGET (fs));
8166 create_file_selection (GtkWidget *widget)
8168 static GtkWidget *window = NULL;
8173 window = gtk_file_selection_new ("file selection dialog");
8174 gtk_window_set_screen (GTK_WINDOW (window),
8175 gtk_widget_get_screen (widget));
8177 gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window));
8179 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
8181 g_signal_connect (window, "destroy",
8182 G_CALLBACK (gtk_widget_destroyed),
8185 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->ok_button,
8187 G_CALLBACK (file_selection_ok),
8189 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->cancel_button,
8191 G_CALLBACK (gtk_widget_destroy),
8194 button = gtk_check_button_new_with_label ("Show Fileops");
8195 g_signal_connect (button, "toggled",
8196 G_CALLBACK (show_fileops),
8198 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
8199 button, FALSE, FALSE, 0);
8200 gtk_widget_show (button);
8202 button = gtk_check_button_new_with_label ("Select Multiple");
8203 g_signal_connect (button, "clicked",
8204 G_CALLBACK (select_multiple),
8206 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
8207 button, FALSE, FALSE, 0);
8208 gtk_widget_show (button);
8211 if (!GTK_WIDGET_VISIBLE (window))
8212 gtk_widget_show (window);
8214 gtk_widget_destroy (window);
8218 flipping_toggled_cb (GtkWidget *widget, gpointer data)
8220 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8221 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
8223 gtk_widget_set_default_direction (new_direction);
8227 set_direction_recurse (GtkWidget *widget,
8230 GtkTextDirection *dir = data;
8232 gtk_widget_set_direction (widget, *dir);
8233 if (GTK_IS_CONTAINER (widget))
8234 gtk_container_foreach (GTK_CONTAINER (widget),
8235 set_direction_recurse,
8240 create_forward_back (const char *title,
8241 GtkTextDirection text_dir)
8243 GtkWidget *frame = gtk_frame_new (title);
8244 GtkWidget *bbox = gtk_hbutton_box_new ();
8245 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
8246 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
8248 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
8250 gtk_container_add (GTK_CONTAINER (frame), bbox);
8251 gtk_container_add (GTK_CONTAINER (bbox), back_button);
8252 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
8254 set_direction_recurse (frame, &text_dir);
8260 create_flipping (GtkWidget *widget)
8262 static GtkWidget *window = NULL;
8263 GtkWidget *check_button, *button;
8267 window = gtk_dialog_new ();
8269 gtk_window_set_screen (GTK_WINDOW (window),
8270 gtk_widget_get_screen (widget));
8272 g_signal_connect (window, "destroy",
8273 G_CALLBACK (gtk_widget_destroyed),
8276 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
8278 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
8279 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8280 check_button, TRUE, TRUE, 0);
8282 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8283 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
8286 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8287 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
8290 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8291 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
8294 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
8295 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
8297 g_signal_connect (check_button, "toggled",
8298 G_CALLBACK (flipping_toggled_cb), NULL);
8300 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
8302 button = gtk_button_new_with_label ("Close");
8303 g_signal_connect_swapped (button, "clicked",
8304 G_CALLBACK (gtk_widget_destroy), window);
8305 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
8306 button, TRUE, TRUE, 0);
8309 if (!GTK_WIDGET_VISIBLE (window))
8310 gtk_widget_show_all (window);
8312 gtk_widget_destroy (window);
8320 make_focus_table (GList **list)
8325 table = gtk_table_new (5, 5, FALSE);
8338 widget = gtk_entry_new ();
8340 widget = gtk_button_new_with_label ("Foo");
8342 *list = g_list_prepend (*list, widget);
8344 gtk_table_attach (GTK_TABLE (table),
8348 GTK_EXPAND | GTK_FILL,
8349 GTK_EXPAND | GTK_FILL,
8358 *list = g_list_reverse (*list);
8364 create_focus (GtkWidget *widget)
8366 static GtkWidget *window = NULL;
8374 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
8380 gtk_window_set_screen (GTK_WINDOW (window),
8381 gtk_widget_get_screen (widget));
8383 g_signal_connect (window, "destroy",
8384 G_CALLBACK (gtk_widget_destroyed),
8387 g_signal_connect (window, "response",
8388 G_CALLBACK (gtk_widget_destroy),
8391 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
8393 frame = gtk_frame_new ("Weird tab focus chain");
8395 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8396 frame, TRUE, TRUE, 0);
8398 table = make_focus_table (&list);
8400 gtk_container_add (GTK_CONTAINER (frame), table);
8402 gtk_container_set_focus_chain (GTK_CONTAINER (table),
8407 frame = gtk_frame_new ("Default tab focus chain");
8409 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
8410 frame, TRUE, TRUE, 0);
8413 table = make_focus_table (&list);
8417 gtk_container_add (GTK_CONTAINER (frame), table);
8420 if (!GTK_WIDGET_VISIBLE (window))
8421 gtk_widget_show_all (window);
8423 gtk_widget_destroy (window);
8431 font_selection_ok (GtkWidget *w,
8432 GtkFontSelectionDialog *fs)
8434 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
8436 g_print ("%s\n", s);
8438 gtk_widget_destroy (GTK_WIDGET (fs));
8442 create_font_selection (GtkWidget *widget)
8444 static GtkWidget *window = NULL;
8452 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8453 gtk_window_set_screen (GTK_WINDOW (window),
8454 gtk_widget_get_screen (widget));
8456 g_signal_connect (window, "destroy",
8457 G_CALLBACK (gtk_widget_destroyed),
8460 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
8461 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8463 hbox = gtk_hbox_new (FALSE, 8);
8464 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
8465 gtk_container_add (GTK_CONTAINER (window), hbox);
8467 label = gtk_label_new ("Pick a font");
8468 gtk_container_add (GTK_CONTAINER (hbox), label);
8470 picker = gtk_font_button_new ();
8471 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
8472 gtk_container_add (GTK_CONTAINER (hbox), picker);
8475 if (!GTK_WIDGET_VISIBLE (window))
8476 gtk_widget_show_all (window);
8478 gtk_widget_destroy (window);
8485 static GtkWidget *dialog_window = NULL;
8488 label_toggle (GtkWidget *widget,
8493 *label = gtk_label_new ("Dialog Test");
8494 g_signal_connect (*label,
8496 G_CALLBACK (gtk_widget_destroyed),
8498 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
8499 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
8500 *label, TRUE, TRUE, 0);
8501 gtk_widget_show (*label);
8504 gtk_widget_destroy (*label);
8507 #define RESPONSE_TOGGLE_SEPARATOR 1
8510 print_response (GtkWidget *dialog,
8514 g_print ("response signal received (%d)\n", response_id);
8516 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
8518 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
8519 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
8524 create_dialog (GtkWidget *widget)
8526 static GtkWidget *label;
8531 /* This is a terrible example; it's much simpler to create
8532 * dialogs than this. Don't use testgtk for example code,
8536 dialog_window = gtk_dialog_new ();
8537 gtk_window_set_screen (GTK_WINDOW (dialog_window),
8538 gtk_widget_get_screen (widget));
8540 g_signal_connect (dialog_window,
8542 G_CALLBACK (print_response),
8545 g_signal_connect (dialog_window, "destroy",
8546 G_CALLBACK (gtk_widget_destroyed),
8549 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
8550 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
8552 button = gtk_button_new_with_label ("OK");
8553 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8554 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8555 button, TRUE, TRUE, 0);
8556 gtk_widget_grab_default (button);
8557 gtk_widget_show (button);
8559 button = gtk_button_new_with_label ("Toggle");
8560 g_signal_connect (button, "clicked",
8561 G_CALLBACK (label_toggle),
8563 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8564 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8565 button, TRUE, TRUE, 0);
8566 gtk_widget_show (button);
8570 button = gtk_button_new_with_label ("Separator");
8572 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8574 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
8576 RESPONSE_TOGGLE_SEPARATOR);
8577 gtk_widget_show (button);
8580 if (!GTK_WIDGET_VISIBLE (dialog_window))
8581 gtk_widget_show (dialog_window);
8583 gtk_widget_destroy (dialog_window);
8586 /* Display & Screen test
8592 GtkWidget *radio_dpy;
8593 GtkWidget *toplevel;
8594 GtkWidget *dialog_window;
8595 GList *valid_display_list;
8596 } ScreenDisplaySelection;
8599 display_name_cmp (gconstpointer a,
8602 return g_ascii_strcasecmp (a,b);
8606 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
8609 GdkDisplay *display = gtk_widget_get_display (widget);
8611 GdkScreen *new_screen = NULL;
8612 GdkScreen *current_screen = gtk_widget_get_screen (widget);
8614 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
8616 display_name = g_strdup (gtk_entry_get_text (data->entry));
8617 display = gdk_display_open (display_name);
8621 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
8622 GTK_DIALOG_DESTROY_WITH_PARENT,
8625 "The display :\n%s\ncannot be opened",
8627 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
8628 gtk_widget_show (dialog);
8629 g_signal_connect (dialog, "response",
8630 G_CALLBACK (gtk_widget_destroy),
8635 if (!g_list_find_custom (data->valid_display_list,
8638 data->valid_display_list = g_list_append (data->valid_display_list,
8641 new_screen = gdk_display_get_default_screen (display);
8646 gint number_of_screens = gdk_display_get_n_screens (display);
8647 gint screen_num = gdk_screen_get_number (current_screen);
8648 if ((screen_num +1) < number_of_screens)
8649 new_screen = gdk_display_get_screen (display, screen_num + 1);
8651 new_screen = gdk_display_get_screen (display, 0);
8656 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
8657 gtk_widget_destroy (data->dialog_window);
8662 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
8664 gtk_widget_destroy (data);
8668 create_display_screen (GtkWidget *widget)
8670 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
8671 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
8673 ScreenDisplaySelection *scr_dpy_data;
8674 GdkScreen *screen = gtk_widget_get_screen (widget);
8675 static GList *valid_display_list = NULL;
8677 GdkDisplay *display = gdk_screen_get_display (screen);
8679 window = gtk_widget_new (gtk_window_get_type (),
8682 "type", GTK_WINDOW_TOPLEVEL,
8684 "Screen or Display selection",
8685 "border_width", 10, NULL);
8686 g_signal_connect (window, "destroy",
8687 G_CALLBACK (gtk_widget_destroy), NULL);
8689 vbox = gtk_vbox_new (FALSE, 3);
8690 gtk_container_add (GTK_CONTAINER (window), vbox);
8692 frame = gtk_frame_new ("Select screen or display");
8693 gtk_container_add (GTK_CONTAINER (vbox), frame);
8695 table = gtk_table_new (2, 2, TRUE);
8696 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
8697 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
8699 gtk_container_add (GTK_CONTAINER (frame), table);
8701 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
8702 if (gdk_display_get_n_screens(display) > 1)
8703 radio_scr = gtk_radio_button_new_with_label
8704 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
8707 radio_scr = gtk_radio_button_new_with_label
8708 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
8709 "only one screen on the current display");
8710 gtk_widget_set_sensitive (radio_scr, FALSE);
8712 combo_dpy = gtk_combo_new ();
8713 if (!valid_display_list)
8714 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
8716 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
8718 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
8719 "<hostname>:<X Server Num>.<Screen Num>");
8721 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
8722 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
8723 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
8725 bbox = gtk_hbutton_box_new ();
8726 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
8727 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
8729 gtk_container_add (GTK_CONTAINER (vbox), bbox);
8731 gtk_container_add (GTK_CONTAINER (bbox), applyb);
8732 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
8734 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
8736 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
8737 scr_dpy_data->radio_dpy = radio_dpy;
8738 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
8739 scr_dpy_data->dialog_window = window;
8740 scr_dpy_data->valid_display_list = valid_display_list;
8742 g_signal_connect (cancelb, "clicked",
8743 G_CALLBACK (screen_display_destroy_diag), window);
8744 g_signal_connect (applyb, "clicked",
8745 G_CALLBACK (screen_display_check), scr_dpy_data);
8746 gtk_widget_show_all (window);
8751 static gboolean event_watcher_enter_id = 0;
8752 static gboolean event_watcher_leave_id = 0;
8755 event_watcher (GSignalInvocationHint *ihint,
8756 guint n_param_values,
8757 const GValue *param_values,
8760 g_print ("Watch: \"%s\" emitted for %s\n",
8761 g_signal_name (ihint->signal_id),
8762 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
8768 event_watcher_down (void)
8770 if (event_watcher_enter_id)
8774 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
8775 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
8776 event_watcher_enter_id = 0;
8777 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
8778 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
8779 event_watcher_leave_id = 0;
8784 event_watcher_toggle (void)
8786 if (event_watcher_enter_id)
8787 event_watcher_down ();
8792 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
8793 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8794 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
8795 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8800 create_event_watcher (GtkWidget *widget)
8806 dialog_window = gtk_dialog_new ();
8807 gtk_window_set_screen (GTK_WINDOW (dialog_window),
8808 gtk_widget_get_screen (widget));
8810 g_signal_connect (dialog_window, "destroy",
8811 G_CALLBACK (gtk_widget_destroyed),
8813 g_signal_connect (dialog_window, "destroy",
8814 G_CALLBACK (event_watcher_down),
8817 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
8818 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
8819 gtk_widget_set_size_request (dialog_window, 200, 110);
8821 button = gtk_toggle_button_new_with_label ("Activate Watch");
8822 g_signal_connect (button, "clicked",
8823 G_CALLBACK (event_watcher_toggle),
8825 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
8826 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
8827 button, TRUE, TRUE, 0);
8828 gtk_widget_show (button);
8830 button = gtk_button_new_with_label ("Close");
8831 g_signal_connect_swapped (button, "clicked",
8832 G_CALLBACK (gtk_widget_destroy),
8834 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8835 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8836 button, TRUE, TRUE, 0);
8837 gtk_widget_grab_default (button);
8838 gtk_widget_show (button);
8841 if (!GTK_WIDGET_VISIBLE (dialog_window))
8842 gtk_widget_show (dialog_window);
8844 gtk_widget_destroy (dialog_window);
8852 reformat_value (GtkScale *scale,
8855 return g_strdup_printf ("-->%0.*g<--",
8856 gtk_scale_get_digits (scale), value);
8860 create_range_controls (GtkWidget *widget)
8862 static GtkWidget *window = NULL;
8866 GtkWidget *scrollbar;
8868 GtkWidget *separator;
8869 GtkObject *adjustment;
8874 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8876 gtk_window_set_screen (GTK_WINDOW (window),
8877 gtk_widget_get_screen (widget));
8879 g_signal_connect (window, "destroy",
8880 G_CALLBACK (gtk_widget_destroyed),
8883 gtk_window_set_title (GTK_WINDOW (window), "range controls");
8884 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8887 box1 = gtk_vbox_new (FALSE, 0);
8888 gtk_container_add (GTK_CONTAINER (window), box1);
8889 gtk_widget_show (box1);
8892 box2 = gtk_vbox_new (FALSE, 10);
8893 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8894 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
8895 gtk_widget_show (box2);
8898 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
8900 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
8901 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
8902 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
8903 gtk_scale_set_digits (GTK_SCALE (scale), 1);
8904 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8905 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
8906 gtk_widget_show (scale);
8908 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
8909 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
8910 GTK_UPDATE_CONTINUOUS);
8911 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
8912 gtk_widget_show (scrollbar);
8914 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
8915 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8916 g_signal_connect (scale,
8918 G_CALLBACK (reformat_value),
8920 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
8921 gtk_widget_show (scale);
8923 hbox = gtk_hbox_new (FALSE, 0);
8925 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8926 gtk_widget_set_size_request (scale, -1, 200);
8927 gtk_scale_set_digits (GTK_SCALE (scale), 2);
8928 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8929 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8930 gtk_widget_show (scale);
8932 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8933 gtk_widget_set_size_request (scale, -1, 200);
8934 gtk_scale_set_digits (GTK_SCALE (scale), 2);
8935 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8936 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
8937 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8938 gtk_widget_show (scale);
8940 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8941 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8942 g_signal_connect (scale,
8944 G_CALLBACK (reformat_value),
8946 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8947 gtk_widget_show (scale);
8950 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
8951 gtk_widget_show (hbox);
8953 separator = gtk_hseparator_new ();
8954 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
8955 gtk_widget_show (separator);
8958 box2 = gtk_vbox_new (FALSE, 10);
8959 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8960 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8961 gtk_widget_show (box2);
8964 button = gtk_button_new_with_label ("close");
8965 g_signal_connect_swapped (button, "clicked",
8966 G_CALLBACK (gtk_widget_destroy),
8968 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8969 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8970 gtk_widget_grab_default (button);
8971 gtk_widget_show (button);
8974 if (!GTK_WIDGET_VISIBLE (window))
8975 gtk_widget_show (window);
8977 gtk_widget_destroy (window);
8985 create_rulers (GtkWidget *widget)
8987 static GtkWidget *window = NULL;
8993 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8995 gtk_window_set_screen (GTK_WINDOW (window),
8996 gtk_widget_get_screen (widget));
8998 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
9000 g_signal_connect (window, "destroy",
9001 G_CALLBACK (gtk_widget_destroyed),
9004 gtk_window_set_title (GTK_WINDOW (window), "rulers");
9005 gtk_widget_set_size_request (window, 300, 300);
9006 gtk_widget_set_events (window,
9007 GDK_POINTER_MOTION_MASK
9008 | GDK_POINTER_MOTION_HINT_MASK);
9009 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9011 table = gtk_table_new (2, 2, FALSE);
9012 gtk_container_add (GTK_CONTAINER (window), table);
9013 gtk_widget_show (table);
9015 ruler = gtk_hruler_new ();
9016 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
9017 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
9019 g_signal_connect_swapped (window,
9020 "motion_notify_event",
9021 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
9024 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
9025 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
9026 gtk_widget_show (ruler);
9029 ruler = gtk_vruler_new ();
9030 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
9032 g_signal_connect_swapped (window,
9033 "motion_notify_event",
9034 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
9037 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
9038 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
9039 gtk_widget_show (ruler);
9042 if (!GTK_WIDGET_VISIBLE (window))
9043 gtk_widget_show (window);
9045 gtk_widget_destroy (window);
9049 text_toggle_editable (GtkWidget *checkbutton,
9052 gtk_text_set_editable(GTK_TEXT(text),
9053 GTK_TOGGLE_BUTTON(checkbutton)->active);
9057 text_toggle_word_wrap (GtkWidget *checkbutton,
9060 gtk_text_set_word_wrap(GTK_TEXT(text),
9061 GTK_TOGGLE_BUTTON(checkbutton)->active);
9068 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
9069 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
9070 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
9071 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
9072 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
9073 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
9074 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
9075 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
9078 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
9084 text_insert_random (GtkWidget *w, GtkText *text)
9088 for (i=0; i<10; i++)
9090 c = 'A' + rand() % ('Z' - 'A');
9091 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
9092 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
9097 create_text (GtkWidget *widget)
9101 static GtkWidget *window = NULL;
9107 GtkWidget *separator;
9108 GtkWidget *scrolled_window;
9115 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9116 gtk_window_set_screen (GTK_WINDOW (window),
9117 gtk_widget_get_screen (widget));
9119 gtk_widget_set_name (window, "text window");
9120 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
9121 gtk_widget_set_size_request (window, 500, 500);
9123 g_signal_connect (window, "destroy",
9124 G_CALLBACK (gtk_widget_destroyed),
9127 gtk_window_set_title (GTK_WINDOW (window), "test");
9128 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9131 box1 = gtk_vbox_new (FALSE, 0);
9132 gtk_container_add (GTK_CONTAINER (window), box1);
9133 gtk_widget_show (box1);
9136 box2 = gtk_vbox_new (FALSE, 10);
9137 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9138 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
9139 gtk_widget_show (box2);
9142 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
9143 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
9144 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
9147 gtk_widget_show (scrolled_window);
9149 text = gtk_text_new (NULL, NULL);
9150 gtk_text_set_editable (GTK_TEXT (text), TRUE);
9151 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
9152 gtk_widget_grab_focus (text);
9153 gtk_widget_show (text);
9156 gtk_text_freeze (GTK_TEXT (text));
9158 for (i=0; i<ntext_colors; i++)
9160 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
9161 text_colors[i].name, -1);
9162 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
9164 for (j=0; j<ntext_colors; j++)
9166 gtk_text_insert (GTK_TEXT (text), NULL,
9167 &text_colors[j].color, &text_colors[i].color,
9170 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
9173 infile = fopen("testgtk.c", "r");
9178 int nbytes_read, nbytes_alloc;
9181 nbytes_alloc = 1024;
9182 buffer = g_new (char, nbytes_alloc);
9186 if (nbytes_alloc < nbytes_read + 1024)
9189 buffer = g_realloc (buffer, nbytes_alloc);
9191 len = fread (buffer + nbytes_read, 1, 1024, infile);
9197 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
9198 NULL, buffer, nbytes_read);
9203 gtk_text_thaw (GTK_TEXT (text));
9205 hbox = gtk_hbutton_box_new ();
9206 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
9207 gtk_widget_show (hbox);
9209 check = gtk_check_button_new_with_label("Editable");
9210 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
9211 g_signal_connect (check, "toggled",
9212 G_CALLBACK (text_toggle_editable), text);
9213 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
9214 gtk_widget_show (check);
9216 check = gtk_check_button_new_with_label("Wrap Words");
9217 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
9218 g_signal_connect (check, "toggled",
9219 G_CALLBACK (text_toggle_word_wrap), text);
9220 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
9221 gtk_widget_show (check);
9223 separator = gtk_hseparator_new ();
9224 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9225 gtk_widget_show (separator);
9228 box2 = gtk_vbox_new (FALSE, 10);
9229 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9230 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9231 gtk_widget_show (box2);
9234 button = gtk_button_new_with_label ("insert random");
9235 g_signal_connect (button, "clicked",
9236 G_CALLBACK (text_insert_random),
9238 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9239 gtk_widget_show (button);
9241 button = gtk_button_new_with_label ("close");
9242 g_signal_connect_swapped (button, "clicked",
9243 G_CALLBACK (gtk_widget_destroy),
9245 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9246 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9247 gtk_widget_grab_default (button);
9248 gtk_widget_show (button);
9251 if (!GTK_WIDGET_VISIBLE (window))
9252 gtk_widget_show (window);
9254 gtk_widget_destroy (window);
9261 GdkPixbuf *book_open;
9262 GdkPixbuf *book_closed;
9263 GtkWidget *sample_notebook;
9266 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
9268 GtkWidget *page_widget;
9271 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
9273 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
9274 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
9276 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
9277 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
9281 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
9283 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
9284 gint old_page_num = gtk_notebook_get_current_page (notebook);
9286 if (page_num == old_page_num)
9289 set_page_image (notebook, page_num, book_open);
9291 if (old_page_num != -1)
9292 set_page_image (notebook, old_page_num, book_closed);
9296 tab_fill (GtkToggleButton *button, GtkWidget *child)
9299 GtkPackType pack_type;
9301 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9302 &expand, NULL, &pack_type);
9303 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9304 expand, button->active, pack_type);
9308 tab_expand (GtkToggleButton *button, GtkWidget *child)
9311 GtkPackType pack_type;
9313 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9314 NULL, &fill, &pack_type);
9315 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9316 button->active, fill, pack_type);
9320 tab_pack (GtkToggleButton *button, GtkWidget *child)
9326 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9327 &expand, &fill, NULL);
9328 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
9329 expand, fill, button->active);
9333 create_pages (GtkNotebook *notebook, gint start, gint end)
9335 GtkWidget *child = NULL;
9340 GtkWidget *label_box;
9341 GtkWidget *menu_box;
9345 char accel_buffer[32];
9347 for (i = start; i <= end; i++)
9349 sprintf (buffer, "Page %d", i);
9350 sprintf (accel_buffer, "Page _%d", i);
9352 child = gtk_frame_new (buffer);
9353 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
9355 vbox = gtk_vbox_new (TRUE,0);
9356 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9357 gtk_container_add (GTK_CONTAINER (child), vbox);
9359 hbox = gtk_hbox_new (TRUE,0);
9360 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
9362 button = gtk_check_button_new_with_label ("Fill Tab");
9363 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9364 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
9365 g_signal_connect (button, "toggled",
9366 G_CALLBACK (tab_fill), child);
9368 button = gtk_check_button_new_with_label ("Expand Tab");
9369 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9370 g_signal_connect (button, "toggled",
9371 G_CALLBACK (tab_expand), child);
9373 button = gtk_check_button_new_with_label ("Pack end");
9374 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
9375 g_signal_connect (button, "toggled",
9376 G_CALLBACK (tab_pack), child);
9378 button = gtk_button_new_with_label ("Hide Page");
9379 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
9380 g_signal_connect_swapped (button, "clicked",
9381 G_CALLBACK (gtk_widget_hide),
9384 gtk_widget_show_all (child);
9386 label_box = gtk_hbox_new (FALSE, 0);
9387 pixwid = gtk_image_new_from_pixbuf (book_closed);
9388 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
9390 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
9391 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
9392 label = gtk_label_new_with_mnemonic (accel_buffer);
9393 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
9394 gtk_widget_show_all (label_box);
9397 menu_box = gtk_hbox_new (FALSE, 0);
9398 pixwid = gtk_image_new_from_pixbuf (book_closed);
9399 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
9401 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
9402 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
9403 label = gtk_label_new (buffer);
9404 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
9405 gtk_widget_show_all (menu_box);
9407 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
9412 rotate_notebook (GtkButton *button,
9413 GtkNotebook *notebook)
9415 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
9419 show_all_pages (GtkButton *button,
9420 GtkNotebook *notebook)
9422 gtk_container_foreach (GTK_CONTAINER (notebook),
9423 (GtkCallback) gtk_widget_show, NULL);
9427 notebook_type_changed (GtkWidget *optionmenu,
9430 GtkNotebook *notebook;
9440 notebook = GTK_NOTEBOOK (data);
9442 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
9447 /* standard notebook */
9448 gtk_notebook_set_show_tabs (notebook, TRUE);
9449 gtk_notebook_set_show_border (notebook, TRUE);
9450 gtk_notebook_set_scrollable (notebook, FALSE);
9454 /* notabs notebook */
9455 gtk_notebook_set_show_tabs (notebook, FALSE);
9456 gtk_notebook_set_show_border (notebook, TRUE);
9461 gtk_notebook_set_show_tabs (notebook, FALSE);
9462 gtk_notebook_set_show_border (notebook, FALSE);
9467 gtk_notebook_set_show_tabs (notebook, TRUE);
9468 gtk_notebook_set_show_border (notebook, TRUE);
9469 gtk_notebook_set_scrollable (notebook, TRUE);
9470 if (g_list_length (notebook->children) == 5)
9471 create_pages (notebook, 6, 15);
9477 if (g_list_length (notebook->children) == 15)
9478 for (i = 0; i < 10; i++)
9479 gtk_notebook_remove_page (notebook, 5);
9483 notebook_popup (GtkToggleButton *button,
9484 GtkNotebook *notebook)
9487 gtk_notebook_popup_enable (notebook);
9489 gtk_notebook_popup_disable (notebook);
9493 notebook_homogeneous (GtkToggleButton *button,
9494 GtkNotebook *notebook)
9496 g_object_set (notebook, "homogeneous", button->active, NULL);
9500 create_notebook (GtkWidget *widget)
9502 static GtkWidget *window = NULL;
9506 GtkWidget *separator;
9510 static gchar *items[] =
9520 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9521 gtk_window_set_screen (GTK_WINDOW (window),
9522 gtk_widget_get_screen (widget));
9524 g_signal_connect (window, "destroy",
9525 G_CALLBACK (gtk_widget_destroyed),
9528 gtk_window_set_title (GTK_WINDOW (window), "notebook");
9529 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9531 box1 = gtk_vbox_new (FALSE, 0);
9532 gtk_container_add (GTK_CONTAINER (window), box1);
9534 sample_notebook = gtk_notebook_new ();
9535 g_signal_connect (sample_notebook, "switch_page",
9536 G_CALLBACK (page_switch), NULL);
9537 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
9538 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
9539 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
9541 gtk_widget_realize (sample_notebook);
9544 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
9547 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
9549 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
9551 separator = gtk_hseparator_new ();
9552 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
9554 box2 = gtk_hbox_new (FALSE, 5);
9555 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9556 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9558 button = gtk_check_button_new_with_label ("popup menu");
9559 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
9560 g_signal_connect (button, "clicked",
9561 G_CALLBACK (notebook_popup),
9564 button = gtk_check_button_new_with_label ("homogeneous tabs");
9565 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
9566 g_signal_connect (button, "clicked",
9567 G_CALLBACK (notebook_homogeneous),
9570 box2 = gtk_hbox_new (FALSE, 5);
9571 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9572 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9574 label = gtk_label_new ("Notebook Style :");
9575 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
9577 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
9578 notebook_type_changed,
9580 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
9582 button = gtk_button_new_with_label ("Show all Pages");
9583 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
9584 g_signal_connect (button, "clicked",
9585 G_CALLBACK (show_all_pages), sample_notebook);
9587 box2 = gtk_hbox_new (TRUE, 10);
9588 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9589 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9591 button = gtk_button_new_with_label ("prev");
9592 g_signal_connect_swapped (button, "clicked",
9593 G_CALLBACK (gtk_notebook_prev_page),
9595 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9597 button = gtk_button_new_with_label ("next");
9598 g_signal_connect_swapped (button, "clicked",
9599 G_CALLBACK (gtk_notebook_next_page),
9601 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9603 button = gtk_button_new_with_label ("rotate");
9604 g_signal_connect (button, "clicked",
9605 G_CALLBACK (rotate_notebook), sample_notebook);
9606 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9608 separator = gtk_hseparator_new ();
9609 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
9611 button = gtk_button_new_with_label ("close");
9612 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
9613 g_signal_connect_swapped (button, "clicked",
9614 G_CALLBACK (gtk_widget_destroy),
9616 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
9617 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9618 gtk_widget_grab_default (button);
9621 if (!GTK_WIDGET_VISIBLE (window))
9622 gtk_widget_show_all (window);
9624 gtk_widget_destroy (window);
9632 toggle_resize (GtkWidget *widget, GtkWidget *child)
9634 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
9635 GValue value = { 0, };
9636 g_value_init (&value, G_TYPE_BOOLEAN);
9637 gtk_container_child_get_property (container, child, "resize", &value);
9638 g_value_set_boolean (&value, !g_value_get_boolean (&value));
9639 gtk_container_child_set_property (container, child, "resize", &value);
9643 toggle_shrink (GtkWidget *widget, GtkWidget *child)
9645 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
9646 GValue value = { 0, };
9647 g_value_init (&value, G_TYPE_BOOLEAN);
9648 gtk_container_child_get_property (container, child, "shrink", &value);
9649 g_value_set_boolean (&value, !g_value_get_boolean (&value));
9650 gtk_container_child_set_property (container, child, "shrink", &value);
9654 paned_props_clicked (GtkWidget *button,
9657 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
9659 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
9663 create_pane_options (GtkPaned *paned,
9664 const gchar *frame_label,
9665 const gchar *label1,
9666 const gchar *label2)
9672 GtkWidget *check_button;
9674 frame = gtk_frame_new (frame_label);
9675 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
9677 table = gtk_table_new (4, 2, 4);
9678 gtk_container_add (GTK_CONTAINER (frame), table);
9680 label = gtk_label_new (label1);
9681 gtk_table_attach_defaults (GTK_TABLE (table), label,
9684 check_button = gtk_check_button_new_with_label ("Resize");
9685 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9687 g_signal_connect (check_button, "toggled",
9688 G_CALLBACK (toggle_resize),
9691 check_button = gtk_check_button_new_with_label ("Shrink");
9692 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9694 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9696 g_signal_connect (check_button, "toggled",
9697 G_CALLBACK (toggle_shrink),
9700 label = gtk_label_new (label2);
9701 gtk_table_attach_defaults (GTK_TABLE (table), label,
9704 check_button = gtk_check_button_new_with_label ("Resize");
9705 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9707 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9709 g_signal_connect (check_button, "toggled",
9710 G_CALLBACK (toggle_resize),
9713 check_button = gtk_check_button_new_with_label ("Shrink");
9714 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
9716 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
9718 g_signal_connect (check_button, "toggled",
9719 G_CALLBACK (toggle_shrink),
9722 button = gtk_button_new_with_mnemonic ("_Properties");
9723 gtk_table_attach_defaults (GTK_TABLE (table), button,
9725 g_signal_connect (button, "clicked",
9726 G_CALLBACK (paned_props_clicked),
9733 create_panes (GtkWidget *widget)
9735 static GtkWidget *window = NULL;
9744 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9746 gtk_window_set_screen (GTK_WINDOW (window),
9747 gtk_widget_get_screen (widget));
9749 g_signal_connect (window, "destroy",
9750 G_CALLBACK (gtk_widget_destroyed),
9753 gtk_window_set_title (GTK_WINDOW (window), "Panes");
9754 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9756 vbox = gtk_vbox_new (FALSE, 0);
9757 gtk_container_add (GTK_CONTAINER (window), vbox);
9759 vpaned = gtk_vpaned_new ();
9760 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
9761 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
9763 hpaned = gtk_hpaned_new ();
9764 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
9766 frame = gtk_frame_new (NULL);
9767 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9768 gtk_widget_set_size_request (frame, 60, 60);
9769 gtk_paned_add1 (GTK_PANED (hpaned), frame);
9771 button = gtk_button_new_with_label ("Hi there");
9772 gtk_container_add (GTK_CONTAINER(frame), button);
9774 frame = gtk_frame_new (NULL);
9775 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9776 gtk_widget_set_size_request (frame, 80, 60);
9777 gtk_paned_add2 (GTK_PANED (hpaned), frame);
9779 frame = gtk_frame_new (NULL);
9780 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
9781 gtk_widget_set_size_request (frame, 60, 80);
9782 gtk_paned_add2 (GTK_PANED (vpaned), frame);
9784 /* Now create toggle buttons to control sizing */
9786 gtk_box_pack_start (GTK_BOX (vbox),
9787 create_pane_options (GTK_PANED (hpaned),
9793 gtk_box_pack_start (GTK_BOX (vbox),
9794 create_pane_options (GTK_PANED (vpaned),
9800 gtk_widget_show_all (vbox);
9803 if (!GTK_WIDGET_VISIBLE (window))
9804 gtk_widget_show (window);
9806 gtk_widget_destroy (window);
9810 * Paned keyboard navigation
9814 paned_keyboard_window1 (GtkWidget *widget)
9837 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9838 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
9839 gtk_window_set_screen (GTK_WINDOW (window1),
9840 gtk_widget_get_screen (widget));
9842 hpaned1 = gtk_hpaned_new ();
9843 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
9845 frame1 = gtk_frame_new (NULL);
9846 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
9847 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
9849 vbox1 = gtk_vbox_new (FALSE, 0);
9850 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
9852 button7 = gtk_button_new_with_label ("button7");
9853 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
9855 button8 = gtk_button_new_with_label ("button8");
9856 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
9858 button9 = gtk_button_new_with_label ("button9");
9859 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
9861 vpaned1 = gtk_vpaned_new ();
9862 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
9864 frame2 = gtk_frame_new (NULL);
9865 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
9866 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
9868 frame5 = gtk_frame_new (NULL);
9869 gtk_container_add (GTK_CONTAINER (frame2), frame5);
9871 hbox1 = gtk_hbox_new (FALSE, 0);
9872 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
9874 button5 = gtk_button_new_with_label ("button5");
9875 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
9877 button6 = gtk_button_new_with_label ("button6");
9878 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
9880 frame3 = gtk_frame_new (NULL);
9881 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
9882 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
9884 frame4 = gtk_frame_new ("Buttons");
9885 gtk_container_add (GTK_CONTAINER (frame3), frame4);
9886 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
9888 table1 = gtk_table_new (2, 2, FALSE);
9889 gtk_container_add (GTK_CONTAINER (frame4), table1);
9890 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
9892 button1 = gtk_button_new_with_label ("button1");
9893 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
9894 (GtkAttachOptions) (GTK_FILL),
9895 (GtkAttachOptions) (0), 0, 0);
9897 button2 = gtk_button_new_with_label ("button2");
9898 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
9899 (GtkAttachOptions) (GTK_FILL),
9900 (GtkAttachOptions) (0), 0, 0);
9902 button3 = gtk_button_new_with_label ("button3");
9903 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
9904 (GtkAttachOptions) (GTK_FILL),
9905 (GtkAttachOptions) (0), 0, 0);
9907 button4 = gtk_button_new_with_label ("button4");
9908 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
9909 (GtkAttachOptions) (GTK_FILL),
9910 (GtkAttachOptions) (0), 0, 0);
9916 paned_keyboard_window2 (GtkWidget *widget)
9921 GtkWidget *button13;
9925 GtkWidget *button12;
9927 GtkWidget *button11;
9928 GtkWidget *button10;
9930 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9931 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
9933 gtk_window_set_screen (GTK_WINDOW (window2),
9934 gtk_widget_get_screen (widget));
9936 hpaned2 = gtk_hpaned_new ();
9937 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
9939 frame6 = gtk_frame_new (NULL);
9940 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
9941 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
9943 button13 = gtk_button_new_with_label ("button13");
9944 gtk_container_add (GTK_CONTAINER (frame6), button13);
9946 hbox2 = gtk_hbox_new (FALSE, 0);
9947 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
9949 vpaned2 = gtk_vpaned_new ();
9950 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
9952 frame7 = gtk_frame_new (NULL);
9953 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
9954 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
9956 button12 = gtk_button_new_with_label ("button12");
9957 gtk_container_add (GTK_CONTAINER (frame7), button12);
9959 frame8 = gtk_frame_new (NULL);
9960 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
9961 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
9963 button11 = gtk_button_new_with_label ("button11");
9964 gtk_container_add (GTK_CONTAINER (frame8), button11);
9966 button10 = gtk_button_new_with_label ("button10");
9967 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
9973 paned_keyboard_window3 (GtkWidget *widget)
9980 GtkWidget *button14;
9983 GtkWidget *button15;
9986 GtkWidget *button16;
9988 GtkWidget *button17;
9990 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9991 g_object_set_data (G_OBJECT (window3), "window3", window3);
9992 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
9994 gtk_window_set_screen (GTK_WINDOW (window3),
9995 gtk_widget_get_screen (widget));
9998 vbox2 = gtk_vbox_new (FALSE, 0);
9999 gtk_container_add (GTK_CONTAINER (window3), vbox2);
10001 label1 = gtk_label_new ("Three panes nested inside each other");
10002 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
10004 hpaned3 = gtk_hpaned_new ();
10005 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
10007 frame9 = gtk_frame_new (NULL);
10008 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
10009 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
10011 button14 = gtk_button_new_with_label ("button14");
10012 gtk_container_add (GTK_CONTAINER (frame9), button14);
10014 hpaned4 = gtk_hpaned_new ();
10015 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
10017 frame10 = gtk_frame_new (NULL);
10018 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
10019 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
10021 button15 = gtk_button_new_with_label ("button15");
10022 gtk_container_add (GTK_CONTAINER (frame10), button15);
10024 hpaned5 = gtk_hpaned_new ();
10025 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
10027 frame11 = gtk_frame_new (NULL);
10028 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
10029 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
10031 button16 = gtk_button_new_with_label ("button16");
10032 gtk_container_add (GTK_CONTAINER (frame11), button16);
10034 frame12 = gtk_frame_new (NULL);
10035 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
10036 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
10038 button17 = gtk_button_new_with_label ("button17");
10039 gtk_container_add (GTK_CONTAINER (frame12), button17);
10045 paned_keyboard_window4 (GtkWidget *widget)
10047 GtkWidget *window4;
10050 GtkWidget *hpaned6;
10051 GtkWidget *vpaned3;
10052 GtkWidget *button19;
10053 GtkWidget *button18;
10055 GtkWidget *vpaned4;
10056 GtkWidget *button21;
10057 GtkWidget *button20;
10058 GtkWidget *vpaned5;
10059 GtkWidget *button23;
10060 GtkWidget *button22;
10061 GtkWidget *vpaned6;
10062 GtkWidget *button25;
10063 GtkWidget *button24;
10065 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10066 g_object_set_data (G_OBJECT (window4), "window4", window4);
10067 gtk_window_set_title (GTK_WINDOW (window4), "window4");
10069 gtk_window_set_screen (GTK_WINDOW (window4),
10070 gtk_widget_get_screen (widget));
10072 vbox3 = gtk_vbox_new (FALSE, 0);
10073 gtk_container_add (GTK_CONTAINER (window4), vbox3);
10075 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
10076 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
10077 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
10079 hpaned6 = gtk_hpaned_new ();
10080 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
10082 vpaned3 = gtk_vpaned_new ();
10083 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
10085 button19 = gtk_button_new_with_label ("button19");
10086 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
10088 button18 = gtk_button_new_with_label ("button18");
10089 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
10091 hbox3 = gtk_hbox_new (FALSE, 0);
10092 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
10094 vpaned4 = gtk_vpaned_new ();
10095 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
10097 button21 = gtk_button_new_with_label ("button21");
10098 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
10100 button20 = gtk_button_new_with_label ("button20");
10101 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
10103 vpaned5 = gtk_vpaned_new ();
10104 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
10106 button23 = gtk_button_new_with_label ("button23");
10107 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
10109 button22 = gtk_button_new_with_label ("button22");
10110 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
10112 vpaned6 = gtk_vpaned_new ();
10113 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
10115 button25 = gtk_button_new_with_label ("button25");
10116 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
10118 button24 = gtk_button_new_with_label ("button24");
10119 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
10125 create_paned_keyboard_navigation (GtkWidget *widget)
10127 static GtkWidget *window1 = NULL;
10128 static GtkWidget *window2 = NULL;
10129 static GtkWidget *window3 = NULL;
10130 static GtkWidget *window4 = NULL;
10133 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
10135 gtk_widget_destroy (window1);
10136 gtk_widget_destroy (window2);
10137 gtk_widget_destroy (window3);
10138 gtk_widget_destroy (window4);
10143 window1 = paned_keyboard_window1 (widget);
10144 g_signal_connect (window1, "destroy",
10145 G_CALLBACK (gtk_widget_destroyed),
10151 window2 = paned_keyboard_window2 (widget);
10152 g_signal_connect (window2, "destroy",
10153 G_CALLBACK (gtk_widget_destroyed),
10159 window3 = paned_keyboard_window3 (widget);
10160 g_signal_connect (window3, "destroy",
10161 G_CALLBACK (gtk_widget_destroyed),
10167 window4 = paned_keyboard_window4 (widget);
10168 g_signal_connect (window4, "destroy",
10169 G_CALLBACK (gtk_widget_destroyed),
10173 if (GTK_WIDGET_VISIBLE (window1))
10174 gtk_widget_destroy (GTK_WIDGET (window1));
10176 gtk_widget_show_all (GTK_WIDGET (window1));
10178 if (GTK_WIDGET_VISIBLE (window2))
10179 gtk_widget_destroy (GTK_WIDGET (window2));
10181 gtk_widget_show_all (GTK_WIDGET (window2));
10183 if (GTK_WIDGET_VISIBLE (window3))
10184 gtk_widget_destroy (GTK_WIDGET (window3));
10186 gtk_widget_show_all (GTK_WIDGET (window3));
10188 if (GTK_WIDGET_VISIBLE (window4))
10189 gtk_widget_destroy (GTK_WIDGET (window4));
10191 gtk_widget_show_all (GTK_WIDGET (window4));
10199 typedef struct _cursoroffset {gint x,y;} CursorOffset;
10202 shape_pressed (GtkWidget *widget, GdkEventButton *event)
10206 /* ignore double and triple click */
10207 if (event->type != GDK_BUTTON_PRESS)
10210 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
10211 p->x = (int) event->x;
10212 p->y = (int) event->y;
10214 gtk_grab_add (widget);
10215 gdk_pointer_grab (widget->window, TRUE,
10216 GDK_BUTTON_RELEASE_MASK |
10217 GDK_BUTTON_MOTION_MASK |
10218 GDK_POINTER_MOTION_HINT_MASK,
10223 shape_released (GtkWidget *widget)
10225 gtk_grab_remove (widget);
10226 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10231 shape_motion (GtkWidget *widget,
10232 GdkEventMotion *event)
10236 GdkModifierType mask;
10238 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
10241 * Can't use event->x / event->y here
10242 * because I need absolute coordinates.
10244 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
10245 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
10249 shape_create_icon (GdkScreen *screen,
10260 CursorOffset* icon_pos;
10262 GdkBitmap *gdk_pixmap_mask;
10263 GdkPixmap *gdk_pixmap;
10266 style = gtk_widget_get_default_style ();
10267 gc = style->black_gc;
10270 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
10272 window = gtk_window_new (window_type);
10273 gtk_window_set_screen (GTK_WINDOW (window), screen);
10275 fixed = gtk_fixed_new ();
10276 gtk_widget_set_size_request (fixed, 100, 100);
10277 gtk_container_add (GTK_CONTAINER (window), fixed);
10278 gtk_widget_show (fixed);
10280 gtk_widget_set_events (window,
10281 gtk_widget_get_events (window) |
10282 GDK_BUTTON_MOTION_MASK |
10283 GDK_POINTER_MOTION_HINT_MASK |
10284 GDK_BUTTON_PRESS_MASK);
10286 gtk_widget_realize (window);
10287 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
10288 &style->bg[GTK_STATE_NORMAL],
10291 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
10292 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
10293 gtk_widget_show (pixmap);
10295 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
10297 g_object_unref (gdk_pixmap_mask);
10298 g_object_unref (gdk_pixmap);
10300 g_signal_connect (window, "button_press_event",
10301 G_CALLBACK (shape_pressed), NULL);
10302 g_signal_connect (window, "button_release_event",
10303 G_CALLBACK (shape_released), NULL);
10304 g_signal_connect (window, "motion_notify_event",
10305 G_CALLBACK (shape_motion), NULL);
10307 icon_pos = g_new (CursorOffset, 1);
10308 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
10310 gtk_widget_set_uposition (window, x, y);
10311 gtk_widget_show (window);
10317 create_shapes (GtkWidget *widget)
10319 /* Variables used by the Drag/Drop and Shape Window demos */
10320 static GtkWidget *modeller = NULL;
10321 static GtkWidget *sheets = NULL;
10322 static GtkWidget *rings = NULL;
10323 static GtkWidget *with_region = NULL;
10324 GdkScreen *screen = gtk_widget_get_screen (widget);
10326 if (!(file_exists ("Modeller.xpm") &&
10327 file_exists ("FilesQueue.xpm") &&
10328 file_exists ("3DRings.xpm")))
10334 modeller = shape_create_icon (screen, "Modeller.xpm",
10335 440, 140, 0,0, GTK_WINDOW_POPUP);
10337 g_signal_connect (modeller, "destroy",
10338 G_CALLBACK (gtk_widget_destroyed),
10342 gtk_widget_destroy (modeller);
10346 sheets = shape_create_icon (screen, "FilesQueue.xpm",
10347 580, 170, 0,0, GTK_WINDOW_POPUP);
10349 g_signal_connect (sheets, "destroy",
10350 G_CALLBACK (gtk_widget_destroyed),
10355 gtk_widget_destroy (sheets);
10359 rings = shape_create_icon (screen, "3DRings.xpm",
10360 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
10362 g_signal_connect (rings, "destroy",
10363 G_CALLBACK (gtk_widget_destroyed),
10367 gtk_widget_destroy (rings);
10374 with_region = shape_create_icon (screen, "3DRings.xpm",
10375 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
10377 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
10379 g_signal_connect (with_region, "destroy",
10380 G_CALLBACK (gtk_widget_destroyed),
10383 /* reset shape from mask to a region */
10386 region = gdk_region_new ();
10398 gdk_region_union_with_rect (region, &rect);
10406 gdk_window_shape_combine_region (with_region->window,
10411 gtk_widget_destroy (with_region);
10419 create_wmhints (GtkWidget *widget)
10421 static GtkWidget *window = NULL;
10423 GtkWidget *separator;
10428 GdkBitmap *circles;
10432 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10434 gtk_window_set_screen (GTK_WINDOW (window),
10435 gtk_widget_get_screen (widget));
10437 g_signal_connect (window, "destroy",
10438 G_CALLBACK (gtk_widget_destroyed),
10441 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
10442 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10444 gtk_widget_realize (window);
10446 circles = gdk_bitmap_create_from_data (window->window,
10450 gdk_window_set_icon (window->window, NULL,
10453 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
10455 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
10456 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
10458 box1 = gtk_vbox_new (FALSE, 0);
10459 gtk_container_add (GTK_CONTAINER (window), box1);
10460 gtk_widget_show (box1);
10462 label = gtk_label_new ("Try iconizing me!");
10463 gtk_widget_set_size_request (label, 150, 50);
10464 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
10465 gtk_widget_show (label);
10468 separator = gtk_hseparator_new ();
10469 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10470 gtk_widget_show (separator);
10473 box2 = gtk_vbox_new (FALSE, 10);
10474 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10475 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10476 gtk_widget_show (box2);
10479 button = gtk_button_new_with_label ("close");
10481 g_signal_connect_swapped (button, "clicked",
10482 G_CALLBACK (gtk_widget_destroy),
10485 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10486 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
10487 gtk_widget_grab_default (button);
10488 gtk_widget_show (button);
10491 if (!GTK_WIDGET_VISIBLE (window))
10492 gtk_widget_show (window);
10494 gtk_widget_destroy (window);
10499 * Window state tracking
10503 window_state_callback (GtkWidget *widget,
10504 GdkEventWindowState *event,
10507 GtkWidget *label = data;
10510 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
10511 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
10512 "withdrawn" : "not withdrawn", ", ",
10513 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
10514 "iconified" : "not iconified", ", ",
10515 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
10516 "sticky" : "not sticky", ", ",
10517 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
10518 "maximized" : "not maximized", ", ",
10519 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
10520 "fullscreen" : "not fullscreen",
10521 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
10522 "above" : "not above", ", ",
10523 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
10524 "below" : "not below", ", ",
10527 gtk_label_set_text (GTK_LABEL (label), msg);
10535 tracking_label (GtkWidget *window)
10541 hbox = gtk_hbox_new (FALSE, 5);
10543 g_signal_connect_object (hbox,
10545 G_CALLBACK (gtk_widget_destroy),
10547 G_CONNECT_SWAPPED);
10549 label = gtk_label_new ("<no window state events received>");
10550 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
10551 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
10553 g_signal_connect (window,
10554 "window_state_event",
10555 G_CALLBACK (window_state_callback),
10558 button = gtk_button_new_with_label ("Deiconify");
10559 g_signal_connect_object (button,
10561 G_CALLBACK (gtk_window_deiconify),
10563 G_CONNECT_SWAPPED);
10564 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10566 button = gtk_button_new_with_label ("Iconify");
10567 g_signal_connect_object (button,
10569 G_CALLBACK (gtk_window_iconify),
10571 G_CONNECT_SWAPPED);
10572 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10574 button = gtk_button_new_with_label ("Fullscreen");
10575 g_signal_connect_object (button,
10577 G_CALLBACK (gtk_window_fullscreen),
10579 G_CONNECT_SWAPPED);
10580 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10582 button = gtk_button_new_with_label ("Unfullscreen");
10583 g_signal_connect_object (button,
10585 G_CALLBACK (gtk_window_unfullscreen),
10587 G_CONNECT_SWAPPED);
10588 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10590 button = gtk_button_new_with_label ("Present");
10591 g_signal_connect_object (button,
10593 G_CALLBACK (gtk_window_present),
10595 G_CONNECT_SWAPPED);
10596 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10598 button = gtk_button_new_with_label ("Show");
10599 g_signal_connect_object (button,
10601 G_CALLBACK (gtk_widget_show),
10603 G_CONNECT_SWAPPED);
10604 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
10606 gtk_widget_show_all (hbox);
10612 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
10614 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
10616 gtk_window_set_keep_above (GTK_WINDOW (data),
10617 gtk_toggle_button_get_active (togglebutton));
10619 if (gtk_toggle_button_get_active (togglebutton))
10620 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10624 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
10626 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
10628 gtk_window_set_keep_below (GTK_WINDOW (data),
10629 gtk_toggle_button_get_active (togglebutton));
10631 if (gtk_toggle_button_get_active (togglebutton))
10632 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10637 get_state_controls (GtkWidget *window)
10641 GtkWidget *button_above;
10642 GtkWidget *button_below;
10644 vbox = gtk_vbox_new (FALSE, 0);
10646 button = gtk_button_new_with_label ("Stick");
10647 g_signal_connect_object (button,
10649 G_CALLBACK (gtk_window_stick),
10651 G_CONNECT_SWAPPED);
10652 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10654 button = gtk_button_new_with_label ("Unstick");
10655 g_signal_connect_object (button,
10657 G_CALLBACK (gtk_window_unstick),
10659 G_CONNECT_SWAPPED);
10660 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10662 button = gtk_button_new_with_label ("Maximize");
10663 g_signal_connect_object (button,
10665 G_CALLBACK (gtk_window_maximize),
10667 G_CONNECT_SWAPPED);
10668 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10670 button = gtk_button_new_with_label ("Unmaximize");
10671 g_signal_connect_object (button,
10673 G_CALLBACK (gtk_window_unmaximize),
10675 G_CONNECT_SWAPPED);
10676 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10678 button = gtk_button_new_with_label ("Iconify");
10679 g_signal_connect_object (button,
10681 G_CALLBACK (gtk_window_iconify),
10683 G_CONNECT_SWAPPED);
10684 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10686 button = gtk_button_new_with_label ("Fullscreen");
10687 g_signal_connect_object (button,
10689 G_CALLBACK (gtk_window_fullscreen),
10691 G_CONNECT_SWAPPED);
10692 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10694 button = gtk_button_new_with_label ("Unfullscreen");
10695 g_signal_connect_object (button,
10697 G_CALLBACK (gtk_window_unfullscreen),
10699 G_CONNECT_SWAPPED);
10700 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10702 button_above = gtk_toggle_button_new_with_label ("Keep above");
10703 g_signal_connect (button_above,
10705 G_CALLBACK (keep_window_above),
10707 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
10709 button_below = gtk_toggle_button_new_with_label ("Keep below");
10710 g_signal_connect (button_below,
10712 G_CALLBACK (keep_window_below),
10714 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
10716 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
10717 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
10719 button = gtk_button_new_with_label ("Hide (withdraw)");
10720 g_signal_connect_object (button,
10722 G_CALLBACK (gtk_widget_hide),
10724 G_CONNECT_SWAPPED);
10725 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10727 gtk_widget_show_all (vbox);
10733 create_window_states (GtkWidget *widget)
10735 static GtkWidget *window = NULL;
10738 GtkWidget *iconified;
10740 GtkWidget *controls;
10744 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10745 gtk_window_set_screen (GTK_WINDOW (window),
10746 gtk_widget_get_screen (widget));
10748 g_signal_connect (window, "destroy",
10749 G_CALLBACK (gtk_widget_destroyed),
10752 gtk_window_set_title (GTK_WINDOW (window), "Window states");
10754 box1 = gtk_vbox_new (FALSE, 0);
10755 gtk_container_add (GTK_CONTAINER (window), box1);
10757 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10759 gtk_window_set_screen (GTK_WINDOW (iconified),
10760 gtk_widget_get_screen (widget));
10762 g_signal_connect_object (iconified, "destroy",
10763 G_CALLBACK (gtk_widget_destroy),
10765 G_CONNECT_SWAPPED);
10766 gtk_window_iconify (GTK_WINDOW (iconified));
10767 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
10768 controls = get_state_controls (iconified);
10769 gtk_container_add (GTK_CONTAINER (iconified), controls);
10771 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10773 gtk_window_set_screen (GTK_WINDOW (normal),
10774 gtk_widget_get_screen (widget));
10776 g_signal_connect_object (normal, "destroy",
10777 G_CALLBACK (gtk_widget_destroy),
10779 G_CONNECT_SWAPPED);
10781 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
10782 controls = get_state_controls (normal);
10783 gtk_container_add (GTK_CONTAINER (normal), controls);
10785 label = tracking_label (iconified);
10786 gtk_container_add (GTK_CONTAINER (box1), label);
10788 label = tracking_label (normal);
10789 gtk_container_add (GTK_CONTAINER (box1), label);
10791 gtk_widget_show_all (iconified);
10792 gtk_widget_show_all (normal);
10793 gtk_widget_show_all (box1);
10796 if (!GTK_WIDGET_VISIBLE (window))
10797 gtk_widget_show (window);
10799 gtk_widget_destroy (window);
10807 configure_event_callback (GtkWidget *widget,
10808 GdkEventConfigure *event,
10811 GtkWidget *label = data;
10815 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
10817 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
10818 "position: %d, %d",
10819 event->x, event->y, event->width, event->height,
10822 gtk_label_set_text (GTK_LABEL (label), msg);
10830 get_ints (GtkWidget *window,
10837 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
10838 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
10840 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
10841 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
10845 set_size_callback (GtkWidget *widget,
10850 get_ints (data, &w, &h);
10852 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
10856 unset_default_size_callback (GtkWidget *widget,
10859 gtk_window_set_default_size (g_object_get_data (data, "target"),
10864 set_default_size_callback (GtkWidget *widget,
10869 get_ints (data, &w, &h);
10871 gtk_window_set_default_size (g_object_get_data (data, "target"),
10876 unset_size_request_callback (GtkWidget *widget,
10879 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10884 set_size_request_callback (GtkWidget *widget,
10889 get_ints (data, &w, &h);
10891 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10896 set_location_callback (GtkWidget *widget,
10901 get_ints (data, &x, &y);
10903 gtk_window_move (g_object_get_data (data, "target"), x, y);
10907 move_to_position_callback (GtkWidget *widget,
10913 window = g_object_get_data (data, "target");
10915 gtk_window_get_position (window, &x, &y);
10917 gtk_window_move (window, x, y);
10921 set_geometry_callback (GtkWidget *entry,
10927 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
10929 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
10931 if (!gtk_window_parse_geometry (target, text))
10932 g_print ("Bad geometry string '%s'\n", text);
10938 allow_shrink_callback (GtkWidget *widget,
10941 g_object_set (g_object_get_data (data, "target"),
10943 GTK_TOGGLE_BUTTON (widget)->active,
10948 allow_grow_callback (GtkWidget *widget,
10951 g_object_set (g_object_get_data (data, "target"),
10953 GTK_TOGGLE_BUTTON (widget)->active,
10958 gravity_selected (GtkWidget *widget,
10961 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
10962 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
10966 pos_selected (GtkWidget *widget,
10969 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
10970 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
10974 move_gravity_window_to_current_position (GtkWidget *widget,
10980 window = GTK_WINDOW (data);
10982 gtk_window_get_position (window, &x, &y);
10984 gtk_window_move (window, x, y);
10988 get_screen_corner (GtkWindow *window,
10993 GdkScreen * screen = gtk_window_get_screen (window);
10995 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
10997 switch (gtk_window_get_gravity (window))
10999 case GDK_GRAVITY_SOUTH_EAST:
11000 *x = gdk_screen_get_width (screen) - w;
11001 *y = gdk_screen_get_height (screen) - h;
11004 case GDK_GRAVITY_NORTH_EAST:
11005 *x = gdk_screen_get_width (screen) - w;
11009 case GDK_GRAVITY_SOUTH_WEST:
11011 *y = gdk_screen_get_height (screen) - h;
11014 case GDK_GRAVITY_NORTH_WEST:
11019 case GDK_GRAVITY_SOUTH:
11020 *x = (gdk_screen_get_width (screen) - w) / 2;
11021 *y = gdk_screen_get_height (screen) - h;
11024 case GDK_GRAVITY_NORTH:
11025 *x = (gdk_screen_get_width (screen) - w) / 2;
11029 case GDK_GRAVITY_WEST:
11031 *y = (gdk_screen_get_height (screen) - h) / 2;
11034 case GDK_GRAVITY_EAST:
11035 *x = gdk_screen_get_width (screen) - w;
11036 *y = (gdk_screen_get_height (screen) - h) / 2;
11039 case GDK_GRAVITY_CENTER:
11040 *x = (gdk_screen_get_width (screen) - w) / 2;
11041 *y = (gdk_screen_get_height (screen) - h) / 2;
11044 case GDK_GRAVITY_STATIC:
11045 /* pick some random numbers */
11051 g_assert_not_reached ();
11057 move_gravity_window_to_starting_position (GtkWidget *widget,
11063 window = GTK_WINDOW (data);
11065 get_screen_corner (window,
11068 gtk_window_move (window, x, y);
11072 make_gravity_window (GtkWidget *destroy_with,
11073 GdkGravity gravity,
11074 const gchar *title)
11081 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11083 gtk_window_set_screen (GTK_WINDOW (window),
11084 gtk_widget_get_screen (destroy_with));
11086 vbox = gtk_vbox_new (FALSE, 0);
11087 gtk_widget_show (vbox);
11089 gtk_container_add (GTK_CONTAINER (window), vbox);
11090 gtk_window_set_title (GTK_WINDOW (window), title);
11091 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
11093 g_signal_connect_object (destroy_with,
11095 G_CALLBACK (gtk_widget_destroy),
11097 G_CONNECT_SWAPPED);
11100 button = gtk_button_new_with_mnemonic ("_Move to current position");
11102 g_signal_connect (button, "clicked",
11103 G_CALLBACK (move_gravity_window_to_current_position),
11106 gtk_container_add (GTK_CONTAINER (vbox), button);
11107 gtk_widget_show (button);
11109 button = gtk_button_new_with_mnemonic ("Move to _starting position");
11111 g_signal_connect (button, "clicked",
11112 G_CALLBACK (move_gravity_window_to_starting_position),
11115 gtk_container_add (GTK_CONTAINER (vbox), button);
11116 gtk_widget_show (button);
11118 /* Pretend this is the result of --geometry.
11119 * DO NOT COPY THIS CODE unless you are setting --geometry results,
11120 * and in that case you probably should just use gtk_window_parse_geometry().
11121 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
11122 * you are parsing --geometry or equivalent.
11124 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11126 GDK_HINT_USER_POS);
11128 gtk_window_set_default_size (GTK_WINDOW (window),
11131 get_screen_corner (GTK_WINDOW (window), &x, &y);
11133 gtk_window_move (GTK_WINDOW (window),
11140 do_gravity_test (GtkWidget *widget,
11143 GtkWidget *destroy_with = data;
11146 /* We put a window at each gravity point on the screen. */
11147 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
11149 gtk_widget_show (window);
11151 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
11153 gtk_widget_show (window);
11155 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
11157 gtk_widget_show (window);
11159 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
11161 gtk_widget_show (window);
11163 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
11165 gtk_widget_show (window);
11167 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
11169 gtk_widget_show (window);
11172 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
11174 gtk_widget_show (window);
11177 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
11179 gtk_widget_show (window);
11181 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
11183 gtk_widget_show (window);
11185 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
11187 gtk_widget_show (window);
11191 window_controls (GtkWidget *window)
11193 GtkWidget *control_window;
11198 GtkAdjustment *adj;
11204 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11206 gtk_window_set_screen (GTK_WINDOW (control_window),
11207 gtk_widget_get_screen (window));
11209 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
11211 g_object_set_data (G_OBJECT (control_window),
11215 g_signal_connect_object (control_window,
11217 G_CALLBACK (gtk_widget_destroy),
11219 G_CONNECT_SWAPPED);
11221 vbox = gtk_vbox_new (FALSE, 5);
11223 gtk_container_add (GTK_CONTAINER (control_window), vbox);
11225 label = gtk_label_new ("<no configure events>");
11226 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11228 g_signal_connect (window,
11230 G_CALLBACK (configure_event_callback),
11233 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
11235 spin = gtk_spin_button_new (adj, 0, 0);
11237 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
11239 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
11241 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
11243 spin = gtk_spin_button_new (adj, 0, 0);
11245 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
11247 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
11249 entry = gtk_entry_new ();
11250 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
11252 g_signal_connect (entry, "changed",
11253 G_CALLBACK (set_geometry_callback),
11256 button = gtk_button_new_with_label ("Show gravity test windows");
11257 g_signal_connect_swapped (button,
11259 G_CALLBACK (do_gravity_test),
11261 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11263 button = gtk_button_new_with_label ("Reshow with initial size");
11264 g_signal_connect_object (button,
11266 G_CALLBACK (gtk_window_reshow_with_initial_size),
11268 G_CONNECT_SWAPPED);
11269 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11271 button = gtk_button_new_with_label ("Queue resize");
11272 g_signal_connect_object (button,
11274 G_CALLBACK (gtk_widget_queue_resize),
11276 G_CONNECT_SWAPPED);
11277 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11279 button = gtk_button_new_with_label ("Resize");
11280 g_signal_connect (button,
11282 G_CALLBACK (set_size_callback),
11284 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11286 button = gtk_button_new_with_label ("Set default size");
11287 g_signal_connect (button,
11289 G_CALLBACK (set_default_size_callback),
11291 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11293 button = gtk_button_new_with_label ("Unset default size");
11294 g_signal_connect (button,
11296 G_CALLBACK (unset_default_size_callback),
11298 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11300 button = gtk_button_new_with_label ("Set size request");
11301 g_signal_connect (button,
11303 G_CALLBACK (set_size_request_callback),
11305 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11307 button = gtk_button_new_with_label ("Unset size request");
11308 g_signal_connect (button,
11310 G_CALLBACK (unset_size_request_callback),
11312 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11314 button = gtk_button_new_with_label ("Move");
11315 g_signal_connect (button,
11317 G_CALLBACK (set_location_callback),
11319 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11321 button = gtk_button_new_with_label ("Move to current position");
11322 g_signal_connect (button,
11324 G_CALLBACK (move_to_position_callback),
11326 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11328 button = gtk_check_button_new_with_label ("Allow shrink");
11329 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
11330 g_signal_connect (button,
11332 G_CALLBACK (allow_shrink_callback),
11334 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11336 button = gtk_check_button_new_with_label ("Allow grow");
11337 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
11338 g_signal_connect (button,
11340 G_CALLBACK (allow_grow_callback),
11342 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11344 button = gtk_button_new_with_mnemonic ("_Show");
11345 g_signal_connect_object (button,
11347 G_CALLBACK (gtk_widget_show),
11349 G_CONNECT_SWAPPED);
11350 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11352 button = gtk_button_new_with_mnemonic ("_Hide");
11353 g_signal_connect_object (button,
11355 G_CALLBACK (gtk_widget_hide),
11357 G_CONNECT_SWAPPED);
11358 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
11360 menu = gtk_menu_new ();
11366 static gchar *names[] = {
11367 "GDK_GRAVITY_NORTH_WEST",
11368 "GDK_GRAVITY_NORTH",
11369 "GDK_GRAVITY_NORTH_EAST",
11370 "GDK_GRAVITY_WEST",
11371 "GDK_GRAVITY_CENTER",
11372 "GDK_GRAVITY_EAST",
11373 "GDK_GRAVITY_SOUTH_WEST",
11374 "GDK_GRAVITY_SOUTH",
11375 "GDK_GRAVITY_SOUTH_EAST",
11376 "GDK_GRAVITY_STATIC",
11380 g_assert (names[i]);
11382 mi = gtk_menu_item_new_with_label (names[i]);
11384 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
11389 gtk_widget_show_all (menu);
11391 om = gtk_option_menu_new ();
11392 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
11395 g_signal_connect (om,
11397 G_CALLBACK (gravity_selected),
11400 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
11403 menu = gtk_menu_new ();
11409 static gchar *names[] = {
11410 "GTK_WIN_POS_NONE",
11411 "GTK_WIN_POS_CENTER",
11412 "GTK_WIN_POS_MOUSE",
11413 "GTK_WIN_POS_CENTER_ALWAYS",
11414 "GTK_WIN_POS_CENTER_ON_PARENT",
11418 g_assert (names[i]);
11420 mi = gtk_menu_item_new_with_label (names[i]);
11422 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
11427 gtk_widget_show_all (menu);
11429 om = gtk_option_menu_new ();
11430 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
11433 g_signal_connect (om,
11435 G_CALLBACK (pos_selected),
11438 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
11440 gtk_widget_show_all (vbox);
11442 return control_window;
11446 create_window_sizing (GtkWidget *widget)
11448 static GtkWidget *window = NULL;
11449 static GtkWidget *target_window = NULL;
11451 if (!target_window)
11455 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11456 gtk_window_set_screen (GTK_WINDOW (target_window),
11457 gtk_widget_get_screen (widget));
11458 label = gtk_label_new (NULL);
11459 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");
11460 gtk_container_add (GTK_CONTAINER (target_window), label);
11461 gtk_widget_show (label);
11463 g_signal_connect (target_window, "destroy",
11464 G_CALLBACK (gtk_widget_destroyed),
11467 window = window_controls (target_window);
11469 g_signal_connect (window, "destroy",
11470 G_CALLBACK (gtk_widget_destroyed),
11473 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
11476 /* don't show target window by default, we want to allow testing
11477 * of behavior on first show.
11480 if (!GTK_WIDGET_VISIBLE (window))
11481 gtk_widget_show (window);
11483 gtk_widget_destroy (window);
11490 typedef struct _ProgressData {
11493 GtkWidget *block_spin;
11494 GtkWidget *x_align_spin;
11495 GtkWidget *y_align_spin;
11496 GtkWidget *step_spin;
11497 GtkWidget *act_blocks_spin;
11507 progress_timeout (gpointer data)
11510 GtkAdjustment *adj;
11512 adj = GTK_PROGRESS (data)->adjustment;
11514 new_val = adj->value + 1;
11515 if (new_val > adj->upper)
11516 new_val = adj->lower;
11518 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
11524 destroy_progress (GtkWidget *widget,
11525 ProgressData **pdata)
11527 gtk_timeout_remove ((*pdata)->timer);
11528 (*pdata)->timer = 0;
11529 (*pdata)->window = NULL;
11535 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
11537 ProgressData *pdata;
11540 pdata = (ProgressData *) data;
11542 if (!GTK_WIDGET_MAPPED (widget))
11545 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11547 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
11548 (GtkProgressBarOrientation) i);
11552 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
11554 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
11555 GTK_TOGGLE_BUTTON (widget)->active);
11556 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
11557 gtk_widget_set_sensitive (pdata->x_align_spin,
11558 GTK_TOGGLE_BUTTON (widget)->active);
11559 gtk_widget_set_sensitive (pdata->y_align_spin,
11560 GTK_TOGGLE_BUTTON (widget)->active);
11564 progressbar_toggle_ellipsize (GtkWidget *widget,
11567 ProgressData *pdata = data;
11568 if (GTK_WIDGET_DRAWABLE (widget))
11570 gint i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11571 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
11576 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
11578 ProgressData *pdata;
11581 pdata = (ProgressData *) data;
11583 if (!GTK_WIDGET_MAPPED (widget))
11586 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
11589 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
11591 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
11593 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
11594 (GtkProgressBarStyle) i);
11598 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
11602 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
11603 sprintf (buf, "???");
11605 sprintf (buf, "%.0f%%", 100 *
11606 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
11607 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
11611 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
11613 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
11614 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
11615 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
11619 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
11621 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
11622 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
11626 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
11628 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
11629 gtk_spin_button_get_value_as_int
11630 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
11634 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
11636 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
11637 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
11638 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
11642 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
11644 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
11645 GTK_TOGGLE_BUTTON (widget)->active);
11646 gtk_widget_set_sensitive (pdata->step_spin,
11647 GTK_TOGGLE_BUTTON (widget)->active);
11648 gtk_widget_set_sensitive (pdata->act_blocks_spin,
11649 GTK_TOGGLE_BUTTON (widget)->active);
11653 entry_changed (GtkWidget *widget, ProgressData *pdata)
11655 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
11656 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
11660 create_progress_bar (GtkWidget *widget)
11671 GtkAdjustment *adj;
11672 static ProgressData *pdata = NULL;
11674 static gchar *items1[] =
11682 static gchar *items2[] =
11688 static char *ellipsize_items[] = {
11689 "None", // PANGO_ELLIPSIZE_NONE,
11690 "Start", // PANGO_ELLIPSIZE_START,
11691 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
11692 "End", // PANGO_ELLIPSIZE_END
11696 pdata = g_new0 (ProgressData, 1);
11698 if (!pdata->window)
11700 pdata->window = gtk_dialog_new ();
11702 gtk_window_set_screen (GTK_WINDOW (pdata->window),
11703 gtk_widget_get_screen (widget));
11705 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
11707 g_signal_connect (pdata->window, "destroy",
11708 G_CALLBACK (destroy_progress),
11713 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
11714 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
11716 vbox = gtk_vbox_new (FALSE, 5);
11717 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11718 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
11719 vbox, FALSE, TRUE, 0);
11721 frame = gtk_frame_new ("Progress");
11722 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
11724 vbox2 = gtk_vbox_new (FALSE, 5);
11725 gtk_container_add (GTK_CONTAINER (frame), vbox2);
11727 align = gtk_alignment_new (0.5, 0.5, 0, 0);
11728 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
11730 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
11731 g_signal_connect (adj, "value_changed",
11732 G_CALLBACK (progress_value_changed), pdata);
11734 pdata->pbar = gtk_widget_new (GTK_TYPE_PROGRESS_BAR,
11736 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
11738 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
11739 "%v from [%l,%u] (=%p%%)");
11740 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
11741 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
11743 align = gtk_alignment_new (0.5, 0.5, 0, 0);
11744 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
11746 hbox = gtk_hbox_new (FALSE, 5);
11747 gtk_container_add (GTK_CONTAINER (align), hbox);
11748 label = gtk_label_new ("Label updated by user :");
11749 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11750 pdata->label = gtk_label_new ("");
11751 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
11753 frame = gtk_frame_new ("Options");
11754 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
11756 vbox2 = gtk_vbox_new (FALSE, 5);
11757 gtk_container_add (GTK_CONTAINER (frame), vbox2);
11759 tab = gtk_table_new (7, 2, FALSE);
11760 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
11762 label = gtk_label_new ("Orientation :");
11763 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
11764 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11766 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11768 pdata->omenu1 = build_option_menu (items1, 4, 0,
11769 progressbar_toggle_orientation,
11771 hbox = gtk_hbox_new (FALSE, 0);
11772 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
11773 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11775 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
11777 check = gtk_check_button_new_with_label ("Show text");
11778 g_signal_connect (check, "clicked",
11779 G_CALLBACK (toggle_show_text),
11781 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
11782 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11785 hbox = gtk_hbox_new (FALSE, 0);
11786 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
11787 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11790 label = gtk_label_new ("Format : ");
11791 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11793 pdata->entry = gtk_entry_new ();
11794 g_signal_connect (pdata->entry, "changed",
11795 G_CALLBACK (entry_changed),
11797 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
11798 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
11799 gtk_widget_set_size_request (pdata->entry, 100, -1);
11800 gtk_widget_set_sensitive (pdata->entry, FALSE);
11802 label = gtk_label_new ("Text align :");
11803 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
11804 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11806 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11808 hbox = gtk_hbox_new (FALSE, 0);
11809 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
11810 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11813 label = gtk_label_new ("x :");
11814 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11816 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11817 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
11818 g_signal_connect (adj, "value_changed",
11819 G_CALLBACK (adjust_align), pdata);
11820 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
11821 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
11823 label = gtk_label_new ("y :");
11824 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11826 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11827 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
11828 g_signal_connect (adj, "value_changed",
11829 G_CALLBACK (adjust_align), pdata);
11830 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
11831 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
11833 label = gtk_label_new ("Ellipsize text :");
11834 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
11835 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11837 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11838 pdata->elmenu = build_option_menu (ellipsize_items,
11839 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
11840 2, // PANGO_ELLIPSIZE_MIDDLE
11841 progressbar_toggle_ellipsize,
11843 hbox = gtk_hbox_new (FALSE, 0);
11844 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
11845 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11847 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
11849 label = gtk_label_new ("Bar Style :");
11850 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 13, 14,
11851 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11853 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11855 pdata->omenu2 = build_option_menu (items2, 2, 0,
11856 progressbar_toggle_bar_style,
11858 hbox = gtk_hbox_new (FALSE, 0);
11859 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 13, 14,
11860 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11862 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
11864 label = gtk_label_new ("Block count :");
11865 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 14, 15,
11866 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11868 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11870 hbox = gtk_hbox_new (FALSE, 0);
11871 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 14, 15,
11872 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11874 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
11875 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
11876 g_signal_connect (adj, "value_changed",
11877 G_CALLBACK (adjust_blocks), pdata);
11878 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
11879 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
11881 check = gtk_check_button_new_with_label ("Activity mode");
11882 g_signal_connect (check, "clicked",
11883 G_CALLBACK (toggle_activity_mode), pdata);
11884 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
11885 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11888 hbox = gtk_hbox_new (FALSE, 0);
11889 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 15, 16,
11890 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11892 label = gtk_label_new ("Step size : ");
11893 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11894 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
11895 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
11896 g_signal_connect (adj, "value_changed",
11897 G_CALLBACK (adjust_step), pdata);
11898 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
11899 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
11901 hbox = gtk_hbox_new (FALSE, 0);
11902 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 16, 17,
11903 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11905 label = gtk_label_new ("Blocks : ");
11906 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11907 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
11908 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
11909 g_signal_connect (adj, "value_changed",
11910 G_CALLBACK (adjust_act_blocks), pdata);
11911 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
11913 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
11915 button = gtk_button_new_with_label ("close");
11916 g_signal_connect_swapped (button, "clicked",
11917 G_CALLBACK (gtk_widget_destroy),
11919 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11920 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
11921 button, TRUE, TRUE, 0);
11922 gtk_widget_grab_default (button);
11925 if (!GTK_WIDGET_VISIBLE (pdata->window))
11926 gtk_widget_show_all (pdata->window);
11928 gtk_widget_destroy (pdata->window);
11940 GtkWidget *res_widget;
11944 find_widget (GtkWidget *widget, FindWidgetData *data)
11946 GtkAllocation new_allocation;
11950 new_allocation = widget->allocation;
11952 if (data->found || !GTK_WIDGET_MAPPED (widget))
11955 /* Note that in the following code, we only count the
11956 * position as being inside a WINDOW widget if it is inside
11957 * widget->window; points that are outside of widget->window
11958 * but within the allocation are not counted. This is consistent
11959 * with the way we highlight drag targets.
11961 if (!GTK_WIDGET_NO_WINDOW (widget))
11963 new_allocation.x = 0;
11964 new_allocation.y = 0;
11967 if (widget->parent && !data->first)
11969 GdkWindow *window = widget->window;
11970 while (window != widget->parent->window)
11972 gint tx, ty, twidth, theight;
11973 gdk_drawable_get_size (window, &twidth, &theight);
11975 if (new_allocation.x < 0)
11977 new_allocation.width += new_allocation.x;
11978 new_allocation.x = 0;
11980 if (new_allocation.y < 0)
11982 new_allocation.height += new_allocation.y;
11983 new_allocation.y = 0;
11985 if (new_allocation.x + new_allocation.width > twidth)
11986 new_allocation.width = twidth - new_allocation.x;
11987 if (new_allocation.y + new_allocation.height > theight)
11988 new_allocation.height = theight - new_allocation.y;
11990 gdk_window_get_position (window, &tx, &ty);
11991 new_allocation.x += tx;
11993 new_allocation.y += ty;
11996 window = gdk_window_get_parent (window);
12000 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
12001 (data->x < new_allocation.x + new_allocation.width) &&
12002 (data->y < new_allocation.y + new_allocation.height))
12004 /* First, check if the drag is in a valid drop site in
12005 * one of our children
12007 if (GTK_IS_CONTAINER (widget))
12009 FindWidgetData new_data = *data;
12011 new_data.x -= x_offset;
12012 new_data.y -= y_offset;
12013 new_data.found = FALSE;
12014 new_data.first = FALSE;
12016 gtk_container_forall (GTK_CONTAINER (widget),
12017 (GtkCallback)find_widget,
12020 data->found = new_data.found;
12022 data->res_widget = new_data.res_widget;
12025 /* If not, and this widget is registered as a drop site, check to
12026 * emit "drag_motion" to check if we are actually in
12031 data->found = TRUE;
12032 data->res_widget = widget;
12038 find_widget_at_pointer (GdkDisplay *display)
12040 GtkWidget *widget = NULL;
12041 GdkWindow *pointer_window;
12043 FindWidgetData data;
12045 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
12047 if (pointer_window)
12048 gdk_window_get_user_data (pointer_window, (gpointer) &widget);
12052 gdk_window_get_pointer (widget->window,
12057 data.found = FALSE;
12060 find_widget (widget, &data);
12062 return data.res_widget;
12068 struct PropertiesData {
12069 GtkWidget **window;
12076 destroy_properties (GtkWidget *widget,
12077 struct PropertiesData *data)
12081 *data->window = NULL;
12082 data->window = NULL;
12087 gdk_cursor_unref (data->cursor);
12088 data->cursor = NULL;
12093 g_signal_handler_disconnect (widget, data->handler);
12101 property_query_event (GtkWidget *widget,
12103 struct PropertiesData *data)
12105 GtkWidget *res_widget = NULL;
12107 if (!data->in_query)
12110 if (event->type == GDK_BUTTON_RELEASE)
12112 gtk_grab_remove (widget);
12113 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
12116 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
12119 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
12120 gtk_widget_get_screen (widget));
12121 create_prop_editor (G_OBJECT (res_widget), 0);
12124 data->in_query = FALSE;
12131 query_properties (GtkButton *button,
12132 struct PropertiesData *data)
12136 g_signal_connect (button, "event",
12137 G_CALLBACK (property_query_event), data);
12141 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
12144 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
12146 GDK_BUTTON_RELEASE_MASK,
12151 gtk_grab_add (GTK_WIDGET (button));
12153 data->in_query = TRUE;
12157 create_properties (GtkWidget *widget)
12159 static GtkWidget *window = NULL;
12163 struct PropertiesData *data;
12165 data = g_new (struct PropertiesData, 1);
12166 data->window = &window;
12167 data->in_query = FALSE;
12168 data->cursor = NULL;
12173 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12175 gtk_window_set_screen (GTK_WINDOW (window),
12176 gtk_widget_get_screen (widget));
12178 data->handler = g_signal_connect (window, "destroy",
12179 G_CALLBACK (destroy_properties),
12182 gtk_window_set_title (GTK_WINDOW (window), "test properties");
12183 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12185 vbox = gtk_vbox_new (FALSE, 1);
12186 gtk_container_add (GTK_CONTAINER (window), vbox);
12188 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
12189 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
12191 button = gtk_button_new_with_label ("Query properties");
12192 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
12193 g_signal_connect (button, "clicked",
12194 G_CALLBACK (query_properties),
12198 if (!GTK_WIDGET_VISIBLE (window))
12199 gtk_widget_show_all (window);
12201 gtk_widget_destroy (window);
12210 static int color_idle = 0;
12213 color_idle_func (GtkWidget *preview)
12215 static int count = 1;
12219 for (i = 0; i < 256; i++)
12221 for (j = 0, k = 0; j < 256; j++)
12223 buf[k+0] = i + count;
12225 buf[k+2] = j + count;
12229 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12234 gtk_widget_queue_draw (preview);
12235 gdk_window_process_updates (preview->window, TRUE);
12241 color_preview_destroy (GtkWidget *widget,
12242 GtkWidget **window)
12244 gtk_idle_remove (color_idle);
12251 create_color_preview (GtkWidget *widget)
12253 static GtkWidget *window = NULL;
12254 GtkWidget *preview;
12260 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12262 gtk_window_set_screen (GTK_WINDOW (window),
12263 gtk_widget_get_screen (widget));
12265 g_signal_connect (window, "destroy",
12266 G_CALLBACK (color_preview_destroy),
12269 gtk_window_set_title (GTK_WINDOW (window), "test");
12270 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12272 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
12273 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
12274 gtk_container_add (GTK_CONTAINER (window), preview);
12276 for (i = 0; i < 256; i++)
12278 for (j = 0, k = 0; j < 256; j++)
12286 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12289 color_idle = gtk_idle_add ((GtkFunction) color_idle_func, preview);
12292 if (!GTK_WIDGET_VISIBLE (window))
12293 gtk_widget_show_all (window);
12295 gtk_widget_destroy (window);
12302 static int gray_idle = 0;
12305 gray_idle_func (GtkWidget *preview)
12307 static int count = 1;
12311 for (i = 0; i < 256; i++)
12313 for (j = 0; j < 256; j++)
12314 buf[j] = i + j + count;
12316 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12321 gtk_widget_draw (preview, NULL);
12327 gray_preview_destroy (GtkWidget *widget,
12328 GtkWidget **window)
12330 gtk_idle_remove (gray_idle);
12337 create_gray_preview (GtkWidget *widget)
12339 static GtkWidget *window = NULL;
12340 GtkWidget *preview;
12346 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12348 gtk_window_set_screen (GTK_WINDOW (window),
12349 gtk_widget_get_screen (widget));
12351 g_signal_connect (window, "destroy",
12352 G_CALLBACK (gray_preview_destroy),
12355 gtk_window_set_title (GTK_WINDOW (window), "test");
12356 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12358 preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
12359 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
12360 gtk_container_add (GTK_CONTAINER (window), preview);
12362 for (i = 0; i < 256; i++)
12364 for (j = 0; j < 256; j++)
12367 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
12370 gray_idle = gtk_idle_add ((GtkFunction) gray_idle_func, preview);
12373 if (!GTK_WIDGET_VISIBLE (window))
12374 gtk_widget_show_all (window);
12376 gtk_widget_destroy (window);
12385 selection_test_received (GtkWidget *list, GtkSelectionData *data)
12388 GtkWidget *list_item;
12392 if (data->length < 0)
12394 g_print ("Selection retrieval failed\n");
12397 if (data->type != GDK_SELECTION_TYPE_ATOM)
12399 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
12403 /* Clear out any current list items */
12405 gtk_list_clear_items (GTK_LIST(list), 0, -1);
12407 /* Add new items to list */
12409 atoms = (GdkAtom *)data->data;
12412 l = data->length / sizeof (GdkAtom);
12413 for (i = 0; i < l; i++)
12416 name = gdk_atom_name (atoms[i]);
12419 list_item = gtk_list_item_new_with_label (name);
12423 list_item = gtk_list_item_new_with_label ("(bad atom)");
12425 gtk_widget_show (list_item);
12426 item_list = g_list_append (item_list, list_item);
12429 gtk_list_append_items (GTK_LIST (list), item_list);
12435 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
12437 static GdkAtom targets_atom = GDK_NONE;
12439 if (targets_atom == GDK_NONE)
12440 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
12442 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
12447 create_selection_test (GtkWidget *widget)
12449 static GtkWidget *window = NULL;
12452 GtkWidget *scrolled_win;
12458 window = gtk_dialog_new ();
12460 gtk_window_set_screen (GTK_WINDOW (window),
12461 gtk_widget_get_screen (widget));
12463 g_signal_connect (window, "destroy",
12464 G_CALLBACK (gtk_widget_destroyed),
12467 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
12468 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12470 /* Create the list */
12472 vbox = gtk_vbox_new (FALSE, 5);
12473 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
12474 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
12477 label = gtk_label_new ("Gets available targets for current selection");
12478 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12480 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
12481 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
12482 GTK_POLICY_AUTOMATIC,
12483 GTK_POLICY_AUTOMATIC);
12484 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
12485 gtk_widget_set_size_request (scrolled_win, 100, 200);
12487 list = gtk_list_new ();
12488 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
12490 g_signal_connect (list, "selection_received",
12491 G_CALLBACK (selection_test_received), NULL);
12493 /* .. And create some buttons */
12494 button = gtk_button_new_with_label ("Get Targets");
12495 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12496 button, TRUE, TRUE, 0);
12498 g_signal_connect (button, "clicked",
12499 G_CALLBACK (selection_test_get_targets), list);
12501 button = gtk_button_new_with_label ("Quit");
12502 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12503 button, TRUE, TRUE, 0);
12505 g_signal_connect_swapped (button, "clicked",
12506 G_CALLBACK (gtk_widget_destroy),
12510 if (!GTK_WIDGET_VISIBLE (window))
12511 gtk_widget_show_all (window);
12513 gtk_widget_destroy (window);
12521 create_gamma_curve (GtkWidget *widget)
12523 static GtkWidget *window = NULL, *curve;
12524 static int count = 0;
12531 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12532 gtk_window_set_screen (GTK_WINDOW (window),
12533 gtk_widget_get_screen (widget));
12535 gtk_window_set_title (GTK_WINDOW (window), "test");
12536 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
12538 g_signal_connect (window, "destroy",
12539 G_CALLBACK(gtk_widget_destroyed),
12542 curve = gtk_gamma_curve_new ();
12543 gtk_container_add (GTK_CONTAINER (window), curve);
12544 gtk_widget_show (curve);
12547 max = 127 + (count % 2)*128;
12548 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
12550 for (i = 0; i < max; ++i)
12551 vec[i] = (127 / sqrt (max)) * sqrt (i);
12552 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
12555 if (!GTK_WIDGET_VISIBLE (window))
12556 gtk_widget_show (window);
12557 else if (count % 4 == 3)
12559 gtk_widget_destroy (window);
12570 static int scroll_test_pos = 0.0;
12573 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
12574 GtkAdjustment *adj)
12577 gint imin, imax, jmin, jmax;
12579 imin = (event->area.x) / 10;
12580 imax = (event->area.x + event->area.width + 9) / 10;
12582 jmin = ((int)adj->value + event->area.y) / 10;
12583 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
12585 gdk_window_clear_area (widget->window,
12586 event->area.x, event->area.y,
12587 event->area.width, event->area.height);
12589 for (i=imin; i<imax; i++)
12590 for (j=jmin; j<jmax; j++)
12592 gdk_draw_rectangle (widget->window,
12593 widget->style->black_gc,
12595 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
12601 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
12602 GtkAdjustment *adj)
12604 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
12605 -adj->page_increment / 2:
12606 adj->page_increment / 2);
12607 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
12608 gtk_adjustment_set_value (adj, new_value);
12614 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
12615 GtkAdjustment *adj)
12617 adj->page_increment = 0.9 * widget->allocation.height;
12618 adj->page_size = widget->allocation.height;
12620 g_signal_emit_by_name (adj, "changed");
12624 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
12626 /* gint source_min = (int)adj->value - scroll_test_pos; */
12629 dy = scroll_test_pos - (int)adj->value;
12630 scroll_test_pos = adj->value;
12632 if (!GTK_WIDGET_DRAWABLE (widget))
12634 gdk_window_scroll (widget->window, 0, dy);
12635 gdk_window_process_updates (widget->window, FALSE);
12640 create_scroll_test (GtkWidget *widget)
12642 static GtkWidget *window = NULL;
12644 GtkWidget *drawing_area;
12645 GtkWidget *scrollbar;
12647 GtkAdjustment *adj;
12648 GdkGeometry geometry;
12649 GdkWindowHints geometry_mask;
12653 window = gtk_dialog_new ();
12655 gtk_window_set_screen (GTK_WINDOW (window),
12656 gtk_widget_get_screen (widget));
12658 g_signal_connect (window, "destroy",
12659 G_CALLBACK (gtk_widget_destroyed),
12662 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
12663 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12665 hbox = gtk_hbox_new (FALSE, 0);
12666 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
12668 gtk_widget_show (hbox);
12670 drawing_area = gtk_drawing_area_new ();
12671 gtk_widget_set_size_request (drawing_area, 200, 200);
12672 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
12673 gtk_widget_show (drawing_area);
12675 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
12677 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
12678 scroll_test_pos = 0.0;
12680 scrollbar = gtk_vscrollbar_new (adj);
12681 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
12682 gtk_widget_show (scrollbar);
12684 g_signal_connect (drawing_area, "expose_event",
12685 G_CALLBACK (scroll_test_expose), adj);
12686 g_signal_connect (drawing_area, "configure_event",
12687 G_CALLBACK (scroll_test_configure), adj);
12688 g_signal_connect (drawing_area, "scroll_event",
12689 G_CALLBACK (scroll_test_scroll), adj);
12691 g_signal_connect (adj, "value_changed",
12692 G_CALLBACK (scroll_test_adjustment_changed),
12695 /* .. And create some buttons */
12697 button = gtk_button_new_with_label ("Quit");
12698 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12699 button, TRUE, TRUE, 0);
12701 g_signal_connect_swapped (button, "clicked",
12702 G_CALLBACK (gtk_widget_destroy),
12704 gtk_widget_show (button);
12706 /* Set up gridded geometry */
12708 geometry_mask = GDK_HINT_MIN_SIZE |
12709 GDK_HINT_BASE_SIZE |
12710 GDK_HINT_RESIZE_INC;
12712 geometry.min_width = 20;
12713 geometry.min_height = 20;
12714 geometry.base_width = 0;
12715 geometry.base_height = 0;
12716 geometry.width_inc = 10;
12717 geometry.height_inc = 10;
12719 gtk_window_set_geometry_hints (GTK_WINDOW (window),
12720 drawing_area, &geometry, geometry_mask);
12723 if (!GTK_WIDGET_VISIBLE (window))
12724 gtk_widget_show (window);
12726 gtk_widget_destroy (window);
12733 static int timer = 0;
12736 timeout_test (GtkWidget *label)
12738 static int count = 0;
12739 static char buffer[32];
12741 sprintf (buffer, "count: %d", ++count);
12742 gtk_label_set_text (GTK_LABEL (label), buffer);
12748 start_timeout_test (GtkWidget *widget,
12753 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
12758 stop_timeout_test (GtkWidget *widget,
12763 gtk_timeout_remove (timer);
12769 destroy_timeout_test (GtkWidget *widget,
12770 GtkWidget **window)
12772 stop_timeout_test (NULL, NULL);
12778 create_timeout_test (GtkWidget *widget)
12780 static GtkWidget *window = NULL;
12786 window = gtk_dialog_new ();
12788 gtk_window_set_screen (GTK_WINDOW (window),
12789 gtk_widget_get_screen (widget));
12791 g_signal_connect (window, "destroy",
12792 G_CALLBACK (destroy_timeout_test),
12795 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
12796 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12798 label = gtk_label_new ("count: 0");
12799 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
12800 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
12801 label, TRUE, TRUE, 0);
12802 gtk_widget_show (label);
12804 button = gtk_button_new_with_label ("close");
12805 g_signal_connect_swapped (button, "clicked",
12806 G_CALLBACK (gtk_widget_destroy),
12808 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12809 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12810 button, TRUE, TRUE, 0);
12811 gtk_widget_grab_default (button);
12812 gtk_widget_show (button);
12814 button = gtk_button_new_with_label ("start");
12815 g_signal_connect (button, "clicked",
12816 G_CALLBACK(start_timeout_test),
12818 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12819 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12820 button, TRUE, TRUE, 0);
12821 gtk_widget_show (button);
12823 button = gtk_button_new_with_label ("stop");
12824 g_signal_connect (button, "clicked",
12825 G_CALLBACK (stop_timeout_test),
12827 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12828 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12829 button, TRUE, TRUE, 0);
12830 gtk_widget_show (button);
12833 if (!GTK_WIDGET_VISIBLE (window))
12834 gtk_widget_show (window);
12836 gtk_widget_destroy (window);
12843 static int idle_id = 0;
12846 idle_test (GtkWidget *label)
12848 static int count = 0;
12849 static char buffer[32];
12851 sprintf (buffer, "count: %d", ++count);
12852 gtk_label_set_text (GTK_LABEL (label), buffer);
12858 start_idle_test (GtkWidget *widget,
12863 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
12868 stop_idle_test (GtkWidget *widget,
12873 gtk_idle_remove (idle_id);
12879 destroy_idle_test (GtkWidget *widget,
12880 GtkWidget **window)
12882 stop_idle_test (NULL, NULL);
12888 toggle_idle_container (GObject *button,
12889 GtkContainer *container)
12891 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
12895 create_idle_test (GtkWidget *widget)
12897 static GtkWidget *window = NULL;
12900 GtkWidget *container;
12904 GtkWidget *button2;
12908 window = gtk_dialog_new ();
12910 gtk_window_set_screen (GTK_WINDOW (window),
12911 gtk_widget_get_screen (widget));
12913 g_signal_connect (window, "destroy",
12914 G_CALLBACK (destroy_idle_test),
12917 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
12918 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12920 label = gtk_label_new ("count: 0");
12921 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
12922 gtk_widget_show (label);
12925 gtk_widget_new (GTK_TYPE_HBOX,
12927 /* "GtkContainer::child", gtk_widget_new (GTK_TYPE_HBOX,
12928 * "GtkWidget::visible", TRUE,
12933 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
12934 container, TRUE, TRUE, 0);
12937 gtk_widget_new (GTK_TYPE_FRAME,
12939 "label", "Label Container",
12941 "parent", GTK_DIALOG (window)->vbox,
12944 gtk_widget_new (GTK_TYPE_VBOX,
12949 g_object_connect (gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
12950 "label", "Resize-Parent",
12951 "user_data", (void*)GTK_RESIZE_PARENT,
12955 "signal::clicked", toggle_idle_container, container,
12957 button = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
12958 "label", "Resize-Queue",
12959 "user_data", (void*)GTK_RESIZE_QUEUE,
12964 g_object_connect (button,
12965 "signal::clicked", toggle_idle_container, container,
12967 button2 = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
12968 "label", "Resize-Immediate",
12969 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
12971 g_object_connect (button2,
12972 "signal::clicked", toggle_idle_container, container,
12974 g_object_set (button2,
12980 button = gtk_button_new_with_label ("close");
12981 g_signal_connect_swapped (button, "clicked",
12982 G_CALLBACK (gtk_widget_destroy),
12984 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12985 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12986 button, TRUE, TRUE, 0);
12987 gtk_widget_grab_default (button);
12988 gtk_widget_show (button);
12990 button = gtk_button_new_with_label ("start");
12991 g_signal_connect (button, "clicked",
12992 G_CALLBACK (start_idle_test),
12994 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12995 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12996 button, TRUE, TRUE, 0);
12997 gtk_widget_show (button);
12999 button = gtk_button_new_with_label ("stop");
13000 g_signal_connect (button, "clicked",
13001 G_CALLBACK (stop_idle_test),
13003 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13004 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13005 button, TRUE, TRUE, 0);
13006 gtk_widget_show (button);
13009 if (!GTK_WIDGET_VISIBLE (window))
13010 gtk_widget_show (window);
13012 gtk_widget_destroy (window);
13020 reload_all_rc_files (void)
13022 static GdkAtom atom_rcfiles = GDK_NONE;
13024 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
13028 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
13030 for(i = 0; i < 5; i++)
13031 send_event->client.data.l[i] = 0;
13032 send_event->client.data_format = 32;
13033 send_event->client.message_type = atom_rcfiles;
13034 gdk_event_send_clientmessage_toall (send_event);
13036 gdk_event_free (send_event);
13040 create_rc_file (GtkWidget *widget)
13042 static GtkWidget *window = NULL;
13050 window = gtk_dialog_new ();
13052 gtk_window_set_screen (GTK_WINDOW (window),
13053 gtk_widget_get_screen (widget));
13055 g_signal_connect (window, "destroy",
13056 G_CALLBACK (gtk_widget_destroyed),
13059 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
13060 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
13062 vbox = gtk_vbox_new (FALSE, 0);
13063 gtk_container_add (GTK_CONTAINER (frame), vbox);
13065 label = gtk_label_new ("This label should be red");
13066 gtk_widget_set_name (label, "testgtk-red-label");
13067 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13069 label = gtk_label_new ("This label should be green");
13070 gtk_widget_set_name (label, "testgtk-green-label");
13071 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13073 label = gtk_label_new ("This label should be blue");
13074 gtk_widget_set_name (label, "testgtk-blue-label");
13075 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13077 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
13078 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
13080 button = gtk_button_new_with_label ("Reload");
13081 g_signal_connect (button, "clicked",
13082 G_CALLBACK (gtk_rc_reparse_all), NULL);
13083 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13084 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13085 button, TRUE, TRUE, 0);
13086 gtk_widget_grab_default (button);
13088 button = gtk_button_new_with_label ("Reload All");
13089 g_signal_connect (button, "clicked",
13090 G_CALLBACK (reload_all_rc_files), NULL);
13091 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13092 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13093 button, TRUE, TRUE, 0);
13095 button = gtk_button_new_with_label ("Close");
13096 g_signal_connect_swapped (button, "clicked",
13097 G_CALLBACK (gtk_widget_destroy),
13099 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13100 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13101 button, TRUE, TRUE, 0);
13104 if (!GTK_WIDGET_VISIBLE (window))
13105 gtk_widget_show_all (window);
13107 gtk_widget_destroy (window);
13111 * Test of recursive mainloop
13115 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
13122 create_mainloop (GtkWidget *widget)
13124 static GtkWidget *window = NULL;
13130 window = gtk_dialog_new ();
13132 gtk_window_set_screen (GTK_WINDOW (window),
13133 gtk_widget_get_screen (widget));
13135 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
13137 g_signal_connect (window, "destroy",
13138 G_CALLBACK (mainloop_destroyed),
13141 label = gtk_label_new ("In recursive main loop...");
13142 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
13144 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
13146 gtk_widget_show (label);
13148 button = gtk_button_new_with_label ("Leave");
13149 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
13152 g_signal_connect_swapped (button, "clicked",
13153 G_CALLBACK (gtk_widget_destroy),
13156 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13157 gtk_widget_grab_default (button);
13159 gtk_widget_show (button);
13162 if (!GTK_WIDGET_VISIBLE (window))
13164 gtk_widget_show (window);
13166 g_print ("create_mainloop: start\n");
13168 g_print ("create_mainloop: done\n");
13171 gtk_widget_destroy (window);
13175 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
13180 gint imin, imax, jmin, jmax;
13182 layout = GTK_LAYOUT (widget);
13184 if (event->window != layout->bin_window)
13187 imin = (event->area.x) / 10;
13188 imax = (event->area.x + event->area.width + 9) / 10;
13190 jmin = (event->area.y) / 10;
13191 jmax = (event->area.y + event->area.height + 9) / 10;
13193 for (i=imin; i<imax; i++)
13194 for (j=jmin; j<jmax; j++)
13196 gdk_draw_rectangle (layout->bin_window,
13197 widget->style->black_gc,
13205 void create_layout (GtkWidget *widget)
13207 static GtkWidget *window = NULL;
13209 GtkWidget *scrolledwindow;
13218 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13219 gtk_window_set_screen (GTK_WINDOW (window),
13220 gtk_widget_get_screen (widget));
13222 g_signal_connect (window, "destroy",
13223 G_CALLBACK (gtk_widget_destroyed),
13226 gtk_window_set_title (GTK_WINDOW (window), "Layout");
13227 gtk_widget_set_size_request (window, 200, 200);
13229 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
13230 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
13232 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
13233 GTK_CORNER_TOP_RIGHT);
13235 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
13237 layout = gtk_layout_new (NULL, NULL);
13238 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
13240 /* We set step sizes here since GtkLayout does not set
13243 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
13244 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
13246 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
13247 g_signal_connect (layout, "expose_event",
13248 G_CALLBACK (layout_expose_handler), NULL);
13250 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
13252 for (i=0 ; i < 16 ; i++)
13253 for (j=0 ; j < 16 ; j++)
13255 sprintf(buf, "Button %d, %d", i, j);
13257 button = gtk_button_new_with_label (buf);
13259 button = gtk_label_new (buf);
13261 gtk_layout_put (GTK_LAYOUT (layout), button,
13265 for (i=16; i < 1280; i++)
13267 sprintf(buf, "Button %d, %d", i, 0);
13269 button = gtk_button_new_with_label (buf);
13271 button = gtk_label_new (buf);
13273 gtk_layout_put (GTK_LAYOUT (layout), button,
13278 if (!GTK_WIDGET_VISIBLE (window))
13279 gtk_widget_show_all (window);
13281 gtk_widget_destroy (window);
13285 create_styles (GtkWidget *widget)
13287 static GtkWidget *window = NULL;
13292 static GdkColor red = { 0, 0xffff, 0, 0 };
13293 static GdkColor green = { 0, 0, 0xffff, 0 };
13294 static GdkColor blue = { 0, 0, 0, 0xffff };
13295 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
13296 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
13297 PangoFontDescription *font_desc;
13299 GtkRcStyle *rc_style;
13303 window = gtk_dialog_new ();
13304 gtk_window_set_screen (GTK_WINDOW (window),
13305 gtk_widget_get_screen (widget));
13307 g_signal_connect (window, "destroy",
13308 G_CALLBACK (gtk_widget_destroyed),
13312 button = gtk_button_new_with_label ("Close");
13313 g_signal_connect_swapped (button, "clicked",
13314 G_CALLBACK (gtk_widget_destroy),
13316 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13317 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
13318 button, TRUE, TRUE, 0);
13319 gtk_widget_show (button);
13321 vbox = gtk_vbox_new (FALSE, 5);
13322 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
13323 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
13325 label = gtk_label_new ("Font:");
13326 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13327 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13329 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
13331 button = gtk_button_new_with_label ("Some Text");
13332 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
13333 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13335 label = gtk_label_new ("Foreground:");
13336 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13337 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13339 button = gtk_button_new_with_label ("Some Text");
13340 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
13341 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13343 label = gtk_label_new ("Background:");
13344 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13345 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13347 button = gtk_button_new_with_label ("Some Text");
13348 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
13349 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13351 label = gtk_label_new ("Text:");
13352 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13353 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13355 entry = gtk_entry_new ();
13356 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13357 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
13358 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13360 label = gtk_label_new ("Base:");
13361 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13362 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13364 entry = gtk_entry_new ();
13365 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
13366 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
13367 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
13369 label = gtk_label_new ("Multiple:");
13370 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
13371 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
13373 button = gtk_button_new_with_label ("Some Text");
13375 rc_style = gtk_rc_style_new ();
13377 rc_style->font_desc = pango_font_description_copy (font_desc);
13378 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
13379 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
13380 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
13381 rc_style->fg[GTK_STATE_NORMAL] = yellow;
13382 rc_style->bg[GTK_STATE_NORMAL] = blue;
13383 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
13384 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
13385 rc_style->fg[GTK_STATE_ACTIVE] = red;
13386 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
13387 rc_style->xthickness = 5;
13388 rc_style->ythickness = 5;
13390 gtk_widget_modify_style (button, rc_style);
13391 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
13393 g_object_unref (rc_style);
13395 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
13398 if (!GTK_WIDGET_VISIBLE (window))
13399 gtk_widget_show_all (window);
13401 gtk_widget_destroy (window);
13405 * Main Window and Exit
13409 do_exit (GtkWidget *widget, GtkWidget *window)
13411 gtk_widget_destroy (window);
13417 void (*func) (GtkWidget *widget);
13418 gboolean do_not_benchmark;
13421 { "alpha window", create_alpha_window },
13423 /* dog slow on NT, no working at all on 9x */
13424 { "big windows", create_big_windows, TRUE },
13426 { "big windows", create_big_windows },
13428 { "button box", create_button_box },
13429 { "buttons", create_buttons },
13430 { "check buttons", create_check_buttons },
13431 { "clist", create_clist},
13432 { "color selection", create_color_selection },
13433 { "composited window", create_composited_window },
13434 { "ctree", create_ctree },
13435 { "cursors", create_cursors },
13436 { "dialog", create_dialog, TRUE },
13437 { "display & screen", create_display_screen, TRUE },
13438 { "entry", create_entry },
13439 { "event box", create_event_box },
13440 { "event watcher", create_event_watcher },
13441 { "expander", create_expander },
13442 { "file selection", create_file_selection },
13443 { "flipping", create_flipping },
13444 { "focus", create_focus },
13445 { "font selection", create_font_selection },
13446 { "gamma curve", create_gamma_curve, TRUE },
13447 { "gridded geometry", create_gridded_geometry },
13448 { "handle box", create_handle_box },
13449 { "image from drawable", create_get_image },
13450 { "image", create_image },
13451 { "item factory", create_item_factory },
13452 { "key lookup", create_key_lookup },
13453 { "labels", create_labels },
13454 { "layout", create_layout },
13455 { "list", create_list },
13456 { "menus", create_menus },
13457 { "message dialog", create_message_dialog },
13458 { "modal window", create_modal_window, TRUE },
13459 { "notebook", create_notebook },
13460 { "panes", create_panes },
13461 { "paned keyboard", create_paned_keyboard_navigation },
13462 { "pixmap", create_pixmap },
13463 { "preview color", create_color_preview, TRUE },
13464 { "preview gray", create_gray_preview, TRUE },
13465 { "progress bar", create_progress_bar },
13466 { "properties", create_properties },
13467 { "radio buttons", create_radio_buttons },
13468 { "range controls", create_range_controls },
13469 { "rc file", create_rc_file },
13470 { "reparent", create_reparent },
13471 { "resize grips", create_resize_grips },
13472 { "rotated label", create_rotated_label },
13473 { "rotated text", create_rotated_text },
13474 { "rulers", create_rulers },
13475 { "saved position", create_saved_position },
13476 { "scrolled windows", create_scrolled_windows },
13477 { "shapes", create_shapes },
13478 { "size groups", create_size_groups },
13479 { "spinbutton", create_spins },
13480 { "statusbar", create_statusbar },
13481 { "styles", create_styles },
13482 { "test idle", create_idle_test },
13483 { "test mainloop", create_mainloop, TRUE },
13484 { "test scrolling", create_scroll_test },
13485 { "test selection", create_selection_test },
13486 { "test timeout", create_timeout_test },
13487 { "text", create_text },
13488 { "toggle buttons", create_toggle_buttons },
13489 { "toolbar", create_toolbar },
13490 { "tooltips", create_tooltips },
13491 { "tree", create_tree_mode_window},
13492 { "WM hints", create_wmhints },
13493 { "window sizing", create_window_sizing },
13494 { "window states", create_window_states }
13496 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
13499 create_main_window (void)
13504 GtkWidget *scrolled_window;
13508 GtkWidget *separator;
13509 GdkGeometry geometry;
13512 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13513 gtk_widget_set_name (window, "main window");
13514 gtk_widget_set_uposition (window, 20, 20);
13515 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
13517 geometry.min_width = -1;
13518 geometry.min_height = -1;
13519 geometry.max_width = -1;
13520 geometry.max_height = G_MAXSHORT;
13521 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
13523 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
13525 g_signal_connect (window, "destroy",
13526 G_CALLBACK (gtk_main_quit),
13528 g_signal_connect (window, "delete-event",
13529 G_CALLBACK (gtk_false),
13532 box1 = gtk_vbox_new (FALSE, 0);
13533 gtk_container_add (GTK_CONTAINER (window), box1);
13535 if (gtk_micro_version > 0)
13540 gtk_micro_version);
13545 gtk_minor_version);
13547 label = gtk_label_new (buffer);
13548 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
13549 gtk_widget_set_name (label, "testgtk-version-label");
13551 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
13552 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
13553 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
13555 GTK_POLICY_AUTOMATIC);
13556 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
13558 box2 = gtk_vbox_new (FALSE, 0);
13559 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
13560 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
13561 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
13562 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
13563 gtk_widget_show (box2);
13565 for (i = 0; i < nbuttons; i++)
13567 button = gtk_button_new_with_label (buttons[i].label);
13568 if (buttons[i].func)
13569 g_signal_connect (button,
13571 G_CALLBACK(buttons[i].func),
13574 gtk_widget_set_sensitive (button, FALSE);
13575 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
13578 separator = gtk_hseparator_new ();
13579 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
13581 box2 = gtk_vbox_new (FALSE, 10);
13582 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
13583 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
13585 button = gtk_button_new_with_mnemonic ("_Close");
13586 g_signal_connect (button, "clicked",
13587 G_CALLBACK (do_exit),
13589 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
13590 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
13591 gtk_widget_grab_default (button);
13593 gtk_widget_show_all (window);
13599 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
13600 G_FILE_TEST_EXISTS))
13602 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
13603 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
13608 pad (const char *str, int to)
13610 static char buf[256];
13611 int len = strlen (str);
13614 for (i = 0; i < to; i++)
13619 memcpy (buf, str, len);
13625 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
13627 fn (widget); /* on */
13628 while (g_main_context_iteration (NULL, FALSE));
13629 fn (widget); /* off */
13630 while (g_main_context_iteration (NULL, FALSE));
13634 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
13640 static gboolean printed_headers = FALSE;
13642 if (!printed_headers) {
13643 g_print ("Test Iters First Other\n");
13644 g_print ("-------------------- ----- ---------- ----------\n");
13645 printed_headers = TRUE;
13648 g_get_current_time (&tv0);
13649 bench_iteration (widget, fn);
13650 g_get_current_time (&tv1);
13652 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
13653 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
13655 g_get_current_time (&tv0);
13656 for (n = 0; n < num - 1; n++)
13657 bench_iteration (widget, fn);
13658 g_get_current_time (&tv1);
13659 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
13660 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
13662 g_print ("%s %5d ", pad (name, 20), num);
13664 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
13666 g_print ("%10.1f\n", dt_first);
13670 do_bench (char* what, int num)
13674 void (* fn) (GtkWidget *widget);
13676 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13678 if (g_ascii_strcasecmp (what, "ALL") == 0)
13680 for (i = 0; i < nbuttons; i++)
13682 if (!buttons[i].do_not_benchmark)
13683 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
13690 for (i = 0; i < nbuttons; i++)
13692 if (strcmp (buttons[i].label, what) == 0)
13694 fn = buttons[i].func;
13700 g_print ("Can't bench: \"%s\" not found.\n", what);
13702 do_real_bench (widget, fn, buttons[i].label, num);
13709 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
13714 main (int argc, char *argv[])
13716 GtkBindingSet *binding_set;
13718 gboolean done_benchmarks = FALSE;
13720 srand (time (NULL));
13724 /* Check to see if we are being run from the correct
13727 if (file_exists ("testgtkrc"))
13728 gtk_rc_add_default_file ("testgtkrc");
13730 g_set_application_name ("GTK+ Test Program");
13732 gtk_init (&argc, &argv);
13734 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
13743 for (i = 1; i < argc; i++)
13745 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
13752 nextarg = strchr (argv[i], '=');
13763 count = strchr (nextarg, ':');
13766 what = g_strndup (nextarg, count - nextarg);
13768 num = atoi (count);
13773 what = g_strdup (nextarg);
13775 do_bench (what, num ? num : 1);
13776 done_benchmarks = TRUE;
13781 if (done_benchmarks)
13786 binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_WIDGET));
13787 gtk_binding_entry_add_signal (binding_set,
13788 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
13791 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
13793 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
13797 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
13798 " fg[NORMAL] = \"#ff0000\"\n"
13799 " font = \"Sans 18\"\n"
13801 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
13803 create_main_window ();
13809 while (g_main_context_pending (NULL))
13810 g_main_context_iteration (NULL, FALSE);
13813 while (g_main_context_pending (NULL))
13814 g_main_context_iteration (NULL, FALSE);