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/.
44 #include "gdk/gdkkeysyms.h"
47 #define sleep(n) _sleep(n)
50 #include "prop-editor.h"
52 #include "circles.xbm"
56 file_exists (const char *filename)
60 return stat (filename, &statbuf) == 0;
64 shape_create_icon (GdkScreen *screen,
73 build_option_menu (gchar *items[],
76 void (*func) (GtkWidget *widget, gpointer data),
79 /* macro, structure and variables used by tree window demos */
80 #define DEFAULT_NUMBER_OF_ITEM 3
81 #define DEFAULT_RECURSION_LEVEL 3
84 GSList* selection_mode_group;
85 GtkWidget* single_button;
86 GtkWidget* browse_button;
87 GtkWidget* multiple_button;
88 GtkWidget* draw_line_button;
89 GtkWidget* view_line_button;
90 GtkWidget* no_root_item_button;
91 GtkWidget* nb_item_spinner;
92 GtkWidget* recursion_spinner;
93 } sTreeSampleSelection;
95 typedef struct sTreeButtons {
97 GtkWidget* add_button;
98 GtkWidget* remove_button;
99 GtkWidget* subtree_button;
101 /* end of tree section */
104 build_option_menu (gchar *items[],
107 void (*func)(GtkWidget *widget, gpointer data),
113 omenu = gtk_combo_box_new_text ();
114 g_signal_connect (omenu, "changed",
115 G_CALLBACK (func), data);
117 for (i = 0; i < num_items; i++)
118 gtk_combo_box_append_text (GTK_COMBO_BOX (omenu), items[i]);
120 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
126 * Windows with an alpha channel
131 on_alpha_window_expose (GtkWidget *widget,
132 GdkEventExpose *expose)
135 cairo_pattern_t *pattern;
138 cr = gdk_cairo_create (widget->window);
140 radius = MIN (widget->allocation.width, widget->allocation.height) / 2;
141 pattern = cairo_pattern_create_radial (widget->allocation.width / 2,
142 widget->allocation.height / 2,
144 widget->allocation.width / 2,
145 widget->allocation.height / 2,
148 if (gdk_screen_get_rgba_colormap (gtk_widget_get_screen (widget)) &&
149 gtk_widget_is_composited (widget))
150 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
152 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
154 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
157 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
158 1.0, 0.75, 0.0, 1.0); /* solid orange */
159 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
160 1.0, 0.75, 0.0, 0.0); /* transparent orange */
162 cairo_set_source (cr, pattern);
163 cairo_pattern_destroy (pattern);
165 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
174 build_alpha_widgets (void)
177 GtkWidget *radio_button;
182 table = gtk_table_new (1, 1, FALSE);
184 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
185 gtk_table_attach (GTK_TABLE (table),
188 GTK_EXPAND | GTK_FILL, 0,
191 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
192 gtk_table_attach (GTK_TABLE (table),
195 GTK_EXPAND | GTK_FILL, 0,
198 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
199 gtk_table_attach (GTK_TABLE (table),
202 GTK_EXPAND | GTK_FILL, 0,
205 gtk_table_attach (GTK_TABLE (table),
206 gtk_check_button_new_with_label ("Sedentary"),
208 GTK_EXPAND | GTK_FILL, 0,
210 gtk_table_attach (GTK_TABLE (table),
211 gtk_check_button_new_with_label ("Nocturnal"),
213 GTK_EXPAND | GTK_FILL, 0,
215 gtk_table_attach (GTK_TABLE (table),
216 gtk_check_button_new_with_label ("Compulsive"),
218 GTK_EXPAND | GTK_FILL, 0,
221 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
222 gtk_table_attach (GTK_TABLE (table),
225 GTK_EXPAND | GTK_FILL, 0,
228 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
229 gtk_table_attach (GTK_TABLE (table),
232 GTK_EXPAND | GTK_FILL, 0,
235 hbox = gtk_hbox_new (FALSE, 0);
236 label = gtk_label_new (NULL);
237 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
238 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
239 entry = gtk_entry_new ();
240 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
241 gtk_table_attach (GTK_TABLE (table),
244 GTK_EXPAND | GTK_FILL, 0,
251 on_alpha_drawing_expose (GtkWidget *widget,
252 GdkEventExpose *expose)
254 int x = widget->allocation.x;
255 int y = widget->allocation.y;
256 int width = widget->allocation.width;
257 int height = widget->allocation.height;
264 buffer = g_malloc (64 * 64 * 4);
266 gdk_draw_rectangle (widget->window, widget->style->black_gc, FALSE,
268 width - 1, height - 1);
271 for (i = 0; i < 64; i++) {
272 for (j = 0; j < 64; j++) {
276 *(p++) = MIN (255, ((32 - i) * (32 - i) + (32 - j) * (32 - j)) / 8);
281 gdk_draw_rgb_32_image (widget->window, widget->style->black_gc,
282 x + 18, y + (height - 64) /2,
283 64, 64, GDK_RGB_DITHER_NORMAL, buffer, 64 * 4);
285 pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, TRUE,
286 8, 64, 64, 4 * 64, NULL, NULL);
287 cr = gdk_cairo_create (widget->window);
289 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
291 x + width - 18 - 64, y + (height - 64) /2,
296 g_object_unref (pixbuf);
304 build_alpha_drawing ()
308 hbox = gtk_hbox_new (FALSE, 0);
309 gtk_widget_set_size_request (hbox, 100, 100);
311 g_signal_connect (hbox, "expose-event",
312 G_CALLBACK (on_alpha_drawing_expose), NULL);
318 on_alpha_screen_changed (GtkWidget *widget,
319 GdkScreen *old_screen,
322 GdkScreen *screen = gtk_widget_get_screen (widget);
323 GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
327 colormap = gdk_screen_get_default_colormap (screen);
328 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
332 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
335 gtk_widget_set_colormap (widget, colormap);
339 on_composited_changed (GtkWidget *window,
342 gboolean is_composited = gtk_widget_is_composited (window);
345 gtk_label_set_text (label, "Composited");
347 gtk_label_set_text (label, "Not composited");
351 create_alpha_window (GtkWidget *widget)
353 static GtkWidget *window;
357 GtkWidget *content_area;
361 window = gtk_dialog_new_with_buttons ("Alpha Window",
362 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
366 gtk_widget_set_app_paintable (window, TRUE);
367 g_signal_connect (window, "expose-event",
368 G_CALLBACK (on_alpha_window_expose), NULL);
370 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
372 vbox = gtk_vbox_new (FALSE, 8);
373 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
374 gtk_box_pack_start (GTK_BOX (content_area), vbox,
377 label = gtk_label_new (NULL);
378 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
379 on_alpha_screen_changed (window, NULL, label);
380 g_signal_connect (window, "screen-changed",
381 G_CALLBACK (on_alpha_screen_changed), label);
383 label = gtk_label_new (NULL);
384 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
385 on_composited_changed (window, GTK_LABEL (label));
386 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
388 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
389 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_drawing (), TRUE, TRUE, 0);
391 g_signal_connect (window, "destroy",
392 G_CALLBACK (gtk_widget_destroyed),
395 g_signal_connect (window, "response",
396 G_CALLBACK (gtk_widget_destroy),
400 if (!gtk_widget_get_visible (window))
401 gtk_widget_show_all (window);
403 gtk_widget_destroy (window);
407 * Composited non-toplevel window
410 /* The expose event handler for the event box.
412 * This function simply draws a transparency onto a widget on the area
413 * for which it receives expose events. This is intended to give the
414 * event box a "transparent" background.
416 * In order for this to work properly, the widget must have an RGBA
417 * colourmap. The widget should also be set as app-paintable since it
418 * doesn't make sense for GTK to draw a background if we are drawing it
419 * (and because GTK might actually replace our transparency with its
420 * default background colour).
423 transparent_expose (GtkWidget *widget,
424 GdkEventExpose *event)
428 cr = gdk_cairo_create (widget->window);
429 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
430 gdk_cairo_region (cr, event->region);
437 /* The expose event handler for the window.
439 * This function performs the actual compositing of the event box onto
440 * the already-existing background of the window at 50% normal opacity.
442 * In this case we do not want app-paintable to be set on the widget
443 * since we want it to draw its own (red) background. Because of this,
444 * however, we must ensure that we use g_signal_register_after so that
445 * this handler is called after the red has been drawn. If it was
446 * called before then GTK would just blindly paint over our work.
449 window_expose_event (GtkWidget *widget,
450 GdkEventExpose *event)
452 cairo_region_t *region;
456 /* get our child (in this case, the event box) */
457 child = gtk_bin_get_child (GTK_BIN (widget));
459 /* create a cairo context to draw to the window */
460 cr = gdk_cairo_create (widget->window);
462 /* the source data is the (composited) event box */
463 gdk_cairo_set_source_pixmap (cr, child->window,
465 child->allocation.y);
467 /* draw no more than our expose event intersects our child */
468 region = cairo_region_create_rectangle (&child->allocation);
469 cairo_region_intersect (region, event->region);
470 gdk_cairo_region (cr, region);
473 /* composite, with a 50% opacity */
474 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
475 cairo_paint_with_alpha (cr, 0.5);
484 create_composited_window (GtkWidget *widget)
486 static GtkWidget *window;
490 GtkWidget *event, *button;
495 /* make the widgets */
496 button = gtk_button_new_with_label ("A Button");
497 event = gtk_event_box_new ();
498 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
500 g_signal_connect (window, "destroy",
501 G_CALLBACK (gtk_widget_destroyed),
504 /* put a red background on the window */
505 gdk_color_parse ("red", &red);
506 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
508 /* set the colourmap for the event box.
509 * must be done before the event box is realised.
511 screen = gtk_widget_get_screen (event);
512 rgba = gdk_screen_get_rgba_colormap (screen);
513 gtk_widget_set_colormap (event, rgba);
515 /* set our event box to have a fully-transparent background
516 * drawn on it. currently there is no way to simply tell gtk
517 * that "transparency" is the background colour for a widget.
519 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
520 g_signal_connect (event, "expose-event",
521 G_CALLBACK (transparent_expose), NULL);
523 /* put them inside one another */
524 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
525 gtk_container_add (GTK_CONTAINER (window), event);
526 gtk_container_add (GTK_CONTAINER (event), button);
528 /* realise and show everything */
529 gtk_widget_realize (button);
531 /* set the event box GdkWindow to be composited.
532 * obviously must be performed after event box is realised.
534 gdk_window_set_composited (event->window, TRUE);
536 /* set up the compositing handler.
537 * note that we do _after so that the normal (red) background is drawn
538 * by gtk before our compositing occurs.
540 g_signal_connect_after (window, "expose-event",
541 G_CALLBACK (window_expose_event), NULL);
544 if (!gtk_widget_get_visible (window))
545 gtk_widget_show_all (window);
547 gtk_widget_destroy (window);
551 * Big windows and guffaw scrolling
555 pattern_expose (GtkWidget *widget,
556 GdkEventExpose *event,
560 GdkWindow *window = event->window;
562 color = g_object_get_data (G_OBJECT (window), "pattern-color");
565 GdkGC *tmp_gc = gdk_gc_new (window);
566 gdk_gc_set_rgb_fg_color (tmp_gc, color);
568 gdk_draw_rectangle (window, tmp_gc, TRUE,
569 event->area.x, event->area.y,
570 event->area.width, event->area.height);
572 g_object_unref (tmp_gc);
579 pattern_set_bg (GtkWidget *widget,
583 static const GdkColor colors[] = {
584 { 0, 0x4444, 0x4444, 0xffff },
585 { 0, 0x8888, 0x8888, 0xffff },
586 { 0, 0xaaaa, 0xaaaa, 0xffff }
589 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
590 gdk_window_set_user_data (child, widget);
594 create_pattern (GtkWidget *widget,
605 while (2 * h <= height)
610 while (2 * w <= width)
612 if ((i + j) % 2 == 0)
617 GdkWindowAttr attributes;
619 attributes.window_type = GDK_WINDOW_CHILD;
622 attributes.width = w;
623 attributes.height = h;
624 attributes.wclass = GDK_INPUT_OUTPUT;
625 attributes.event_mask = GDK_EXPOSURE_MASK;
626 attributes.visual = gtk_widget_get_visual (widget);
627 attributes.colormap = gtk_widget_get_colormap (widget);
629 child = gdk_window_new (parent, &attributes,
630 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
632 pattern_set_bg (widget, child, level);
635 create_pattern (widget, child, level + 1, w, h);
637 gdk_window_show (child);
647 #define PATTERN_SIZE (1 << 18)
650 pattern_hadj_changed (GtkAdjustment *adj,
653 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
654 gint new_value = adj->value;
656 if (gtk_widget_get_realized (darea))
658 gdk_window_scroll (darea->window, *old_value - new_value, 0);
659 *old_value = new_value;
664 pattern_vadj_changed (GtkAdjustment *adj,
667 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
668 gint new_value = adj->value;
670 if (gtk_widget_get_realized (darea))
672 gdk_window_scroll (darea->window, 0, *old_value - new_value);
673 *old_value = new_value;
678 pattern_realize (GtkWidget *widget,
681 pattern_set_bg (widget, widget->window, 0);
682 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
686 create_big_windows (GtkWidget *widget)
688 static GtkWidget *window = NULL;
689 GtkWidget *content_area;
690 GtkWidget *darea, *table, *scrollbar;
694 static gint current_x;
695 static gint current_y;
702 window = gtk_dialog_new_with_buttons ("Big Windows",
708 gtk_window_set_screen (GTK_WINDOW (window),
709 gtk_widget_get_screen (widget));
711 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
713 g_signal_connect (window, "destroy",
714 G_CALLBACK (gtk_widget_destroyed),
717 g_signal_connect (window, "response",
718 G_CALLBACK (gtk_widget_destroy),
721 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
723 table = gtk_table_new (2, 2, FALSE);
724 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
726 darea = gtk_drawing_area_new ();
728 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
729 g_signal_connect (hadj, "value_changed",
730 G_CALLBACK (pattern_hadj_changed), darea);
731 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
733 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
734 g_signal_connect (vadj, "value_changed",
735 G_CALLBACK (pattern_vadj_changed), darea);
736 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
738 g_signal_connect (darea, "realize",
739 G_CALLBACK (pattern_realize),
741 g_signal_connect (darea, "expose_event",
742 G_CALLBACK (pattern_expose),
745 eventbox = gtk_event_box_new ();
746 gtk_table_attach (GTK_TABLE (table), eventbox,
748 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
751 gtk_container_add (GTK_CONTAINER (eventbox), darea);
753 scrollbar = gtk_hscrollbar_new (hadj);
754 gtk_table_attach (GTK_TABLE (table), scrollbar,
756 GTK_FILL | GTK_EXPAND, GTK_FILL,
759 scrollbar = gtk_vscrollbar_new (vadj);
760 gtk_table_attach (GTK_TABLE (table), scrollbar,
762 GTK_FILL, GTK_EXPAND | GTK_FILL,
767 if (!gtk_widget_get_visible (window))
768 gtk_widget_show_all (window);
770 gtk_widget_hide (window);
778 button_window (GtkWidget *widget,
781 if (!gtk_widget_get_visible (button))
782 gtk_widget_show (button);
784 gtk_widget_hide (button);
788 create_buttons (GtkWidget *widget)
790 static GtkWidget *window = NULL;
794 GtkWidget *button[10];
795 GtkWidget *separator;
799 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
800 gtk_window_set_screen (GTK_WINDOW (window),
801 gtk_widget_get_screen (widget));
803 g_signal_connect (window, "destroy",
804 G_CALLBACK (gtk_widget_destroyed),
807 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
808 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
810 box1 = gtk_vbox_new (FALSE, 0);
811 gtk_container_add (GTK_CONTAINER (window), box1);
813 table = gtk_table_new (3, 3, FALSE);
814 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
815 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
816 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
817 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
819 button[0] = gtk_button_new_with_label ("button1");
820 button[1] = gtk_button_new_with_mnemonic ("_button2");
821 button[2] = gtk_button_new_with_mnemonic ("_button3");
822 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
823 button[4] = gtk_button_new_with_label ("button5");
824 button[5] = gtk_button_new_with_label ("button6");
825 button[6] = gtk_button_new_with_label ("button7");
826 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
827 button[8] = gtk_button_new_with_label ("button9");
829 g_signal_connect (button[0], "clicked",
830 G_CALLBACK (button_window),
833 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
834 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
836 g_signal_connect (button[1], "clicked",
837 G_CALLBACK (button_window),
840 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
841 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
843 g_signal_connect (button[2], "clicked",
844 G_CALLBACK (button_window),
846 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
847 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
849 g_signal_connect (button[3], "clicked",
850 G_CALLBACK (button_window),
852 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
853 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
855 g_signal_connect (button[4], "clicked",
856 G_CALLBACK (button_window),
858 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
859 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
861 g_signal_connect (button[5], "clicked",
862 G_CALLBACK (button_window),
864 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
865 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
867 g_signal_connect (button[6], "clicked",
868 G_CALLBACK (button_window),
870 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
871 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
873 g_signal_connect (button[7], "clicked",
874 G_CALLBACK (button_window),
876 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
877 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
879 g_signal_connect (button[8], "clicked",
880 G_CALLBACK (button_window),
882 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
883 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
885 separator = gtk_hseparator_new ();
886 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
888 box2 = gtk_vbox_new (FALSE, 10);
889 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
890 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
892 button[9] = gtk_button_new_with_label ("close");
893 g_signal_connect_swapped (button[9], "clicked",
894 G_CALLBACK (gtk_widget_destroy),
896 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
897 gtk_widget_set_can_default (button[9], TRUE);
898 gtk_widget_grab_default (button[9]);
901 if (!gtk_widget_get_visible (window))
902 gtk_widget_show_all (window);
904 gtk_widget_destroy (window);
912 create_toggle_buttons (GtkWidget *widget)
914 static GtkWidget *window = NULL;
918 GtkWidget *separator;
922 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
923 gtk_window_set_screen (GTK_WINDOW (window),
924 gtk_widget_get_screen (widget));
926 g_signal_connect (window, "destroy",
927 G_CALLBACK (gtk_widget_destroyed),
930 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
931 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
933 box1 = gtk_vbox_new (FALSE, 0);
934 gtk_container_add (GTK_CONTAINER (window), box1);
936 box2 = gtk_vbox_new (FALSE, 10);
937 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
938 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
940 button = gtk_toggle_button_new_with_label ("button1");
941 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
943 button = gtk_toggle_button_new_with_label ("button2");
944 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
946 button = gtk_toggle_button_new_with_label ("button3");
947 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
949 button = gtk_toggle_button_new_with_label ("inconsistent");
950 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
951 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
953 separator = gtk_hseparator_new ();
954 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
956 box2 = gtk_vbox_new (FALSE, 10);
957 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
958 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
960 button = gtk_button_new_with_label ("close");
961 g_signal_connect_swapped (button, "clicked",
962 G_CALLBACK (gtk_widget_destroy),
964 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
965 gtk_widget_set_can_default (button, TRUE);
966 gtk_widget_grab_default (button);
969 if (!gtk_widget_get_visible (window))
970 gtk_widget_show_all (window);
972 gtk_widget_destroy (window);
976 create_widget_grid (GType widget_type)
979 GtkWidget *group_widget = NULL;
982 table = gtk_table_new (FALSE, 3, 3);
984 for (i = 0; i < 5; i++)
986 for (j = 0; j < 5; j++)
991 if (i == 0 && j == 0)
997 tmp = g_strdup_printf ("%d", j);
998 widget = gtk_label_new (tmp);
1003 tmp = g_strdup_printf ("%c", 'A' + i - 1);
1004 widget = gtk_label_new (tmp);
1009 widget = g_object_new (widget_type, NULL);
1011 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
1014 group_widget = widget;
1016 g_object_set (widget, "group", group_widget, NULL);
1021 gtk_table_attach (GTK_TABLE (table), widget,
1036 create_check_buttons (GtkWidget *widget)
1038 static GtkWidget *window = NULL;
1042 GtkWidget *separator;
1047 window = gtk_dialog_new_with_buttons ("Check Buttons",
1053 gtk_window_set_screen (GTK_WINDOW (window),
1054 gtk_widget_get_screen (widget));
1056 g_signal_connect (window, "destroy",
1057 G_CALLBACK (gtk_widget_destroyed),
1059 g_signal_connect (window, "response",
1060 G_CALLBACK (gtk_widget_destroy),
1063 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1065 box2 = gtk_vbox_new (FALSE, 10);
1066 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1067 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1069 button = gtk_check_button_new_with_mnemonic ("_button1");
1070 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1072 button = gtk_check_button_new_with_label ("button2");
1073 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1075 button = gtk_check_button_new_with_label ("button3");
1076 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1078 button = gtk_check_button_new_with_label ("inconsistent");
1079 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1080 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1082 separator = gtk_hseparator_new ();
1083 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1085 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
1086 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1087 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1090 if (!gtk_widget_get_visible (window))
1091 gtk_widget_show_all (window);
1093 gtk_widget_destroy (window);
1101 create_radio_buttons (GtkWidget *widget)
1103 static GtkWidget *window = NULL;
1107 GtkWidget *separator;
1112 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1118 gtk_window_set_screen (GTK_WINDOW (window),
1119 gtk_widget_get_screen (widget));
1121 g_signal_connect (window, "destroy",
1122 G_CALLBACK (gtk_widget_destroyed),
1124 g_signal_connect (window, "response",
1125 G_CALLBACK (gtk_widget_destroy),
1128 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1130 box2 = gtk_vbox_new (FALSE, 10);
1131 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1132 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1134 button = gtk_radio_button_new_with_label (NULL, "button1");
1135 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1137 button = gtk_radio_button_new_with_label (
1138 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1140 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1141 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1143 button = gtk_radio_button_new_with_label (
1144 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
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_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1152 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1154 separator = gtk_hseparator_new ();
1155 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1157 box2 = gtk_vbox_new (FALSE, 10);
1158 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1159 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1161 button = gtk_radio_button_new_with_label (NULL, "button4");
1162 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1163 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1165 button = gtk_radio_button_new_with_label (
1166 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1168 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1169 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1170 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1172 button = gtk_radio_button_new_with_label (
1173 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1175 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1176 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1178 separator = gtk_hseparator_new ();
1179 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1181 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1182 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1183 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1186 if (!gtk_widget_get_visible (window))
1187 gtk_widget_show_all (window);
1189 gtk_widget_destroy (window);
1197 create_bbox (gint horizontal,
1208 frame = gtk_frame_new (title);
1211 bbox = gtk_hbutton_box_new ();
1213 bbox = gtk_vbutton_box_new ();
1215 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1216 gtk_container_add (GTK_CONTAINER (frame), bbox);
1218 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1219 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1221 button = gtk_button_new_with_label ("OK");
1222 gtk_container_add (GTK_CONTAINER (bbox), button);
1224 button = gtk_button_new_with_label ("Cancel");
1225 gtk_container_add (GTK_CONTAINER (bbox), button);
1227 button = gtk_button_new_with_label ("Help");
1228 gtk_container_add (GTK_CONTAINER (bbox), button);
1234 create_button_box (GtkWidget *widget)
1236 static GtkWidget* window = NULL;
1237 GtkWidget *main_vbox;
1240 GtkWidget *frame_horz;
1241 GtkWidget *frame_vert;
1245 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1246 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1247 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1249 g_signal_connect (window, "destroy",
1250 G_CALLBACK (gtk_widget_destroyed),
1253 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1255 main_vbox = gtk_vbox_new (FALSE, 0);
1256 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1258 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1259 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1261 vbox = gtk_vbox_new (FALSE, 0);
1262 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1263 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1265 gtk_box_pack_start (GTK_BOX (vbox),
1266 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1269 gtk_box_pack_start (GTK_BOX (vbox),
1270 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1273 gtk_box_pack_start (GTK_BOX (vbox),
1274 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1277 gtk_box_pack_start (GTK_BOX (vbox),
1278 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1281 gtk_box_pack_start (GTK_BOX (vbox),
1282 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1285 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1286 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1288 hbox = gtk_hbox_new (FALSE, 0);
1289 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1290 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1292 gtk_box_pack_start (GTK_BOX (hbox),
1293 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1296 gtk_box_pack_start (GTK_BOX (hbox),
1297 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1300 gtk_box_pack_start (GTK_BOX (hbox),
1301 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1304 gtk_box_pack_start (GTK_BOX (hbox),
1305 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1308 gtk_box_pack_start (GTK_BOX (hbox),
1309 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1313 if (!gtk_widget_get_visible (window))
1314 gtk_widget_show_all (window);
1316 gtk_widget_destroy (window);
1324 new_pixmap (char *filename,
1326 GdkColor *background)
1332 if (strcmp (filename, "test.xpm") == 0 ||
1333 !file_exists (filename))
1335 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask,
1340 pixmap = gdk_pixmap_create_from_xpm (window, &mask,
1344 wpixmap = gtk_image_new_from_pixmap (pixmap, mask);
1351 set_toolbar_small_stock (GtkWidget *widget,
1354 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1358 set_toolbar_large_stock (GtkWidget *widget,
1361 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1365 set_toolbar_horizontal (GtkWidget *widget,
1368 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1372 set_toolbar_vertical (GtkWidget *widget,
1375 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1379 set_toolbar_icons (GtkWidget *widget,
1382 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1386 set_toolbar_text (GtkWidget *widget,
1389 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1393 set_toolbar_both (GtkWidget *widget,
1396 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1400 set_toolbar_both_horiz (GtkWidget *widget,
1403 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1407 set_toolbar_enable (GtkWidget *widget,
1410 GtkSettings *settings = gtk_widget_get_settings (widget);
1411 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1415 set_toolbar_disable (GtkWidget *widget,
1418 GtkSettings *settings = gtk_widget_get_settings (widget);
1419 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1422 static GtkActionEntry create_toolbar_items[] = {
1423 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1424 G_CALLBACK (set_toolbar_small_stock) },
1425 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1426 G_CALLBACK (set_toolbar_large_stock) },
1427 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1428 G_CALLBACK (set_toolbar_horizontal) },
1429 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1430 G_CALLBACK (set_toolbar_vertical) },
1432 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1433 G_CALLBACK (set_toolbar_icons) },
1434 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1435 G_CALLBACK (set_toolbar_text) },
1436 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1437 G_CALLBACK (set_toolbar_both) },
1438 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1439 G_CALLBACK (set_toolbar_both_horiz) },
1441 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1445 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1446 G_CALLBACK (set_toolbar_enable) },
1447 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1448 G_CALLBACK (set_toolbar_disable) },
1450 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1452 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1455 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1457 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1462 create_toolbar (GtkWidget *widget)
1464 static GtkWidget *window = NULL;
1471 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1472 gtk_window_set_screen (GTK_WINDOW (window),
1473 gtk_widget_get_screen (widget));
1475 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1477 g_signal_connect (window, "destroy",
1478 G_CALLBACK (gtk_widget_destroyed),
1481 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1482 gtk_widget_realize (window);
1484 toolbar = gtk_toolbar_new ();
1485 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1487 GtkToolItem *toolitem;
1489 if (create_toolbar_items[i].tooltip == NULL)
1490 toolitem = gtk_separator_tool_item_new ();
1491 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1495 toolitem = gtk_tool_item_new ();
1496 entry = gtk_entry_new ();
1497 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1499 else if (create_toolbar_items[i].stock_id)
1500 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1505 icon = new_pixmap ("test.xpm", window->window,
1506 &window->style->bg[GTK_STATE_NORMAL]);
1507 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1509 if (create_toolbar_items[i].callback)
1510 g_signal_connect (toolitem, "clicked",
1511 create_toolbar_items[i].callback, toolbar);
1512 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1513 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1516 gtk_container_add (GTK_CONTAINER (window), toolbar);
1518 gtk_widget_set_size_request (toolbar, 200, -1);
1521 if (!gtk_widget_get_visible (window))
1522 gtk_widget_show_all (window);
1524 gtk_widget_destroy (window);
1527 static GtkActionEntry make_toolbar_items[] = {
1528 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1529 G_CALLBACK (set_toolbar_horizontal) },
1530 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1531 G_CALLBACK (set_toolbar_vertical) },
1533 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1534 G_CALLBACK (set_toolbar_icons) },
1535 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1536 G_CALLBACK (set_toolbar_text) },
1537 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1538 G_CALLBACK (set_toolbar_both) },
1540 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1542 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1545 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1546 G_CALLBACK (set_toolbar_enable) },
1547 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1548 G_CALLBACK (set_toolbar_disable) },
1550 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1552 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1557 make_toolbar (GtkWidget *window)
1562 if (!gtk_widget_get_realized (window))
1563 gtk_widget_realize (window);
1565 toolbar = gtk_toolbar_new ();
1566 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1569 GtkToolItem *toolitem;
1571 if (make_toolbar_items[i].label == NULL)
1573 toolitem = gtk_separator_tool_item_new ();
1576 icon = new_pixmap ("test.xpm", window->window,
1577 &window->style->bg[GTK_STATE_NORMAL]);
1578 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1579 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1580 if (make_toolbar_items[i].callback != NULL)
1581 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1582 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1592 static guint statusbar_counter = 1;
1595 statusbar_push (GtkWidget *button,
1596 GtkStatusbar *statusbar)
1600 sprintf (text, "something %d", statusbar_counter++);
1602 gtk_statusbar_push (statusbar, 1, text);
1606 statusbar_push_long (GtkWidget *button,
1607 GtkStatusbar *statusbar)
1611 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\").");
1613 gtk_statusbar_push (statusbar, 1, text);
1617 statusbar_pop (GtkWidget *button,
1618 GtkStatusbar *statusbar)
1620 gtk_statusbar_pop (statusbar, 1);
1624 statusbar_steal (GtkWidget *button,
1625 GtkStatusbar *statusbar)
1627 gtk_statusbar_remove (statusbar, 1, 4);
1631 statusbar_popped (GtkStatusbar *statusbar,
1636 statusbar_counter = 1;
1640 statusbar_contexts (GtkStatusbar *statusbar)
1644 string = "any context";
1645 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1647 gtk_statusbar_get_context_id (statusbar, string));
1649 string = "idle messages";
1650 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1652 gtk_statusbar_get_context_id (statusbar, string));
1654 string = "some text";
1655 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1657 gtk_statusbar_get_context_id (statusbar, string));
1659 string = "hit the mouse";
1660 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1662 gtk_statusbar_get_context_id (statusbar, string));
1664 string = "hit the mouse2";
1665 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1667 gtk_statusbar_get_context_id (statusbar, string));
1671 create_statusbar (GtkWidget *widget)
1673 static GtkWidget *window = NULL;
1677 GtkWidget *separator;
1678 GtkWidget *statusbar;
1682 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1683 gtk_window_set_screen (GTK_WINDOW (window),
1684 gtk_widget_get_screen (widget));
1686 g_signal_connect (window, "destroy",
1687 G_CALLBACK (gtk_widget_destroyed),
1690 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1691 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1693 box1 = gtk_vbox_new (FALSE, 0);
1694 gtk_container_add (GTK_CONTAINER (window), box1);
1696 box2 = gtk_vbox_new (FALSE, 10);
1697 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1698 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1700 statusbar = gtk_statusbar_new ();
1701 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1702 g_signal_connect (statusbar,
1704 G_CALLBACK (statusbar_popped),
1707 button = g_object_new (gtk_button_get_type (),
1708 "label", "push something",
1712 g_object_connect (button,
1713 "signal::clicked", statusbar_push, statusbar,
1716 button = g_object_connect (g_object_new (gtk_button_get_type (),
1721 "signal_after::clicked", statusbar_pop, statusbar,
1724 button = g_object_connect (g_object_new (gtk_button_get_type (),
1725 "label", "steal #4",
1729 "signal_after::clicked", statusbar_steal, statusbar,
1732 button = g_object_connect (g_object_new (gtk_button_get_type (),
1733 "label", "test contexts",
1737 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1740 button = g_object_connect (g_object_new (gtk_button_get_type (),
1741 "label", "push something long",
1745 "signal_after::clicked", statusbar_push_long, statusbar,
1748 separator = gtk_hseparator_new ();
1749 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1751 box2 = gtk_vbox_new (FALSE, 10);
1752 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1753 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1755 button = gtk_button_new_with_label ("close");
1756 g_signal_connect_swapped (button, "clicked",
1757 G_CALLBACK (gtk_widget_destroy),
1759 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1760 gtk_widget_set_can_default (button, TRUE);
1761 gtk_widget_grab_default (button);
1764 if (!gtk_widget_get_visible (window))
1765 gtk_widget_show_all (window);
1767 gtk_widget_destroy (window);
1773 #define GRID_SIZE 20
1774 #define DEFAULT_GEOMETRY "10x10"
1777 gridded_geometry_expose (GtkWidget *widget,
1778 GdkEventExpose *event)
1782 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
1783 0, 0, widget->allocation.width, widget->allocation.height);
1785 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
1786 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
1788 if ((i + j) % 2 == 0)
1789 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
1790 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1797 gridded_geometry_subresponse (GtkDialog *dialog,
1799 gchar *geometry_string)
1801 if (response_id == GTK_RESPONSE_NONE)
1803 gtk_widget_destroy (GTK_WIDGET (dialog));
1807 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1809 g_print ("Can't parse geometry string %s\n", geometry_string);
1810 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1816 gridded_geometry_response (GtkDialog *dialog,
1820 if (response_id == GTK_RESPONSE_NONE)
1822 gtk_widget_destroy (GTK_WIDGET (dialog));
1826 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1827 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1828 GtkWidget *content_area;
1830 GtkWidget *drawing_area;
1832 GdkGeometry geometry;
1834 window = gtk_dialog_new_with_buttons (title,
1837 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1840 gtk_window_set_screen (GTK_WINDOW (window),
1841 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1843 g_signal_connect (window, "response",
1844 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1846 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1848 box = gtk_vbox_new (FALSE, 0);
1849 gtk_box_pack_start (GTK_BOX (content_area), box, TRUE, TRUE, 0);
1851 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1853 drawing_area = gtk_drawing_area_new ();
1854 g_signal_connect (drawing_area, "expose_event",
1855 G_CALLBACK (gridded_geometry_expose), NULL);
1856 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1858 /* Gross hack to work around bug 68668... if we set the size request
1859 * large enough, then the current
1861 * request_of_window - request_of_geometry_widget
1863 * method of getting the base size works more or less works.
1865 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1867 geometry.base_width = 0;
1868 geometry.base_height = 0;
1869 geometry.min_width = 2 * GRID_SIZE;
1870 geometry.min_height = 2 * GRID_SIZE;
1871 geometry.width_inc = GRID_SIZE;
1872 geometry.height_inc = GRID_SIZE;
1874 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1876 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1878 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1880 g_print ("Can't parse geometry string %s\n", geometry_string);
1881 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1884 gtk_widget_show_all (window);
1889 create_gridded_geometry (GtkWidget *widget)
1891 static GtkWidget *window = NULL;
1892 gpointer window_ptr;
1893 GtkWidget *content_area;
1899 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1902 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1905 gtk_window_set_screen (GTK_WINDOW (window),
1906 gtk_widget_get_screen (widget));
1908 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1910 label = gtk_label_new ("Geometry string:");
1911 gtk_box_pack_start (GTK_BOX (content_area), label, FALSE, FALSE, 0);
1913 entry = gtk_entry_new ();
1914 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1915 gtk_box_pack_start (GTK_BOX (content_area), entry, FALSE, FALSE, 0);
1917 g_signal_connect (window, "response",
1918 G_CALLBACK (gridded_geometry_response), entry);
1919 window_ptr = &window;
1920 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
1922 gtk_widget_show_all (window);
1925 gtk_widget_destroy (window);
1933 handle_box_child_signal (GtkHandleBox *hb,
1935 const gchar *action)
1937 printf ("%s: child <%s> %sed\n",
1938 g_type_name (G_OBJECT_TYPE (hb)),
1939 g_type_name (G_OBJECT_TYPE (child)),
1944 create_handle_box (GtkWidget *widget)
1946 static GtkWidget* window = NULL;
1947 GtkWidget *handle_box;
1948 GtkWidget *handle_box2;
1953 GtkWidget *separator;
1957 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1959 gtk_window_set_screen (GTK_WINDOW (window),
1960 gtk_widget_get_screen (widget));
1961 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1962 gtk_window_set_title (GTK_WINDOW (window),
1964 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1966 g_signal_connect (window, "destroy",
1967 G_CALLBACK (gtk_widget_destroyed),
1970 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1972 vbox = gtk_vbox_new (FALSE, 0);
1973 gtk_container_add (GTK_CONTAINER (window), vbox);
1974 gtk_widget_show (vbox);
1976 label = gtk_label_new ("Above");
1977 gtk_container_add (GTK_CONTAINER (vbox), label);
1978 gtk_widget_show (label);
1980 separator = gtk_hseparator_new ();
1981 gtk_container_add (GTK_CONTAINER (vbox), separator);
1982 gtk_widget_show (separator);
1984 hbox = gtk_hbox_new (FALSE, 10);
1985 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1986 gtk_widget_show (hbox);
1988 separator = gtk_hseparator_new ();
1989 gtk_container_add (GTK_CONTAINER (vbox), separator);
1990 gtk_widget_show (separator);
1992 label = gtk_label_new ("Below");
1993 gtk_container_add (GTK_CONTAINER (vbox), label);
1994 gtk_widget_show (label);
1996 handle_box = gtk_handle_box_new ();
1997 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1998 g_signal_connect (handle_box,
2000 G_CALLBACK (handle_box_child_signal),
2002 g_signal_connect (handle_box,
2004 G_CALLBACK (handle_box_child_signal),
2006 gtk_widget_show (handle_box);
2008 toolbar = make_toolbar (window);
2010 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2011 gtk_widget_show (toolbar);
2013 handle_box = gtk_handle_box_new ();
2014 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2015 g_signal_connect (handle_box,
2017 G_CALLBACK (handle_box_child_signal),
2019 g_signal_connect (handle_box,
2021 G_CALLBACK (handle_box_child_signal),
2023 gtk_widget_show (handle_box);
2025 handle_box2 = gtk_handle_box_new ();
2026 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2027 g_signal_connect (handle_box2,
2029 G_CALLBACK (handle_box_child_signal),
2031 g_signal_connect (handle_box2,
2033 G_CALLBACK (handle_box_child_signal),
2035 gtk_widget_show (handle_box2);
2037 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
2038 label = gtk_label_new ("Fooo!");
2039 gtk_container_add (GTK_CONTAINER (hbox), label);
2040 gtk_widget_show (label);
2041 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
2044 if (!gtk_widget_get_visible (window))
2045 gtk_widget_show (window);
2047 gtk_widget_destroy (window);
2051 * Test for getting an image from a drawable
2062 take_snapshot (GtkWidget *button,
2065 struct GetImageData *gid = data;
2066 GdkRectangle visible;
2068 int height_fraction;
2071 GdkColor color = { 0, 30000, 0, 0 };
2072 GdkRectangle target;
2075 /* Do some begin_paint_rect on some random rects, draw some
2076 * distinctive stuff into those rects, then take the snapshot.
2077 * figure out whether any rects were overlapped and report to
2081 visible = gid->sw->allocation;
2083 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2084 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2086 width_fraction = visible.width / 4;
2087 height_fraction = visible.height / 4;
2089 gc = gdk_gc_new (gid->src->window);
2090 black_gc = gid->src->style->black_gc;
2092 gdk_gc_set_rgb_fg_color (gc, &color);
2095 target.x = visible.x + width_fraction;
2096 target.y = visible.y + height_fraction * 3;
2097 target.width = width_fraction;
2098 target.height = height_fraction / 2;
2100 gdk_window_begin_paint_rect (gid->src->window,
2103 gdk_draw_rectangle (gid->src->window,
2107 target.width, target.height);
2109 gdk_draw_rectangle (gid->src->window,
2112 target.x + 10, target.y + 10,
2113 target.width - 20, target.height - 20);
2115 target.x = visible.x + width_fraction;
2116 target.y = visible.y + height_fraction;
2117 target.width = width_fraction;
2118 target.height = height_fraction;
2120 gdk_window_begin_paint_rect (gid->src->window,
2123 gdk_draw_rectangle (gid->src->window,
2127 target.width, target.height);
2129 gdk_draw_rectangle (gid->src->window,
2132 target.x + 10, target.y + 10,
2133 target.width - 20, target.height - 20);
2135 target.x = visible.x + width_fraction * 3;
2136 target.y = visible.y + height_fraction;
2137 target.width = width_fraction / 2;
2138 target.height = height_fraction;
2140 gdk_window_begin_paint_rect (gid->src->window,
2143 gdk_draw_rectangle (gid->src->window,
2147 target.width, target.height);
2149 gdk_draw_rectangle (gid->src->window,
2152 target.x + 10, target.y + 10,
2153 target.width - 20, target.height - 20);
2155 target.x = visible.x + width_fraction * 2;
2156 target.y = visible.y + height_fraction * 2;
2157 target.width = width_fraction / 4;
2158 target.height = height_fraction / 4;
2160 gdk_window_begin_paint_rect (gid->src->window,
2163 gdk_draw_rectangle (gid->src->window,
2167 target.width, target.height);
2169 gdk_draw_rectangle (gid->src->window,
2172 target.x + 10, target.y + 10,
2173 target.width - 20, target.height - 20);
2175 target.x += target.width / 2;
2176 target.y += target.width / 2;
2178 gdk_window_begin_paint_rect (gid->src->window,
2181 gdk_draw_rectangle (gid->src->window,
2185 target.width, target.height);
2187 gdk_draw_rectangle (gid->src->window,
2190 target.x + 10, target.y + 10,
2191 target.width - 20, target.height - 20);
2193 /* Screen shot area */
2195 target.x = visible.x + width_fraction * 1.5;
2196 target.y = visible.y + height_fraction * 1.5;
2197 target.width = width_fraction * 2;
2198 target.height = height_fraction * 2;
2200 shot = gdk_pixbuf_get_from_drawable (NULL,
2205 target.width, target.height);
2206 gtk_image_set_from_pixbuf (GTK_IMAGE (gid->snap), shot);
2208 g_object_unref (shot);
2210 gdk_window_end_paint (gid->src->window);
2211 gdk_window_end_paint (gid->src->window);
2212 gdk_window_end_paint (gid->src->window);
2213 gdk_window_end_paint (gid->src->window);
2214 gdk_window_end_paint (gid->src->window);
2216 gdk_draw_rectangle (gid->src->window,
2217 gid->src->style->black_gc,
2220 target.width, target.height);
2222 g_object_unref (gc);
2226 image_source_expose (GtkWidget *da,
2227 GdkEventExpose *event,
2230 int x = event->area.x;
2231 GdkColor red = { 0, 65535, 0, 0 };
2232 GdkColor green = { 0, 0, 65535, 0 };
2233 GdkColor blue = { 0, 0, 0, 65535 };
2236 gc = gdk_gc_new (event->window);
2238 while (x < (event->area.x + event->area.width))
2245 gdk_gc_set_rgb_fg_color (gc, &red);
2251 gdk_gc_set_rgb_fg_color (gc, &green);
2257 gdk_gc_set_rgb_fg_color (gc, &blue);
2261 g_assert_not_reached ();
2265 gdk_draw_line (event->window,
2268 x, event->area.y + event->area.height);
2273 g_object_unref (gc);
2279 create_get_image (GtkWidget *widget)
2281 static GtkWidget *window = NULL;
2284 gtk_widget_destroy (window);
2293 struct GetImageData *gid;
2295 gid = g_new (struct GetImageData, 1);
2297 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2299 gtk_window_set_screen (GTK_WINDOW (window),
2300 gtk_widget_get_screen (widget));
2302 g_signal_connect (window,
2304 G_CALLBACK (gtk_widget_destroyed),
2307 g_object_set_data_full (G_OBJECT (window),
2308 "testgtk-get-image-data",
2312 hbox = gtk_hbox_new (FALSE, 0);
2314 gtk_container_add (GTK_CONTAINER (window), hbox);
2316 sw = gtk_scrolled_window_new (NULL, NULL);
2317 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2318 GTK_POLICY_AUTOMATIC,
2319 GTK_POLICY_AUTOMATIC);
2323 gtk_widget_set_size_request (sw, 400, 400);
2325 src = gtk_drawing_area_new ();
2326 gtk_widget_set_size_request (src, 10000, 10000);
2328 g_signal_connect (src,
2330 G_CALLBACK (image_source_expose),
2335 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2338 gtk_box_pack_start (GTK_BOX (hbox),
2342 vbox = gtk_vbox_new (FALSE, 3);
2344 snap = g_object_new (GTK_TYPE_IMAGE, NULL);
2348 sw = gtk_scrolled_window_new (NULL, NULL);
2349 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2350 GTK_POLICY_AUTOMATIC,
2351 GTK_POLICY_AUTOMATIC);
2352 gtk_widget_set_size_request (sw, 300, 300);
2354 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2356 gtk_box_pack_end (GTK_BOX (vbox), sw, FALSE, FALSE, 5);
2358 button = gtk_button_new_with_label ("Get image from drawable");
2360 g_signal_connect (button,
2362 G_CALLBACK (take_snapshot),
2365 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2367 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2369 gtk_widget_show_all (window);
2377 sensitivity_toggled (GtkWidget *toggle,
2380 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2384 create_sensitivity_control (GtkWidget *widget)
2388 button = gtk_toggle_button_new_with_label ("Sensitive");
2390 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2391 gtk_widget_is_sensitive (widget));
2393 g_signal_connect (button,
2395 G_CALLBACK (sensitivity_toggled),
2398 gtk_widget_show_all (button);
2404 set_selectable_recursive (GtkWidget *widget,
2407 if (GTK_IS_CONTAINER (widget))
2412 children = gtk_container_get_children (GTK_CONTAINER (widget));
2416 set_selectable_recursive (tmp->data, setting);
2420 g_list_free (children);
2422 else if (GTK_IS_LABEL (widget))
2424 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2429 selectable_toggled (GtkWidget *toggle,
2432 set_selectable_recursive (widget,
2433 GTK_TOGGLE_BUTTON (toggle)->active);
2437 create_selectable_control (GtkWidget *widget)
2441 button = gtk_toggle_button_new_with_label ("Selectable");
2443 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2446 g_signal_connect (button,
2448 G_CALLBACK (selectable_toggled),
2451 gtk_widget_show_all (button);
2457 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
2461 gtk_widget_destroy (dialog);
2463 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2464 "as hyperlinks, which can be clicked\n"
2465 "or activated via <a href=\"keynav\">keynav</a>.\n"
2466 "The links remain the same.";
2467 gtk_label_set_markup (label, text);
2471 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
2473 if (g_strcmp0 (uri, "keynav") == 0)
2477 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
2478 GTK_DIALOG_DESTROY_WITH_PARENT,
2481 "The term <i>keynav</i> is a shorthand for "
2482 "keyboard navigation and refers to the process of using a program "
2483 "(exclusively) via keyboard input.");
2485 gtk_window_present (GTK_WINDOW (dialog));
2487 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
2495 void create_labels (GtkWidget *widget)
2497 static GtkWidget *window = NULL;
2506 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2508 gtk_window_set_screen (GTK_WINDOW (window),
2509 gtk_widget_get_screen (widget));
2511 g_signal_connect (window, "destroy",
2512 G_CALLBACK (gtk_widget_destroyed),
2515 gtk_window_set_title (GTK_WINDOW (window), "Label");
2517 vbox = gtk_vbox_new (FALSE, 5);
2519 hbox = gtk_hbox_new (FALSE, 5);
2520 gtk_container_add (GTK_CONTAINER (window), vbox);
2522 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2524 button = create_sensitivity_control (hbox);
2526 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2528 button = create_selectable_control (hbox);
2530 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2532 vbox = gtk_vbox_new (FALSE, 5);
2534 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2535 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2537 frame = gtk_frame_new ("Normal Label");
2538 label = gtk_label_new ("This is a Normal label");
2539 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2540 gtk_container_add (GTK_CONTAINER (frame), label);
2541 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2543 frame = gtk_frame_new ("Multi-line Label");
2544 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2545 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
2546 gtk_container_add (GTK_CONTAINER (frame), label);
2547 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2549 frame = gtk_frame_new ("Left Justified Label");
2550 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2551 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
2552 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2553 gtk_container_add (GTK_CONTAINER (frame), label);
2554 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2556 frame = gtk_frame_new ("Right Justified Label");
2557 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2558 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2559 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2560 gtk_container_add (GTK_CONTAINER (frame), label);
2561 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2563 frame = gtk_frame_new ("Internationalized Label");
2564 label = gtk_label_new (NULL);
2565 gtk_label_set_markup (GTK_LABEL (label),
2566 "French (Fran\303\247ais) Bonjour, Salut\n"
2567 "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"
2568 "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"
2569 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2570 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2571 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2572 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2573 gtk_container_add (GTK_CONTAINER (frame), label);
2574 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2576 frame = gtk_frame_new ("Bidirection Label");
2577 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"
2578 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
2579 gtk_container_add (GTK_CONTAINER (frame), label);
2580 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2582 frame = gtk_frame_new ("Links in a label");
2583 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2584 "as hyperlinks, which can be clicked\n"
2585 "or activated via <a href=\"keynav\">keynav</a>");
2586 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
2587 gtk_container_add (GTK_CONTAINER (frame), label);
2588 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2589 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
2591 vbox = gtk_vbox_new (FALSE, 5);
2592 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2593 frame = gtk_frame_new ("Line wrapped label");
2594 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2595 "up the entire "/* big space to test spacing */\
2596 "width allocated to it, but automatically wraps the words to fit. "\
2597 "The time has come, for all good men, to come to the aid of their party. "\
2598 "The sixth sheik's six sheep's sick.\n"\
2599 " It supports multiple paragraphs correctly, and correctly adds "\
2600 "many extra spaces. ");
2602 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2603 gtk_container_add (GTK_CONTAINER (frame), label);
2604 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2606 frame = gtk_frame_new ("Filled, wrapped label");
2607 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2608 "up the entire width allocated to it. Here is a seneance to prove "\
2609 "my point. Here is another sentence. "\
2610 "Here comes the sun, do de do de do.\n"\
2611 " This is a new paragraph.\n"\
2612 " This is another newer, longer, better paragraph. It is coming to an end, "\
2614 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2615 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2616 gtk_container_add (GTK_CONTAINER (frame), label);
2617 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2619 frame = gtk_frame_new ("Underlined label");
2620 label = gtk_label_new ("This label is underlined!\n"
2621 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2622 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2623 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2624 gtk_container_add (GTK_CONTAINER (frame), label);
2625 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2627 frame = gtk_frame_new ("Markup label");
2628 label = gtk_label_new (NULL);
2630 /* There's also a gtk_label_set_markup() without accel if you
2631 * don't have an accelerator key
2633 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2634 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2635 "<b>markup</b> _such as "
2636 "<big><i>Big Italics</i></big>\n"
2637 "<tt>Monospace font</tt>\n"
2638 "<u>Underline!</u>\n"
2640 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2641 "and nothing on this line,\n"
2644 "or even on this one\n"
2645 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2646 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2647 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2649 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2651 gtk_container_add (GTK_CONTAINER (frame), label);
2652 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2655 if (!gtk_widget_get_visible (window))
2656 gtk_widget_show_all (window);
2658 gtk_widget_destroy (window);
2662 on_angle_scale_changed (GtkRange *range,
2665 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2669 create_rotated_label (GtkWidget *widget)
2671 static GtkWidget *window = NULL;
2672 GtkWidget *content_area;
2676 GtkWidget *scale_label;
2677 GtkWidget *scale_hbox;
2681 window = gtk_dialog_new_with_buttons ("Rotated Label",
2682 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2683 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2686 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2688 gtk_window_set_screen (GTK_WINDOW (window),
2689 gtk_widget_get_screen (widget));
2691 g_signal_connect (window, "response",
2692 G_CALLBACK (gtk_object_destroy), NULL);
2693 g_signal_connect (window, "destroy",
2694 G_CALLBACK (gtk_widget_destroyed), &window);
2696 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2698 vbox = gtk_vbox_new (FALSE, 5);
2699 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2700 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2702 label = gtk_label_new (NULL);
2703 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2704 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2706 scale_hbox = gtk_hbox_new (FALSE, 0);
2707 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2709 scale_label = gtk_label_new (NULL);
2710 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2711 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2713 hscale = gtk_hscale_new_with_range (0, 360, 5);
2714 g_signal_connect (hscale, "value-changed",
2715 G_CALLBACK (on_angle_scale_changed), label);
2717 gtk_range_set_value (GTK_RANGE (hscale), 45);
2718 gtk_widget_set_size_request (hscale, 200, -1);
2719 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2722 if (!gtk_widget_get_visible (window))
2723 gtk_widget_show_all (window);
2725 gtk_widget_destroy (window);
2728 #define DEFAULT_TEXT_RADIUS 200
2731 on_rotated_text_unrealize (GtkWidget *widget)
2733 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2737 on_rotated_text_expose (GtkWidget *widget,
2738 GdkEventExpose *event,
2739 GdkPixbuf *tile_pixbuf)
2741 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2742 "had", "10,000", "men" };
2743 PangoRenderer *renderer;
2748 PangoMatrix matrix = PANGO_MATRIX_INIT;
2749 PangoLayout *layout;
2750 PangoContext *context;
2751 PangoFontDescription *desc;
2753 gc = g_object_get_data (G_OBJECT (widget), "text-gc");
2756 static GdkColor black = { 0, 0, 0, 0 };
2758 gc = gdk_gc_new (widget->window);
2759 gdk_gc_set_rgb_fg_color (gc, &black);
2766 gint width = gdk_pixbuf_get_width (tile_pixbuf);
2767 gint height = gdk_pixbuf_get_height (tile_pixbuf);
2769 tile = gdk_pixmap_new (widget->window, width, height, -1);
2771 cr = gdk_cairo_create (tile);
2772 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2776 gdk_gc_set_tile (gc, tile);
2777 gdk_gc_set_fill (gc, GDK_TILED);
2779 g_object_unref (tile);
2782 g_object_set_data_full (G_OBJECT (widget), "text-gc", gc, (GDestroyNotify)g_object_unref);
2785 renderer = gdk_pango_renderer_get_default (gtk_widget_get_screen (widget));
2786 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), widget->window);
2787 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), gc);
2789 radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
2791 pango_matrix_translate (&matrix,
2792 radius + (widget->allocation.width - 2 * radius) / 2,
2793 radius + (widget->allocation.height - 2 * radius) / 2);
2794 pango_matrix_scale (&matrix, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2796 context = gtk_widget_get_pango_context (widget);
2797 layout = pango_layout_new (context);
2798 desc = pango_font_description_from_string ("Sans Bold 30");
2799 pango_layout_set_font_description (layout, desc);
2800 pango_font_description_free (desc);
2802 n_words = G_N_ELEMENTS (words);
2803 for (i = 0; i < n_words; i++)
2805 PangoMatrix rotated_matrix = matrix;
2808 pango_matrix_rotate (&rotated_matrix, - (360. * i) / n_words);
2810 pango_context_set_matrix (context, &rotated_matrix);
2811 pango_layout_context_changed (layout);
2812 pango_layout_set_text (layout, words[i], -1);
2814 pango_layout_get_size (layout, &width, &height);
2816 pango_renderer_draw_layout (renderer, layout,
2817 - width / 2, - DEFAULT_TEXT_RADIUS * PANGO_SCALE);
2820 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL);
2821 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL);
2823 g_object_unref (layout);
2829 create_rotated_text (GtkWidget *widget)
2831 static GtkWidget *window = NULL;
2835 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
2836 GtkRequisition requisition;
2837 GtkWidget *content_area;
2838 GtkWidget *drawing_area;
2839 GdkPixbuf *tile_pixbuf;
2841 window = gtk_dialog_new_with_buttons ("Rotated Text",
2842 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2843 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2846 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2848 gtk_window_set_screen (GTK_WINDOW (window),
2849 gtk_widget_get_screen (widget));
2851 g_signal_connect (window, "response",
2852 G_CALLBACK (gtk_object_destroy), NULL);
2853 g_signal_connect (window, "destroy",
2854 G_CALLBACK (gtk_widget_destroyed), &window);
2856 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2858 drawing_area = gtk_drawing_area_new ();
2859 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2860 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
2862 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2864 g_signal_connect (drawing_area, "expose-event",
2865 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
2866 g_signal_connect (drawing_area, "unrealize",
2867 G_CALLBACK (on_rotated_text_unrealize), NULL);
2869 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2871 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2872 gtk_widget_size_request (window, &requisition);
2873 gtk_widget_set_size_request (drawing_area, -1, -1);
2874 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2877 if (!gtk_widget_get_visible (window))
2878 gtk_widget_show (window);
2880 gtk_widget_destroy (window);
2888 reparent_label (GtkWidget *widget,
2889 GtkWidget *new_parent)
2893 label = g_object_get_data (G_OBJECT (widget), "user_data");
2895 gtk_widget_reparent (label, new_parent);
2899 set_parent_signal (GtkWidget *child,
2900 GtkWidget *old_parent,
2903 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2904 g_type_name (G_OBJECT_TYPE (child)),
2905 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
2906 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2907 GPOINTER_TO_INT (func_data));
2911 create_reparent (GtkWidget *widget)
2913 static GtkWidget *window = NULL;
2920 GtkWidget *separator;
2921 GtkWidget *event_box;
2925 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2927 gtk_window_set_screen (GTK_WINDOW (window),
2928 gtk_widget_get_screen (widget));
2930 g_signal_connect (window, "destroy",
2931 G_CALLBACK (gtk_widget_destroyed),
2934 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2935 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2937 box1 = gtk_vbox_new (FALSE, 0);
2938 gtk_container_add (GTK_CONTAINER (window), box1);
2940 box2 = gtk_hbox_new (FALSE, 5);
2941 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2942 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2944 label = gtk_label_new ("Hello World");
2946 frame = gtk_frame_new ("Frame 1");
2947 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2949 box3 = gtk_vbox_new (FALSE, 5);
2950 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2951 gtk_container_add (GTK_CONTAINER (frame), box3);
2953 button = gtk_button_new_with_label ("switch");
2954 g_object_set_data (G_OBJECT (button), "user_data", label);
2955 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2957 event_box = gtk_event_box_new ();
2958 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2959 gtk_container_add (GTK_CONTAINER (event_box), label);
2961 g_signal_connect (button, "clicked",
2962 G_CALLBACK (reparent_label),
2965 g_signal_connect (label, "parent_set",
2966 G_CALLBACK (set_parent_signal),
2967 GINT_TO_POINTER (42));
2969 frame = gtk_frame_new ("Frame 2");
2970 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2972 box3 = gtk_vbox_new (FALSE, 5);
2973 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2974 gtk_container_add (GTK_CONTAINER (frame), box3);
2976 button = gtk_button_new_with_label ("switch");
2977 g_object_set_data (G_OBJECT (button), "user_data", label);
2978 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2980 event_box = gtk_event_box_new ();
2981 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2983 g_signal_connect (button, "clicked",
2984 G_CALLBACK (reparent_label),
2987 separator = gtk_hseparator_new ();
2988 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2990 box2 = gtk_vbox_new (FALSE, 10);
2991 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2992 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2994 button = gtk_button_new_with_label ("close");
2995 g_signal_connect_swapped (button, "clicked",
2996 G_CALLBACK (gtk_widget_destroy), window);
2997 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2998 gtk_widget_set_can_default (button, TRUE);
2999 gtk_widget_grab_default (button);
3002 if (!gtk_widget_get_visible (window))
3003 gtk_widget_show_all (window);
3005 gtk_widget_destroy (window);
3012 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
3014 if (event->type == GDK_BUTTON_PRESS)
3016 if (event->button == 1)
3017 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
3018 event->button, event->x_root, event->y_root,
3020 else if (event->button == 2)
3021 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
3022 event->button, event->x_root, event->y_root,
3029 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
3031 gtk_paint_resize_grip (area->style,
3033 gtk_widget_get_state (area),
3039 area->allocation.width,
3040 area->allocation.height);
3046 create_resize_grips (GtkWidget *widget)
3048 static GtkWidget *window = NULL;
3050 GtkWidget *hbox, *vbox;
3053 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3055 gtk_window_set_screen (GTK_WINDOW (window),
3056 gtk_widget_get_screen (widget));
3058 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
3060 g_signal_connect (window, "destroy",
3061 G_CALLBACK (gtk_widget_destroyed),
3064 vbox = gtk_vbox_new (FALSE, 0);
3065 gtk_container_add (GTK_CONTAINER (window), vbox);
3067 hbox = gtk_hbox_new (FALSE, 0);
3068 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3071 area = gtk_drawing_area_new ();
3072 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3073 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3074 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3075 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3076 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3077 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3080 area = gtk_drawing_area_new ();
3081 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3082 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3083 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3084 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3085 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3086 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3089 area = gtk_drawing_area_new ();
3090 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3091 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3092 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3093 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3094 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3095 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3097 hbox = gtk_hbox_new (FALSE, 0);
3098 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3101 area = gtk_drawing_area_new ();
3102 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3103 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3104 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3105 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3106 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3107 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3110 area = gtk_drawing_area_new ();
3111 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3114 area = gtk_drawing_area_new ();
3115 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3116 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3117 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3118 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3119 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3120 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3123 hbox = gtk_hbox_new (FALSE, 0);
3124 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3127 area = gtk_drawing_area_new ();
3128 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3129 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3130 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3131 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3132 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3133 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3135 area = gtk_drawing_area_new ();
3136 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3137 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3138 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3139 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3140 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3141 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3144 area = gtk_drawing_area_new ();
3145 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3146 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3147 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3148 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3149 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3150 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3153 if (!gtk_widget_get_visible (window))
3154 gtk_widget_show_all (window);
3156 gtk_widget_destroy (window);
3162 gint upositionx = 0;
3163 gint upositiony = 0;
3166 uposition_configure (GtkWidget *window)
3172 lx = g_object_get_data (G_OBJECT (window), "x");
3173 ly = g_object_get_data (G_OBJECT (window), "y");
3175 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
3176 sprintf (buffer, "%d", upositionx);
3177 gtk_label_set_text (lx, buffer);
3178 sprintf (buffer, "%d", upositiony);
3179 gtk_label_set_text (ly, buffer);
3185 uposition_stop_configure (GtkToggleButton *toggle,
3189 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
3191 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
3195 create_saved_position (GtkWidget *widget)
3197 static GtkWidget *window = NULL;
3202 GtkWidget *main_vbox;
3210 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
3211 "type", GTK_WINDOW_TOPLEVEL,
3212 "title", "Saved Position",
3214 "signal::configure_event", uposition_configure, NULL,
3217 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3219 gtk_window_set_screen (GTK_WINDOW (window),
3220 gtk_widget_get_screen (widget));
3223 g_signal_connect (window, "destroy",
3224 G_CALLBACK (gtk_widget_destroyed),
3227 main_vbox = gtk_vbox_new (FALSE, 5);
3228 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3229 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3232 g_object_new (gtk_vbox_get_type (),
3233 "GtkBox::homogeneous", FALSE,
3234 "GtkBox::spacing", 5,
3235 "GtkContainer::border_width", 10,
3236 "GtkWidget::parent", main_vbox,
3237 "GtkWidget::visible", TRUE,
3238 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
3239 "label", "Stop Events",
3243 "signal::clicked", uposition_stop_configure, window,
3247 hbox = gtk_hbox_new (FALSE, 0);
3248 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3249 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3251 label = gtk_label_new ("X Origin : ");
3252 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3253 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3255 x_label = gtk_label_new ("");
3256 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3257 g_object_set_data (G_OBJECT (window), "x", x_label);
3259 hbox = gtk_hbox_new (FALSE, 0);
3260 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3261 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3263 label = gtk_label_new ("Y Origin : ");
3264 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3265 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3267 y_label = gtk_label_new ("");
3268 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3269 g_object_set_data (G_OBJECT (window), "y", y_label);
3272 g_object_new (gtk_hseparator_get_type (),
3273 "GtkWidget::visible", TRUE,
3275 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3277 hbox = gtk_hbox_new (FALSE, 0);
3278 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3279 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3281 button = gtk_button_new_with_label ("Close");
3282 g_signal_connect_swapped (button, "clicked",
3283 G_CALLBACK (gtk_widget_destroy),
3285 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3286 gtk_widget_set_can_default (button, TRUE);
3287 gtk_widget_grab_default (button);
3289 gtk_widget_show_all (window);
3292 gtk_widget_destroy (window);
3300 create_pixmap (GtkWidget *widget)
3302 static GtkWidget *window = NULL;
3308 GtkWidget *separator;
3309 GtkWidget *pixmapwid;
3313 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3315 gtk_window_set_screen (GTK_WINDOW (window),
3316 gtk_widget_get_screen (widget));
3318 g_signal_connect (window, "destroy",
3319 G_CALLBACK (gtk_widget_destroyed),
3322 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3323 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3324 gtk_widget_realize(window);
3326 box1 = gtk_vbox_new (FALSE, 0);
3327 gtk_container_add (GTK_CONTAINER (window), box1);
3329 box2 = gtk_vbox_new (FALSE, 10);
3330 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3331 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3333 button = gtk_button_new ();
3334 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3336 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3338 label = gtk_label_new ("Pixmap\ntest");
3339 box3 = gtk_hbox_new (FALSE, 0);
3340 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3341 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3342 gtk_container_add (GTK_CONTAINER (box3), label);
3343 gtk_container_add (GTK_CONTAINER (button), box3);
3345 button = gtk_button_new ();
3346 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3348 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3350 label = gtk_label_new ("Pixmap\ntest");
3351 box3 = gtk_hbox_new (FALSE, 0);
3352 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3353 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3354 gtk_container_add (GTK_CONTAINER (box3), label);
3355 gtk_container_add (GTK_CONTAINER (button), box3);
3357 gtk_widget_set_sensitive (button, FALSE);
3359 separator = gtk_hseparator_new ();
3360 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3362 box2 = gtk_vbox_new (FALSE, 10);
3363 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3364 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3366 button = gtk_button_new_with_label ("close");
3367 g_signal_connect_swapped (button, "clicked",
3368 G_CALLBACK (gtk_widget_destroy),
3370 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3371 gtk_widget_set_can_default (button, TRUE);
3372 gtk_widget_grab_default (button);
3375 if (!gtk_widget_get_visible (window))
3376 gtk_widget_show_all (window);
3378 gtk_widget_destroy (window);
3382 create_tooltips (GtkWidget *widget)
3384 static GtkWidget *window = NULL;
3391 GtkWidget *separator;
3396 g_object_new (gtk_window_get_type (),
3397 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3398 "GtkContainer::border_width", 0,
3399 "GtkWindow::title", "Tooltips",
3400 "GtkWindow::allow_shrink", TRUE,
3401 "GtkWindow::allow_grow", FALSE,
3404 gtk_window_set_screen (GTK_WINDOW (window),
3405 gtk_widget_get_screen (widget));
3407 box1 = gtk_vbox_new (FALSE, 0);
3408 gtk_container_add (GTK_CONTAINER (window), box1);
3410 box2 = gtk_vbox_new (FALSE, 10);
3411 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3412 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3414 button = gtk_toggle_button_new_with_label ("button1");
3415 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3417 gtk_widget_set_tooltip_text (button, "This is button 1");
3419 button = gtk_toggle_button_new_with_label ("button2");
3420 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3422 gtk_widget_set_tooltip_text (button,
3423 "This is button 2. This is also a really long tooltip which probably "
3424 "won't fit on a single line and will therefore need to be wrapped. "
3425 "Hopefully the wrapping will work correctly.");
3427 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3428 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3430 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
3433 g_object_new (gtk_vbox_get_type (),
3434 "homogeneous", FALSE,
3441 g_object_new (gtk_button_get_type (),
3446 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3447 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
3449 frame = g_object_new (gtk_frame_get_type (),
3450 "label", "ToolTips Inspector",
3451 "label_xalign", (double) 0.5,
3457 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3459 separator = gtk_hseparator_new ();
3460 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3462 box2 = gtk_vbox_new (FALSE, 10);
3463 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3464 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3466 button = gtk_button_new_with_label ("close");
3467 g_signal_connect_swapped (button, "clicked",
3468 G_CALLBACK (gtk_widget_destroy),
3470 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3471 gtk_widget_set_can_default (button, TRUE);
3472 gtk_widget_grab_default (button);
3474 gtk_widget_set_tooltip_text (button, "Push this button to close window");
3477 if (!gtk_widget_get_visible (window))
3478 gtk_widget_show_all (window);
3480 gtk_widget_destroy (window);
3488 pack_image (GtkWidget *box,
3492 gtk_box_pack_start (GTK_BOX (box),
3493 gtk_label_new (text),
3496 gtk_box_pack_start (GTK_BOX (box),
3502 create_image (GtkWidget *widget)
3504 static GtkWidget *window = NULL;
3512 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3514 gtk_window_set_screen (GTK_WINDOW (window),
3515 gtk_widget_get_screen (widget));
3517 /* this is bogus for testing drawing when allocation < request,
3518 * don't copy into real code
3520 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
3522 g_signal_connect (window, "destroy",
3523 G_CALLBACK (gtk_widget_destroyed),
3526 vbox = gtk_vbox_new (FALSE, 5);
3528 gtk_container_add (GTK_CONTAINER (window), vbox);
3530 pack_image (vbox, "Stock Warning Dialog",
3531 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3532 GTK_ICON_SIZE_DIALOG));
3534 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
3535 gtk_widget_get_colormap (window),
3540 pack_image (vbox, "Pixmap",
3541 gtk_image_new_from_pixmap (pixmap, mask));
3544 if (!gtk_widget_get_visible (window))
3545 gtk_widget_show_all (window);
3547 gtk_widget_destroy (window);
3555 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3558 GtkWidget *menuitem;
3567 menu = gtk_menu_new ();
3568 gtk_menu_set_screen (GTK_MENU (menu), screen);
3574 menuitem = gtk_tearoff_menu_item_new ();
3575 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3576 gtk_widget_show (menuitem);
3579 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3580 GTK_ICON_SIZE_MENU);
3581 gtk_widget_show (image);
3582 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3583 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3584 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3585 gtk_widget_show (menuitem);
3587 for (i = 0, j = 1; i < length; i++, j++)
3589 sprintf (buf, "item %2d - %d", depth, j);
3591 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3592 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3594 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3595 gtk_widget_show (menuitem);
3597 gtk_widget_set_sensitive (menuitem, FALSE);
3600 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3604 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3605 create_menu (screen, depth - 1, 5, TRUE));
3612 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3615 GtkWidget *menuitem;
3621 menu = gtk_menu_new ();
3622 gtk_menu_set_screen (GTK_MENU (menu), screen);
3627 menuitem = gtk_tearoff_menu_item_new ();
3628 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3629 gtk_widget_show (menuitem);
3633 menuitem = gtk_menu_item_new_with_label ("items");
3634 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3636 submenu = gtk_menu_new ();
3637 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3638 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3639 gtk_widget_show (menuitem);
3642 /* now fill the items submenu */
3643 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3644 GTK_ICON_SIZE_MENU);
3645 gtk_widget_show (image);
3646 menuitem = gtk_image_menu_item_new_with_label ("Image");
3647 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3648 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3649 gtk_widget_show (menuitem);
3651 menuitem = gtk_menu_item_new_with_label ("x");
3652 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3653 gtk_widget_show (menuitem);
3655 menuitem = gtk_menu_item_new_with_label ("x");
3656 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3657 gtk_widget_show (menuitem);
3659 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3660 GTK_ICON_SIZE_MENU);
3661 gtk_widget_show (image);
3662 menuitem = gtk_image_menu_item_new_with_label ("Image");
3663 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3664 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3665 gtk_widget_show (menuitem);
3667 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3668 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3669 gtk_widget_show (menuitem);
3671 menuitem = gtk_menu_item_new_with_label ("x");
3672 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3673 gtk_widget_show (menuitem);
3675 menuitem = gtk_menu_item_new_with_label ("x");
3676 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3677 gtk_widget_show (menuitem);
3679 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3680 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3681 gtk_widget_show (menuitem);
3683 menuitem = gtk_check_menu_item_new_with_label ("Check");
3684 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3685 gtk_widget_show (menuitem);
3687 menuitem = gtk_menu_item_new_with_label ("x");
3688 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3689 gtk_widget_show (menuitem);
3691 menuitem = gtk_menu_item_new_with_label ("x");
3692 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3693 gtk_widget_show (menuitem);
3695 menuitem = gtk_check_menu_item_new_with_label ("Check");
3696 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3697 gtk_widget_show (menuitem);
3699 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3700 gtk_widget_show (menuitem);
3701 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3703 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3704 gtk_widget_show (menuitem);
3705 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3707 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3708 gtk_widget_show (menuitem);
3709 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3711 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3712 gtk_widget_show (menuitem);
3713 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3715 /* end of items submenu */
3717 menuitem = gtk_menu_item_new_with_label ("spanning");
3718 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3720 submenu = gtk_menu_new ();
3721 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3722 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3723 gtk_widget_show (menuitem);
3726 /* now fill the spanning submenu */
3727 menuitem = gtk_menu_item_new_with_label ("a");
3728 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3729 gtk_widget_show (menuitem);
3731 menuitem = gtk_menu_item_new_with_label ("b");
3732 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3733 gtk_widget_show (menuitem);
3735 menuitem = gtk_menu_item_new_with_label ("c");
3736 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3737 gtk_widget_show (menuitem);
3739 menuitem = gtk_menu_item_new_with_label ("d");
3740 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3741 gtk_widget_show (menuitem);
3743 menuitem = gtk_menu_item_new_with_label ("e");
3744 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3745 gtk_widget_show (menuitem);
3746 /* end of spanning submenu */
3748 menuitem = gtk_menu_item_new_with_label ("left");
3749 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3750 submenu = gtk_menu_new ();
3751 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3752 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3753 gtk_widget_show (menuitem);
3755 menuitem = gtk_menu_item_new_with_label ("Empty");
3756 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3757 submenu = gtk_menu_new ();
3758 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3759 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3760 gtk_widget_show (menuitem);
3762 menuitem = gtk_menu_item_new_with_label ("right");
3763 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3764 submenu = gtk_menu_new ();
3765 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3766 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3767 gtk_widget_show (menuitem);
3769 menuitem = gtk_menu_item_new_with_label ("Empty");
3770 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3771 gtk_widget_show (menuitem);
3775 for (; j < rows; j++)
3776 for (i = 0; i < cols; i++)
3778 sprintf (buf, "(%d %d)", i, j);
3779 menuitem = gtk_menu_item_new_with_label (buf);
3780 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3781 gtk_widget_show (menuitem);
3784 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3785 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3786 gtk_widget_show (menuitem);
3787 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3788 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3789 gtk_widget_show (menuitem);
3790 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3791 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3792 gtk_widget_show (menuitem);
3793 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3794 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3795 gtk_widget_show (menuitem);
3801 create_menus (GtkWidget *widget)
3803 static GtkWidget *window = NULL;
3807 GtkWidget *optionmenu;
3808 GtkWidget *separator;
3814 GtkWidget *menuitem;
3815 GtkAccelGroup *accel_group;
3817 GdkScreen *screen = gtk_widget_get_screen (widget);
3819 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3821 gtk_window_set_screen (GTK_WINDOW (window), screen);
3823 g_signal_connect (window, "destroy",
3824 G_CALLBACK (gtk_widget_destroyed),
3826 g_signal_connect (window, "delete-event",
3827 G_CALLBACK (gtk_true),
3830 accel_group = gtk_accel_group_new ();
3831 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3833 gtk_window_set_title (GTK_WINDOW (window), "menus");
3834 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3837 box1 = gtk_vbox_new (FALSE, 0);
3838 gtk_container_add (GTK_CONTAINER (window), box1);
3839 gtk_widget_show (box1);
3841 menubar = gtk_menu_bar_new ();
3842 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3843 gtk_widget_show (menubar);
3845 menu = create_menu (screen, 2, 50, TRUE);
3847 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3848 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3849 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3850 gtk_widget_show (menuitem);
3852 menu = create_table_menu (screen, 2, 50, TRUE);
3854 menuitem = gtk_menu_item_new_with_label ("table");
3855 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3856 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3857 gtk_widget_show (menuitem);
3859 menuitem = gtk_menu_item_new_with_label ("foo");
3860 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3861 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3862 gtk_widget_show (menuitem);
3864 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3865 GTK_ICON_SIZE_MENU);
3866 gtk_widget_show (image);
3867 menuitem = gtk_image_menu_item_new_with_label ("Help");
3868 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3869 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3870 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3871 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3872 gtk_widget_show (menuitem);
3874 menubar = gtk_menu_bar_new ();
3875 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3876 gtk_widget_show (menubar);
3878 menu = create_menu (screen, 2, 10, TRUE);
3880 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3881 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3882 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3883 gtk_widget_show (menuitem);
3885 box2 = gtk_vbox_new (FALSE, 10);
3886 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3887 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3888 gtk_widget_show (box2);
3890 menu = create_menu (screen, 1, 5, FALSE);
3891 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3893 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3894 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3895 gtk_widget_show (menuitem);
3897 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3898 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3899 gtk_widget_show (menuitem);
3900 gtk_widget_add_accelerator (menuitem,
3906 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3907 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3908 gtk_widget_show (menuitem);
3909 gtk_widget_add_accelerator (menuitem,
3914 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3915 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3916 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3917 gtk_widget_show (menuitem);
3918 gtk_widget_add_accelerator (menuitem,
3924 gtk_widget_add_accelerator (menuitem,
3931 optionmenu = gtk_combo_box_new_text ();
3932 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3933 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3934 gtk_widget_show (optionmenu);
3936 separator = gtk_hseparator_new ();
3937 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3938 gtk_widget_show (separator);
3940 box2 = gtk_vbox_new (FALSE, 10);
3941 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3942 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3943 gtk_widget_show (box2);
3945 button = gtk_button_new_with_label ("close");
3946 g_signal_connect_swapped (button, "clicked",
3947 G_CALLBACK (gtk_widget_destroy),
3949 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3950 gtk_widget_set_can_default (button, TRUE);
3951 gtk_widget_grab_default (button);
3952 gtk_widget_show (button);
3955 if (!gtk_widget_get_visible (window))
3956 gtk_widget_show (window);
3958 gtk_widget_destroy (window);
3961 /* GdkPixbuf RGBA C-Source image dump */
3963 static const guint8 apple[] =
3965 /* Pixbuf magic (0x47646b50) */
3967 /* length: header (24) + pixel_data (2304) */
3969 /* pixdata_type (0x1010002) */
3971 /* rowstride (96) */
3978 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3979 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3980 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3981 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3982 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3983 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3984 "\0\0\0\0\0\0\0\0\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"
3985 "\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"
3986 "\0\0\0\0\0\0\0\0\0\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"
3987 "[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"
3988 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3989 "\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"
3990 "\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"
3991 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3992 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3993 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3994 "\0\0\0\0\0\0\0\0\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"
3995 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3996 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3997 "\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["
3998 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3999 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
4000 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
4001 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
4002 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
4003 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
4004 "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"
4005 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
4006 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
4007 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
4008 "\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"
4009 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
4010 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
4011 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
4012 "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"
4013 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
4014 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
4015 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
4016 "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"
4017 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
4018 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
4019 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4020 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4021 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4022 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4023 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4024 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4025 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4026 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4027 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4028 "\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>"
4029 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4030 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4031 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4032 "\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"
4033 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4034 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4035 "\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"
4036 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4037 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4038 "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"
4039 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4040 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4041 "\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"
4042 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4043 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4044 "\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"
4045 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4046 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4047 "\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"
4048 "\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"
4049 "\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"
4050 "\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"
4051 "\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"
4052 "\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"
4053 "\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"
4054 "\0\0\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"
4055 "\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"
4056 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4060 accel_button_new (GtkAccelGroup *accel_group,
4065 GdkModifierType modifiers;
4069 gtk_accelerator_parse (accel, &keyval, &modifiers);
4072 button = gtk_button_new ();
4073 gtk_widget_add_accelerator (button, "activate", accel_group,
4074 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4076 label = gtk_accel_label_new (text);
4077 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4078 gtk_widget_show (label);
4080 gtk_container_add (GTK_CONTAINER (button), label);
4086 create_key_lookup (GtkWidget *widget)
4088 static GtkWidget *window = NULL;
4089 gpointer window_ptr;
4093 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4095 GtkWidget *content_area;
4097 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4098 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4101 gtk_window_set_screen (GTK_WINDOW (window),
4102 gtk_widget_get_screen (widget));
4104 /* We have to expand it so the accel labels will draw their labels
4106 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4108 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4110 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4112 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4113 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4114 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4115 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4116 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4117 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4118 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4119 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4120 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4121 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4122 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4123 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4124 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4125 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4126 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4127 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4128 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4129 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4130 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4131 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4132 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4133 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4134 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4135 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4136 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4137 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4138 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4139 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4141 window_ptr = &window;
4142 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
4143 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4145 gtk_widget_show_all (window);
4148 gtk_widget_destroy (window);
4157 cmw_destroy_cb(GtkWidget *widget)
4159 /* This is needed to get out of gtk_main */
4166 cmw_color (GtkWidget *widget, GtkWidget *parent)
4169 GtkWidget *colorsel;
4170 GtkWidget *ok_button, *cancel_button;
4172 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4174 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4176 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
4177 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
4181 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4183 /* And mark it as a transient dialog */
4184 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4186 g_signal_connect (csd, "destroy",
4187 G_CALLBACK (cmw_destroy_cb), NULL);
4190 "ok-button", &ok_button,
4191 "cancel-button", &cancel_button,
4194 g_signal_connect_swapped (ok_button,
4195 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4196 g_signal_connect_swapped (cancel_button,
4197 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4199 /* wait until destroy calls gtk_main_quit */
4200 gtk_widget_show (csd);
4205 cmw_file (GtkWidget *widget, GtkWidget *parent)
4209 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
4210 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
4211 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
4212 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
4214 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4215 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
4217 g_signal_connect (fs, "destroy",
4218 G_CALLBACK (cmw_destroy_cb), NULL);
4219 g_signal_connect_swapped (fs, "response",
4220 G_CALLBACK (gtk_widget_destroy), fs);
4222 /* wait until destroy calls gtk_main_quit */
4223 gtk_widget_show (fs);
4229 create_modal_window (GtkWidget *widget)
4231 GtkWidget *window = NULL;
4232 GtkWidget *box1,*box2;
4234 GtkWidget *btnColor,*btnFile,*btnClose;
4236 /* Create modal window (Here you can use any window descendent )*/
4237 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4238 gtk_window_set_screen (GTK_WINDOW (window),
4239 gtk_widget_get_screen (widget));
4241 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4243 /* Set window as modal */
4244 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4246 /* Create widgets */
4247 box1 = gtk_vbox_new (FALSE,5);
4248 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4249 box2 = gtk_vbox_new (TRUE,5);
4250 btnColor = gtk_button_new_with_label ("Color");
4251 btnFile = gtk_button_new_with_label ("File Selection");
4252 btnClose = gtk_button_new_with_label ("Close");
4255 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4256 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4259 gtk_container_add (GTK_CONTAINER (window), box1);
4260 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4261 gtk_container_add (GTK_CONTAINER (frame1), box2);
4262 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4263 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4264 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4265 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4267 /* connect signals */
4268 g_signal_connect_swapped (btnClose, "clicked",
4269 G_CALLBACK (gtk_widget_destroy), window);
4271 g_signal_connect (window, "destroy",
4272 G_CALLBACK (cmw_destroy_cb), NULL);
4274 g_signal_connect (btnColor, "clicked",
4275 G_CALLBACK (cmw_color), window);
4276 g_signal_connect (btnFile, "clicked",
4277 G_CALLBACK (cmw_file), window);
4280 gtk_widget_show_all (window);
4282 /* wait until dialog get destroyed */
4291 make_message_dialog (GdkScreen *screen,
4293 GtkMessageType type,
4294 GtkButtonsType buttons,
4295 guint default_response)
4299 gtk_widget_destroy (*dialog);
4304 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4305 "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.)");
4307 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4309 g_signal_connect_swapped (*dialog,
4311 G_CALLBACK (gtk_widget_destroy),
4314 g_signal_connect (*dialog,
4316 G_CALLBACK (gtk_widget_destroyed),
4319 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4321 gtk_widget_show (*dialog);
4325 create_message_dialog (GtkWidget *widget)
4327 static GtkWidget *info = NULL;
4328 static GtkWidget *warning = NULL;
4329 static GtkWidget *error = NULL;
4330 static GtkWidget *question = NULL;
4331 GdkScreen *screen = gtk_widget_get_screen (widget);
4333 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4334 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
4335 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4336 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
4343 static GtkWidget *sw_parent = NULL;
4344 static GtkWidget *sw_float_parent;
4345 static guint sw_destroyed_handler = 0;
4348 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4350 gtk_widget_reparent (scrollwin, sw_parent);
4352 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4353 sw_float_parent = NULL;
4355 sw_destroyed_handler = 0;
4361 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4363 gtk_widget_destroy (sw_float_parent);
4365 sw_float_parent = NULL;
4367 sw_destroyed_handler = 0;
4371 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4375 gtk_widget_reparent (scrollwin, sw_parent);
4376 gtk_widget_destroy (sw_float_parent);
4378 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4379 sw_float_parent = NULL;
4381 sw_destroyed_handler = 0;
4385 sw_parent = scrollwin->parent;
4386 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4387 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4388 gtk_widget_get_screen (widget));
4390 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4392 gtk_widget_reparent (scrollwin, sw_float_parent);
4393 gtk_widget_show (sw_float_parent);
4395 sw_destroyed_handler =
4396 g_signal_connect (sw_parent, "destroy",
4397 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4398 g_signal_connect (sw_float_parent, "delete_event",
4399 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4404 create_scrolled_windows (GtkWidget *widget)
4406 static GtkWidget *window;
4407 GtkWidget *content_area, *action_area;
4408 GtkWidget *scrolled_window;
4416 window = gtk_dialog_new ();
4418 gtk_window_set_screen (GTK_WINDOW (window),
4419 gtk_widget_get_screen (widget));
4421 g_signal_connect (window, "destroy",
4422 G_CALLBACK (gtk_widget_destroyed),
4425 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4426 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
4428 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4429 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4431 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4432 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4433 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4434 GTK_POLICY_AUTOMATIC,
4435 GTK_POLICY_AUTOMATIC);
4436 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
4437 gtk_widget_show (scrolled_window);
4439 table = gtk_table_new (20, 20, FALSE);
4440 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4441 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4442 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4443 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4444 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4445 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4446 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4447 gtk_widget_show (table);
4449 for (i = 0; i < 20; i++)
4450 for (j = 0; j < 20; j++)
4452 sprintf (buffer, "button (%d,%d)\n", i, j);
4453 button = gtk_toggle_button_new_with_label (buffer);
4454 gtk_table_attach_defaults (GTK_TABLE (table), button,
4456 gtk_widget_show (button);
4460 button = gtk_button_new_with_label ("Close");
4461 g_signal_connect_swapped (button, "clicked",
4462 G_CALLBACK (gtk_widget_destroy),
4464 gtk_widget_set_can_default (button, TRUE);
4465 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4466 gtk_widget_grab_default (button);
4467 gtk_widget_show (button);
4469 button = gtk_button_new_with_label ("Reparent Out");
4470 g_signal_connect (button, "clicked",
4471 G_CALLBACK (scrolled_windows_remove),
4473 gtk_widget_set_can_default (button, TRUE);
4474 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4475 gtk_widget_grab_default (button);
4476 gtk_widget_show (button);
4478 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4481 if (!gtk_widget_get_visible (window))
4482 gtk_widget_show (window);
4484 gtk_widget_destroy (window);
4492 entry_toggle_frame (GtkWidget *checkbutton,
4495 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4496 GTK_TOGGLE_BUTTON(checkbutton)->active);
4500 entry_toggle_sensitive (GtkWidget *checkbutton,
4503 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4507 entry_progress_timeout (gpointer data)
4509 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
4511 gtk_entry_progress_pulse (GTK_ENTRY (data));
4517 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
4520 if (fraction > 1.0001)
4523 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
4530 entry_remove_timeout (gpointer data)
4532 g_source_remove (GPOINTER_TO_UINT (data));
4536 entry_toggle_progress (GtkWidget *checkbutton,
4539 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
4541 guint timeout = gdk_threads_add_timeout (100,
4542 entry_progress_timeout,
4544 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
4545 GUINT_TO_POINTER (timeout),
4546 entry_remove_timeout);
4550 g_object_set_data (G_OBJECT (entry), "timeout-id",
4551 GUINT_TO_POINTER (0));
4553 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
4558 entry_toggle_pulse (GtkWidget *checkbutton,
4561 g_object_set_data (G_OBJECT (entry), "progress-pulse",
4562 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
4566 props_clicked (GtkWidget *button,
4569 GtkWidget *window = create_prop_editor (object, 0);
4571 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
4575 create_entry (GtkWidget *widget)
4577 static GtkWidget *window = NULL;
4581 GtkWidget *has_frame_check;
4582 GtkWidget *sensitive_check;
4583 GtkWidget *progress_check;
4586 GtkWidget *cb_entry;
4588 GtkWidget *separator;
4592 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4593 gtk_window_set_screen (GTK_WINDOW (window),
4594 gtk_widget_get_screen (widget));
4596 g_signal_connect (window, "destroy",
4597 G_CALLBACK (gtk_widget_destroyed),
4600 gtk_window_set_title (GTK_WINDOW (window), "entry");
4601 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4604 box1 = gtk_vbox_new (FALSE, 0);
4605 gtk_container_add (GTK_CONTAINER (window), box1);
4608 box2 = gtk_vbox_new (FALSE, 10);
4609 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4610 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4612 hbox = gtk_hbox_new (FALSE, 5);
4613 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4615 entry = gtk_entry_new ();
4616 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");
4617 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4618 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4620 button = gtk_button_new_with_mnemonic ("_Props");
4621 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4622 g_signal_connect (button, "clicked",
4623 G_CALLBACK (props_clicked),
4626 cb = GTK_COMBO_BOX (gtk_combo_box_entry_new_text ());
4627 gtk_combo_box_append_text (cb, "item0");
4628 gtk_combo_box_append_text (cb, "item0");
4629 gtk_combo_box_append_text (cb, "item1 item1");
4630 gtk_combo_box_append_text (cb, "item2 item2 item2");
4631 gtk_combo_box_append_text (cb, "item3 item3 item3 item3");
4632 gtk_combo_box_append_text (cb, "item4 item4 item4 item4 item4");
4633 gtk_combo_box_append_text (cb, "item5 item5 item5 item5 item5 item5");
4634 gtk_combo_box_append_text (cb, "item6 item6 item6 item6 item6");
4635 gtk_combo_box_append_text (cb, "item7 item7 item7 item7");
4636 gtk_combo_box_append_text (cb, "item8 item8 item8");
4637 gtk_combo_box_append_text (cb, "item9 item9");
4639 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4640 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4641 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4642 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4644 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4645 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4646 g_signal_connect (sensitive_check, "toggled",
4647 G_CALLBACK (entry_toggle_sensitive), entry);
4648 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4650 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4651 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4652 g_signal_connect (has_frame_check, "toggled",
4653 G_CALLBACK (entry_toggle_frame), entry);
4654 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4656 progress_check = gtk_check_button_new_with_label("Show Progress");
4657 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4658 g_signal_connect (progress_check, "toggled",
4659 G_CALLBACK (entry_toggle_progress), entry);
4661 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4662 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4663 g_signal_connect (progress_check, "toggled",
4664 G_CALLBACK (entry_toggle_pulse), entry);
4666 separator = gtk_hseparator_new ();
4667 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4669 box2 = gtk_vbox_new (FALSE, 10);
4670 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4671 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4673 button = gtk_button_new_with_label ("close");
4674 g_signal_connect_swapped (button, "clicked",
4675 G_CALLBACK (gtk_widget_destroy),
4677 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4678 gtk_widget_set_can_default (button, TRUE);
4679 gtk_widget_grab_default (button);
4682 if (!gtk_widget_get_visible (window))
4683 gtk_widget_show_all (window);
4685 gtk_widget_destroy (window);
4689 create_expander (GtkWidget *widget)
4692 GtkWidget *expander;
4694 static GtkWidget *window = NULL;
4698 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4699 gtk_window_set_screen (GTK_WINDOW (window),
4700 gtk_widget_get_screen (widget));
4702 g_signal_connect (window, "destroy",
4703 G_CALLBACK (gtk_widget_destroyed),
4706 gtk_window_set_title (GTK_WINDOW (window), "expander");
4707 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4709 box1 = gtk_vbox_new (FALSE, 0);
4710 gtk_container_add (GTK_CONTAINER (window), box1);
4712 expander = gtk_expander_new ("The Hidden");
4714 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4716 hidden = gtk_label_new ("Revealed!");
4718 gtk_container_add (GTK_CONTAINER (expander), hidden);
4721 if (!gtk_widget_get_visible (window))
4722 gtk_widget_show_all (window);
4724 gtk_widget_destroy (window);
4732 event_box_label_pressed (GtkWidget *widget,
4733 GdkEventButton *event,
4736 g_print ("clicked on event box\n");
4740 event_box_button_clicked (GtkWidget *widget,
4744 g_print ("pushed button\n");
4748 event_box_toggle_visible_window (GtkWidget *checkbutton,
4749 GtkEventBox *event_box)
4751 gtk_event_box_set_visible_window (event_box,
4752 GTK_TOGGLE_BUTTON(checkbutton)->active);
4756 event_box_toggle_above_child (GtkWidget *checkbutton,
4757 GtkEventBox *event_box)
4759 gtk_event_box_set_above_child (event_box,
4760 GTK_TOGGLE_BUTTON(checkbutton)->active);
4764 create_event_box (GtkWidget *widget)
4766 static GtkWidget *window = NULL;
4772 GtkWidget *separator;
4773 GtkWidget *event_box;
4775 GtkWidget *visible_window_check;
4776 GtkWidget *above_child_check;
4785 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4786 gtk_window_set_screen (GTK_WINDOW (window),
4787 gtk_widget_get_screen (widget));
4789 g_signal_connect (window, "destroy",
4790 G_CALLBACK (gtk_widget_destroyed),
4793 gtk_window_set_title (GTK_WINDOW (window), "event box");
4794 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4796 box1 = gtk_vbox_new (FALSE, 0);
4797 gtk_container_add (GTK_CONTAINER (window), box1);
4798 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4800 hbox = gtk_hbox_new (FALSE, 0);
4801 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4803 event_box = gtk_event_box_new ();
4804 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4806 vbox = gtk_vbox_new (FALSE, 0);
4807 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4808 g_signal_connect (event_box, "button_press_event",
4809 G_CALLBACK (event_box_label_pressed),
4812 label = gtk_label_new ("Click on this label");
4813 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4815 button = gtk_button_new_with_label ("button in eventbox");
4816 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4817 g_signal_connect (button, "clicked",
4818 G_CALLBACK (event_box_button_clicked),
4822 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4823 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4824 g_signal_connect (visible_window_check, "toggled",
4825 G_CALLBACK (event_box_toggle_visible_window), event_box);
4826 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4828 above_child_check = gtk_check_button_new_with_label("Above Child");
4829 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4830 g_signal_connect (above_child_check, "toggled",
4831 G_CALLBACK (event_box_toggle_above_child), event_box);
4832 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4834 separator = gtk_hseparator_new ();
4835 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4837 box2 = gtk_vbox_new (FALSE, 10);
4838 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4839 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4841 button = gtk_button_new_with_label ("close");
4842 g_signal_connect_swapped (button, "clicked",
4843 G_CALLBACK (gtk_widget_destroy),
4845 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4846 gtk_widget_set_can_default (button, TRUE);
4847 gtk_widget_grab_default (button);
4850 if (!gtk_widget_get_visible (window))
4851 gtk_widget_show_all (window);
4853 gtk_widget_destroy (window);
4861 #define SIZE_GROUP_INITIAL_SIZE 50
4864 size_group_hsize_changed (GtkSpinButton *spin_button,
4867 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4868 gtk_spin_button_get_value_as_int (spin_button),
4873 size_group_vsize_changed (GtkSpinButton *spin_button,
4876 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4878 gtk_spin_button_get_value_as_int (spin_button));
4882 create_size_group_window (GdkScreen *screen,
4883 GtkSizeGroup *master_size_group)
4885 GtkWidget *content_area;
4888 GtkWidget *main_button;
4890 GtkWidget *spin_button;
4892 GtkSizeGroup *hgroup1;
4893 GtkSizeGroup *hgroup2;
4894 GtkSizeGroup *vgroup1;
4895 GtkSizeGroup *vgroup2;
4897 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4903 gtk_window_set_screen (GTK_WINDOW (window), screen);
4905 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4907 g_signal_connect (window, "response",
4908 G_CALLBACK (gtk_widget_destroy),
4911 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4913 table = gtk_table_new (2, 2, FALSE);
4914 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4916 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4917 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4918 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4919 gtk_widget_set_size_request (table, 250, 250);
4921 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4922 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4923 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4924 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4926 main_button = gtk_button_new_with_label ("X");
4928 gtk_table_attach (GTK_TABLE (table), main_button,
4930 GTK_EXPAND, GTK_EXPAND,
4932 gtk_size_group_add_widget (master_size_group, main_button);
4933 gtk_size_group_add_widget (hgroup1, main_button);
4934 gtk_size_group_add_widget (vgroup1, main_button);
4935 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4936 SIZE_GROUP_INITIAL_SIZE,
4937 SIZE_GROUP_INITIAL_SIZE);
4939 button = gtk_button_new ();
4940 gtk_table_attach (GTK_TABLE (table), button,
4942 GTK_EXPAND, GTK_EXPAND,
4944 gtk_size_group_add_widget (vgroup1, button);
4945 gtk_size_group_add_widget (vgroup2, button);
4947 button = gtk_button_new ();
4948 gtk_table_attach (GTK_TABLE (table), button,
4950 GTK_EXPAND, GTK_EXPAND,
4952 gtk_size_group_add_widget (hgroup1, button);
4953 gtk_size_group_add_widget (hgroup2, button);
4955 button = gtk_button_new ();
4956 gtk_table_attach (GTK_TABLE (table), button,
4958 GTK_EXPAND, GTK_EXPAND,
4960 gtk_size_group_add_widget (hgroup2, button);
4961 gtk_size_group_add_widget (vgroup2, button);
4963 g_object_unref (hgroup1);
4964 g_object_unref (hgroup2);
4965 g_object_unref (vgroup1);
4966 g_object_unref (vgroup2);
4968 hbox = gtk_hbox_new (FALSE, 5);
4969 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4971 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4972 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4973 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4974 g_signal_connect (spin_button, "value_changed",
4975 G_CALLBACK (size_group_hsize_changed), main_button);
4977 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4978 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4979 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4980 g_signal_connect (spin_button, "value_changed",
4981 G_CALLBACK (size_group_vsize_changed), main_button);
4987 create_size_groups (GtkWidget *widget)
4989 static GtkWidget *window1 = NULL;
4990 static GtkWidget *window2 = NULL;
4991 static GtkSizeGroup *master_size_group;
4993 if (!master_size_group)
4994 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4998 window1 = create_size_group_window (gtk_widget_get_screen (widget),
5001 g_signal_connect (window1, "destroy",
5002 G_CALLBACK (gtk_widget_destroyed),
5008 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5011 g_signal_connect (window2, "destroy",
5012 G_CALLBACK (gtk_widget_destroyed),
5016 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
5018 gtk_widget_destroy (window1);
5019 gtk_widget_destroy (window2);
5023 if (!gtk_widget_get_visible (window1))
5024 gtk_widget_show_all (window1);
5025 if (!gtk_widget_get_visible (window2))
5026 gtk_widget_show_all (window2);
5034 static GtkWidget *spinner1;
5037 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5039 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5043 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5045 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5049 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5051 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5052 gtk_spin_button_get_value_as_int (spin));
5056 get_value (GtkWidget *widget, gpointer data)
5060 GtkSpinButton *spin;
5062 spin = GTK_SPIN_BUTTON (spinner1);
5063 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5064 if (GPOINTER_TO_INT (data) == 1)
5065 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5067 sprintf (buf, "%0.*f",
5068 gtk_spin_button_get_digits (spin),
5069 gtk_spin_button_get_value (spin));
5071 gtk_label_set_text (label, buf);
5075 get_spin_value (GtkWidget *widget, gpointer data)
5079 GtkSpinButton *spin;
5081 spin = GTK_SPIN_BUTTON (widget);
5082 label = GTK_LABEL (data);
5084 buffer = g_strdup_printf ("%0.*f",
5085 gtk_spin_button_get_digits (spin),
5086 gtk_spin_button_get_value (spin));
5087 gtk_label_set_text (label, buffer);
5093 spin_button_time_output_func (GtkSpinButton *spin_button)
5095 GtkAdjustment *adjustment;
5096 static gchar buf[6];
5100 adjustment = gtk_spin_button_get_adjustment (spin_button);
5101 hours = gtk_adjustment_get_value (adjustment) / 60.0;
5102 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5103 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5104 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5105 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5110 spin_button_month_input_func (GtkSpinButton *spin_button,
5114 static gchar *month[12] = { "January", "February", "March", "April",
5115 "May", "June", "July", "August",
5116 "September", "October", "November", "December" };
5118 gboolean found = FALSE;
5120 for (i = 1; i <= 12; i++)
5122 tmp1 = g_ascii_strup (month[i - 1], -1);
5123 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5124 if (strstr (tmp1, tmp2) == tmp1)
5134 return GTK_INPUT_ERROR;
5136 *new_val = (gdouble) i;
5141 spin_button_month_output_func (GtkSpinButton *spin_button)
5143 GtkAdjustment *adjustment;
5146 static gchar *month[12] = { "January", "February", "March", "April",
5147 "May", "June", "July", "August", "September",
5148 "October", "November", "December" };
5150 adjustment = gtk_spin_button_get_adjustment (spin_button);
5151 value = gtk_adjustment_get_value (adjustment);
5152 for (i = 1; i <= 12; i++)
5153 if (fabs (value - (double)i) < 1e-5)
5155 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5156 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5162 spin_button_hex_input_func (GtkSpinButton *spin_button,
5169 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5170 res = strtol(buf, &err, 16);
5173 return GTK_INPUT_ERROR;
5179 spin_button_hex_output_func (GtkSpinButton *spin_button)
5181 GtkAdjustment *adjustment;
5182 static gchar buf[7];
5185 adjustment = gtk_spin_button_get_adjustment (spin_button);
5186 val = (gint) gtk_adjustment_get_value (adjustment);
5187 if (fabs (val) < 1e-5)
5188 sprintf (buf, "0x00");
5190 sprintf (buf, "0x%.2X", val);
5191 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5192 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5197 create_spins (GtkWidget *widget)
5199 static GtkWidget *window = NULL;
5202 GtkWidget *main_vbox;
5205 GtkWidget *spinner2;
5209 GtkWidget *val_label;
5214 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5215 gtk_window_set_screen (GTK_WINDOW (window),
5216 gtk_widget_get_screen (widget));
5218 g_signal_connect (window, "destroy",
5219 G_CALLBACK (gtk_widget_destroyed),
5222 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5224 main_vbox = gtk_vbox_new (FALSE, 5);
5225 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5226 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5228 frame = gtk_frame_new ("Not accelerated");
5229 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5231 vbox = gtk_vbox_new (FALSE, 0);
5232 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5233 gtk_container_add (GTK_CONTAINER (frame), vbox);
5235 /* Time, month, hex spinners */
5237 hbox = gtk_hbox_new (FALSE, 0);
5238 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5240 vbox2 = gtk_vbox_new (FALSE, 0);
5241 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5243 label = gtk_label_new ("Time :");
5244 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5245 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5247 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5248 spinner = gtk_spin_button_new (adj, 0, 0);
5249 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5250 g_signal_connect (spinner,
5252 G_CALLBACK (spin_button_time_output_func),
5254 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5255 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5256 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5258 vbox2 = gtk_vbox_new (FALSE, 0);
5259 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5261 label = gtk_label_new ("Month :");
5262 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5263 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5265 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5267 spinner = gtk_spin_button_new (adj, 0, 0);
5268 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5269 GTK_UPDATE_IF_VALID);
5270 g_signal_connect (spinner,
5272 G_CALLBACK (spin_button_month_input_func),
5274 g_signal_connect (spinner,
5276 G_CALLBACK (spin_button_month_output_func),
5278 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5279 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5280 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5282 vbox2 = gtk_vbox_new (FALSE, 0);
5283 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5285 label = gtk_label_new ("Hex :");
5286 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5287 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5289 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5290 spinner = gtk_spin_button_new (adj, 0, 0);
5291 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5292 g_signal_connect (spinner,
5294 G_CALLBACK (spin_button_hex_input_func),
5296 g_signal_connect (spinner,
5298 G_CALLBACK (spin_button_hex_output_func),
5300 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5301 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
5302 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5304 frame = gtk_frame_new ("Accelerated");
5305 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5307 vbox = gtk_vbox_new (FALSE, 0);
5308 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5309 gtk_container_add (GTK_CONTAINER (frame), vbox);
5311 hbox = gtk_hbox_new (FALSE, 0);
5312 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5314 vbox2 = gtk_vbox_new (FALSE, 0);
5315 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5317 label = gtk_label_new ("Value :");
5318 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5319 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5321 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
5323 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5324 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5325 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
5327 vbox2 = gtk_vbox_new (FALSE, 0);
5328 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5330 label = gtk_label_new ("Digits :");
5331 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5332 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5334 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
5335 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
5336 g_signal_connect (adj, "value_changed",
5337 G_CALLBACK (change_digits),
5339 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
5341 hbox = gtk_hbox_new (FALSE, 0);
5342 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
5344 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
5345 g_signal_connect (button, "clicked",
5346 G_CALLBACK (toggle_snap),
5348 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5349 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5351 button = gtk_check_button_new_with_label ("Numeric only input mode");
5352 g_signal_connect (button, "clicked",
5353 G_CALLBACK (toggle_numeric),
5355 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5356 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5358 val_label = gtk_label_new ("");
5360 hbox = gtk_hbox_new (FALSE, 0);
5361 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5363 button = gtk_button_new_with_label ("Value as Int");
5364 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5365 g_signal_connect (button, "clicked",
5366 G_CALLBACK (get_value),
5367 GINT_TO_POINTER (1));
5368 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5370 button = gtk_button_new_with_label ("Value as Float");
5371 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5372 g_signal_connect (button, "clicked",
5373 G_CALLBACK (get_value),
5374 GINT_TO_POINTER (2));
5375 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5377 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
5378 gtk_label_set_text (GTK_LABEL (val_label), "0");
5380 frame = gtk_frame_new ("Using Convenience Constructor");
5381 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5383 hbox = gtk_hbox_new (FALSE, 0);
5384 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5385 gtk_container_add (GTK_CONTAINER (frame), hbox);
5387 val_label = gtk_label_new ("0.0");
5389 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5390 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5391 g_signal_connect (spinner, "value_changed",
5392 G_CALLBACK (get_spin_value), val_label);
5393 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5394 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5396 hbox = gtk_hbox_new (FALSE, 0);
5397 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5399 button = gtk_button_new_with_label ("Close");
5400 g_signal_connect_swapped (button, "clicked",
5401 G_CALLBACK (gtk_widget_destroy),
5403 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5406 if (!gtk_widget_get_visible (window))
5407 gtk_widget_show_all (window);
5409 gtk_widget_destroy (window);
5418 cursor_expose_event (GtkWidget *widget,
5422 GtkDrawingArea *darea;
5423 GdkDrawable *drawable;
5430 g_return_val_if_fail (widget != NULL, TRUE);
5431 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5433 darea = GTK_DRAWING_AREA (widget);
5434 drawable = widget->window;
5435 white_gc = widget->style->white_gc;
5436 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5437 black_gc = widget->style->black_gc;
5438 max_width = widget->allocation.width;
5439 max_height = widget->allocation.height;
5441 gdk_draw_rectangle (drawable, white_gc,
5448 gdk_draw_rectangle (drawable, black_gc,
5455 gdk_draw_rectangle (drawable, gray_gc,
5466 set_cursor (GtkWidget *spinner,
5475 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5478 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5480 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
5481 vals = class->values;
5483 while (vals && vals->value != c)
5486 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5488 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5490 g_type_class_unref (class);
5492 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5493 gdk_window_set_cursor (widget->window, cursor);
5494 gdk_cursor_unref (cursor);
5498 cursor_event (GtkWidget *widget,
5500 GtkSpinButton *spinner)
5502 if ((event->type == GDK_BUTTON_PRESS) &&
5503 ((event->button.button == 1) ||
5504 (event->button.button == 3)))
5506 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5507 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5514 #ifdef GDK_WINDOWING_X11
5515 #include "x11/gdkx.h"
5518 change_cursor_theme (GtkWidget *widget,
5525 children = gtk_container_get_children (GTK_CONTAINER (data));
5527 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
5528 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
5530 g_list_free (children);
5532 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
5539 create_cursors (GtkWidget *widget)
5541 static GtkWidget *window = NULL;
5544 GtkWidget *main_vbox;
5557 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5558 gtk_window_set_screen (GTK_WINDOW (window),
5559 gtk_widget_get_screen (widget));
5561 g_signal_connect (window, "destroy",
5562 G_CALLBACK (gtk_widget_destroyed),
5565 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5567 main_vbox = gtk_vbox_new (FALSE, 5);
5568 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5569 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5572 g_object_new (gtk_vbox_get_type (),
5573 "GtkBox::homogeneous", FALSE,
5574 "GtkBox::spacing", 5,
5575 "GtkContainer::border_width", 10,
5576 "GtkWidget::parent", main_vbox,
5577 "GtkWidget::visible", TRUE,
5580 #ifdef GDK_WINDOWING_X11
5581 hbox = gtk_hbox_new (FALSE, 0);
5582 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5583 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5585 label = gtk_label_new ("Cursor Theme : ");
5586 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5587 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5589 entry = gtk_entry_new ();
5590 gtk_entry_set_text (GTK_ENTRY (entry), "default");
5591 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
5593 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
5594 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
5595 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5597 g_signal_connect (entry, "changed",
5598 G_CALLBACK (change_cursor_theme), hbox);
5599 g_signal_connect (size, "changed",
5600 G_CALLBACK (change_cursor_theme), hbox);
5603 hbox = gtk_hbox_new (FALSE, 0);
5604 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5605 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5607 label = gtk_label_new ("Cursor Value : ");
5608 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5609 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5611 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5615 spinner = gtk_spin_button_new (adj, 0, 0);
5616 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5619 g_object_new (gtk_frame_get_type (),
5620 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5621 "GtkFrame::label_xalign", 0.5,
5622 "GtkFrame::label", "Cursor Area",
5623 "GtkContainer::border_width", 10,
5624 "GtkWidget::parent", vbox,
5625 "GtkWidget::visible", TRUE,
5628 darea = gtk_drawing_area_new ();
5629 gtk_widget_set_size_request (darea, 80, 80);
5630 gtk_container_add (GTK_CONTAINER (frame), darea);
5631 g_signal_connect (darea,
5633 G_CALLBACK (cursor_expose_event),
5635 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5636 g_signal_connect (darea,
5637 "button_press_event",
5638 G_CALLBACK (cursor_event),
5640 gtk_widget_show (darea);
5642 g_signal_connect (spinner, "changed",
5643 G_CALLBACK (set_cursor),
5646 label = g_object_new (GTK_TYPE_LABEL,
5651 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5654 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5657 g_object_new (gtk_hseparator_get_type (),
5658 "GtkWidget::visible", TRUE,
5660 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5662 hbox = gtk_hbox_new (FALSE, 0);
5663 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5664 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5666 button = gtk_button_new_with_label ("Close");
5667 g_signal_connect_swapped (button, "clicked",
5668 G_CALLBACK (gtk_widget_destroy),
5670 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5672 gtk_widget_show_all (window);
5674 set_cursor (spinner, darea);
5677 gtk_widget_destroy (window);
5685 color_selection_ok (GtkWidget *w,
5686 GtkColorSelectionDialog *cs)
5688 GtkWidget *colorsel;
5691 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5693 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5694 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5698 color_selection_changed (GtkWidget *w,
5699 GtkColorSelectionDialog *cs)
5701 GtkWidget *colorsel;
5704 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5705 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5706 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5711 opacity_toggled_cb (GtkWidget *w,
5712 GtkColorSelectionDialog *cs)
5714 GtkColorSelection *colorsel;
5716 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5717 gtk_color_selection_set_has_opacity_control (colorsel,
5718 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5722 palette_toggled_cb (GtkWidget *w,
5723 GtkColorSelectionDialog *cs)
5725 GtkColorSelection *colorsel;
5727 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5728 gtk_color_selection_set_has_palette (colorsel,
5729 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5734 create_color_selection (GtkWidget *widget)
5736 static GtkWidget *window = NULL;
5745 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5746 gtk_window_set_screen (GTK_WINDOW (window),
5747 gtk_widget_get_screen (widget));
5749 g_signal_connect (window, "destroy",
5750 G_CALLBACK (gtk_widget_destroyed),
5753 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5754 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5756 hbox = gtk_hbox_new (FALSE, 8);
5757 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5758 gtk_container_add (GTK_CONTAINER (window), hbox);
5760 label = gtk_label_new ("Pick a color");
5761 gtk_container_add (GTK_CONTAINER (hbox), label);
5763 picker = gtk_color_button_new ();
5764 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5765 gtk_container_add (GTK_CONTAINER (hbox), picker);
5767 button = gtk_button_new_with_mnemonic ("_Props");
5768 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5769 g_signal_connect (button, "clicked",
5770 G_CALLBACK (props_clicked),
5774 if (!gtk_widget_get_visible (window))
5775 gtk_widget_show_all (window);
5777 gtk_widget_destroy (window);
5781 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5783 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5784 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5786 gtk_widget_set_default_direction (new_direction);
5790 orientable_toggle_orientation (GtkOrientable *orientable)
5792 GtkOrientation orientation;
5794 orientation = gtk_orientable_get_orientation (orientable);
5795 gtk_orientable_set_orientation (orientable,
5796 orientation == GTK_ORIENTATION_HORIZONTAL ?
5797 GTK_ORIENTATION_VERTICAL :
5798 GTK_ORIENTATION_HORIZONTAL);
5800 if (GTK_IS_CONTAINER (orientable))
5805 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5807 for (child = children; child; child = child->next)
5809 if (GTK_IS_ORIENTABLE (child->data))
5810 orientable_toggle_orientation (child->data);
5813 g_list_free (children);
5818 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5820 GtkWidget *content_area;
5821 GtkWidget *toplevel;
5823 toplevel = gtk_widget_get_toplevel (widget);
5824 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5825 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5829 set_direction_recurse (GtkWidget *widget,
5832 GtkTextDirection *dir = data;
5834 gtk_widget_set_direction (widget, *dir);
5835 if (GTK_IS_CONTAINER (widget))
5836 gtk_container_foreach (GTK_CONTAINER (widget),
5837 set_direction_recurse,
5842 create_forward_back (const char *title,
5843 GtkTextDirection text_dir)
5845 GtkWidget *frame = gtk_frame_new (title);
5846 GtkWidget *bbox = gtk_hbutton_box_new ();
5847 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5848 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5850 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5852 gtk_container_add (GTK_CONTAINER (frame), bbox);
5853 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5854 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5856 set_direction_recurse (frame, &text_dir);
5862 create_flipping (GtkWidget *widget)
5864 static GtkWidget *window = NULL;
5865 GtkWidget *check_button, *button;
5866 GtkWidget *action_area, *content_area;
5870 window = gtk_dialog_new ();
5872 gtk_window_set_screen (GTK_WINDOW (window),
5873 gtk_widget_get_screen (widget));
5875 g_signal_connect (window, "destroy",
5876 G_CALLBACK (gtk_widget_destroyed),
5879 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5880 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5882 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5884 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5885 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5886 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5888 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5889 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5891 g_signal_connect (check_button, "toggled",
5892 G_CALLBACK (flipping_toggled_cb), NULL);
5894 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5895 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5896 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5898 g_signal_connect (check_button, "toggled",
5899 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5901 gtk_box_pack_start (GTK_BOX (content_area),
5902 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5905 gtk_box_pack_start (GTK_BOX (content_area),
5906 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5909 gtk_box_pack_start (GTK_BOX (content_area),
5910 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5913 button = gtk_button_new_with_label ("Close");
5914 g_signal_connect_swapped (button, "clicked",
5915 G_CALLBACK (gtk_widget_destroy), window);
5916 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5919 if (!gtk_widget_get_visible (window))
5920 gtk_widget_show_all (window);
5922 gtk_widget_destroy (window);
5930 make_focus_table (GList **list)
5935 table = gtk_table_new (5, 5, FALSE);
5948 widget = gtk_entry_new ();
5950 widget = gtk_button_new_with_label ("Foo");
5952 *list = g_list_prepend (*list, widget);
5954 gtk_table_attach (GTK_TABLE (table),
5958 GTK_EXPAND | GTK_FILL,
5959 GTK_EXPAND | GTK_FILL,
5968 *list = g_list_reverse (*list);
5974 create_focus (GtkWidget *widget)
5976 static GtkWidget *window = NULL;
5980 GtkWidget *content_area;
5985 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5991 gtk_window_set_screen (GTK_WINDOW (window),
5992 gtk_widget_get_screen (widget));
5994 g_signal_connect (window, "destroy",
5995 G_CALLBACK (gtk_widget_destroyed),
5998 g_signal_connect (window, "response",
5999 G_CALLBACK (gtk_widget_destroy),
6002 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
6004 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
6006 frame = gtk_frame_new ("Weird tab focus chain");
6008 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
6010 table = make_focus_table (&list);
6012 gtk_container_add (GTK_CONTAINER (frame), table);
6014 gtk_container_set_focus_chain (GTK_CONTAINER (table),
6019 frame = gtk_frame_new ("Default tab focus chain");
6021 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
6024 table = make_focus_table (&list);
6028 gtk_container_add (GTK_CONTAINER (frame), table);
6031 if (!gtk_widget_get_visible (window))
6032 gtk_widget_show_all (window);
6034 gtk_widget_destroy (window);
6042 font_selection_ok (GtkWidget *w,
6043 GtkFontSelectionDialog *fs)
6045 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
6047 g_print ("%s\n", s);
6049 gtk_widget_destroy (GTK_WIDGET (fs));
6053 create_font_selection (GtkWidget *widget)
6055 static GtkWidget *window = NULL;
6063 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6064 gtk_window_set_screen (GTK_WINDOW (window),
6065 gtk_widget_get_screen (widget));
6067 g_signal_connect (window, "destroy",
6068 G_CALLBACK (gtk_widget_destroyed),
6071 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
6072 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6074 hbox = gtk_hbox_new (FALSE, 8);
6075 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6076 gtk_container_add (GTK_CONTAINER (window), hbox);
6078 label = gtk_label_new ("Pick a font");
6079 gtk_container_add (GTK_CONTAINER (hbox), label);
6081 picker = gtk_font_button_new ();
6082 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
6083 gtk_container_add (GTK_CONTAINER (hbox), picker);
6086 if (!gtk_widget_get_visible (window))
6087 gtk_widget_show_all (window);
6089 gtk_widget_destroy (window);
6096 static GtkWidget *dialog_window = NULL;
6099 label_toggle (GtkWidget *widget,
6104 *label = gtk_label_new ("Dialog Test");
6105 g_signal_connect (*label,
6107 G_CALLBACK (gtk_widget_destroyed),
6109 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
6110 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
6111 *label, TRUE, TRUE, 0);
6112 gtk_widget_show (*label);
6115 gtk_widget_destroy (*label);
6118 #define RESPONSE_TOGGLE_SEPARATOR 1
6121 print_response (GtkWidget *dialog,
6125 g_print ("response signal received (%d)\n", response_id);
6127 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
6129 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
6130 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
6135 create_dialog (GtkWidget *widget)
6137 static GtkWidget *label;
6138 GtkWidget *action_area;
6143 /* This is a terrible example; it's much simpler to create
6144 * dialogs than this. Don't use testgtk for example code,
6148 dialog_window = gtk_dialog_new ();
6149 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6150 gtk_widget_get_screen (widget));
6152 g_signal_connect (dialog_window,
6154 G_CALLBACK (print_response),
6157 g_signal_connect (dialog_window, "destroy",
6158 G_CALLBACK (gtk_widget_destroyed),
6161 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
6163 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
6164 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6166 button = gtk_button_new_with_label ("OK");
6167 gtk_widget_set_can_default (button, TRUE);
6168 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6169 gtk_widget_grab_default (button);
6170 gtk_widget_show (button);
6172 button = gtk_button_new_with_label ("Toggle");
6173 g_signal_connect (button, "clicked",
6174 G_CALLBACK (label_toggle),
6176 gtk_widget_set_can_default (button, TRUE);
6177 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6178 gtk_widget_show (button);
6182 button = gtk_button_new_with_label ("Separator");
6184 gtk_widget_set_can_default (button, TRUE);
6186 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
6188 RESPONSE_TOGGLE_SEPARATOR);
6189 gtk_widget_show (button);
6192 if (!gtk_widget_get_visible (dialog_window))
6193 gtk_widget_show (dialog_window);
6195 gtk_widget_destroy (dialog_window);
6198 /* Display & Screen test
6205 GtkWidget *radio_dpy;
6206 GtkWidget *toplevel;
6207 GtkWidget *dialog_window;
6208 } ScreenDisplaySelection;
6211 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
6213 const gchar *display_name;
6214 GdkDisplay *display = gtk_widget_get_display (widget);
6216 GdkScreen *new_screen = NULL;
6217 GdkScreen *current_screen = gtk_widget_get_screen (widget);
6219 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
6221 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
6222 display = gdk_display_open (display_name);
6226 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
6227 GTK_DIALOG_DESTROY_WITH_PARENT,
6230 "The display :\n%s\ncannot be opened",
6232 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
6233 gtk_widget_show (dialog);
6234 g_signal_connect (dialog, "response",
6235 G_CALLBACK (gtk_widget_destroy),
6240 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
6243 gboolean found = FALSE;
6244 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
6247 gtk_tree_model_get (model, &iter, 0, &name, -1);
6248 found = !g_ascii_strcasecmp (display_name, name);
6255 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
6256 new_screen = gdk_display_get_default_screen (display);
6261 gint number_of_screens = gdk_display_get_n_screens (display);
6262 gint screen_num = gdk_screen_get_number (current_screen);
6263 if ((screen_num +1) < number_of_screens)
6264 new_screen = gdk_display_get_screen (display, screen_num + 1);
6266 new_screen = gdk_display_get_screen (display, 0);
6271 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
6272 gtk_widget_destroy (data->dialog_window);
6277 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
6279 gtk_widget_destroy (data);
6283 create_display_screen (GtkWidget *widget)
6285 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
6286 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
6288 ScreenDisplaySelection *scr_dpy_data;
6289 GdkScreen *screen = gtk_widget_get_screen (widget);
6290 GdkDisplay *display = gdk_screen_get_display (screen);
6292 window = g_object_new (gtk_window_get_type (),
6295 "type", GTK_WINDOW_TOPLEVEL,
6297 "Screen or Display selection",
6298 "border_width", 10, NULL);
6299 g_signal_connect (window, "destroy",
6300 G_CALLBACK (gtk_widget_destroy), NULL);
6302 vbox = gtk_vbox_new (FALSE, 3);
6303 gtk_container_add (GTK_CONTAINER (window), vbox);
6305 frame = gtk_frame_new ("Select screen or display");
6306 gtk_container_add (GTK_CONTAINER (vbox), frame);
6308 table = gtk_table_new (2, 2, TRUE);
6309 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
6310 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
6312 gtk_container_add (GTK_CONTAINER (frame), table);
6314 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
6315 if (gdk_display_get_n_screens(display) > 1)
6316 radio_scr = gtk_radio_button_new_with_label
6317 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
6320 radio_scr = gtk_radio_button_new_with_label
6321 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
6322 "only one screen on the current display");
6323 gtk_widget_set_sensitive (radio_scr, FALSE);
6325 combo_dpy = gtk_combo_box_new_text ();
6326 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
6327 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
6328 "<hostname>:<X Server Num>.<Screen Num>");
6330 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
6331 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
6332 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
6334 bbox = gtk_hbutton_box_new ();
6335 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
6336 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
6338 gtk_container_add (GTK_CONTAINER (vbox), bbox);
6340 gtk_container_add (GTK_CONTAINER (bbox), applyb);
6341 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
6343 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
6345 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
6346 scr_dpy_data->radio_dpy = radio_dpy;
6347 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
6348 scr_dpy_data->dialog_window = window;
6350 g_signal_connect (cancelb, "clicked",
6351 G_CALLBACK (screen_display_destroy_diag), window);
6352 g_signal_connect (applyb, "clicked",
6353 G_CALLBACK (screen_display_check), scr_dpy_data);
6354 gtk_widget_show_all (window);
6359 static gboolean event_watcher_enter_id = 0;
6360 static gboolean event_watcher_leave_id = 0;
6363 event_watcher (GSignalInvocationHint *ihint,
6364 guint n_param_values,
6365 const GValue *param_values,
6368 g_print ("Watch: \"%s\" emitted for %s\n",
6369 g_signal_name (ihint->signal_id),
6370 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
6376 event_watcher_down (void)
6378 if (event_watcher_enter_id)
6382 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6383 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
6384 event_watcher_enter_id = 0;
6385 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6386 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
6387 event_watcher_leave_id = 0;
6392 event_watcher_toggle (void)
6394 if (event_watcher_enter_id)
6395 event_watcher_down ();
6400 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6401 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6402 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6403 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6408 create_event_watcher (GtkWidget *widget)
6410 GtkWidget *action_area, *content_area;
6415 dialog_window = gtk_dialog_new ();
6416 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6417 gtk_widget_get_screen (widget));
6419 g_signal_connect (dialog_window, "destroy",
6420 G_CALLBACK (gtk_widget_destroyed),
6422 g_signal_connect (dialog_window, "destroy",
6423 G_CALLBACK (event_watcher_down),
6426 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
6427 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
6429 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6430 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6431 gtk_widget_set_size_request (dialog_window, 200, 110);
6433 button = gtk_toggle_button_new_with_label ("Activate Watch");
6434 g_signal_connect (button, "clicked",
6435 G_CALLBACK (event_watcher_toggle),
6437 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6438 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
6439 gtk_widget_show (button);
6441 button = gtk_button_new_with_label ("Close");
6442 g_signal_connect_swapped (button, "clicked",
6443 G_CALLBACK (gtk_widget_destroy),
6445 gtk_widget_set_can_default (button, TRUE);
6446 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6447 gtk_widget_grab_default (button);
6448 gtk_widget_show (button);
6451 if (!gtk_widget_get_visible (dialog_window))
6452 gtk_widget_show (dialog_window);
6454 gtk_widget_destroy (dialog_window);
6462 reformat_value (GtkScale *scale,
6465 return g_strdup_printf ("-->%0.*g<--",
6466 gtk_scale_get_digits (scale), value);
6470 create_range_controls (GtkWidget *widget)
6472 static GtkWidget *window = NULL;
6476 GtkWidget *scrollbar;
6478 GtkWidget *separator;
6479 GtkObject *adjustment;
6484 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6486 gtk_window_set_screen (GTK_WINDOW (window),
6487 gtk_widget_get_screen (widget));
6489 g_signal_connect (window, "destroy",
6490 G_CALLBACK (gtk_widget_destroyed),
6493 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6494 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6497 box1 = gtk_vbox_new (FALSE, 0);
6498 gtk_container_add (GTK_CONTAINER (window), box1);
6499 gtk_widget_show (box1);
6502 box2 = gtk_vbox_new (FALSE, 10);
6503 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6504 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6505 gtk_widget_show (box2);
6508 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6510 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6511 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6512 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6513 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6514 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6515 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6516 gtk_widget_show (scale);
6518 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6519 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6520 GTK_UPDATE_CONTINUOUS);
6521 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6522 gtk_widget_show (scrollbar);
6524 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6525 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6526 g_signal_connect (scale,
6528 G_CALLBACK (reformat_value),
6530 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6531 gtk_widget_show (scale);
6533 hbox = gtk_hbox_new (FALSE, 0);
6535 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6536 gtk_widget_set_size_request (scale, -1, 200);
6537 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6538 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6539 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6540 gtk_widget_show (scale);
6542 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6543 gtk_widget_set_size_request (scale, -1, 200);
6544 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6545 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6546 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6547 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6548 gtk_widget_show (scale);
6550 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6551 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6552 g_signal_connect (scale,
6554 G_CALLBACK (reformat_value),
6556 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6557 gtk_widget_show (scale);
6560 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6561 gtk_widget_show (hbox);
6563 separator = gtk_hseparator_new ();
6564 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6565 gtk_widget_show (separator);
6568 box2 = gtk_vbox_new (FALSE, 10);
6569 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6570 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6571 gtk_widget_show (box2);
6574 button = gtk_button_new_with_label ("close");
6575 g_signal_connect_swapped (button, "clicked",
6576 G_CALLBACK (gtk_widget_destroy),
6578 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6579 gtk_widget_set_can_default (button, TRUE);
6580 gtk_widget_grab_default (button);
6581 gtk_widget_show (button);
6584 if (!gtk_widget_get_visible (window))
6585 gtk_widget_show (window);
6587 gtk_widget_destroy (window);
6595 create_rulers (GtkWidget *widget)
6597 static GtkWidget *window = NULL;
6603 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6605 gtk_window_set_screen (GTK_WINDOW (window),
6606 gtk_widget_get_screen (widget));
6608 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
6610 g_signal_connect (window, "destroy",
6611 G_CALLBACK (gtk_widget_destroyed),
6614 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6615 gtk_widget_set_size_request (window, 300, 300);
6616 gtk_widget_set_events (window,
6617 GDK_POINTER_MOTION_MASK
6618 | GDK_POINTER_MOTION_HINT_MASK);
6619 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6621 table = gtk_table_new (2, 2, FALSE);
6622 gtk_container_add (GTK_CONTAINER (window), table);
6623 gtk_widget_show (table);
6625 ruler = gtk_hruler_new ();
6626 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6627 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6629 g_signal_connect_swapped (window,
6630 "motion_notify_event",
6631 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6634 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6635 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6636 gtk_widget_show (ruler);
6639 ruler = gtk_vruler_new ();
6640 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6642 g_signal_connect_swapped (window,
6643 "motion_notify_event",
6644 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6647 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6648 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6649 gtk_widget_show (ruler);
6652 if (!gtk_widget_get_visible (window))
6653 gtk_widget_show (window);
6655 gtk_widget_destroy (window);
6662 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6663 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6664 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6665 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6666 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6667 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6668 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6669 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6672 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6678 static char * book_open_xpm[] = {
6701 static char * book_closed_xpm[] = {
6726 GdkPixbuf *book_open;
6727 GdkPixbuf *book_closed;
6728 GtkWidget *sample_notebook;
6731 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6733 GtkWidget *page_widget;
6736 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6738 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6739 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6741 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6742 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6746 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6748 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6749 gint old_page_num = gtk_notebook_get_current_page (notebook);
6751 if (page_num == old_page_num)
6754 set_page_image (notebook, page_num, book_open);
6756 if (old_page_num != -1)
6757 set_page_image (notebook, old_page_num, book_closed);
6761 tab_fill (GtkToggleButton *button, GtkWidget *child)
6763 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6764 "tab-fill", gtk_toggle_button_get_active (button),
6769 tab_expand (GtkToggleButton *button, GtkWidget *child)
6771 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6772 "tab-expand", gtk_toggle_button_get_active (button),
6777 create_pages (GtkNotebook *notebook, gint start, gint end)
6779 GtkWidget *child = NULL;
6784 GtkWidget *label_box;
6785 GtkWidget *menu_box;
6789 char accel_buffer[32];
6791 for (i = start; i <= end; i++)
6793 sprintf (buffer, "Page %d", i);
6794 sprintf (accel_buffer, "Page _%d", i);
6796 child = gtk_frame_new (buffer);
6797 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6799 vbox = gtk_vbox_new (TRUE,0);
6800 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6801 gtk_container_add (GTK_CONTAINER (child), vbox);
6803 hbox = gtk_hbox_new (TRUE,0);
6804 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6806 button = gtk_check_button_new_with_label ("Fill Tab");
6807 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6808 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6809 g_signal_connect (button, "toggled",
6810 G_CALLBACK (tab_fill), child);
6812 button = gtk_check_button_new_with_label ("Expand Tab");
6813 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6814 g_signal_connect (button, "toggled",
6815 G_CALLBACK (tab_expand), child);
6817 button = gtk_button_new_with_label ("Hide Page");
6818 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6819 g_signal_connect_swapped (button, "clicked",
6820 G_CALLBACK (gtk_widget_hide),
6823 gtk_widget_show_all (child);
6825 label_box = gtk_hbox_new (FALSE, 0);
6826 pixwid = gtk_image_new_from_pixbuf (book_closed);
6827 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6829 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6830 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6831 label = gtk_label_new_with_mnemonic (accel_buffer);
6832 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6833 gtk_widget_show_all (label_box);
6836 menu_box = gtk_hbox_new (FALSE, 0);
6837 pixwid = gtk_image_new_from_pixbuf (book_closed);
6838 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6840 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6841 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6842 label = gtk_label_new (buffer);
6843 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6844 gtk_widget_show_all (menu_box);
6846 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6851 rotate_notebook (GtkButton *button,
6852 GtkNotebook *notebook)
6854 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6858 show_all_pages (GtkButton *button,
6859 GtkNotebook *notebook)
6861 gtk_container_foreach (GTK_CONTAINER (notebook),
6862 (GtkCallback) gtk_widget_show, NULL);
6866 notebook_type_changed (GtkWidget *optionmenu,
6869 GtkNotebook *notebook;
6879 notebook = GTK_NOTEBOOK (data);
6881 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6886 /* standard notebook */
6887 gtk_notebook_set_show_tabs (notebook, TRUE);
6888 gtk_notebook_set_show_border (notebook, TRUE);
6889 gtk_notebook_set_scrollable (notebook, FALSE);
6893 /* notabs notebook */
6894 gtk_notebook_set_show_tabs (notebook, FALSE);
6895 gtk_notebook_set_show_border (notebook, TRUE);
6900 gtk_notebook_set_show_tabs (notebook, FALSE);
6901 gtk_notebook_set_show_border (notebook, FALSE);
6906 gtk_notebook_set_show_tabs (notebook, TRUE);
6907 gtk_notebook_set_show_border (notebook, TRUE);
6908 gtk_notebook_set_scrollable (notebook, TRUE);
6909 if (gtk_notebook_get_n_pages (notebook) == 5)
6910 create_pages (notebook, 6, 15);
6916 if (gtk_notebook_get_n_pages (notebook) == 15)
6917 for (i = 0; i < 10; i++)
6918 gtk_notebook_remove_page (notebook, 5);
6922 notebook_popup (GtkToggleButton *button,
6923 GtkNotebook *notebook)
6926 gtk_notebook_popup_enable (notebook);
6928 gtk_notebook_popup_disable (notebook);
6932 create_notebook (GtkWidget *widget)
6934 static GtkWidget *window = NULL;
6938 GtkWidget *separator;
6942 static gchar *items[] =
6952 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6953 gtk_window_set_screen (GTK_WINDOW (window),
6954 gtk_widget_get_screen (widget));
6956 g_signal_connect (window, "destroy",
6957 G_CALLBACK (gtk_widget_destroyed),
6960 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6961 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6963 box1 = gtk_vbox_new (FALSE, 0);
6964 gtk_container_add (GTK_CONTAINER (window), box1);
6966 sample_notebook = gtk_notebook_new ();
6967 g_signal_connect (sample_notebook, "switch_page",
6968 G_CALLBACK (page_switch), NULL);
6969 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6970 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6971 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6973 gtk_widget_realize (sample_notebook);
6976 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
6979 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
6981 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6983 separator = gtk_hseparator_new ();
6984 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6986 box2 = gtk_hbox_new (FALSE, 5);
6987 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6988 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6990 button = gtk_check_button_new_with_label ("popup menu");
6991 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6992 g_signal_connect (button, "clicked",
6993 G_CALLBACK (notebook_popup),
6996 box2 = gtk_hbox_new (FALSE, 5);
6997 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6998 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7000 label = gtk_label_new ("Notebook Style :");
7001 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
7003 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
7004 notebook_type_changed,
7006 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
7008 button = gtk_button_new_with_label ("Show all Pages");
7009 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
7010 g_signal_connect (button, "clicked",
7011 G_CALLBACK (show_all_pages), sample_notebook);
7013 box2 = gtk_hbox_new (TRUE, 10);
7014 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7015 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7017 button = gtk_button_new_with_label ("prev");
7018 g_signal_connect_swapped (button, "clicked",
7019 G_CALLBACK (gtk_notebook_prev_page),
7021 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7023 button = gtk_button_new_with_label ("next");
7024 g_signal_connect_swapped (button, "clicked",
7025 G_CALLBACK (gtk_notebook_next_page),
7027 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7029 button = gtk_button_new_with_label ("rotate");
7030 g_signal_connect (button, "clicked",
7031 G_CALLBACK (rotate_notebook), sample_notebook);
7032 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7034 separator = gtk_hseparator_new ();
7035 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
7037 button = gtk_button_new_with_label ("close");
7038 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
7039 g_signal_connect_swapped (button, "clicked",
7040 G_CALLBACK (gtk_widget_destroy),
7042 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
7043 gtk_widget_set_can_default (button, TRUE);
7044 gtk_widget_grab_default (button);
7047 if (!gtk_widget_get_visible (window))
7048 gtk_widget_show_all (window);
7050 gtk_widget_destroy (window);
7058 toggle_resize (GtkWidget *widget, GtkWidget *child)
7060 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7061 GValue value = { 0, };
7062 g_value_init (&value, G_TYPE_BOOLEAN);
7063 gtk_container_child_get_property (container, child, "resize", &value);
7064 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7065 gtk_container_child_set_property (container, child, "resize", &value);
7069 toggle_shrink (GtkWidget *widget, GtkWidget *child)
7071 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7072 GValue value = { 0, };
7073 g_value_init (&value, G_TYPE_BOOLEAN);
7074 gtk_container_child_get_property (container, child, "shrink", &value);
7075 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7076 gtk_container_child_set_property (container, child, "shrink", &value);
7080 paned_props_clicked (GtkWidget *button,
7083 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
7085 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
7089 create_pane_options (GtkPaned *paned,
7090 const gchar *frame_label,
7091 const gchar *label1,
7092 const gchar *label2)
7094 GtkWidget *child1, *child2;
7099 GtkWidget *check_button;
7101 child1 = gtk_paned_get_child1 (paned);
7102 child2 = gtk_paned_get_child2 (paned);
7104 frame = gtk_frame_new (frame_label);
7105 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
7107 table = gtk_table_new (4, 2, 4);
7108 gtk_container_add (GTK_CONTAINER (frame), table);
7110 label = gtk_label_new (label1);
7111 gtk_table_attach_defaults (GTK_TABLE (table), label,
7114 check_button = gtk_check_button_new_with_label ("Resize");
7115 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7117 g_signal_connect (check_button, "toggled",
7118 G_CALLBACK (toggle_resize),
7121 check_button = gtk_check_button_new_with_label ("Shrink");
7122 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7124 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7126 g_signal_connect (check_button, "toggled",
7127 G_CALLBACK (toggle_shrink),
7130 label = gtk_label_new (label2);
7131 gtk_table_attach_defaults (GTK_TABLE (table), label,
7134 check_button = gtk_check_button_new_with_label ("Resize");
7135 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7137 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7139 g_signal_connect (check_button, "toggled",
7140 G_CALLBACK (toggle_resize),
7143 check_button = gtk_check_button_new_with_label ("Shrink");
7144 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7146 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7148 g_signal_connect (check_button, "toggled",
7149 G_CALLBACK (toggle_shrink),
7152 button = gtk_button_new_with_mnemonic ("_Properties");
7153 gtk_table_attach_defaults (GTK_TABLE (table), button,
7155 g_signal_connect (button, "clicked",
7156 G_CALLBACK (paned_props_clicked),
7163 create_panes (GtkWidget *widget)
7165 static GtkWidget *window = NULL;
7174 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7176 gtk_window_set_screen (GTK_WINDOW (window),
7177 gtk_widget_get_screen (widget));
7179 g_signal_connect (window, "destroy",
7180 G_CALLBACK (gtk_widget_destroyed),
7183 gtk_window_set_title (GTK_WINDOW (window), "Panes");
7184 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7186 vbox = gtk_vbox_new (FALSE, 0);
7187 gtk_container_add (GTK_CONTAINER (window), vbox);
7189 vpaned = gtk_vpaned_new ();
7190 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
7191 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
7193 hpaned = gtk_hpaned_new ();
7194 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
7196 frame = gtk_frame_new (NULL);
7197 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7198 gtk_widget_set_size_request (frame, 60, 60);
7199 gtk_paned_add1 (GTK_PANED (hpaned), frame);
7201 button = gtk_button_new_with_label ("Hi there");
7202 gtk_container_add (GTK_CONTAINER(frame), button);
7204 frame = gtk_frame_new (NULL);
7205 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7206 gtk_widget_set_size_request (frame, 80, 60);
7207 gtk_paned_add2 (GTK_PANED (hpaned), frame);
7209 frame = gtk_frame_new (NULL);
7210 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7211 gtk_widget_set_size_request (frame, 60, 80);
7212 gtk_paned_add2 (GTK_PANED (vpaned), frame);
7214 /* Now create toggle buttons to control sizing */
7216 gtk_box_pack_start (GTK_BOX (vbox),
7217 create_pane_options (GTK_PANED (hpaned),
7223 gtk_box_pack_start (GTK_BOX (vbox),
7224 create_pane_options (GTK_PANED (vpaned),
7230 gtk_widget_show_all (vbox);
7233 if (!gtk_widget_get_visible (window))
7234 gtk_widget_show (window);
7236 gtk_widget_destroy (window);
7240 * Paned keyboard navigation
7244 paned_keyboard_window1 (GtkWidget *widget)
7267 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7268 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
7269 gtk_window_set_screen (GTK_WINDOW (window1),
7270 gtk_widget_get_screen (widget));
7272 hpaned1 = gtk_hpaned_new ();
7273 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
7275 frame1 = gtk_frame_new (NULL);
7276 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
7277 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
7279 vbox1 = gtk_vbox_new (FALSE, 0);
7280 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
7282 button7 = gtk_button_new_with_label ("button7");
7283 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
7285 button8 = gtk_button_new_with_label ("button8");
7286 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
7288 button9 = gtk_button_new_with_label ("button9");
7289 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
7291 vpaned1 = gtk_vpaned_new ();
7292 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
7294 frame2 = gtk_frame_new (NULL);
7295 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
7296 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
7298 frame5 = gtk_frame_new (NULL);
7299 gtk_container_add (GTK_CONTAINER (frame2), frame5);
7301 hbox1 = gtk_hbox_new (FALSE, 0);
7302 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
7304 button5 = gtk_button_new_with_label ("button5");
7305 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
7307 button6 = gtk_button_new_with_label ("button6");
7308 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
7310 frame3 = gtk_frame_new (NULL);
7311 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
7312 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
7314 frame4 = gtk_frame_new ("Buttons");
7315 gtk_container_add (GTK_CONTAINER (frame3), frame4);
7316 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
7318 table1 = gtk_table_new (2, 2, FALSE);
7319 gtk_container_add (GTK_CONTAINER (frame4), table1);
7320 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
7322 button1 = gtk_button_new_with_label ("button1");
7323 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
7324 (GtkAttachOptions) (GTK_FILL),
7325 (GtkAttachOptions) (0), 0, 0);
7327 button2 = gtk_button_new_with_label ("button2");
7328 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
7329 (GtkAttachOptions) (GTK_FILL),
7330 (GtkAttachOptions) (0), 0, 0);
7332 button3 = gtk_button_new_with_label ("button3");
7333 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
7334 (GtkAttachOptions) (GTK_FILL),
7335 (GtkAttachOptions) (0), 0, 0);
7337 button4 = gtk_button_new_with_label ("button4");
7338 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
7339 (GtkAttachOptions) (GTK_FILL),
7340 (GtkAttachOptions) (0), 0, 0);
7346 paned_keyboard_window2 (GtkWidget *widget)
7351 GtkWidget *button13;
7355 GtkWidget *button12;
7357 GtkWidget *button11;
7358 GtkWidget *button10;
7360 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7361 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
7363 gtk_window_set_screen (GTK_WINDOW (window2),
7364 gtk_widget_get_screen (widget));
7366 hpaned2 = gtk_hpaned_new ();
7367 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
7369 frame6 = gtk_frame_new (NULL);
7370 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
7371 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
7373 button13 = gtk_button_new_with_label ("button13");
7374 gtk_container_add (GTK_CONTAINER (frame6), button13);
7376 hbox2 = gtk_hbox_new (FALSE, 0);
7377 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
7379 vpaned2 = gtk_vpaned_new ();
7380 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
7382 frame7 = gtk_frame_new (NULL);
7383 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
7384 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
7386 button12 = gtk_button_new_with_label ("button12");
7387 gtk_container_add (GTK_CONTAINER (frame7), button12);
7389 frame8 = gtk_frame_new (NULL);
7390 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
7391 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
7393 button11 = gtk_button_new_with_label ("button11");
7394 gtk_container_add (GTK_CONTAINER (frame8), button11);
7396 button10 = gtk_button_new_with_label ("button10");
7397 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
7403 paned_keyboard_window3 (GtkWidget *widget)
7410 GtkWidget *button14;
7413 GtkWidget *button15;
7416 GtkWidget *button16;
7418 GtkWidget *button17;
7420 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7421 g_object_set_data (G_OBJECT (window3), "window3", window3);
7422 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
7424 gtk_window_set_screen (GTK_WINDOW (window3),
7425 gtk_widget_get_screen (widget));
7428 vbox2 = gtk_vbox_new (FALSE, 0);
7429 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7431 label1 = gtk_label_new ("Three panes nested inside each other");
7432 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7434 hpaned3 = gtk_hpaned_new ();
7435 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7437 frame9 = gtk_frame_new (NULL);
7438 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7439 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7441 button14 = gtk_button_new_with_label ("button14");
7442 gtk_container_add (GTK_CONTAINER (frame9), button14);
7444 hpaned4 = gtk_hpaned_new ();
7445 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7447 frame10 = gtk_frame_new (NULL);
7448 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7449 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7451 button15 = gtk_button_new_with_label ("button15");
7452 gtk_container_add (GTK_CONTAINER (frame10), button15);
7454 hpaned5 = gtk_hpaned_new ();
7455 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7457 frame11 = gtk_frame_new (NULL);
7458 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7459 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7461 button16 = gtk_button_new_with_label ("button16");
7462 gtk_container_add (GTK_CONTAINER (frame11), button16);
7464 frame12 = gtk_frame_new (NULL);
7465 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7466 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7468 button17 = gtk_button_new_with_label ("button17");
7469 gtk_container_add (GTK_CONTAINER (frame12), button17);
7475 paned_keyboard_window4 (GtkWidget *widget)
7482 GtkWidget *button19;
7483 GtkWidget *button18;
7486 GtkWidget *button21;
7487 GtkWidget *button20;
7489 GtkWidget *button23;
7490 GtkWidget *button22;
7492 GtkWidget *button25;
7493 GtkWidget *button24;
7495 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7496 g_object_set_data (G_OBJECT (window4), "window4", window4);
7497 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7499 gtk_window_set_screen (GTK_WINDOW (window4),
7500 gtk_widget_get_screen (widget));
7502 vbox3 = gtk_vbox_new (FALSE, 0);
7503 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7505 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7506 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7507 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7509 hpaned6 = gtk_hpaned_new ();
7510 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7512 vpaned3 = gtk_vpaned_new ();
7513 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7515 button19 = gtk_button_new_with_label ("button19");
7516 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7518 button18 = gtk_button_new_with_label ("button18");
7519 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7521 hbox3 = gtk_hbox_new (FALSE, 0);
7522 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7524 vpaned4 = gtk_vpaned_new ();
7525 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7527 button21 = gtk_button_new_with_label ("button21");
7528 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7530 button20 = gtk_button_new_with_label ("button20");
7531 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7533 vpaned5 = gtk_vpaned_new ();
7534 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7536 button23 = gtk_button_new_with_label ("button23");
7537 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7539 button22 = gtk_button_new_with_label ("button22");
7540 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7542 vpaned6 = gtk_vpaned_new ();
7543 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7545 button25 = gtk_button_new_with_label ("button25");
7546 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7548 button24 = gtk_button_new_with_label ("button24");
7549 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7555 create_paned_keyboard_navigation (GtkWidget *widget)
7557 static GtkWidget *window1 = NULL;
7558 static GtkWidget *window2 = NULL;
7559 static GtkWidget *window3 = NULL;
7560 static GtkWidget *window4 = NULL;
7563 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7565 gtk_widget_destroy (window1);
7566 gtk_widget_destroy (window2);
7567 gtk_widget_destroy (window3);
7568 gtk_widget_destroy (window4);
7573 window1 = paned_keyboard_window1 (widget);
7574 g_signal_connect (window1, "destroy",
7575 G_CALLBACK (gtk_widget_destroyed),
7581 window2 = paned_keyboard_window2 (widget);
7582 g_signal_connect (window2, "destroy",
7583 G_CALLBACK (gtk_widget_destroyed),
7589 window3 = paned_keyboard_window3 (widget);
7590 g_signal_connect (window3, "destroy",
7591 G_CALLBACK (gtk_widget_destroyed),
7597 window4 = paned_keyboard_window4 (widget);
7598 g_signal_connect (window4, "destroy",
7599 G_CALLBACK (gtk_widget_destroyed),
7603 if (gtk_widget_get_visible (window1))
7604 gtk_widget_destroy (GTK_WIDGET (window1));
7606 gtk_widget_show_all (GTK_WIDGET (window1));
7608 if (gtk_widget_get_visible (window2))
7609 gtk_widget_destroy (GTK_WIDGET (window2));
7611 gtk_widget_show_all (GTK_WIDGET (window2));
7613 if (gtk_widget_get_visible (window3))
7614 gtk_widget_destroy (GTK_WIDGET (window3));
7616 gtk_widget_show_all (GTK_WIDGET (window3));
7618 if (gtk_widget_get_visible (window4))
7619 gtk_widget_destroy (GTK_WIDGET (window4));
7621 gtk_widget_show_all (GTK_WIDGET (window4));
7629 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7632 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7636 /* ignore double and triple click */
7637 if (event->type != GDK_BUTTON_PRESS)
7640 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7641 p->x = (int) event->x;
7642 p->y = (int) event->y;
7644 gtk_grab_add (widget);
7645 gdk_pointer_grab (widget->window, TRUE,
7646 GDK_BUTTON_RELEASE_MASK |
7647 GDK_BUTTON_MOTION_MASK |
7648 GDK_POINTER_MOTION_HINT_MASK,
7653 shape_released (GtkWidget *widget)
7655 gtk_grab_remove (widget);
7656 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7661 shape_motion (GtkWidget *widget,
7662 GdkEventMotion *event)
7666 GdkModifierType mask;
7668 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7671 * Can't use event->x / event->y here
7672 * because I need absolute coordinates.
7674 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7675 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7679 shape_create_icon (GdkScreen *screen,
7690 CursorOffset* icon_pos;
7692 GdkBitmap *gdk_pixmap_mask;
7693 GdkPixmap *gdk_pixmap;
7696 style = gtk_widget_get_default_style ();
7697 gc = style->black_gc;
7700 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7702 window = gtk_window_new (window_type);
7703 gtk_window_set_screen (GTK_WINDOW (window), screen);
7705 fixed = gtk_fixed_new ();
7706 gtk_widget_set_size_request (fixed, 100, 100);
7707 gtk_container_add (GTK_CONTAINER (window), fixed);
7708 gtk_widget_show (fixed);
7710 gtk_widget_set_events (window,
7711 gtk_widget_get_events (window) |
7712 GDK_BUTTON_MOTION_MASK |
7713 GDK_POINTER_MOTION_HINT_MASK |
7714 GDK_BUTTON_PRESS_MASK);
7716 gtk_widget_realize (window);
7717 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
7718 &style->bg[GTK_STATE_NORMAL],
7721 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
7722 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
7723 gtk_widget_show (pixmap);
7725 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
7727 g_object_unref (gdk_pixmap_mask);
7728 g_object_unref (gdk_pixmap);
7730 g_signal_connect (window, "button_press_event",
7731 G_CALLBACK (shape_pressed), NULL);
7732 g_signal_connect (window, "button_release_event",
7733 G_CALLBACK (shape_released), NULL);
7734 g_signal_connect (window, "motion_notify_event",
7735 G_CALLBACK (shape_motion), NULL);
7737 icon_pos = g_new (CursorOffset, 1);
7738 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7740 gtk_window_move (GTK_WINDOW (window), x, y);
7741 gtk_widget_show (window);
7747 create_shapes (GtkWidget *widget)
7749 /* Variables used by the Drag/Drop and Shape Window demos */
7750 static GtkWidget *modeller = NULL;
7751 static GtkWidget *sheets = NULL;
7752 static GtkWidget *rings = NULL;
7753 static GtkWidget *with_region = NULL;
7754 GdkScreen *screen = gtk_widget_get_screen (widget);
7756 if (!(file_exists ("Modeller.xpm") &&
7757 file_exists ("FilesQueue.xpm") &&
7758 file_exists ("3DRings.xpm")))
7764 modeller = shape_create_icon (screen, "Modeller.xpm",
7765 440, 140, 0,0, GTK_WINDOW_POPUP);
7767 g_signal_connect (modeller, "destroy",
7768 G_CALLBACK (gtk_widget_destroyed),
7772 gtk_widget_destroy (modeller);
7776 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7777 580, 170, 0,0, GTK_WINDOW_POPUP);
7779 g_signal_connect (sheets, "destroy",
7780 G_CALLBACK (gtk_widget_destroyed),
7785 gtk_widget_destroy (sheets);
7789 rings = shape_create_icon (screen, "3DRings.xpm",
7790 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7792 g_signal_connect (rings, "destroy",
7793 G_CALLBACK (gtk_widget_destroyed),
7797 gtk_widget_destroy (rings);
7801 cairo_region_t *region;
7804 with_region = shape_create_icon (screen, "3DRings.xpm",
7805 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7807 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7809 g_signal_connect (with_region, "destroy",
7810 G_CALLBACK (gtk_widget_destroyed),
7813 /* reset shape from mask to a region */
7816 region = cairo_region_create ();
7828 cairo_region_union_rectangle (region, &rect);
7836 gdk_window_shape_combine_region (with_region->window,
7841 gtk_widget_destroy (with_region);
7849 create_wmhints (GtkWidget *widget)
7851 static GtkWidget *window = NULL;
7853 GtkWidget *separator;
7862 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7864 gtk_window_set_screen (GTK_WINDOW (window),
7865 gtk_widget_get_screen (widget));
7867 g_signal_connect (window, "destroy",
7868 G_CALLBACK (gtk_widget_destroyed),
7871 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7872 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7874 gtk_widget_realize (window);
7876 circles = gdk_bitmap_create_from_data (window->window,
7877 (gchar *) circles_bits,
7880 gdk_window_set_icon (window->window, NULL,
7883 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
7885 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7886 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7888 box1 = gtk_vbox_new (FALSE, 0);
7889 gtk_container_add (GTK_CONTAINER (window), box1);
7890 gtk_widget_show (box1);
7892 label = gtk_label_new ("Try iconizing me!");
7893 gtk_widget_set_size_request (label, 150, 50);
7894 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7895 gtk_widget_show (label);
7898 separator = gtk_hseparator_new ();
7899 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7900 gtk_widget_show (separator);
7903 box2 = gtk_vbox_new (FALSE, 10);
7904 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7905 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7906 gtk_widget_show (box2);
7909 button = gtk_button_new_with_label ("close");
7911 g_signal_connect_swapped (button, "clicked",
7912 G_CALLBACK (gtk_widget_destroy),
7915 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7916 gtk_widget_set_can_default (button, TRUE);
7917 gtk_widget_grab_default (button);
7918 gtk_widget_show (button);
7921 if (!gtk_widget_get_visible (window))
7922 gtk_widget_show (window);
7924 gtk_widget_destroy (window);
7929 * Window state tracking
7933 window_state_callback (GtkWidget *widget,
7934 GdkEventWindowState *event,
7937 GtkWidget *label = data;
7940 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
7941 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7942 "withdrawn" : "not withdrawn", ", ",
7943 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7944 "iconified" : "not iconified", ", ",
7945 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7946 "sticky" : "not sticky", ", ",
7947 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7948 "maximized" : "not maximized", ", ",
7949 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7950 "fullscreen" : "not fullscreen",
7951 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7952 "above" : "not above", ", ",
7953 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7954 "below" : "not below", ", ",
7957 gtk_label_set_text (GTK_LABEL (label), msg);
7965 tracking_label (GtkWidget *window)
7971 hbox = gtk_hbox_new (FALSE, 5);
7973 g_signal_connect_object (hbox,
7975 G_CALLBACK (gtk_widget_destroy),
7979 label = gtk_label_new ("<no window state events received>");
7980 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7981 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7983 g_signal_connect (window,
7984 "window_state_event",
7985 G_CALLBACK (window_state_callback),
7988 button = gtk_button_new_with_label ("Deiconify");
7989 g_signal_connect_object (button,
7991 G_CALLBACK (gtk_window_deiconify),
7994 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7996 button = gtk_button_new_with_label ("Iconify");
7997 g_signal_connect_object (button,
7999 G_CALLBACK (gtk_window_iconify),
8002 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8004 button = gtk_button_new_with_label ("Fullscreen");
8005 g_signal_connect_object (button,
8007 G_CALLBACK (gtk_window_fullscreen),
8010 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8012 button = gtk_button_new_with_label ("Unfullscreen");
8013 g_signal_connect_object (button,
8015 G_CALLBACK (gtk_window_unfullscreen),
8018 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8020 button = gtk_button_new_with_label ("Present");
8021 g_signal_connect_object (button,
8023 G_CALLBACK (gtk_window_present),
8026 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8028 button = gtk_button_new_with_label ("Show");
8029 g_signal_connect_object (button,
8031 G_CALLBACK (gtk_widget_show),
8034 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8036 gtk_widget_show_all (hbox);
8042 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
8044 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8046 gtk_window_set_keep_above (GTK_WINDOW (data),
8047 gtk_toggle_button_get_active (togglebutton));
8049 if (gtk_toggle_button_get_active (togglebutton))
8050 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8054 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
8056 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8058 gtk_window_set_keep_below (GTK_WINDOW (data),
8059 gtk_toggle_button_get_active (togglebutton));
8061 if (gtk_toggle_button_get_active (togglebutton))
8062 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8067 get_state_controls (GtkWidget *window)
8071 GtkWidget *button_above;
8072 GtkWidget *button_below;
8074 vbox = gtk_vbox_new (FALSE, 0);
8076 button = gtk_button_new_with_label ("Stick");
8077 g_signal_connect_object (button,
8079 G_CALLBACK (gtk_window_stick),
8082 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8084 button = gtk_button_new_with_label ("Unstick");
8085 g_signal_connect_object (button,
8087 G_CALLBACK (gtk_window_unstick),
8090 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8092 button = gtk_button_new_with_label ("Maximize");
8093 g_signal_connect_object (button,
8095 G_CALLBACK (gtk_window_maximize),
8098 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8100 button = gtk_button_new_with_label ("Unmaximize");
8101 g_signal_connect_object (button,
8103 G_CALLBACK (gtk_window_unmaximize),
8106 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8108 button = gtk_button_new_with_label ("Iconify");
8109 g_signal_connect_object (button,
8111 G_CALLBACK (gtk_window_iconify),
8114 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8116 button = gtk_button_new_with_label ("Fullscreen");
8117 g_signal_connect_object (button,
8119 G_CALLBACK (gtk_window_fullscreen),
8122 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8124 button = gtk_button_new_with_label ("Unfullscreen");
8125 g_signal_connect_object (button,
8127 G_CALLBACK (gtk_window_unfullscreen),
8130 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8132 button_above = gtk_toggle_button_new_with_label ("Keep above");
8133 g_signal_connect (button_above,
8135 G_CALLBACK (keep_window_above),
8137 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
8139 button_below = gtk_toggle_button_new_with_label ("Keep below");
8140 g_signal_connect (button_below,
8142 G_CALLBACK (keep_window_below),
8144 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
8146 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
8147 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
8149 button = gtk_button_new_with_label ("Hide (withdraw)");
8150 g_signal_connect_object (button,
8152 G_CALLBACK (gtk_widget_hide),
8155 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8157 gtk_widget_show_all (vbox);
8163 create_window_states (GtkWidget *widget)
8165 static GtkWidget *window = NULL;
8168 GtkWidget *iconified;
8170 GtkWidget *controls;
8174 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8175 gtk_window_set_screen (GTK_WINDOW (window),
8176 gtk_widget_get_screen (widget));
8178 g_signal_connect (window, "destroy",
8179 G_CALLBACK (gtk_widget_destroyed),
8182 gtk_window_set_title (GTK_WINDOW (window), "Window states");
8184 box1 = gtk_vbox_new (FALSE, 0);
8185 gtk_container_add (GTK_CONTAINER (window), box1);
8187 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8189 gtk_window_set_screen (GTK_WINDOW (iconified),
8190 gtk_widget_get_screen (widget));
8192 g_signal_connect_object (iconified, "destroy",
8193 G_CALLBACK (gtk_widget_destroy),
8196 gtk_window_iconify (GTK_WINDOW (iconified));
8197 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
8198 controls = get_state_controls (iconified);
8199 gtk_container_add (GTK_CONTAINER (iconified), controls);
8201 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8203 gtk_window_set_screen (GTK_WINDOW (normal),
8204 gtk_widget_get_screen (widget));
8206 g_signal_connect_object (normal, "destroy",
8207 G_CALLBACK (gtk_widget_destroy),
8211 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
8212 controls = get_state_controls (normal);
8213 gtk_container_add (GTK_CONTAINER (normal), controls);
8215 label = tracking_label (iconified);
8216 gtk_container_add (GTK_CONTAINER (box1), label);
8218 label = tracking_label (normal);
8219 gtk_container_add (GTK_CONTAINER (box1), label);
8221 gtk_widget_show_all (iconified);
8222 gtk_widget_show_all (normal);
8223 gtk_widget_show_all (box1);
8226 if (!gtk_widget_get_visible (window))
8227 gtk_widget_show (window);
8229 gtk_widget_destroy (window);
8237 configure_event_callback (GtkWidget *widget,
8238 GdkEventConfigure *event,
8241 GtkWidget *label = data;
8245 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
8247 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
8249 event->x, event->y, event->width, event->height,
8252 gtk_label_set_text (GTK_LABEL (label), msg);
8260 get_ints (GtkWidget *window,
8267 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
8268 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
8270 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
8271 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
8275 set_size_callback (GtkWidget *widget,
8280 get_ints (data, &w, &h);
8282 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
8286 unset_default_size_callback (GtkWidget *widget,
8289 gtk_window_set_default_size (g_object_get_data (data, "target"),
8294 set_default_size_callback (GtkWidget *widget,
8299 get_ints (data, &w, &h);
8301 gtk_window_set_default_size (g_object_get_data (data, "target"),
8306 unset_size_request_callback (GtkWidget *widget,
8309 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8314 set_size_request_callback (GtkWidget *widget,
8319 get_ints (data, &w, &h);
8321 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8326 set_location_callback (GtkWidget *widget,
8331 get_ints (data, &x, &y);
8333 gtk_window_move (g_object_get_data (data, "target"), x, y);
8337 move_to_position_callback (GtkWidget *widget,
8343 window = g_object_get_data (data, "target");
8345 gtk_window_get_position (window, &x, &y);
8347 gtk_window_move (window, x, y);
8351 set_geometry_callback (GtkWidget *entry,
8357 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
8359 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
8361 if (!gtk_window_parse_geometry (target, text))
8362 g_print ("Bad geometry string '%s'\n", text);
8368 allow_shrink_callback (GtkWidget *widget,
8371 g_object_set (g_object_get_data (data, "target"),
8373 GTK_TOGGLE_BUTTON (widget)->active,
8378 allow_grow_callback (GtkWidget *widget,
8381 g_object_set (g_object_get_data (data, "target"),
8383 GTK_TOGGLE_BUTTON (widget)->active,
8388 gravity_selected (GtkWidget *widget,
8391 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
8392 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
8396 pos_selected (GtkWidget *widget,
8399 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
8400 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
8404 move_gravity_window_to_current_position (GtkWidget *widget,
8410 window = GTK_WINDOW (data);
8412 gtk_window_get_position (window, &x, &y);
8414 gtk_window_move (window, x, y);
8418 get_screen_corner (GtkWindow *window,
8423 GdkScreen * screen = gtk_window_get_screen (window);
8425 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
8427 switch (gtk_window_get_gravity (window))
8429 case GDK_GRAVITY_SOUTH_EAST:
8430 *x = gdk_screen_get_width (screen) - w;
8431 *y = gdk_screen_get_height (screen) - h;
8434 case GDK_GRAVITY_NORTH_EAST:
8435 *x = gdk_screen_get_width (screen) - w;
8439 case GDK_GRAVITY_SOUTH_WEST:
8441 *y = gdk_screen_get_height (screen) - h;
8444 case GDK_GRAVITY_NORTH_WEST:
8449 case GDK_GRAVITY_SOUTH:
8450 *x = (gdk_screen_get_width (screen) - w) / 2;
8451 *y = gdk_screen_get_height (screen) - h;
8454 case GDK_GRAVITY_NORTH:
8455 *x = (gdk_screen_get_width (screen) - w) / 2;
8459 case GDK_GRAVITY_WEST:
8461 *y = (gdk_screen_get_height (screen) - h) / 2;
8464 case GDK_GRAVITY_EAST:
8465 *x = gdk_screen_get_width (screen) - w;
8466 *y = (gdk_screen_get_height (screen) - h) / 2;
8469 case GDK_GRAVITY_CENTER:
8470 *x = (gdk_screen_get_width (screen) - w) / 2;
8471 *y = (gdk_screen_get_height (screen) - h) / 2;
8474 case GDK_GRAVITY_STATIC:
8475 /* pick some random numbers */
8481 g_assert_not_reached ();
8487 move_gravity_window_to_starting_position (GtkWidget *widget,
8493 window = GTK_WINDOW (data);
8495 get_screen_corner (window,
8498 gtk_window_move (window, x, y);
8502 make_gravity_window (GtkWidget *destroy_with,
8511 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8513 gtk_window_set_screen (GTK_WINDOW (window),
8514 gtk_widget_get_screen (destroy_with));
8516 vbox = gtk_vbox_new (FALSE, 0);
8517 gtk_widget_show (vbox);
8519 gtk_container_add (GTK_CONTAINER (window), vbox);
8520 gtk_window_set_title (GTK_WINDOW (window), title);
8521 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8523 g_signal_connect_object (destroy_with,
8525 G_CALLBACK (gtk_widget_destroy),
8530 button = gtk_button_new_with_mnemonic ("_Move to current position");
8532 g_signal_connect (button, "clicked",
8533 G_CALLBACK (move_gravity_window_to_current_position),
8536 gtk_container_add (GTK_CONTAINER (vbox), button);
8537 gtk_widget_show (button);
8539 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8541 g_signal_connect (button, "clicked",
8542 G_CALLBACK (move_gravity_window_to_starting_position),
8545 gtk_container_add (GTK_CONTAINER (vbox), button);
8546 gtk_widget_show (button);
8548 /* Pretend this is the result of --geometry.
8549 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8550 * and in that case you probably should just use gtk_window_parse_geometry().
8551 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8552 * you are parsing --geometry or equivalent.
8554 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8558 gtk_window_set_default_size (GTK_WINDOW (window),
8561 get_screen_corner (GTK_WINDOW (window), &x, &y);
8563 gtk_window_move (GTK_WINDOW (window),
8570 do_gravity_test (GtkWidget *widget,
8573 GtkWidget *destroy_with = data;
8576 /* We put a window at each gravity point on the screen. */
8577 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8579 gtk_widget_show (window);
8581 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8583 gtk_widget_show (window);
8585 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8587 gtk_widget_show (window);
8589 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8591 gtk_widget_show (window);
8593 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8595 gtk_widget_show (window);
8597 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8599 gtk_widget_show (window);
8602 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8604 gtk_widget_show (window);
8607 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8609 gtk_widget_show (window);
8611 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8613 gtk_widget_show (window);
8615 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8617 gtk_widget_show (window);
8621 window_controls (GtkWidget *window)
8623 GtkWidget *control_window;
8633 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8635 gtk_window_set_screen (GTK_WINDOW (control_window),
8636 gtk_widget_get_screen (window));
8638 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8640 g_object_set_data (G_OBJECT (control_window),
8644 g_signal_connect_object (control_window,
8646 G_CALLBACK (gtk_widget_destroy),
8650 vbox = gtk_vbox_new (FALSE, 5);
8652 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8654 label = gtk_label_new ("<no configure events>");
8655 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8657 g_signal_connect (window,
8659 G_CALLBACK (configure_event_callback),
8662 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8664 spin = gtk_spin_button_new (adj, 0, 0);
8666 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8668 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8670 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8672 spin = gtk_spin_button_new (adj, 0, 0);
8674 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8676 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8678 entry = gtk_entry_new ();
8679 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8681 g_signal_connect (entry, "changed",
8682 G_CALLBACK (set_geometry_callback),
8685 button = gtk_button_new_with_label ("Show gravity test windows");
8686 g_signal_connect_swapped (button,
8688 G_CALLBACK (do_gravity_test),
8690 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8692 button = gtk_button_new_with_label ("Reshow with initial size");
8693 g_signal_connect_object (button,
8695 G_CALLBACK (gtk_window_reshow_with_initial_size),
8698 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8700 button = gtk_button_new_with_label ("Queue resize");
8701 g_signal_connect_object (button,
8703 G_CALLBACK (gtk_widget_queue_resize),
8706 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8708 button = gtk_button_new_with_label ("Resize");
8709 g_signal_connect (button,
8711 G_CALLBACK (set_size_callback),
8713 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8715 button = gtk_button_new_with_label ("Set default size");
8716 g_signal_connect (button,
8718 G_CALLBACK (set_default_size_callback),
8720 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8722 button = gtk_button_new_with_label ("Unset default size");
8723 g_signal_connect (button,
8725 G_CALLBACK (unset_default_size_callback),
8727 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8729 button = gtk_button_new_with_label ("Set size request");
8730 g_signal_connect (button,
8732 G_CALLBACK (set_size_request_callback),
8734 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8736 button = gtk_button_new_with_label ("Unset size request");
8737 g_signal_connect (button,
8739 G_CALLBACK (unset_size_request_callback),
8741 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8743 button = gtk_button_new_with_label ("Move");
8744 g_signal_connect (button,
8746 G_CALLBACK (set_location_callback),
8748 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8750 button = gtk_button_new_with_label ("Move to current position");
8751 g_signal_connect (button,
8753 G_CALLBACK (move_to_position_callback),
8755 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8757 button = gtk_check_button_new_with_label ("Allow shrink");
8758 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8759 g_signal_connect (button,
8761 G_CALLBACK (allow_shrink_callback),
8763 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8765 button = gtk_check_button_new_with_label ("Allow grow");
8766 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8767 g_signal_connect (button,
8769 G_CALLBACK (allow_grow_callback),
8771 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8773 button = gtk_button_new_with_mnemonic ("_Show");
8774 g_signal_connect_object (button,
8776 G_CALLBACK (gtk_widget_show),
8779 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8781 button = gtk_button_new_with_mnemonic ("_Hide");
8782 g_signal_connect_object (button,
8784 G_CALLBACK (gtk_widget_hide),
8787 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8789 om = gtk_combo_box_new_text ();
8793 static gchar *names[] = {
8794 "GDK_GRAVITY_NORTH_WEST",
8795 "GDK_GRAVITY_NORTH",
8796 "GDK_GRAVITY_NORTH_EAST",
8798 "GDK_GRAVITY_CENTER",
8800 "GDK_GRAVITY_SOUTH_WEST",
8801 "GDK_GRAVITY_SOUTH",
8802 "GDK_GRAVITY_SOUTH_EAST",
8803 "GDK_GRAVITY_STATIC",
8807 g_assert (names[i]);
8808 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8813 g_signal_connect (om,
8815 G_CALLBACK (gravity_selected),
8818 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8821 om = gtk_combo_box_new_text ();
8825 static gchar *names[] = {
8827 "GTK_WIN_POS_CENTER",
8828 "GTK_WIN_POS_MOUSE",
8829 "GTK_WIN_POS_CENTER_ALWAYS",
8830 "GTK_WIN_POS_CENTER_ON_PARENT",
8834 g_assert (names[i]);
8835 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8840 g_signal_connect (om,
8842 G_CALLBACK (pos_selected),
8845 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8847 gtk_widget_show_all (vbox);
8849 return control_window;
8853 create_window_sizing (GtkWidget *widget)
8855 static GtkWidget *window = NULL;
8856 static GtkWidget *target_window = NULL;
8862 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8863 gtk_window_set_screen (GTK_WINDOW (target_window),
8864 gtk_widget_get_screen (widget));
8865 label = gtk_label_new (NULL);
8866 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");
8867 gtk_container_add (GTK_CONTAINER (target_window), label);
8868 gtk_widget_show (label);
8870 g_signal_connect (target_window, "destroy",
8871 G_CALLBACK (gtk_widget_destroyed),
8874 window = window_controls (target_window);
8876 g_signal_connect (window, "destroy",
8877 G_CALLBACK (gtk_widget_destroyed),
8880 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8883 /* don't show target window by default, we want to allow testing
8884 * of behavior on first show.
8887 if (!gtk_widget_get_visible (window))
8888 gtk_widget_show (window);
8890 gtk_widget_destroy (window);
8897 typedef struct _ProgressData {
8900 GtkWidget *block_spin;
8901 GtkWidget *x_align_spin;
8902 GtkWidget *y_align_spin;
8903 GtkWidget *step_spin;
8904 GtkWidget *act_blocks_spin;
8915 progress_timeout (gpointer data)
8917 ProgressData *pdata = data;
8921 if (pdata->activity)
8923 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8925 text = g_strdup_printf ("%s", "???");
8929 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8932 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8934 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8937 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8944 destroy_progress (GtkWidget *widget,
8945 ProgressData **pdata)
8947 g_source_remove ((*pdata)->timer);
8948 (*pdata)->timer = 0;
8949 (*pdata)->window = NULL;
8955 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8957 ProgressData *pdata;
8960 pdata = (ProgressData *) data;
8962 if (!gtk_widget_get_mapped (widget))
8965 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8967 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
8968 (GtkProgressBarOrientation) i);
8972 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8976 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8977 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8981 progressbar_toggle_ellipsize (GtkWidget *widget,
8984 ProgressData *pdata = data;
8985 if (gtk_widget_is_drawable (widget))
8987 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8988 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8993 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8995 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8999 entry_changed (GtkWidget *widget, ProgressData *pdata)
9001 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
9002 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
9006 create_progress_bar (GtkWidget *widget)
9008 GtkWidget *action_area, *content_area;
9018 static ProgressData *pdata = NULL;
9020 static gchar *items1[] =
9028 static char *ellipsize_items[] = {
9029 "None", // PANGO_ELLIPSIZE_NONE,
9030 "Start", // PANGO_ELLIPSIZE_START,
9031 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
9032 "End", // PANGO_ELLIPSIZE_END
9036 pdata = g_new0 (ProgressData, 1);
9040 pdata->window = gtk_dialog_new ();
9042 gtk_window_set_screen (GTK_WINDOW (pdata->window),
9043 gtk_widget_get_screen (widget));
9045 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
9047 g_signal_connect (pdata->window, "destroy",
9048 G_CALLBACK (destroy_progress),
9052 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
9053 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
9055 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
9056 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
9058 vbox = gtk_vbox_new (FALSE, 5);
9059 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9060 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
9062 frame = gtk_frame_new ("Progress");
9063 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9065 vbox2 = gtk_vbox_new (FALSE, 5);
9066 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9068 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9069 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9071 pdata->pbar = gtk_progress_bar_new ();
9072 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
9073 PANGO_ELLIPSIZE_MIDDLE);
9075 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
9076 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
9078 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9079 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9081 hbox = gtk_hbox_new (FALSE, 5);
9082 gtk_container_add (GTK_CONTAINER (align), hbox);
9083 label = gtk_label_new ("Label updated by user :");
9084 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9085 pdata->label = gtk_label_new ("");
9086 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
9088 frame = gtk_frame_new ("Options");
9089 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9091 vbox2 = gtk_vbox_new (FALSE, 5);
9092 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9094 tab = gtk_table_new (7, 2, FALSE);
9095 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
9097 label = gtk_label_new ("Orientation :");
9098 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
9099 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9101 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9103 pdata->omenu1 = build_option_menu (items1, 4, 0,
9104 progressbar_toggle_orientation,
9106 hbox = gtk_hbox_new (FALSE, 0);
9107 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
9108 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9110 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
9112 check = gtk_check_button_new_with_label ("Show text");
9113 g_signal_connect (check, "clicked",
9114 G_CALLBACK (toggle_show_text),
9116 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
9117 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9120 hbox = gtk_hbox_new (FALSE, 0);
9121 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
9122 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9125 label = gtk_label_new ("Text: ");
9126 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9128 pdata->entry = gtk_entry_new ();
9129 g_signal_connect (pdata->entry, "changed",
9130 G_CALLBACK (entry_changed),
9132 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
9133 gtk_widget_set_size_request (pdata->entry, 100, -1);
9135 label = gtk_label_new ("Ellipsize text :");
9136 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
9137 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9139 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9140 pdata->elmenu = build_option_menu (ellipsize_items,
9141 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
9142 2, // PANGO_ELLIPSIZE_MIDDLE
9143 progressbar_toggle_ellipsize,
9145 hbox = gtk_hbox_new (FALSE, 0);
9146 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
9147 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9149 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
9151 check = gtk_check_button_new_with_label ("Activity mode");
9152 g_signal_connect (check, "clicked",
9153 G_CALLBACK (toggle_activity_mode), pdata);
9154 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
9155 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9158 button = gtk_button_new_with_label ("close");
9159 g_signal_connect_swapped (button, "clicked",
9160 G_CALLBACK (gtk_widget_destroy),
9162 gtk_widget_set_can_default (button, TRUE);
9163 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9164 gtk_widget_grab_default (button);
9167 if (!gtk_widget_get_visible (pdata->window))
9168 gtk_widget_show_all (pdata->window);
9170 gtk_widget_destroy (pdata->window);
9182 GtkWidget *res_widget;
9186 find_widget (GtkWidget *widget, FindWidgetData *data)
9188 GtkAllocation new_allocation;
9192 new_allocation = widget->allocation;
9194 if (data->found || !gtk_widget_get_mapped (widget))
9197 /* Note that in the following code, we only count the
9198 * position as being inside a WINDOW widget if it is inside
9199 * widget->window; points that are outside of widget->window
9200 * but within the allocation are not counted. This is consistent
9201 * with the way we highlight drag targets.
9203 if (gtk_widget_get_has_window (widget))
9205 new_allocation.x = 0;
9206 new_allocation.y = 0;
9209 if (widget->parent && !data->first)
9211 GdkWindow *window = widget->window;
9212 while (window != widget->parent->window)
9214 gint tx, ty, twidth, theight;
9215 gdk_drawable_get_size (window, &twidth, &theight);
9217 if (new_allocation.x < 0)
9219 new_allocation.width += new_allocation.x;
9220 new_allocation.x = 0;
9222 if (new_allocation.y < 0)
9224 new_allocation.height += new_allocation.y;
9225 new_allocation.y = 0;
9227 if (new_allocation.x + new_allocation.width > twidth)
9228 new_allocation.width = twidth - new_allocation.x;
9229 if (new_allocation.y + new_allocation.height > theight)
9230 new_allocation.height = theight - new_allocation.y;
9232 gdk_window_get_position (window, &tx, &ty);
9233 new_allocation.x += tx;
9235 new_allocation.y += ty;
9238 window = gdk_window_get_parent (window);
9242 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
9243 (data->x < new_allocation.x + new_allocation.width) &&
9244 (data->y < new_allocation.y + new_allocation.height))
9246 /* First, check if the drag is in a valid drop site in
9247 * one of our children
9249 if (GTK_IS_CONTAINER (widget))
9251 FindWidgetData new_data = *data;
9253 new_data.x -= x_offset;
9254 new_data.y -= y_offset;
9255 new_data.found = FALSE;
9256 new_data.first = FALSE;
9258 gtk_container_forall (GTK_CONTAINER (widget),
9259 (GtkCallback)find_widget,
9262 data->found = new_data.found;
9264 data->res_widget = new_data.res_widget;
9267 /* If not, and this widget is registered as a drop site, check to
9268 * emit "drag_motion" to check if we are actually in
9274 data->res_widget = widget;
9280 find_widget_at_pointer (GdkDisplay *display)
9282 GtkWidget *widget = NULL;
9283 GdkWindow *pointer_window;
9285 FindWidgetData data;
9287 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
9291 gpointer widget_ptr;
9293 gdk_window_get_user_data (pointer_window, &widget_ptr);
9294 widget = widget_ptr;
9299 gdk_window_get_pointer (widget->window,
9307 find_widget (widget, &data);
9309 return data.res_widget;
9315 struct PropertiesData {
9323 destroy_properties (GtkWidget *widget,
9324 struct PropertiesData *data)
9328 *data->window = NULL;
9329 data->window = NULL;
9334 gdk_cursor_unref (data->cursor);
9335 data->cursor = NULL;
9340 g_signal_handler_disconnect (widget, data->handler);
9348 property_query_event (GtkWidget *widget,
9350 struct PropertiesData *data)
9352 GtkWidget *res_widget = NULL;
9354 if (!data->in_query)
9357 if (event->type == GDK_BUTTON_RELEASE)
9359 gtk_grab_remove (widget);
9360 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9363 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9366 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
9367 gtk_widget_get_screen (widget));
9368 create_prop_editor (G_OBJECT (res_widget), 0);
9371 data->in_query = FALSE;
9378 query_properties (GtkButton *button,
9379 struct PropertiesData *data)
9383 g_signal_connect (button, "event",
9384 G_CALLBACK (property_query_event), data);
9388 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9391 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9393 GDK_BUTTON_RELEASE_MASK,
9398 gtk_grab_add (GTK_WIDGET (button));
9400 data->in_query = TRUE;
9404 create_properties (GtkWidget *widget)
9406 static GtkWidget *window = NULL;
9410 struct PropertiesData *data;
9412 data = g_new (struct PropertiesData, 1);
9413 data->window = &window;
9414 data->in_query = FALSE;
9415 data->cursor = NULL;
9420 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9422 gtk_window_set_screen (GTK_WINDOW (window),
9423 gtk_widget_get_screen (widget));
9425 data->handler = g_signal_connect (window, "destroy",
9426 G_CALLBACK (destroy_properties),
9429 gtk_window_set_title (GTK_WINDOW (window), "test properties");
9430 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9432 vbox = gtk_vbox_new (FALSE, 1);
9433 gtk_container_add (GTK_CONTAINER (window), vbox);
9435 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9436 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9438 button = gtk_button_new_with_label ("Query properties");
9439 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9440 g_signal_connect (button, "clicked",
9441 G_CALLBACK (query_properties),
9445 if (!gtk_widget_get_visible (window))
9446 gtk_widget_show_all (window);
9448 gtk_widget_destroy (window);
9452 struct SnapshotData {
9453 GtkWidget *toplevel_button;
9457 gboolean is_toplevel;
9462 destroy_snapshot_data (GtkWidget *widget,
9463 struct SnapshotData *data)
9466 *data->window = NULL;
9470 gdk_cursor_unref (data->cursor);
9471 data->cursor = NULL;
9476 g_signal_handler_disconnect (widget, data->handler);
9484 snapshot_widget_event (GtkWidget *widget,
9486 struct SnapshotData *data)
9488 GtkWidget *res_widget = NULL;
9490 if (!data->in_query)
9493 if (event->type == GDK_BUTTON_RELEASE)
9495 gtk_grab_remove (widget);
9496 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9499 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9500 if (data->is_toplevel && res_widget)
9501 res_widget = gtk_widget_get_toplevel (res_widget);
9505 GtkWidget *window, *image;
9507 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9508 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9509 gtk_widget_realize (window);
9510 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
9512 /* this branch is needed to convert ARGB -> RGB */
9515 gdk_drawable_get_size (pixmap, &width, &height);
9516 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9517 gtk_widget_get_colormap (res_widget),
9521 image = gtk_image_new_from_pixbuf (pixbuf);
9522 g_object_unref (pixbuf);
9525 image = gtk_image_new_from_pixmap (pixmap, NULL);
9526 gtk_container_add (GTK_CONTAINER (window), image);
9527 g_object_unref (pixmap);
9528 gtk_widget_show_all (window);
9531 data->in_query = FALSE;
9538 snapshot_widget (GtkButton *button,
9539 struct SnapshotData *data)
9543 g_signal_connect (button, "event",
9544 G_CALLBACK (snapshot_widget_event), data);
9546 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
9549 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9552 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9554 GDK_BUTTON_RELEASE_MASK,
9559 gtk_grab_add (GTK_WIDGET (button));
9561 data->in_query = TRUE;
9565 create_snapshot (GtkWidget *widget)
9567 static GtkWidget *window = NULL;
9570 struct SnapshotData *data;
9572 data = g_new (struct SnapshotData, 1);
9573 data->window = &window;
9574 data->in_query = FALSE;
9575 data->cursor = NULL;
9580 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9582 gtk_window_set_screen (GTK_WINDOW (window),
9583 gtk_widget_get_screen (widget));
9585 data->handler = g_signal_connect (window, "destroy",
9586 G_CALLBACK (destroy_snapshot_data),
9589 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9590 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9592 vbox = gtk_vbox_new (FALSE, 1);
9593 gtk_container_add (GTK_CONTAINER (window), vbox);
9595 button = gtk_button_new_with_label ("Snapshot widget");
9596 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9597 g_signal_connect (button, "clicked",
9598 G_CALLBACK (snapshot_widget),
9601 button = gtk_button_new_with_label ("Snapshot toplevel");
9602 data->toplevel_button = button;
9603 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9604 g_signal_connect (button, "clicked",
9605 G_CALLBACK (snapshot_widget),
9609 if (!gtk_widget_get_visible (window))
9610 gtk_widget_show_all (window);
9612 gtk_widget_destroy (window);
9621 selection_test_received (GtkWidget *tree_view,
9622 GtkSelectionData *data)
9624 GtkTreeModel *model;
9625 GtkListStore *store;
9629 if (data->length < 0)
9631 g_print ("Selection retrieval failed\n");
9634 if (data->type != GDK_SELECTION_TYPE_ATOM)
9636 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9640 /* Clear out any current list items */
9642 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9643 store = GTK_LIST_STORE (model);
9644 gtk_list_store_clear (store);
9646 /* Add new items to list */
9648 atoms = (GdkAtom *)data->data;
9650 l = data->length / sizeof (GdkAtom);
9651 for (i = 0; i < l; i++)
9656 name = gdk_atom_name (atoms[i]);
9659 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9663 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9670 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9672 static GdkAtom targets_atom = GDK_NONE;
9674 if (targets_atom == GDK_NONE)
9675 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9677 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9682 create_selection_test (GtkWidget *widget)
9684 static GtkWidget *window = NULL;
9685 GtkWidget *action_area, *content_area;
9688 GtkWidget *scrolled_win;
9689 GtkListStore* store;
9690 GtkWidget *tree_view;
9691 GtkTreeViewColumn *column;
9692 GtkCellRenderer *renderer;
9697 window = gtk_dialog_new ();
9699 gtk_window_set_screen (GTK_WINDOW (window),
9700 gtk_widget_get_screen (widget));
9702 g_signal_connect (window, "destroy",
9703 G_CALLBACK (gtk_widget_destroyed),
9706 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9707 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9709 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9710 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9712 /* Create the list */
9714 vbox = gtk_vbox_new (FALSE, 5);
9715 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9716 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9718 label = gtk_label_new ("Gets available targets for current selection");
9719 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9721 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9722 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9723 GTK_POLICY_AUTOMATIC,
9724 GTK_POLICY_AUTOMATIC);
9725 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9726 gtk_widget_set_size_request (scrolled_win, 100, 200);
9728 store = gtk_list_store_new (1, G_TYPE_STRING);
9729 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9730 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9732 renderer = gtk_cell_renderer_text_new ();
9733 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9735 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9737 g_signal_connect (tree_view, "selection_received",
9738 G_CALLBACK (selection_test_received), NULL);
9740 /* .. And create some buttons */
9741 button = gtk_button_new_with_label ("Get Targets");
9742 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9744 g_signal_connect (button, "clicked",
9745 G_CALLBACK (selection_test_get_targets), tree_view);
9747 button = gtk_button_new_with_label ("Quit");
9748 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9750 g_signal_connect_swapped (button, "clicked",
9751 G_CALLBACK (gtk_widget_destroy),
9755 if (!gtk_widget_get_visible (window))
9756 gtk_widget_show_all (window);
9758 gtk_widget_destroy (window);
9765 static int scroll_test_pos = 0.0;
9768 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9772 gint imin, imax, jmin, jmax;
9774 imin = (event->area.x) / 10;
9775 imax = (event->area.x + event->area.width + 9) / 10;
9777 jmin = ((int)adj->value + event->area.y) / 10;
9778 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9780 gdk_window_clear_area (widget->window,
9781 event->area.x, event->area.y,
9782 event->area.width, event->area.height);
9784 for (i=imin; i<imax; i++)
9785 for (j=jmin; j<jmax; j++)
9787 gdk_draw_rectangle (widget->window,
9788 widget->style->black_gc,
9790 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9796 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9799 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9800 -adj->page_increment / 2:
9801 adj->page_increment / 2);
9802 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9803 gtk_adjustment_set_value (adj, new_value);
9809 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9812 adj->page_increment = 0.9 * widget->allocation.height;
9813 adj->page_size = widget->allocation.height;
9815 g_signal_emit_by_name (adj, "changed");
9819 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9821 /* gint source_min = (int)adj->value - scroll_test_pos; */
9824 dy = scroll_test_pos - (int)adj->value;
9825 scroll_test_pos = adj->value;
9827 if (!gtk_widget_is_drawable (widget))
9829 gdk_window_scroll (widget->window, 0, dy);
9830 gdk_window_process_updates (widget->window, FALSE);
9835 create_scroll_test (GtkWidget *widget)
9837 static GtkWidget *window = NULL;
9838 GtkWidget *action_area, *content_area;
9840 GtkWidget *drawing_area;
9841 GtkWidget *scrollbar;
9844 GdkGeometry geometry;
9845 GdkWindowHints geometry_mask;
9849 window = gtk_dialog_new ();
9851 gtk_window_set_screen (GTK_WINDOW (window),
9852 gtk_widget_get_screen (widget));
9854 g_signal_connect (window, "destroy",
9855 G_CALLBACK (gtk_widget_destroyed),
9858 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9859 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9861 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9862 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9864 hbox = gtk_hbox_new (FALSE, 0);
9865 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9866 gtk_widget_show (hbox);
9868 drawing_area = gtk_drawing_area_new ();
9869 gtk_widget_set_size_request (drawing_area, 200, 200);
9870 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9871 gtk_widget_show (drawing_area);
9873 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9875 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9876 scroll_test_pos = 0.0;
9878 scrollbar = gtk_vscrollbar_new (adj);
9879 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9880 gtk_widget_show (scrollbar);
9882 g_signal_connect (drawing_area, "expose_event",
9883 G_CALLBACK (scroll_test_expose), adj);
9884 g_signal_connect (drawing_area, "configure_event",
9885 G_CALLBACK (scroll_test_configure), adj);
9886 g_signal_connect (drawing_area, "scroll_event",
9887 G_CALLBACK (scroll_test_scroll), adj);
9889 g_signal_connect (adj, "value_changed",
9890 G_CALLBACK (scroll_test_adjustment_changed),
9893 /* .. And create some buttons */
9895 button = gtk_button_new_with_label ("Quit");
9896 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9898 g_signal_connect_swapped (button, "clicked",
9899 G_CALLBACK (gtk_widget_destroy),
9901 gtk_widget_show (button);
9903 /* Set up gridded geometry */
9905 geometry_mask = GDK_HINT_MIN_SIZE |
9906 GDK_HINT_BASE_SIZE |
9907 GDK_HINT_RESIZE_INC;
9909 geometry.min_width = 20;
9910 geometry.min_height = 20;
9911 geometry.base_width = 0;
9912 geometry.base_height = 0;
9913 geometry.width_inc = 10;
9914 geometry.height_inc = 10;
9916 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9917 drawing_area, &geometry, geometry_mask);
9920 if (!gtk_widget_get_visible (window))
9921 gtk_widget_show (window);
9923 gtk_widget_destroy (window);
9930 static int timer = 0;
9933 timeout_test (GtkWidget *label)
9935 static int count = 0;
9936 static char buffer[32];
9938 sprintf (buffer, "count: %d", ++count);
9939 gtk_label_set_text (GTK_LABEL (label), buffer);
9945 start_timeout_test (GtkWidget *widget,
9950 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9955 stop_timeout_test (GtkWidget *widget,
9960 g_source_remove (timer);
9966 destroy_timeout_test (GtkWidget *widget,
9969 stop_timeout_test (NULL, NULL);
9975 create_timeout_test (GtkWidget *widget)
9977 static GtkWidget *window = NULL;
9978 GtkWidget *action_area, *content_area;
9984 window = gtk_dialog_new ();
9986 gtk_window_set_screen (GTK_WINDOW (window),
9987 gtk_widget_get_screen (widget));
9989 g_signal_connect (window, "destroy",
9990 G_CALLBACK (destroy_timeout_test),
9993 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9994 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9996 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9997 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9999 label = gtk_label_new ("count: 0");
10000 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10001 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
10002 gtk_widget_show (label);
10004 button = gtk_button_new_with_label ("close");
10005 g_signal_connect_swapped (button, "clicked",
10006 G_CALLBACK (gtk_widget_destroy),
10008 gtk_widget_set_can_default (button, TRUE);
10009 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10010 gtk_widget_grab_default (button);
10011 gtk_widget_show (button);
10013 button = gtk_button_new_with_label ("start");
10014 g_signal_connect (button, "clicked",
10015 G_CALLBACK(start_timeout_test),
10017 gtk_widget_set_can_default (button, TRUE);
10018 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10019 gtk_widget_show (button);
10021 button = gtk_button_new_with_label ("stop");
10022 g_signal_connect (button, "clicked",
10023 G_CALLBACK (stop_timeout_test),
10025 gtk_widget_set_can_default (button, TRUE);
10026 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10027 gtk_widget_show (button);
10030 if (!gtk_widget_get_visible (window))
10031 gtk_widget_show (window);
10033 gtk_widget_destroy (window);
10040 static int idle_id = 0;
10043 idle_test (GtkWidget *label)
10045 static int count = 0;
10046 static char buffer[32];
10048 sprintf (buffer, "count: %d", ++count);
10049 gtk_label_set_text (GTK_LABEL (label), buffer);
10055 start_idle_test (GtkWidget *widget,
10060 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
10065 stop_idle_test (GtkWidget *widget,
10070 g_source_remove (idle_id);
10076 destroy_idle_test (GtkWidget *widget,
10077 GtkWidget **window)
10079 stop_idle_test (NULL, NULL);
10085 toggle_idle_container (GObject *button,
10086 GtkContainer *container)
10088 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
10092 create_idle_test (GtkWidget *widget)
10094 static GtkWidget *window = NULL;
10097 GtkWidget *container;
10101 GtkWidget *action_area, *content_area;
10102 GtkWidget *button2;
10106 window = gtk_dialog_new ();
10108 gtk_window_set_screen (GTK_WINDOW (window),
10109 gtk_widget_get_screen (widget));
10111 g_signal_connect (window, "destroy",
10112 G_CALLBACK (destroy_idle_test),
10115 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10116 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10118 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
10119 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10121 label = gtk_label_new ("count: 0");
10122 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10123 gtk_widget_show (label);
10126 g_object_new (GTK_TYPE_HBOX,
10128 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
10129 * "GtkWidget::visible", TRUE,
10134 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
10137 g_object_new (GTK_TYPE_FRAME,
10139 "label", "Label Container",
10141 "parent", content_area,
10144 g_object_new (GTK_TYPE_VBOX,
10149 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
10150 "label", "Resize-Parent",
10151 "user_data", (void*)GTK_RESIZE_PARENT,
10155 "signal::clicked", toggle_idle_container, container,
10157 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
10158 "label", "Resize-Queue",
10159 "user_data", (void*)GTK_RESIZE_QUEUE,
10164 g_object_connect (button,
10165 "signal::clicked", toggle_idle_container, container,
10167 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
10168 "label", "Resize-Immediate",
10169 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
10171 g_object_connect (button2,
10172 "signal::clicked", toggle_idle_container, container,
10174 g_object_set (button2,
10180 button = gtk_button_new_with_label ("close");
10181 g_signal_connect_swapped (button, "clicked",
10182 G_CALLBACK (gtk_widget_destroy),
10184 gtk_widget_set_can_default (button, TRUE);
10185 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10186 gtk_widget_grab_default (button);
10187 gtk_widget_show (button);
10189 button = gtk_button_new_with_label ("start");
10190 g_signal_connect (button, "clicked",
10191 G_CALLBACK (start_idle_test),
10193 gtk_widget_set_can_default (button, TRUE);
10194 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10195 gtk_widget_show (button);
10197 button = gtk_button_new_with_label ("stop");
10198 g_signal_connect (button, "clicked",
10199 G_CALLBACK (stop_idle_test),
10201 gtk_widget_set_can_default (button, TRUE);
10202 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10203 gtk_widget_show (button);
10206 if (!gtk_widget_get_visible (window))
10207 gtk_widget_show (window);
10209 gtk_widget_destroy (window);
10217 reload_all_rc_files (void)
10219 static GdkAtom atom_rcfiles = GDK_NONE;
10221 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
10225 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
10227 for(i = 0; i < 5; i++)
10228 send_event->client.data.l[i] = 0;
10229 send_event->client.data_format = 32;
10230 send_event->client.message_type = atom_rcfiles;
10231 gdk_event_send_clientmessage_toall (send_event);
10233 gdk_event_free (send_event);
10237 create_rc_file (GtkWidget *widget)
10239 static GtkWidget *window = NULL;
10240 GtkWidget *action_area, *content_area;
10248 window = gtk_dialog_new ();
10250 gtk_window_set_screen (GTK_WINDOW (window),
10251 gtk_widget_get_screen (widget));
10253 g_signal_connect (window, "destroy",
10254 G_CALLBACK (gtk_widget_destroyed),
10257 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10258 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10260 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
10261 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
10263 vbox = gtk_vbox_new (FALSE, 0);
10264 gtk_container_add (GTK_CONTAINER (frame), vbox);
10266 label = gtk_label_new ("This label should be red");
10267 gtk_widget_set_name (label, "testgtk-red-label");
10268 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10270 label = gtk_label_new ("This label should be green");
10271 gtk_widget_set_name (label, "testgtk-green-label");
10272 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10274 label = gtk_label_new ("This label should be blue");
10275 gtk_widget_set_name (label, "testgtk-blue-label");
10276 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10278 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
10279 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10281 button = gtk_button_new_with_label ("Reload");
10282 g_signal_connect (button, "clicked",
10283 G_CALLBACK (gtk_rc_reparse_all), NULL);
10284 gtk_widget_set_can_default (button, TRUE);
10285 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10286 gtk_widget_grab_default (button);
10288 button = gtk_button_new_with_label ("Reload All");
10289 g_signal_connect (button, "clicked",
10290 G_CALLBACK (reload_all_rc_files), NULL);
10291 gtk_widget_set_can_default (button, TRUE);
10292 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10294 button = gtk_button_new_with_label ("Close");
10295 g_signal_connect_swapped (button, "clicked",
10296 G_CALLBACK (gtk_widget_destroy),
10298 gtk_widget_set_can_default (button, TRUE);
10299 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10302 if (!gtk_widget_get_visible (window))
10303 gtk_widget_show_all (window);
10305 gtk_widget_destroy (window);
10309 * Test of recursive mainloop
10313 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
10320 create_mainloop (GtkWidget *widget)
10322 static GtkWidget *window = NULL;
10323 GtkWidget *action_area, *content_area;
10329 window = gtk_dialog_new ();
10331 gtk_window_set_screen (GTK_WINDOW (window),
10332 gtk_widget_get_screen (widget));
10334 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
10336 g_signal_connect (window, "destroy",
10337 G_CALLBACK (mainloop_destroyed),
10340 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10341 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10343 label = gtk_label_new ("In recursive main loop...");
10344 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
10346 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
10347 gtk_widget_show (label);
10349 button = gtk_button_new_with_label ("Leave");
10350 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
10352 g_signal_connect_swapped (button, "clicked",
10353 G_CALLBACK (gtk_widget_destroy),
10356 gtk_widget_set_can_default (button, TRUE);
10357 gtk_widget_grab_default (button);
10359 gtk_widget_show (button);
10362 if (!gtk_widget_get_visible (window))
10364 gtk_widget_show (window);
10366 g_print ("create_mainloop: start\n");
10368 g_print ("create_mainloop: done\n");
10371 gtk_widget_destroy (window);
10375 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
10378 GdkWindow *bin_window;
10380 gint imin, imax, jmin, jmax;
10382 layout = GTK_LAYOUT (widget);
10384 bin_window = gtk_layout_get_bin_window (layout);
10386 if (event->window != bin_window)
10389 imin = (event->area.x) / 10;
10390 imax = (event->area.x + event->area.width + 9) / 10;
10392 jmin = (event->area.y) / 10;
10393 jmax = (event->area.y + event->area.height + 9) / 10;
10395 for (i=imin; i<imax; i++)
10396 for (j=jmin; j<jmax; j++)
10398 gdk_draw_rectangle (bin_window,
10399 widget->style->black_gc,
10407 void create_layout (GtkWidget *widget)
10409 GtkAdjustment *hadjustment, *vadjustment;
10411 static GtkWidget *window = NULL;
10412 GtkWidget *layout_widget;
10413 GtkWidget *scrolledwindow;
10422 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10423 gtk_window_set_screen (GTK_WINDOW (window),
10424 gtk_widget_get_screen (widget));
10426 g_signal_connect (window, "destroy",
10427 G_CALLBACK (gtk_widget_destroyed),
10430 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10431 gtk_widget_set_size_request (window, 200, 200);
10433 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10434 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10436 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10437 GTK_CORNER_TOP_RIGHT);
10439 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10441 layout_widget = gtk_layout_new (NULL, NULL);
10442 layout = GTK_LAYOUT (layout_widget);
10443 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
10445 /* We set step sizes here since GtkLayout does not set
10448 hadjustment = gtk_layout_get_hadjustment (layout);
10449 vadjustment = gtk_layout_get_vadjustment (layout);
10450 gtk_adjustment_set_step_increment (hadjustment, 10.0);
10451 gtk_adjustment_set_step_increment (vadjustment, 10.0);
10452 gtk_layout_set_hadjustment (layout, hadjustment);
10453 gtk_layout_set_vadjustment (layout, vadjustment);
10455 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
10456 g_signal_connect (layout, "expose_event",
10457 G_CALLBACK (layout_expose_handler), NULL);
10459 gtk_layout_set_size (layout, 1600, 128000);
10461 for (i=0 ; i < 16 ; i++)
10462 for (j=0 ; j < 16 ; j++)
10464 sprintf(buf, "Button %d, %d", i, j);
10466 button = gtk_button_new_with_label (buf);
10468 button = gtk_label_new (buf);
10470 gtk_layout_put (layout, button, j*100, i*100);
10473 for (i=16; i < 1280; i++)
10475 sprintf(buf, "Button %d, %d", i, 0);
10477 button = gtk_button_new_with_label (buf);
10479 button = gtk_label_new (buf);
10481 gtk_layout_put (layout, button, 0, i*100);
10485 if (!gtk_widget_get_visible (window))
10486 gtk_widget_show_all (window);
10488 gtk_widget_destroy (window);
10492 create_styles (GtkWidget *widget)
10494 static GtkWidget *window = NULL;
10495 GtkWidget *content_area, *action_area;
10500 static GdkColor red = { 0, 0xffff, 0, 0 };
10501 static GdkColor green = { 0, 0, 0xffff, 0 };
10502 static GdkColor blue = { 0, 0, 0, 0xffff };
10503 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10504 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10505 PangoFontDescription *font_desc;
10507 GtkRcStyle *rc_style;
10511 window = gtk_dialog_new ();
10512 gtk_window_set_screen (GTK_WINDOW (window),
10513 gtk_widget_get_screen (widget));
10515 g_signal_connect (window, "destroy",
10516 G_CALLBACK (gtk_widget_destroyed),
10519 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10520 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10522 button = gtk_button_new_with_label ("Close");
10523 g_signal_connect_swapped (button, "clicked",
10524 G_CALLBACK (gtk_widget_destroy),
10526 gtk_widget_set_can_default (button, TRUE);
10527 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10528 gtk_widget_show (button);
10530 vbox = gtk_vbox_new (FALSE, 5);
10531 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10532 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
10534 label = gtk_label_new ("Font:");
10535 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10536 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10538 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10540 button = gtk_button_new_with_label ("Some Text");
10541 gtk_widget_modify_font (gtk_bin_get_child (GTK_BIN (button)),
10543 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10545 label = gtk_label_new ("Foreground:");
10546 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10547 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10549 button = gtk_button_new_with_label ("Some Text");
10550 gtk_widget_modify_fg (gtk_bin_get_child (GTK_BIN (button)),
10551 GTK_STATE_NORMAL, &red);
10552 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10554 label = gtk_label_new ("Background:");
10555 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10556 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10558 button = gtk_button_new_with_label ("Some Text");
10559 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10560 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10562 label = gtk_label_new ("Text:");
10563 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10564 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10566 entry = gtk_entry_new ();
10567 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10568 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10569 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10571 label = gtk_label_new ("Base:");
10572 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10573 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10575 entry = gtk_entry_new ();
10576 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10577 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10578 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10580 label = gtk_label_new ("Cursor:");
10581 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10582 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10584 entry = gtk_entry_new ();
10585 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10586 gtk_widget_modify_cursor (entry, &red, &red);
10587 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10589 label = gtk_label_new ("Multiple:");
10590 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10591 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10593 button = gtk_button_new_with_label ("Some Text");
10595 rc_style = gtk_rc_style_new ();
10597 rc_style->font_desc = pango_font_description_copy (font_desc);
10598 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10599 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10600 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10601 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10602 rc_style->bg[GTK_STATE_NORMAL] = blue;
10603 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10604 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10605 rc_style->fg[GTK_STATE_ACTIVE] = red;
10606 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10607 rc_style->xthickness = 5;
10608 rc_style->ythickness = 5;
10610 gtk_widget_modify_style (button, rc_style);
10611 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
10613 g_object_unref (rc_style);
10615 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10618 if (!gtk_widget_get_visible (window))
10619 gtk_widget_show_all (window);
10621 gtk_widget_destroy (window);
10625 * Main Window and Exit
10629 do_exit (GtkWidget *widget, GtkWidget *window)
10631 gtk_widget_destroy (window);
10637 void (*func) (GtkWidget *widget);
10638 gboolean do_not_benchmark;
10641 { "alpha window", create_alpha_window },
10642 { "big windows", create_big_windows },
10643 { "button box", create_button_box },
10644 { "buttons", create_buttons },
10645 { "check buttons", create_check_buttons },
10646 { "color selection", create_color_selection },
10647 { "composited window", create_composited_window },
10648 { "cursors", create_cursors },
10649 { "dialog", create_dialog },
10650 { "display & screen", create_display_screen, TRUE },
10651 { "entry", create_entry },
10652 { "event box", create_event_box },
10653 { "event watcher", create_event_watcher },
10654 { "expander", create_expander },
10655 { "flipping", create_flipping },
10656 { "focus", create_focus },
10657 { "font selection", create_font_selection },
10658 { "gridded geometry", create_gridded_geometry },
10659 { "handle box", create_handle_box },
10660 { "image from drawable", create_get_image },
10661 { "image", create_image },
10662 { "key lookup", create_key_lookup },
10663 { "labels", create_labels },
10664 { "layout", create_layout },
10665 { "menus", create_menus },
10666 { "message dialog", create_message_dialog },
10667 { "modal window", create_modal_window, TRUE },
10668 { "notebook", create_notebook },
10669 { "panes", create_panes },
10670 { "paned keyboard", create_paned_keyboard_navigation },
10671 { "pixmap", create_pixmap },
10672 { "progress bar", create_progress_bar },
10673 { "properties", create_properties },
10674 { "radio buttons", create_radio_buttons },
10675 { "range controls", create_range_controls },
10676 { "rc file", create_rc_file },
10677 { "reparent", create_reparent },
10678 { "resize grips", create_resize_grips },
10679 { "rotated label", create_rotated_label },
10680 { "rotated text", create_rotated_text },
10681 { "rulers", create_rulers },
10682 { "saved position", create_saved_position },
10683 { "scrolled windows", create_scrolled_windows },
10684 { "shapes", create_shapes },
10685 { "size groups", create_size_groups },
10686 { "snapshot", create_snapshot },
10687 { "spinbutton", create_spins },
10688 { "statusbar", create_statusbar },
10689 { "styles", create_styles },
10690 { "test idle", create_idle_test },
10691 { "test mainloop", create_mainloop, TRUE },
10692 { "test scrolling", create_scroll_test },
10693 { "test selection", create_selection_test },
10694 { "test timeout", create_timeout_test },
10695 { "toggle buttons", create_toggle_buttons },
10696 { "toolbar", create_toolbar },
10697 { "tooltips", create_tooltips },
10698 { "WM hints", create_wmhints },
10699 { "window sizing", create_window_sizing },
10700 { "window states", create_window_states }
10702 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10705 create_main_window (void)
10710 GtkWidget *scrolled_window;
10714 GtkWidget *separator;
10715 GdkGeometry geometry;
10718 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10719 gtk_widget_set_name (window, "main window");
10720 gtk_window_move (GTK_WINDOW (window), 50, 20);
10721 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10723 geometry.min_width = -1;
10724 geometry.min_height = -1;
10725 geometry.max_width = -1;
10726 geometry.max_height = G_MAXSHORT;
10727 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10729 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10731 g_signal_connect (window, "destroy",
10732 G_CALLBACK (gtk_main_quit),
10734 g_signal_connect (window, "delete-event",
10735 G_CALLBACK (gtk_false),
10738 box1 = gtk_vbox_new (FALSE, 0);
10739 gtk_container_add (GTK_CONTAINER (window), box1);
10741 if (gtk_micro_version > 0)
10746 gtk_micro_version);
10751 gtk_minor_version);
10753 label = gtk_label_new (buffer);
10754 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10755 gtk_widget_set_name (label, "testgtk-version-label");
10757 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10758 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10759 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10761 GTK_POLICY_AUTOMATIC);
10762 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10764 box2 = gtk_vbox_new (FALSE, 0);
10765 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10766 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10767 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10768 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10769 gtk_widget_show (box2);
10771 for (i = 0; i < nbuttons; i++)
10773 button = gtk_button_new_with_label (buttons[i].label);
10774 if (buttons[i].func)
10775 g_signal_connect (button,
10777 G_CALLBACK(buttons[i].func),
10780 gtk_widget_set_sensitive (button, FALSE);
10781 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10784 separator = gtk_hseparator_new ();
10785 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10787 box2 = gtk_vbox_new (FALSE, 10);
10788 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10789 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10791 button = gtk_button_new_with_mnemonic ("_Close");
10792 g_signal_connect (button, "clicked",
10793 G_CALLBACK (do_exit),
10795 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10796 gtk_widget_set_can_default (button, TRUE);
10797 gtk_widget_grab_default (button);
10799 gtk_widget_show_all (window);
10805 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10806 G_FILE_TEST_EXISTS))
10808 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10809 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10814 pad (const char *str, int to)
10816 static char buf[256];
10817 int len = strlen (str);
10820 for (i = 0; i < to; i++)
10825 memcpy (buf, str, len);
10831 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10833 fn (widget); /* on */
10834 while (g_main_context_iteration (NULL, FALSE));
10835 fn (widget); /* off */
10836 while (g_main_context_iteration (NULL, FALSE));
10840 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10846 static gboolean printed_headers = FALSE;
10848 if (!printed_headers) {
10849 g_print ("Test Iters First Other\n");
10850 g_print ("-------------------- ----- ---------- ----------\n");
10851 printed_headers = TRUE;
10854 g_get_current_time (&tv0);
10855 bench_iteration (widget, fn);
10856 g_get_current_time (&tv1);
10858 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10859 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10861 g_get_current_time (&tv0);
10862 for (n = 0; n < num - 1; n++)
10863 bench_iteration (widget, fn);
10864 g_get_current_time (&tv1);
10865 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10866 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10868 g_print ("%s %5d ", pad (name, 20), num);
10870 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10872 g_print ("%10.1f\n", dt_first);
10876 do_bench (char* what, int num)
10880 void (* fn) (GtkWidget *widget);
10882 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10884 if (g_ascii_strcasecmp (what, "ALL") == 0)
10886 for (i = 0; i < nbuttons; i++)
10888 if (!buttons[i].do_not_benchmark)
10889 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10896 for (i = 0; i < nbuttons; i++)
10898 if (strcmp (buttons[i].label, what) == 0)
10900 fn = buttons[i].func;
10906 g_print ("Can't bench: \"%s\" not found.\n", what);
10908 do_real_bench (widget, fn, buttons[i].label, num);
10915 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10920 main (int argc, char *argv[])
10922 GtkBindingSet *binding_set;
10924 gboolean done_benchmarks = FALSE;
10926 srand (time (NULL));
10930 /* Check to see if we are being run from the correct
10933 if (file_exists ("testgtkrc"))
10934 gtk_rc_add_default_file ("testgtkrc");
10935 else if (file_exists ("tests/testgtkrc"))
10936 gtk_rc_add_default_file ("tests/testgtkrc");
10938 g_warning ("Couldn't find file \"testgtkrc\".");
10940 g_set_application_name ("GTK+ Test Program");
10942 gtk_init (&argc, &argv);
10944 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10953 for (i = 1; i < argc; i++)
10955 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10962 nextarg = strchr (argv[i], '=');
10973 count = strchr (nextarg, ':');
10976 what = g_strndup (nextarg, count - nextarg);
10978 num = atoi (count);
10983 what = g_strdup (nextarg);
10985 do_bench (what, num ? num : 1);
10986 done_benchmarks = TRUE;
10991 if (done_benchmarks)
10996 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10997 gtk_binding_entry_add_signal (binding_set,
10998 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
11001 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
11003 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
11007 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
11008 " fg[NORMAL] = \"#ff0000\"\n"
11009 " font = \"Sans 18\"\n"
11011 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
11013 create_main_window ();
11019 while (g_main_context_pending (NULL))
11020 g_main_context_iteration (NULL, FALSE);
11023 while (g_main_context_pending (NULL))
11024 g_main_context_iteration (NULL, FALSE);