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;
263 buffer = g_malloc (64 * 64 * 4);
265 gdk_draw_rectangle (widget->window, widget->style->black_gc, FALSE,
267 width - 1, height - 1);
270 for (i = 0; i < 64; i++) {
271 for (j = 0; j < 64; j++) {
275 *(p++) = MIN (255, ((32 - i) * (32 - i) + (32 - j) * (32 - j)) / 8);
280 gdk_draw_rgb_32_image (widget->window, widget->style->black_gc,
281 x + 18, y + (height - 64) /2,
282 64, 64, GDK_RGB_DITHER_NORMAL, buffer, 64 * 4);
284 pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, TRUE,
285 8, 64, 64, 4 * 64, NULL, NULL);
287 gdk_draw_pixbuf (widget->window, widget->style->black_gc, pixbuf,
288 0, 0, x + width - 18 - 64, y + (height - 64) /2,
289 64, 64, GDK_RGB_DITHER_NORMAL, 0, 0);
291 g_object_unref (pixbuf);
299 build_alpha_drawing ()
303 hbox = gtk_hbox_new (FALSE, 0);
304 gtk_widget_set_size_request (hbox, 100, 100);
306 g_signal_connect (hbox, "expose-event",
307 G_CALLBACK (on_alpha_drawing_expose), NULL);
313 on_alpha_screen_changed (GtkWidget *widget,
314 GdkScreen *old_screen,
317 GdkScreen *screen = gtk_widget_get_screen (widget);
318 GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
322 colormap = gdk_screen_get_rgb_colormap (screen);
323 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
327 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
330 gtk_widget_set_colormap (widget, colormap);
334 on_composited_changed (GtkWidget *window,
337 gboolean is_composited = gtk_widget_is_composited (window);
340 gtk_label_set_text (label, "Composited");
342 gtk_label_set_text (label, "Not composited");
346 create_alpha_window (GtkWidget *widget)
348 static GtkWidget *window;
352 GtkWidget *content_area;
356 window = gtk_dialog_new_with_buttons ("Alpha Window",
357 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
361 gtk_widget_set_app_paintable (window, TRUE);
362 g_signal_connect (window, "expose-event",
363 G_CALLBACK (on_alpha_window_expose), NULL);
365 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
367 vbox = gtk_vbox_new (FALSE, 8);
368 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
369 gtk_box_pack_start (GTK_BOX (content_area), vbox,
372 label = gtk_label_new (NULL);
373 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
374 on_alpha_screen_changed (window, NULL, label);
375 g_signal_connect (window, "screen-changed",
376 G_CALLBACK (on_alpha_screen_changed), label);
378 label = gtk_label_new (NULL);
379 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
380 on_composited_changed (window, GTK_LABEL (label));
381 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
383 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
384 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_drawing (), TRUE, TRUE, 0);
386 g_signal_connect (window, "destroy",
387 G_CALLBACK (gtk_widget_destroyed),
390 g_signal_connect (window, "response",
391 G_CALLBACK (gtk_widget_destroy),
395 if (!gtk_widget_get_visible (window))
396 gtk_widget_show_all (window);
398 gtk_widget_destroy (window);
402 * Composited non-toplevel window
405 /* The expose event handler for the event box.
407 * This function simply draws a transparency onto a widget on the area
408 * for which it receives expose events. This is intended to give the
409 * event box a "transparent" background.
411 * In order for this to work properly, the widget must have an RGBA
412 * colourmap. The widget should also be set as app-paintable since it
413 * doesn't make sense for GTK to draw a background if we are drawing it
414 * (and because GTK might actually replace our transparency with its
415 * default background colour).
418 transparent_expose (GtkWidget *widget,
419 GdkEventExpose *event)
423 cr = gdk_cairo_create (widget->window);
424 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
425 gdk_cairo_region (cr, event->region);
432 /* The expose event handler for the window.
434 * This function performs the actual compositing of the event box onto
435 * the already-existing background of the window at 50% normal opacity.
437 * In this case we do not want app-paintable to be set on the widget
438 * since we want it to draw its own (red) background. Because of this,
439 * however, we must ensure that we use g_signal_register_after so that
440 * this handler is called after the red has been drawn. If it was
441 * called before then GTK would just blindly paint over our work.
444 window_expose_event (GtkWidget *widget,
445 GdkEventExpose *event)
447 cairo_region_t *region;
451 /* get our child (in this case, the event box) */
452 child = gtk_bin_get_child (GTK_BIN (widget));
454 /* create a cairo context to draw to the window */
455 cr = gdk_cairo_create (widget->window);
457 /* the source data is the (composited) event box */
458 gdk_cairo_set_source_pixmap (cr, child->window,
460 child->allocation.y);
462 /* draw no more than our expose event intersects our child */
463 region = cairo_region_create_rectangle (&child->allocation);
464 cairo_region_intersect (region, event->region);
465 gdk_cairo_region (cr, region);
468 /* composite, with a 50% opacity */
469 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
470 cairo_paint_with_alpha (cr, 0.5);
479 create_composited_window (GtkWidget *widget)
481 static GtkWidget *window;
485 GtkWidget *event, *button;
490 /* make the widgets */
491 button = gtk_button_new_with_label ("A Button");
492 event = gtk_event_box_new ();
493 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
495 g_signal_connect (window, "destroy",
496 G_CALLBACK (gtk_widget_destroyed),
499 /* put a red background on the window */
500 gdk_color_parse ("red", &red);
501 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
503 /* set the colourmap for the event box.
504 * must be done before the event box is realised.
506 screen = gtk_widget_get_screen (event);
507 rgba = gdk_screen_get_rgba_colormap (screen);
508 gtk_widget_set_colormap (event, rgba);
510 /* set our event box to have a fully-transparent background
511 * drawn on it. currently there is no way to simply tell gtk
512 * that "transparency" is the background colour for a widget.
514 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
515 g_signal_connect (event, "expose-event",
516 G_CALLBACK (transparent_expose), NULL);
518 /* put them inside one another */
519 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
520 gtk_container_add (GTK_CONTAINER (window), event);
521 gtk_container_add (GTK_CONTAINER (event), button);
523 /* realise and show everything */
524 gtk_widget_realize (button);
526 /* set the event box GdkWindow to be composited.
527 * obviously must be performed after event box is realised.
529 gdk_window_set_composited (event->window, TRUE);
531 /* set up the compositing handler.
532 * note that we do _after so that the normal (red) background is drawn
533 * by gtk before our compositing occurs.
535 g_signal_connect_after (window, "expose-event",
536 G_CALLBACK (window_expose_event), NULL);
539 if (!gtk_widget_get_visible (window))
540 gtk_widget_show_all (window);
542 gtk_widget_destroy (window);
546 * Big windows and guffaw scrolling
550 pattern_expose (GtkWidget *widget,
551 GdkEventExpose *event,
555 GdkWindow *window = event->window;
557 color = g_object_get_data (G_OBJECT (window), "pattern-color");
560 GdkGC *tmp_gc = gdk_gc_new (window);
561 gdk_gc_set_rgb_fg_color (tmp_gc, color);
563 gdk_draw_rectangle (window, tmp_gc, TRUE,
564 event->area.x, event->area.y,
565 event->area.width, event->area.height);
567 g_object_unref (tmp_gc);
574 pattern_set_bg (GtkWidget *widget,
578 static const GdkColor colors[] = {
579 { 0, 0x4444, 0x4444, 0xffff },
580 { 0, 0x8888, 0x8888, 0xffff },
581 { 0, 0xaaaa, 0xaaaa, 0xffff }
584 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
585 gdk_window_set_user_data (child, widget);
589 create_pattern (GtkWidget *widget,
600 while (2 * h <= height)
605 while (2 * w <= width)
607 if ((i + j) % 2 == 0)
612 GdkWindowAttr attributes;
614 attributes.window_type = GDK_WINDOW_CHILD;
617 attributes.width = w;
618 attributes.height = h;
619 attributes.wclass = GDK_INPUT_OUTPUT;
620 attributes.event_mask = GDK_EXPOSURE_MASK;
621 attributes.visual = gtk_widget_get_visual (widget);
622 attributes.colormap = gtk_widget_get_colormap (widget);
624 child = gdk_window_new (parent, &attributes,
625 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
627 pattern_set_bg (widget, child, level);
630 create_pattern (widget, child, level + 1, w, h);
632 gdk_window_show (child);
642 #define PATTERN_SIZE (1 << 18)
645 pattern_hadj_changed (GtkAdjustment *adj,
648 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
649 gint new_value = adj->value;
651 if (gtk_widget_get_realized (darea))
653 gdk_window_scroll (darea->window, *old_value - new_value, 0);
654 *old_value = new_value;
659 pattern_vadj_changed (GtkAdjustment *adj,
662 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
663 gint new_value = adj->value;
665 if (gtk_widget_get_realized (darea))
667 gdk_window_scroll (darea->window, 0, *old_value - new_value);
668 *old_value = new_value;
673 pattern_realize (GtkWidget *widget,
676 pattern_set_bg (widget, widget->window, 0);
677 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
681 create_big_windows (GtkWidget *widget)
683 static GtkWidget *window = NULL;
684 GtkWidget *content_area;
685 GtkWidget *darea, *table, *scrollbar;
689 static gint current_x;
690 static gint current_y;
697 window = gtk_dialog_new_with_buttons ("Big Windows",
703 gtk_window_set_screen (GTK_WINDOW (window),
704 gtk_widget_get_screen (widget));
706 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
708 g_signal_connect (window, "destroy",
709 G_CALLBACK (gtk_widget_destroyed),
712 g_signal_connect (window, "response",
713 G_CALLBACK (gtk_widget_destroy),
716 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
718 table = gtk_table_new (2, 2, FALSE);
719 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
721 darea = gtk_drawing_area_new ();
723 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
724 g_signal_connect (hadj, "value_changed",
725 G_CALLBACK (pattern_hadj_changed), darea);
726 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
728 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
729 g_signal_connect (vadj, "value_changed",
730 G_CALLBACK (pattern_vadj_changed), darea);
731 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
733 g_signal_connect (darea, "realize",
734 G_CALLBACK (pattern_realize),
736 g_signal_connect (darea, "expose_event",
737 G_CALLBACK (pattern_expose),
740 eventbox = gtk_event_box_new ();
741 gtk_table_attach (GTK_TABLE (table), eventbox,
743 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
746 gtk_container_add (GTK_CONTAINER (eventbox), darea);
748 scrollbar = gtk_hscrollbar_new (hadj);
749 gtk_table_attach (GTK_TABLE (table), scrollbar,
751 GTK_FILL | GTK_EXPAND, GTK_FILL,
754 scrollbar = gtk_vscrollbar_new (vadj);
755 gtk_table_attach (GTK_TABLE (table), scrollbar,
757 GTK_FILL, GTK_EXPAND | GTK_FILL,
762 if (!gtk_widget_get_visible (window))
763 gtk_widget_show_all (window);
765 gtk_widget_hide (window);
773 button_window (GtkWidget *widget,
776 if (!gtk_widget_get_visible (button))
777 gtk_widget_show (button);
779 gtk_widget_hide (button);
783 create_buttons (GtkWidget *widget)
785 static GtkWidget *window = NULL;
789 GtkWidget *button[10];
790 GtkWidget *separator;
794 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
795 gtk_window_set_screen (GTK_WINDOW (window),
796 gtk_widget_get_screen (widget));
798 g_signal_connect (window, "destroy",
799 G_CALLBACK (gtk_widget_destroyed),
802 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
803 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
805 box1 = gtk_vbox_new (FALSE, 0);
806 gtk_container_add (GTK_CONTAINER (window), box1);
808 table = gtk_table_new (3, 3, FALSE);
809 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
810 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
811 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
812 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
814 button[0] = gtk_button_new_with_label ("button1");
815 button[1] = gtk_button_new_with_mnemonic ("_button2");
816 button[2] = gtk_button_new_with_mnemonic ("_button3");
817 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
818 button[4] = gtk_button_new_with_label ("button5");
819 button[5] = gtk_button_new_with_label ("button6");
820 button[6] = gtk_button_new_with_label ("button7");
821 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
822 button[8] = gtk_button_new_with_label ("button9");
824 g_signal_connect (button[0], "clicked",
825 G_CALLBACK (button_window),
828 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
829 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
831 g_signal_connect (button[1], "clicked",
832 G_CALLBACK (button_window),
835 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
836 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
838 g_signal_connect (button[2], "clicked",
839 G_CALLBACK (button_window),
841 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
842 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
844 g_signal_connect (button[3], "clicked",
845 G_CALLBACK (button_window),
847 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
848 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
850 g_signal_connect (button[4], "clicked",
851 G_CALLBACK (button_window),
853 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
854 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
856 g_signal_connect (button[5], "clicked",
857 G_CALLBACK (button_window),
859 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
860 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
862 g_signal_connect (button[6], "clicked",
863 G_CALLBACK (button_window),
865 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
866 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
868 g_signal_connect (button[7], "clicked",
869 G_CALLBACK (button_window),
871 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
872 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
874 g_signal_connect (button[8], "clicked",
875 G_CALLBACK (button_window),
877 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
878 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
880 separator = gtk_hseparator_new ();
881 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
883 box2 = gtk_vbox_new (FALSE, 10);
884 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
885 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
887 button[9] = gtk_button_new_with_label ("close");
888 g_signal_connect_swapped (button[9], "clicked",
889 G_CALLBACK (gtk_widget_destroy),
891 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
892 gtk_widget_set_can_default (button[9], TRUE);
893 gtk_widget_grab_default (button[9]);
896 if (!gtk_widget_get_visible (window))
897 gtk_widget_show_all (window);
899 gtk_widget_destroy (window);
907 create_toggle_buttons (GtkWidget *widget)
909 static GtkWidget *window = NULL;
913 GtkWidget *separator;
917 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
918 gtk_window_set_screen (GTK_WINDOW (window),
919 gtk_widget_get_screen (widget));
921 g_signal_connect (window, "destroy",
922 G_CALLBACK (gtk_widget_destroyed),
925 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
926 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
928 box1 = gtk_vbox_new (FALSE, 0);
929 gtk_container_add (GTK_CONTAINER (window), box1);
931 box2 = gtk_vbox_new (FALSE, 10);
932 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
933 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
935 button = gtk_toggle_button_new_with_label ("button1");
936 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
938 button = gtk_toggle_button_new_with_label ("button2");
939 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
941 button = gtk_toggle_button_new_with_label ("button3");
942 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
944 button = gtk_toggle_button_new_with_label ("inconsistent");
945 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
946 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
948 separator = gtk_hseparator_new ();
949 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
951 box2 = gtk_vbox_new (FALSE, 10);
952 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
953 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
955 button = gtk_button_new_with_label ("close");
956 g_signal_connect_swapped (button, "clicked",
957 G_CALLBACK (gtk_widget_destroy),
959 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
960 gtk_widget_set_can_default (button, TRUE);
961 gtk_widget_grab_default (button);
964 if (!gtk_widget_get_visible (window))
965 gtk_widget_show_all (window);
967 gtk_widget_destroy (window);
971 create_widget_grid (GType widget_type)
974 GtkWidget *group_widget = NULL;
977 table = gtk_table_new (FALSE, 3, 3);
979 for (i = 0; i < 5; i++)
981 for (j = 0; j < 5; j++)
986 if (i == 0 && j == 0)
992 tmp = g_strdup_printf ("%d", j);
993 widget = gtk_label_new (tmp);
998 tmp = g_strdup_printf ("%c", 'A' + i - 1);
999 widget = gtk_label_new (tmp);
1004 widget = g_object_new (widget_type, NULL);
1006 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
1009 group_widget = widget;
1011 g_object_set (widget, "group", group_widget, NULL);
1016 gtk_table_attach (GTK_TABLE (table), widget,
1031 create_check_buttons (GtkWidget *widget)
1033 static GtkWidget *window = NULL;
1037 GtkWidget *separator;
1042 window = gtk_dialog_new_with_buttons ("Check Buttons",
1048 gtk_window_set_screen (GTK_WINDOW (window),
1049 gtk_widget_get_screen (widget));
1051 g_signal_connect (window, "destroy",
1052 G_CALLBACK (gtk_widget_destroyed),
1054 g_signal_connect (window, "response",
1055 G_CALLBACK (gtk_widget_destroy),
1058 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1060 box2 = gtk_vbox_new (FALSE, 10);
1061 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1062 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1064 button = gtk_check_button_new_with_mnemonic ("_button1");
1065 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1067 button = gtk_check_button_new_with_label ("button2");
1068 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1070 button = gtk_check_button_new_with_label ("button3");
1071 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1073 button = gtk_check_button_new_with_label ("inconsistent");
1074 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1075 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1077 separator = gtk_hseparator_new ();
1078 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1080 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
1081 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1082 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1085 if (!gtk_widget_get_visible (window))
1086 gtk_widget_show_all (window);
1088 gtk_widget_destroy (window);
1096 create_radio_buttons (GtkWidget *widget)
1098 static GtkWidget *window = NULL;
1102 GtkWidget *separator;
1107 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1113 gtk_window_set_screen (GTK_WINDOW (window),
1114 gtk_widget_get_screen (widget));
1116 g_signal_connect (window, "destroy",
1117 G_CALLBACK (gtk_widget_destroyed),
1119 g_signal_connect (window, "response",
1120 G_CALLBACK (gtk_widget_destroy),
1123 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1125 box2 = gtk_vbox_new (FALSE, 10);
1126 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1127 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1129 button = gtk_radio_button_new_with_label (NULL, "button1");
1130 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1132 button = gtk_radio_button_new_with_label (
1133 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1135 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1136 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1138 button = gtk_radio_button_new_with_label (
1139 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
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_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1147 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1149 separator = gtk_hseparator_new ();
1150 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1152 box2 = gtk_vbox_new (FALSE, 10);
1153 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1154 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1156 button = gtk_radio_button_new_with_label (NULL, "button4");
1157 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1158 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1160 button = gtk_radio_button_new_with_label (
1161 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1163 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1164 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1165 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1167 button = gtk_radio_button_new_with_label (
1168 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1170 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1171 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1173 separator = gtk_hseparator_new ();
1174 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1176 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1177 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1178 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1181 if (!gtk_widget_get_visible (window))
1182 gtk_widget_show_all (window);
1184 gtk_widget_destroy (window);
1192 create_bbox (gint horizontal,
1203 frame = gtk_frame_new (title);
1206 bbox = gtk_hbutton_box_new ();
1208 bbox = gtk_vbutton_box_new ();
1210 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1211 gtk_container_add (GTK_CONTAINER (frame), bbox);
1213 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1214 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1216 button = gtk_button_new_with_label ("OK");
1217 gtk_container_add (GTK_CONTAINER (bbox), button);
1219 button = gtk_button_new_with_label ("Cancel");
1220 gtk_container_add (GTK_CONTAINER (bbox), button);
1222 button = gtk_button_new_with_label ("Help");
1223 gtk_container_add (GTK_CONTAINER (bbox), button);
1229 create_button_box (GtkWidget *widget)
1231 static GtkWidget* window = NULL;
1232 GtkWidget *main_vbox;
1235 GtkWidget *frame_horz;
1236 GtkWidget *frame_vert;
1240 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1241 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1242 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1244 g_signal_connect (window, "destroy",
1245 G_CALLBACK (gtk_widget_destroyed),
1248 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1250 main_vbox = gtk_vbox_new (FALSE, 0);
1251 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1253 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1254 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1256 vbox = gtk_vbox_new (FALSE, 0);
1257 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1258 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1260 gtk_box_pack_start (GTK_BOX (vbox),
1261 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1264 gtk_box_pack_start (GTK_BOX (vbox),
1265 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1268 gtk_box_pack_start (GTK_BOX (vbox),
1269 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1272 gtk_box_pack_start (GTK_BOX (vbox),
1273 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1276 gtk_box_pack_start (GTK_BOX (vbox),
1277 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1280 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1281 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1283 hbox = gtk_hbox_new (FALSE, 0);
1284 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1285 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1287 gtk_box_pack_start (GTK_BOX (hbox),
1288 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1291 gtk_box_pack_start (GTK_BOX (hbox),
1292 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1295 gtk_box_pack_start (GTK_BOX (hbox),
1296 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1299 gtk_box_pack_start (GTK_BOX (hbox),
1300 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1303 gtk_box_pack_start (GTK_BOX (hbox),
1304 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1308 if (!gtk_widget_get_visible (window))
1309 gtk_widget_show_all (window);
1311 gtk_widget_destroy (window);
1319 new_pixmap (char *filename,
1321 GdkColor *background)
1327 if (strcmp (filename, "test.xpm") == 0 ||
1328 !file_exists (filename))
1330 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask,
1335 pixmap = gdk_pixmap_create_from_xpm (window, &mask,
1339 wpixmap = gtk_image_new_from_pixmap (pixmap, mask);
1346 set_toolbar_small_stock (GtkWidget *widget,
1349 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1353 set_toolbar_large_stock (GtkWidget *widget,
1356 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1360 set_toolbar_horizontal (GtkWidget *widget,
1363 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1367 set_toolbar_vertical (GtkWidget *widget,
1370 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1374 set_toolbar_icons (GtkWidget *widget,
1377 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1381 set_toolbar_text (GtkWidget *widget,
1384 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1388 set_toolbar_both (GtkWidget *widget,
1391 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1395 set_toolbar_both_horiz (GtkWidget *widget,
1398 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1402 set_toolbar_enable (GtkWidget *widget,
1405 GtkSettings *settings = gtk_widget_get_settings (widget);
1406 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1410 set_toolbar_disable (GtkWidget *widget,
1413 GtkSettings *settings = gtk_widget_get_settings (widget);
1414 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1417 static GtkActionEntry create_toolbar_items[] = {
1418 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1419 G_CALLBACK (set_toolbar_small_stock) },
1420 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1421 G_CALLBACK (set_toolbar_large_stock) },
1422 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1423 G_CALLBACK (set_toolbar_horizontal) },
1424 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1425 G_CALLBACK (set_toolbar_vertical) },
1427 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1428 G_CALLBACK (set_toolbar_icons) },
1429 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1430 G_CALLBACK (set_toolbar_text) },
1431 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1432 G_CALLBACK (set_toolbar_both) },
1433 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1434 G_CALLBACK (set_toolbar_both_horiz) },
1436 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1440 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1441 G_CALLBACK (set_toolbar_enable) },
1442 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1443 G_CALLBACK (set_toolbar_disable) },
1445 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1447 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1450 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1452 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1457 create_toolbar (GtkWidget *widget)
1459 static GtkWidget *window = NULL;
1466 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1467 gtk_window_set_screen (GTK_WINDOW (window),
1468 gtk_widget_get_screen (widget));
1470 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1472 g_signal_connect (window, "destroy",
1473 G_CALLBACK (gtk_widget_destroyed),
1476 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1477 gtk_widget_realize (window);
1479 toolbar = gtk_toolbar_new ();
1480 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1482 GtkToolItem *toolitem;
1484 if (create_toolbar_items[i].tooltip == NULL)
1485 toolitem = gtk_separator_tool_item_new ();
1486 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1490 toolitem = gtk_tool_item_new ();
1491 entry = gtk_entry_new ();
1492 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1494 else if (create_toolbar_items[i].stock_id)
1495 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1500 icon = new_pixmap ("test.xpm", window->window,
1501 &window->style->bg[GTK_STATE_NORMAL]);
1502 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1504 if (create_toolbar_items[i].callback)
1505 g_signal_connect (toolitem, "clicked",
1506 create_toolbar_items[i].callback, toolbar);
1507 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1508 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1511 gtk_container_add (GTK_CONTAINER (window), toolbar);
1513 gtk_widget_set_size_request (toolbar, 200, -1);
1516 if (!gtk_widget_get_visible (window))
1517 gtk_widget_show_all (window);
1519 gtk_widget_destroy (window);
1522 static GtkActionEntry make_toolbar_items[] = {
1523 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1524 G_CALLBACK (set_toolbar_horizontal) },
1525 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1526 G_CALLBACK (set_toolbar_vertical) },
1528 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1529 G_CALLBACK (set_toolbar_icons) },
1530 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1531 G_CALLBACK (set_toolbar_text) },
1532 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1533 G_CALLBACK (set_toolbar_both) },
1535 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1537 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1540 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1541 G_CALLBACK (set_toolbar_enable) },
1542 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1543 G_CALLBACK (set_toolbar_disable) },
1545 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1547 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1552 make_toolbar (GtkWidget *window)
1557 if (!gtk_widget_get_realized (window))
1558 gtk_widget_realize (window);
1560 toolbar = gtk_toolbar_new ();
1561 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1564 GtkToolItem *toolitem;
1566 if (make_toolbar_items[i].label == NULL)
1568 toolitem = gtk_separator_tool_item_new ();
1571 icon = new_pixmap ("test.xpm", window->window,
1572 &window->style->bg[GTK_STATE_NORMAL]);
1573 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1574 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1575 if (make_toolbar_items[i].callback != NULL)
1576 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1577 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1587 static guint statusbar_counter = 1;
1590 statusbar_push (GtkWidget *button,
1591 GtkStatusbar *statusbar)
1595 sprintf (text, "something %d", statusbar_counter++);
1597 gtk_statusbar_push (statusbar, 1, text);
1601 statusbar_push_long (GtkWidget *button,
1602 GtkStatusbar *statusbar)
1606 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\").");
1608 gtk_statusbar_push (statusbar, 1, text);
1612 statusbar_pop (GtkWidget *button,
1613 GtkStatusbar *statusbar)
1615 gtk_statusbar_pop (statusbar, 1);
1619 statusbar_steal (GtkWidget *button,
1620 GtkStatusbar *statusbar)
1622 gtk_statusbar_remove (statusbar, 1, 4);
1626 statusbar_popped (GtkStatusbar *statusbar,
1630 if (!statusbar->messages)
1631 statusbar_counter = 1;
1635 statusbar_contexts (GtkStatusbar *statusbar)
1639 string = "any context";
1640 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1642 gtk_statusbar_get_context_id (statusbar, string));
1644 string = "idle messages";
1645 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1647 gtk_statusbar_get_context_id (statusbar, string));
1649 string = "some text";
1650 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1652 gtk_statusbar_get_context_id (statusbar, string));
1654 string = "hit the mouse";
1655 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1657 gtk_statusbar_get_context_id (statusbar, string));
1659 string = "hit the mouse2";
1660 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1662 gtk_statusbar_get_context_id (statusbar, string));
1666 create_statusbar (GtkWidget *widget)
1668 static GtkWidget *window = NULL;
1672 GtkWidget *separator;
1673 GtkWidget *statusbar;
1677 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1678 gtk_window_set_screen (GTK_WINDOW (window),
1679 gtk_widget_get_screen (widget));
1681 g_signal_connect (window, "destroy",
1682 G_CALLBACK (gtk_widget_destroyed),
1685 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1686 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1688 box1 = gtk_vbox_new (FALSE, 0);
1689 gtk_container_add (GTK_CONTAINER (window), box1);
1691 box2 = gtk_vbox_new (FALSE, 10);
1692 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1693 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1695 statusbar = gtk_statusbar_new ();
1696 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1697 g_signal_connect (statusbar,
1699 G_CALLBACK (statusbar_popped),
1702 button = g_object_new (gtk_button_get_type (),
1703 "label", "push something",
1707 g_object_connect (button,
1708 "signal::clicked", statusbar_push, statusbar,
1711 button = g_object_connect (g_object_new (gtk_button_get_type (),
1716 "signal_after::clicked", statusbar_pop, statusbar,
1719 button = g_object_connect (g_object_new (gtk_button_get_type (),
1720 "label", "steal #4",
1724 "signal_after::clicked", statusbar_steal, statusbar,
1727 button = g_object_connect (g_object_new (gtk_button_get_type (),
1728 "label", "test contexts",
1732 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1735 button = g_object_connect (g_object_new (gtk_button_get_type (),
1736 "label", "push something long",
1740 "signal_after::clicked", statusbar_push_long, statusbar,
1743 separator = gtk_hseparator_new ();
1744 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1746 box2 = gtk_vbox_new (FALSE, 10);
1747 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1748 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1750 button = gtk_button_new_with_label ("close");
1751 g_signal_connect_swapped (button, "clicked",
1752 G_CALLBACK (gtk_widget_destroy),
1754 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1755 gtk_widget_set_can_default (button, TRUE);
1756 gtk_widget_grab_default (button);
1759 if (!gtk_widget_get_visible (window))
1760 gtk_widget_show_all (window);
1762 gtk_widget_destroy (window);
1768 #define GRID_SIZE 20
1769 #define DEFAULT_GEOMETRY "10x10"
1772 gridded_geometry_expose (GtkWidget *widget,
1773 GdkEventExpose *event)
1777 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
1778 0, 0, widget->allocation.width, widget->allocation.height);
1780 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
1781 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
1783 if ((i + j) % 2 == 0)
1784 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
1785 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1792 gridded_geometry_subresponse (GtkDialog *dialog,
1794 gchar *geometry_string)
1796 if (response_id == GTK_RESPONSE_NONE)
1798 gtk_widget_destroy (GTK_WIDGET (dialog));
1802 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1804 g_print ("Can't parse geometry string %s\n", geometry_string);
1805 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1811 gridded_geometry_response (GtkDialog *dialog,
1815 if (response_id == GTK_RESPONSE_NONE)
1817 gtk_widget_destroy (GTK_WIDGET (dialog));
1821 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1822 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1823 GtkWidget *content_area;
1825 GtkWidget *drawing_area;
1827 GdkGeometry geometry;
1829 window = gtk_dialog_new_with_buttons (title,
1832 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1835 gtk_window_set_screen (GTK_WINDOW (window),
1836 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1838 g_signal_connect (window, "response",
1839 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1841 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1843 box = gtk_vbox_new (FALSE, 0);
1844 gtk_box_pack_start (GTK_BOX (content_area), box, TRUE, TRUE, 0);
1846 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1848 drawing_area = gtk_drawing_area_new ();
1849 g_signal_connect (drawing_area, "expose_event",
1850 G_CALLBACK (gridded_geometry_expose), NULL);
1851 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1853 /* Gross hack to work around bug 68668... if we set the size request
1854 * large enough, then the current
1856 * request_of_window - request_of_geometry_widget
1858 * method of getting the base size works more or less works.
1860 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1862 geometry.base_width = 0;
1863 geometry.base_height = 0;
1864 geometry.min_width = 2 * GRID_SIZE;
1865 geometry.min_height = 2 * GRID_SIZE;
1866 geometry.width_inc = GRID_SIZE;
1867 geometry.height_inc = GRID_SIZE;
1869 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1871 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1873 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1875 g_print ("Can't parse geometry string %s\n", geometry_string);
1876 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1879 gtk_widget_show_all (window);
1884 create_gridded_geometry (GtkWidget *widget)
1886 static GtkWidget *window = NULL;
1887 gpointer window_ptr;
1888 GtkWidget *content_area;
1894 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1897 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1900 gtk_window_set_screen (GTK_WINDOW (window),
1901 gtk_widget_get_screen (widget));
1903 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1905 label = gtk_label_new ("Geometry string:");
1906 gtk_box_pack_start (GTK_BOX (content_area), label, FALSE, FALSE, 0);
1908 entry = gtk_entry_new ();
1909 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1910 gtk_box_pack_start (GTK_BOX (content_area), entry, FALSE, FALSE, 0);
1912 g_signal_connect (window, "response",
1913 G_CALLBACK (gridded_geometry_response), entry);
1914 window_ptr = &window;
1915 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
1917 gtk_widget_show_all (window);
1920 gtk_widget_destroy (window);
1928 handle_box_child_signal (GtkHandleBox *hb,
1930 const gchar *action)
1932 printf ("%s: child <%s> %sed\n",
1933 g_type_name (G_OBJECT_TYPE (hb)),
1934 g_type_name (G_OBJECT_TYPE (child)),
1939 create_handle_box (GtkWidget *widget)
1941 static GtkWidget* window = NULL;
1942 GtkWidget *handle_box;
1943 GtkWidget *handle_box2;
1948 GtkWidget *separator;
1952 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1954 gtk_window_set_screen (GTK_WINDOW (window),
1955 gtk_widget_get_screen (widget));
1956 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1957 gtk_window_set_title (GTK_WINDOW (window),
1959 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1961 g_signal_connect (window, "destroy",
1962 G_CALLBACK (gtk_widget_destroyed),
1965 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1967 vbox = gtk_vbox_new (FALSE, 0);
1968 gtk_container_add (GTK_CONTAINER (window), vbox);
1969 gtk_widget_show (vbox);
1971 label = gtk_label_new ("Above");
1972 gtk_container_add (GTK_CONTAINER (vbox), label);
1973 gtk_widget_show (label);
1975 separator = gtk_hseparator_new ();
1976 gtk_container_add (GTK_CONTAINER (vbox), separator);
1977 gtk_widget_show (separator);
1979 hbox = gtk_hbox_new (FALSE, 10);
1980 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1981 gtk_widget_show (hbox);
1983 separator = gtk_hseparator_new ();
1984 gtk_container_add (GTK_CONTAINER (vbox), separator);
1985 gtk_widget_show (separator);
1987 label = gtk_label_new ("Below");
1988 gtk_container_add (GTK_CONTAINER (vbox), label);
1989 gtk_widget_show (label);
1991 handle_box = gtk_handle_box_new ();
1992 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1993 g_signal_connect (handle_box,
1995 G_CALLBACK (handle_box_child_signal),
1997 g_signal_connect (handle_box,
1999 G_CALLBACK (handle_box_child_signal),
2001 gtk_widget_show (handle_box);
2003 toolbar = make_toolbar (window);
2005 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2006 gtk_widget_show (toolbar);
2008 handle_box = gtk_handle_box_new ();
2009 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2010 g_signal_connect (handle_box,
2012 G_CALLBACK (handle_box_child_signal),
2014 g_signal_connect (handle_box,
2016 G_CALLBACK (handle_box_child_signal),
2018 gtk_widget_show (handle_box);
2020 handle_box2 = gtk_handle_box_new ();
2021 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2022 g_signal_connect (handle_box2,
2024 G_CALLBACK (handle_box_child_signal),
2026 g_signal_connect (handle_box2,
2028 G_CALLBACK (handle_box_child_signal),
2030 gtk_widget_show (handle_box2);
2032 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
2033 label = gtk_label_new ("Fooo!");
2034 gtk_container_add (GTK_CONTAINER (hbox), label);
2035 gtk_widget_show (label);
2036 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
2039 if (!gtk_widget_get_visible (window))
2040 gtk_widget_show (window);
2042 gtk_widget_destroy (window);
2046 * Test for getting an image from a drawable
2057 take_snapshot (GtkWidget *button,
2060 struct GetImageData *gid = data;
2061 GdkRectangle visible;
2063 int height_fraction;
2066 GdkColor color = { 0, 30000, 0, 0 };
2067 GdkRectangle target;
2070 /* Do some begin_paint_rect on some random rects, draw some
2071 * distinctive stuff into those rects, then take the snapshot.
2072 * figure out whether any rects were overlapped and report to
2076 visible = gid->sw->allocation;
2078 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2079 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2081 width_fraction = visible.width / 4;
2082 height_fraction = visible.height / 4;
2084 gc = gdk_gc_new (gid->src->window);
2085 black_gc = gid->src->style->black_gc;
2087 gdk_gc_set_rgb_fg_color (gc, &color);
2090 target.x = visible.x + width_fraction;
2091 target.y = visible.y + height_fraction * 3;
2092 target.width = width_fraction;
2093 target.height = height_fraction / 2;
2095 gdk_window_begin_paint_rect (gid->src->window,
2098 gdk_draw_rectangle (gid->src->window,
2102 target.width, target.height);
2104 gdk_draw_rectangle (gid->src->window,
2107 target.x + 10, target.y + 10,
2108 target.width - 20, target.height - 20);
2110 target.x = visible.x + width_fraction;
2111 target.y = visible.y + height_fraction;
2112 target.width = width_fraction;
2113 target.height = height_fraction;
2115 gdk_window_begin_paint_rect (gid->src->window,
2118 gdk_draw_rectangle (gid->src->window,
2122 target.width, target.height);
2124 gdk_draw_rectangle (gid->src->window,
2127 target.x + 10, target.y + 10,
2128 target.width - 20, target.height - 20);
2130 target.x = visible.x + width_fraction * 3;
2131 target.y = visible.y + height_fraction;
2132 target.width = width_fraction / 2;
2133 target.height = height_fraction;
2135 gdk_window_begin_paint_rect (gid->src->window,
2138 gdk_draw_rectangle (gid->src->window,
2142 target.width, target.height);
2144 gdk_draw_rectangle (gid->src->window,
2147 target.x + 10, target.y + 10,
2148 target.width - 20, target.height - 20);
2150 target.x = visible.x + width_fraction * 2;
2151 target.y = visible.y + height_fraction * 2;
2152 target.width = width_fraction / 4;
2153 target.height = height_fraction / 4;
2155 gdk_window_begin_paint_rect (gid->src->window,
2158 gdk_draw_rectangle (gid->src->window,
2162 target.width, target.height);
2164 gdk_draw_rectangle (gid->src->window,
2167 target.x + 10, target.y + 10,
2168 target.width - 20, target.height - 20);
2170 target.x += target.width / 2;
2171 target.y += target.width / 2;
2173 gdk_window_begin_paint_rect (gid->src->window,
2176 gdk_draw_rectangle (gid->src->window,
2180 target.width, target.height);
2182 gdk_draw_rectangle (gid->src->window,
2185 target.x + 10, target.y + 10,
2186 target.width - 20, target.height - 20);
2188 /* Screen shot area */
2190 target.x = visible.x + width_fraction * 1.5;
2191 target.y = visible.y + height_fraction * 1.5;
2192 target.width = width_fraction * 2;
2193 target.height = height_fraction * 2;
2195 shot = gdk_drawable_get_image (gid->src->window,
2197 target.width, target.height);
2199 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2202 g_object_unref (shot);
2204 gdk_window_end_paint (gid->src->window);
2205 gdk_window_end_paint (gid->src->window);
2206 gdk_window_end_paint (gid->src->window);
2207 gdk_window_end_paint (gid->src->window);
2208 gdk_window_end_paint (gid->src->window);
2210 gdk_draw_rectangle (gid->src->window,
2211 gid->src->style->black_gc,
2214 target.width, target.height);
2216 g_object_unref (gc);
2220 image_source_expose (GtkWidget *da,
2221 GdkEventExpose *event,
2224 int x = event->area.x;
2225 GdkColor red = { 0, 65535, 0, 0 };
2226 GdkColor green = { 0, 0, 65535, 0 };
2227 GdkColor blue = { 0, 0, 0, 65535 };
2230 gc = gdk_gc_new (event->window);
2232 while (x < (event->area.x + event->area.width))
2239 gdk_gc_set_rgb_fg_color (gc, &red);
2245 gdk_gc_set_rgb_fg_color (gc, &green);
2251 gdk_gc_set_rgb_fg_color (gc, &blue);
2255 g_assert_not_reached ();
2259 gdk_draw_line (event->window,
2262 x, event->area.y + event->area.height);
2267 g_object_unref (gc);
2273 create_get_image (GtkWidget *widget)
2275 static GtkWidget *window = NULL;
2278 gtk_widget_destroy (window);
2287 struct GetImageData *gid;
2289 gid = g_new (struct GetImageData, 1);
2291 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2293 gtk_window_set_screen (GTK_WINDOW (window),
2294 gtk_widget_get_screen (widget));
2296 g_signal_connect (window,
2298 G_CALLBACK (gtk_widget_destroyed),
2301 g_object_set_data_full (G_OBJECT (window),
2302 "testgtk-get-image-data",
2306 hbox = gtk_hbox_new (FALSE, 0);
2308 gtk_container_add (GTK_CONTAINER (window), hbox);
2310 sw = gtk_scrolled_window_new (NULL, NULL);
2311 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2312 GTK_POLICY_AUTOMATIC,
2313 GTK_POLICY_AUTOMATIC);
2317 gtk_widget_set_size_request (sw, 400, 400);
2319 src = gtk_drawing_area_new ();
2320 gtk_widget_set_size_request (src, 10000, 10000);
2322 g_signal_connect (src,
2324 G_CALLBACK (image_source_expose),
2329 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2332 gtk_box_pack_start (GTK_BOX (hbox),
2336 vbox = gtk_vbox_new (FALSE, 3);
2338 snap = g_object_new (GTK_TYPE_IMAGE, NULL);
2342 sw = gtk_scrolled_window_new (NULL, NULL);
2343 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2344 GTK_POLICY_AUTOMATIC,
2345 GTK_POLICY_AUTOMATIC);
2346 gtk_widget_set_size_request (sw, 300, 300);
2348 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2350 gtk_box_pack_end (GTK_BOX (vbox), sw, FALSE, FALSE, 5);
2352 button = gtk_button_new_with_label ("Get image from drawable");
2354 g_signal_connect (button,
2356 G_CALLBACK (take_snapshot),
2359 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2361 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2363 gtk_widget_show_all (window);
2371 sensitivity_toggled (GtkWidget *toggle,
2374 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2378 create_sensitivity_control (GtkWidget *widget)
2382 button = gtk_toggle_button_new_with_label ("Sensitive");
2384 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2385 gtk_widget_is_sensitive (widget));
2387 g_signal_connect (button,
2389 G_CALLBACK (sensitivity_toggled),
2392 gtk_widget_show_all (button);
2398 set_selectable_recursive (GtkWidget *widget,
2401 if (GTK_IS_CONTAINER (widget))
2406 children = gtk_container_get_children (GTK_CONTAINER (widget));
2410 set_selectable_recursive (tmp->data, setting);
2414 g_list_free (children);
2416 else if (GTK_IS_LABEL (widget))
2418 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2423 selectable_toggled (GtkWidget *toggle,
2426 set_selectable_recursive (widget,
2427 GTK_TOGGLE_BUTTON (toggle)->active);
2431 create_selectable_control (GtkWidget *widget)
2435 button = gtk_toggle_button_new_with_label ("Selectable");
2437 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2440 g_signal_connect (button,
2442 G_CALLBACK (selectable_toggled),
2445 gtk_widget_show_all (button);
2451 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
2455 gtk_widget_destroy (dialog);
2457 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2458 "as hyperlinks, which can be clicked\n"
2459 "or activated via <a href=\"keynav\">keynav</a>.\n"
2460 "The links remain the same.";
2461 gtk_label_set_markup (label, text);
2465 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
2467 if (g_strcmp0 (uri, "keynav") == 0)
2471 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
2472 GTK_DIALOG_DESTROY_WITH_PARENT,
2475 "The term <i>keynav</i> is a shorthand for "
2476 "keyboard navigation and refers to the process of using a program "
2477 "(exclusively) via keyboard input.");
2479 gtk_window_present (GTK_WINDOW (dialog));
2481 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
2489 void create_labels (GtkWidget *widget)
2491 static GtkWidget *window = NULL;
2500 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2502 gtk_window_set_screen (GTK_WINDOW (window),
2503 gtk_widget_get_screen (widget));
2505 g_signal_connect (window, "destroy",
2506 G_CALLBACK (gtk_widget_destroyed),
2509 gtk_window_set_title (GTK_WINDOW (window), "Label");
2511 vbox = gtk_vbox_new (FALSE, 5);
2513 hbox = gtk_hbox_new (FALSE, 5);
2514 gtk_container_add (GTK_CONTAINER (window), vbox);
2516 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2518 button = create_sensitivity_control (hbox);
2520 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2522 button = create_selectable_control (hbox);
2524 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2526 vbox = gtk_vbox_new (FALSE, 5);
2528 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2529 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2531 frame = gtk_frame_new ("Normal Label");
2532 label = gtk_label_new ("This is a Normal label");
2533 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2534 gtk_container_add (GTK_CONTAINER (frame), label);
2535 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2537 frame = gtk_frame_new ("Multi-line Label");
2538 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2539 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
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 ("Left Justified Label");
2544 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2545 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
2546 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2547 gtk_container_add (GTK_CONTAINER (frame), label);
2548 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2550 frame = gtk_frame_new ("Right Justified Label");
2551 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2552 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2553 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2554 gtk_container_add (GTK_CONTAINER (frame), label);
2555 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2557 frame = gtk_frame_new ("Internationalized Label");
2558 label = gtk_label_new (NULL);
2559 gtk_label_set_markup (GTK_LABEL (label),
2560 "French (Fran\303\247ais) Bonjour, Salut\n"
2561 "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"
2562 "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"
2563 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2564 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2565 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2566 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2567 gtk_container_add (GTK_CONTAINER (frame), label);
2568 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2570 frame = gtk_frame_new ("Bidirection Label");
2571 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"
2572 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
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 ("Links in a label");
2577 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2578 "as hyperlinks, which can be clicked\n"
2579 "or activated via <a href=\"keynav\">keynav</a>");
2580 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
2581 gtk_container_add (GTK_CONTAINER (frame), label);
2582 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2583 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
2585 vbox = gtk_vbox_new (FALSE, 5);
2586 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2587 frame = gtk_frame_new ("Line wrapped label");
2588 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2589 "up the entire "/* big space to test spacing */\
2590 "width allocated to it, but automatically wraps the words to fit. "\
2591 "The time has come, for all good men, to come to the aid of their party. "\
2592 "The sixth sheik's six sheep's sick.\n"\
2593 " It supports multiple paragraphs correctly, and correctly adds "\
2594 "many extra spaces. ");
2596 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2597 gtk_container_add (GTK_CONTAINER (frame), label);
2598 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2600 frame = gtk_frame_new ("Filled, wrapped label");
2601 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2602 "up the entire width allocated to it. Here is a seneance to prove "\
2603 "my point. Here is another sentence. "\
2604 "Here comes the sun, do de do de do.\n"\
2605 " This is a new paragraph.\n"\
2606 " This is another newer, longer, better paragraph. It is coming to an end, "\
2608 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2609 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2610 gtk_container_add (GTK_CONTAINER (frame), label);
2611 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2613 frame = gtk_frame_new ("Underlined label");
2614 label = gtk_label_new ("This label is underlined!\n"
2615 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2616 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2617 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2618 gtk_container_add (GTK_CONTAINER (frame), label);
2619 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2621 frame = gtk_frame_new ("Markup label");
2622 label = gtk_label_new (NULL);
2624 /* There's also a gtk_label_set_markup() without accel if you
2625 * don't have an accelerator key
2627 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2628 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2629 "<b>markup</b> _such as "
2630 "<big><i>Big Italics</i></big>\n"
2631 "<tt>Monospace font</tt>\n"
2632 "<u>Underline!</u>\n"
2634 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2635 "and nothing on this line,\n"
2638 "or even on this one\n"
2639 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2640 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2641 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2643 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2645 gtk_container_add (GTK_CONTAINER (frame), label);
2646 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2649 if (!gtk_widget_get_visible (window))
2650 gtk_widget_show_all (window);
2652 gtk_widget_destroy (window);
2656 on_angle_scale_changed (GtkRange *range,
2659 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2663 create_rotated_label (GtkWidget *widget)
2665 static GtkWidget *window = NULL;
2666 GtkWidget *content_area;
2670 GtkWidget *scale_label;
2671 GtkWidget *scale_hbox;
2675 window = gtk_dialog_new_with_buttons ("Rotated Label",
2676 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2677 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2680 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2682 gtk_window_set_screen (GTK_WINDOW (window),
2683 gtk_widget_get_screen (widget));
2685 g_signal_connect (window, "response",
2686 G_CALLBACK (gtk_object_destroy), NULL);
2687 g_signal_connect (window, "destroy",
2688 G_CALLBACK (gtk_widget_destroyed), &window);
2690 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2692 vbox = gtk_vbox_new (FALSE, 5);
2693 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2694 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2696 label = gtk_label_new (NULL);
2697 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2698 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2700 scale_hbox = gtk_hbox_new (FALSE, 0);
2701 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2703 scale_label = gtk_label_new (NULL);
2704 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2705 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2707 hscale = gtk_hscale_new_with_range (0, 360, 5);
2708 g_signal_connect (hscale, "value-changed",
2709 G_CALLBACK (on_angle_scale_changed), label);
2711 gtk_range_set_value (GTK_RANGE (hscale), 45);
2712 gtk_widget_set_size_request (hscale, 200, -1);
2713 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2716 if (!gtk_widget_get_visible (window))
2717 gtk_widget_show_all (window);
2719 gtk_widget_destroy (window);
2722 #define DEFAULT_TEXT_RADIUS 200
2725 on_rotated_text_unrealize (GtkWidget *widget)
2727 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2731 on_rotated_text_expose (GtkWidget *widget,
2732 GdkEventExpose *event,
2733 GdkPixbuf *tile_pixbuf)
2735 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2736 "had", "10,000", "men" };
2737 PangoRenderer *renderer;
2742 PangoMatrix matrix = PANGO_MATRIX_INIT;
2743 PangoLayout *layout;
2744 PangoContext *context;
2745 PangoFontDescription *desc;
2747 gc = g_object_get_data (G_OBJECT (widget), "text-gc");
2750 static GdkColor black = { 0, 0, 0, 0 };
2752 gc = gdk_gc_new (widget->window);
2753 gdk_gc_set_rgb_fg_color (gc, &black);
2759 gint width = gdk_pixbuf_get_width (tile_pixbuf);
2760 gint height = gdk_pixbuf_get_height (tile_pixbuf);
2762 tile = gdk_pixmap_new (widget->window, width, height, -1);
2763 gdk_draw_pixbuf (tile, gc, tile_pixbuf,
2764 0, 0, 0, 0, width, height,
2765 GDK_RGB_DITHER_NORMAL, 0, 0);
2767 gdk_gc_set_tile (gc, tile);
2768 gdk_gc_set_fill (gc, GDK_TILED);
2770 g_object_unref (tile);
2773 g_object_set_data_full (G_OBJECT (widget), "text-gc", gc, (GDestroyNotify)g_object_unref);
2776 renderer = gdk_pango_renderer_get_default (gtk_widget_get_screen (widget));
2777 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), widget->window);
2778 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), gc);
2780 radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
2782 pango_matrix_translate (&matrix,
2783 radius + (widget->allocation.width - 2 * radius) / 2,
2784 radius + (widget->allocation.height - 2 * radius) / 2);
2785 pango_matrix_scale (&matrix, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2787 context = gtk_widget_get_pango_context (widget);
2788 layout = pango_layout_new (context);
2789 desc = pango_font_description_from_string ("Sans Bold 30");
2790 pango_layout_set_font_description (layout, desc);
2791 pango_font_description_free (desc);
2793 n_words = G_N_ELEMENTS (words);
2794 for (i = 0; i < n_words; i++)
2796 PangoMatrix rotated_matrix = matrix;
2799 pango_matrix_rotate (&rotated_matrix, - (360. * i) / n_words);
2801 pango_context_set_matrix (context, &rotated_matrix);
2802 pango_layout_context_changed (layout);
2803 pango_layout_set_text (layout, words[i], -1);
2805 pango_layout_get_size (layout, &width, &height);
2807 pango_renderer_draw_layout (renderer, layout,
2808 - width / 2, - DEFAULT_TEXT_RADIUS * PANGO_SCALE);
2811 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL);
2812 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL);
2814 g_object_unref (layout);
2820 create_rotated_text (GtkWidget *widget)
2822 static GtkWidget *window = NULL;
2826 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
2827 GtkRequisition requisition;
2828 GtkWidget *content_area;
2829 GtkWidget *drawing_area;
2830 GdkPixbuf *tile_pixbuf;
2832 window = gtk_dialog_new_with_buttons ("Rotated Text",
2833 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2834 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2837 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2839 gtk_window_set_screen (GTK_WINDOW (window),
2840 gtk_widget_get_screen (widget));
2842 g_signal_connect (window, "response",
2843 G_CALLBACK (gtk_object_destroy), NULL);
2844 g_signal_connect (window, "destroy",
2845 G_CALLBACK (gtk_widget_destroyed), &window);
2847 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2849 drawing_area = gtk_drawing_area_new ();
2850 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2851 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
2853 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2855 g_signal_connect (drawing_area, "expose-event",
2856 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
2857 g_signal_connect (drawing_area, "unrealize",
2858 G_CALLBACK (on_rotated_text_unrealize), NULL);
2860 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2862 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2863 gtk_widget_size_request (window, &requisition);
2864 gtk_widget_set_size_request (drawing_area, -1, -1);
2865 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2868 if (!gtk_widget_get_visible (window))
2869 gtk_widget_show (window);
2871 gtk_widget_destroy (window);
2879 reparent_label (GtkWidget *widget,
2880 GtkWidget *new_parent)
2884 label = g_object_get_data (G_OBJECT (widget), "user_data");
2886 gtk_widget_reparent (label, new_parent);
2890 set_parent_signal (GtkWidget *child,
2891 GtkWidget *old_parent,
2894 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2895 g_type_name (G_OBJECT_TYPE (child)),
2896 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
2897 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2898 GPOINTER_TO_INT (func_data));
2902 create_reparent (GtkWidget *widget)
2904 static GtkWidget *window = NULL;
2911 GtkWidget *separator;
2912 GtkWidget *event_box;
2916 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2918 gtk_window_set_screen (GTK_WINDOW (window),
2919 gtk_widget_get_screen (widget));
2921 g_signal_connect (window, "destroy",
2922 G_CALLBACK (gtk_widget_destroyed),
2925 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2926 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2928 box1 = gtk_vbox_new (FALSE, 0);
2929 gtk_container_add (GTK_CONTAINER (window), box1);
2931 box2 = gtk_hbox_new (FALSE, 5);
2932 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2933 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2935 label = gtk_label_new ("Hello World");
2937 frame = gtk_frame_new ("Frame 1");
2938 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2940 box3 = gtk_vbox_new (FALSE, 5);
2941 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2942 gtk_container_add (GTK_CONTAINER (frame), box3);
2944 button = gtk_button_new_with_label ("switch");
2945 g_object_set_data (G_OBJECT (button), "user_data", label);
2946 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2948 event_box = gtk_event_box_new ();
2949 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2950 gtk_container_add (GTK_CONTAINER (event_box), label);
2952 g_signal_connect (button, "clicked",
2953 G_CALLBACK (reparent_label),
2956 g_signal_connect (label, "parent_set",
2957 G_CALLBACK (set_parent_signal),
2958 GINT_TO_POINTER (42));
2960 frame = gtk_frame_new ("Frame 2");
2961 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2963 box3 = gtk_vbox_new (FALSE, 5);
2964 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2965 gtk_container_add (GTK_CONTAINER (frame), box3);
2967 button = gtk_button_new_with_label ("switch");
2968 g_object_set_data (G_OBJECT (button), "user_data", label);
2969 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2971 event_box = gtk_event_box_new ();
2972 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2974 g_signal_connect (button, "clicked",
2975 G_CALLBACK (reparent_label),
2978 separator = gtk_hseparator_new ();
2979 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2981 box2 = gtk_vbox_new (FALSE, 10);
2982 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2983 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2985 button = gtk_button_new_with_label ("close");
2986 g_signal_connect_swapped (button, "clicked",
2987 G_CALLBACK (gtk_widget_destroy), window);
2988 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2989 gtk_widget_set_can_default (button, TRUE);
2990 gtk_widget_grab_default (button);
2993 if (!gtk_widget_get_visible (window))
2994 gtk_widget_show_all (window);
2996 gtk_widget_destroy (window);
3003 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
3005 if (event->type == GDK_BUTTON_PRESS)
3007 if (event->button == 1)
3008 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
3009 event->button, event->x_root, event->y_root,
3011 else if (event->button == 2)
3012 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
3013 event->button, event->x_root, event->y_root,
3020 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
3022 gtk_paint_resize_grip (area->style,
3024 gtk_widget_get_state (area),
3030 area->allocation.width,
3031 area->allocation.height);
3037 create_resize_grips (GtkWidget *widget)
3039 static GtkWidget *window = NULL;
3041 GtkWidget *hbox, *vbox;
3044 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3046 gtk_window_set_screen (GTK_WINDOW (window),
3047 gtk_widget_get_screen (widget));
3049 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
3051 g_signal_connect (window, "destroy",
3052 G_CALLBACK (gtk_widget_destroyed),
3055 vbox = gtk_vbox_new (FALSE, 0);
3056 gtk_container_add (GTK_CONTAINER (window), vbox);
3058 hbox = gtk_hbox_new (FALSE, 0);
3059 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3062 area = gtk_drawing_area_new ();
3063 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3064 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3065 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3066 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3067 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3068 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
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));
3076 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3077 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
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_EAST));
3085 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3086 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3088 hbox = gtk_hbox_new (FALSE, 0);
3089 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3092 area = gtk_drawing_area_new ();
3093 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3094 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3095 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3096 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3097 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3098 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3101 area = gtk_drawing_area_new ();
3102 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3105 area = gtk_drawing_area_new ();
3106 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3107 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3108 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3109 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3110 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3111 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3114 hbox = gtk_hbox_new (FALSE, 0);
3115 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3118 area = gtk_drawing_area_new ();
3119 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3120 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3121 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3122 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3123 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3124 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3126 area = gtk_drawing_area_new ();
3127 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3128 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3129 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3130 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3131 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3132 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
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_EAST));
3140 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3141 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3144 if (!gtk_widget_get_visible (window))
3145 gtk_widget_show_all (window);
3147 gtk_widget_destroy (window);
3153 gint upositionx = 0;
3154 gint upositiony = 0;
3157 uposition_configure (GtkWidget *window)
3163 lx = g_object_get_data (G_OBJECT (window), "x");
3164 ly = g_object_get_data (G_OBJECT (window), "y");
3166 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
3167 sprintf (buffer, "%d", upositionx);
3168 gtk_label_set_text (lx, buffer);
3169 sprintf (buffer, "%d", upositiony);
3170 gtk_label_set_text (ly, buffer);
3176 uposition_stop_configure (GtkToggleButton *toggle,
3180 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
3182 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
3186 create_saved_position (GtkWidget *widget)
3188 static GtkWidget *window = NULL;
3193 GtkWidget *main_vbox;
3201 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
3202 "type", GTK_WINDOW_TOPLEVEL,
3203 "title", "Saved Position",
3205 "signal::configure_event", uposition_configure, NULL,
3208 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3210 gtk_window_set_screen (GTK_WINDOW (window),
3211 gtk_widget_get_screen (widget));
3214 g_signal_connect (window, "destroy",
3215 G_CALLBACK (gtk_widget_destroyed),
3218 main_vbox = gtk_vbox_new (FALSE, 5);
3219 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3220 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3223 g_object_new (gtk_vbox_get_type (),
3224 "GtkBox::homogeneous", FALSE,
3225 "GtkBox::spacing", 5,
3226 "GtkContainer::border_width", 10,
3227 "GtkWidget::parent", main_vbox,
3228 "GtkWidget::visible", TRUE,
3229 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
3230 "label", "Stop Events",
3234 "signal::clicked", uposition_stop_configure, window,
3238 hbox = gtk_hbox_new (FALSE, 0);
3239 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3240 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3242 label = gtk_label_new ("X Origin : ");
3243 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3244 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3246 x_label = gtk_label_new ("");
3247 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3248 g_object_set_data (G_OBJECT (window), "x", x_label);
3250 hbox = gtk_hbox_new (FALSE, 0);
3251 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3252 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3254 label = gtk_label_new ("Y Origin : ");
3255 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3256 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3258 y_label = gtk_label_new ("");
3259 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3260 g_object_set_data (G_OBJECT (window), "y", y_label);
3263 g_object_new (gtk_hseparator_get_type (),
3264 "GtkWidget::visible", TRUE,
3266 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3268 hbox = gtk_hbox_new (FALSE, 0);
3269 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3270 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3272 button = gtk_button_new_with_label ("Close");
3273 g_signal_connect_swapped (button, "clicked",
3274 G_CALLBACK (gtk_widget_destroy),
3276 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3277 gtk_widget_set_can_default (button, TRUE);
3278 gtk_widget_grab_default (button);
3280 gtk_widget_show_all (window);
3283 gtk_widget_destroy (window);
3291 create_pixmap (GtkWidget *widget)
3293 static GtkWidget *window = NULL;
3299 GtkWidget *separator;
3300 GtkWidget *pixmapwid;
3304 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3306 gtk_window_set_screen (GTK_WINDOW (window),
3307 gtk_widget_get_screen (widget));
3309 g_signal_connect (window, "destroy",
3310 G_CALLBACK (gtk_widget_destroyed),
3313 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3314 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3315 gtk_widget_realize(window);
3317 box1 = gtk_vbox_new (FALSE, 0);
3318 gtk_container_add (GTK_CONTAINER (window), box1);
3320 box2 = gtk_vbox_new (FALSE, 10);
3321 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3322 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3324 button = gtk_button_new ();
3325 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3327 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3329 label = gtk_label_new ("Pixmap\ntest");
3330 box3 = gtk_hbox_new (FALSE, 0);
3331 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3332 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3333 gtk_container_add (GTK_CONTAINER (box3), label);
3334 gtk_container_add (GTK_CONTAINER (button), box3);
3336 button = gtk_button_new ();
3337 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3339 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3341 label = gtk_label_new ("Pixmap\ntest");
3342 box3 = gtk_hbox_new (FALSE, 0);
3343 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3344 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3345 gtk_container_add (GTK_CONTAINER (box3), label);
3346 gtk_container_add (GTK_CONTAINER (button), box3);
3348 gtk_widget_set_sensitive (button, FALSE);
3350 separator = gtk_hseparator_new ();
3351 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3353 box2 = gtk_vbox_new (FALSE, 10);
3354 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3355 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3357 button = gtk_button_new_with_label ("close");
3358 g_signal_connect_swapped (button, "clicked",
3359 G_CALLBACK (gtk_widget_destroy),
3361 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3362 gtk_widget_set_can_default (button, TRUE);
3363 gtk_widget_grab_default (button);
3366 if (!gtk_widget_get_visible (window))
3367 gtk_widget_show_all (window);
3369 gtk_widget_destroy (window);
3373 create_tooltips (GtkWidget *widget)
3375 static GtkWidget *window = NULL;
3382 GtkWidget *separator;
3387 g_object_new (gtk_window_get_type (),
3388 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3389 "GtkContainer::border_width", 0,
3390 "GtkWindow::title", "Tooltips",
3391 "GtkWindow::allow_shrink", TRUE,
3392 "GtkWindow::allow_grow", FALSE,
3395 gtk_window_set_screen (GTK_WINDOW (window),
3396 gtk_widget_get_screen (widget));
3398 box1 = gtk_vbox_new (FALSE, 0);
3399 gtk_container_add (GTK_CONTAINER (window), box1);
3401 box2 = gtk_vbox_new (FALSE, 10);
3402 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3403 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3405 button = gtk_toggle_button_new_with_label ("button1");
3406 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3408 gtk_widget_set_tooltip_text (button, "This is button 1");
3410 button = gtk_toggle_button_new_with_label ("button2");
3411 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3413 gtk_widget_set_tooltip_text (button,
3414 "This is button 2. This is also a really long tooltip which probably "
3415 "won't fit on a single line and will therefore need to be wrapped. "
3416 "Hopefully the wrapping will work correctly.");
3418 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3419 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3421 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
3424 g_object_new (gtk_vbox_get_type (),
3425 "homogeneous", FALSE,
3432 g_object_new (gtk_button_get_type (),
3437 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3438 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
3440 frame = g_object_new (gtk_frame_get_type (),
3441 "label", "ToolTips Inspector",
3442 "label_xalign", (double) 0.5,
3448 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3450 separator = gtk_hseparator_new ();
3451 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3453 box2 = gtk_vbox_new (FALSE, 10);
3454 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3455 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3457 button = gtk_button_new_with_label ("close");
3458 g_signal_connect_swapped (button, "clicked",
3459 G_CALLBACK (gtk_widget_destroy),
3461 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3462 gtk_widget_set_can_default (button, TRUE);
3463 gtk_widget_grab_default (button);
3465 gtk_widget_set_tooltip_text (button, "Push this button to close window");
3468 if (!gtk_widget_get_visible (window))
3469 gtk_widget_show_all (window);
3471 gtk_widget_destroy (window);
3479 pack_image (GtkWidget *box,
3483 gtk_box_pack_start (GTK_BOX (box),
3484 gtk_label_new (text),
3487 gtk_box_pack_start (GTK_BOX (box),
3493 create_image (GtkWidget *widget)
3495 static GtkWidget *window = NULL;
3503 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3505 gtk_window_set_screen (GTK_WINDOW (window),
3506 gtk_widget_get_screen (widget));
3508 /* this is bogus for testing drawing when allocation < request,
3509 * don't copy into real code
3511 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
3513 g_signal_connect (window, "destroy",
3514 G_CALLBACK (gtk_widget_destroyed),
3517 vbox = gtk_vbox_new (FALSE, 5);
3519 gtk_container_add (GTK_CONTAINER (window), vbox);
3521 pack_image (vbox, "Stock Warning Dialog",
3522 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3523 GTK_ICON_SIZE_DIALOG));
3525 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
3526 gtk_widget_get_colormap (window),
3531 pack_image (vbox, "Pixmap",
3532 gtk_image_new_from_pixmap (pixmap, mask));
3535 if (!gtk_widget_get_visible (window))
3536 gtk_widget_show_all (window);
3538 gtk_widget_destroy (window);
3546 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3549 GtkWidget *menuitem;
3558 menu = gtk_menu_new ();
3559 gtk_menu_set_screen (GTK_MENU (menu), screen);
3565 menuitem = gtk_tearoff_menu_item_new ();
3566 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3567 gtk_widget_show (menuitem);
3570 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3571 GTK_ICON_SIZE_MENU);
3572 gtk_widget_show (image);
3573 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3574 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3575 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3576 gtk_widget_show (menuitem);
3578 for (i = 0, j = 1; i < length; i++, j++)
3580 sprintf (buf, "item %2d - %d", depth, j);
3582 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3583 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3585 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3586 gtk_widget_show (menuitem);
3588 gtk_widget_set_sensitive (menuitem, FALSE);
3591 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3595 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3596 create_menu (screen, depth - 1, 5, TRUE));
3603 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3606 GtkWidget *menuitem;
3612 menu = gtk_menu_new ();
3613 gtk_menu_set_screen (GTK_MENU (menu), screen);
3618 menuitem = gtk_tearoff_menu_item_new ();
3619 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3620 gtk_widget_show (menuitem);
3624 menuitem = gtk_menu_item_new_with_label ("items");
3625 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3627 submenu = gtk_menu_new ();
3628 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3629 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3630 gtk_widget_show (menuitem);
3633 /* now fill the items submenu */
3634 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3635 GTK_ICON_SIZE_MENU);
3636 gtk_widget_show (image);
3637 menuitem = gtk_image_menu_item_new_with_label ("Image");
3638 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3639 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3640 gtk_widget_show (menuitem);
3642 menuitem = gtk_menu_item_new_with_label ("x");
3643 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3644 gtk_widget_show (menuitem);
3646 menuitem = gtk_menu_item_new_with_label ("x");
3647 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3648 gtk_widget_show (menuitem);
3650 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3651 GTK_ICON_SIZE_MENU);
3652 gtk_widget_show (image);
3653 menuitem = gtk_image_menu_item_new_with_label ("Image");
3654 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3655 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3656 gtk_widget_show (menuitem);
3658 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3659 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3660 gtk_widget_show (menuitem);
3662 menuitem = gtk_menu_item_new_with_label ("x");
3663 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3664 gtk_widget_show (menuitem);
3666 menuitem = gtk_menu_item_new_with_label ("x");
3667 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3668 gtk_widget_show (menuitem);
3670 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3671 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3672 gtk_widget_show (menuitem);
3674 menuitem = gtk_check_menu_item_new_with_label ("Check");
3675 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3676 gtk_widget_show (menuitem);
3678 menuitem = gtk_menu_item_new_with_label ("x");
3679 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3680 gtk_widget_show (menuitem);
3682 menuitem = gtk_menu_item_new_with_label ("x");
3683 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3684 gtk_widget_show (menuitem);
3686 menuitem = gtk_check_menu_item_new_with_label ("Check");
3687 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3688 gtk_widget_show (menuitem);
3690 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3691 gtk_widget_show (menuitem);
3692 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3694 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3695 gtk_widget_show (menuitem);
3696 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3698 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3699 gtk_widget_show (menuitem);
3700 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3702 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3703 gtk_widget_show (menuitem);
3704 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3706 /* end of items submenu */
3708 menuitem = gtk_menu_item_new_with_label ("spanning");
3709 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3711 submenu = gtk_menu_new ();
3712 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3713 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3714 gtk_widget_show (menuitem);
3717 /* now fill the spanning submenu */
3718 menuitem = gtk_menu_item_new_with_label ("a");
3719 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3720 gtk_widget_show (menuitem);
3722 menuitem = gtk_menu_item_new_with_label ("b");
3723 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3724 gtk_widget_show (menuitem);
3726 menuitem = gtk_menu_item_new_with_label ("c");
3727 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3728 gtk_widget_show (menuitem);
3730 menuitem = gtk_menu_item_new_with_label ("d");
3731 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3732 gtk_widget_show (menuitem);
3734 menuitem = gtk_menu_item_new_with_label ("e");
3735 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3736 gtk_widget_show (menuitem);
3737 /* end of spanning submenu */
3739 menuitem = gtk_menu_item_new_with_label ("left");
3740 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3741 submenu = gtk_menu_new ();
3742 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3743 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3744 gtk_widget_show (menuitem);
3746 menuitem = gtk_menu_item_new_with_label ("Empty");
3747 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3748 submenu = gtk_menu_new ();
3749 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3750 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3751 gtk_widget_show (menuitem);
3753 menuitem = gtk_menu_item_new_with_label ("right");
3754 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3755 submenu = gtk_menu_new ();
3756 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3757 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3758 gtk_widget_show (menuitem);
3760 menuitem = gtk_menu_item_new_with_label ("Empty");
3761 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3762 gtk_widget_show (menuitem);
3766 for (; j < rows; j++)
3767 for (i = 0; i < cols; i++)
3769 sprintf (buf, "(%d %d)", i, j);
3770 menuitem = gtk_menu_item_new_with_label (buf);
3771 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3772 gtk_widget_show (menuitem);
3775 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3776 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3777 gtk_widget_show (menuitem);
3778 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3779 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3780 gtk_widget_show (menuitem);
3781 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3782 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3783 gtk_widget_show (menuitem);
3784 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3785 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3786 gtk_widget_show (menuitem);
3792 create_menus (GtkWidget *widget)
3794 static GtkWidget *window = NULL;
3798 GtkWidget *optionmenu;
3799 GtkWidget *separator;
3805 GtkWidget *menuitem;
3806 GtkAccelGroup *accel_group;
3808 GdkScreen *screen = gtk_widget_get_screen (widget);
3810 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3812 gtk_window_set_screen (GTK_WINDOW (window), screen);
3814 g_signal_connect (window, "destroy",
3815 G_CALLBACK (gtk_widget_destroyed),
3817 g_signal_connect (window, "delete-event",
3818 G_CALLBACK (gtk_true),
3821 accel_group = gtk_accel_group_new ();
3822 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3824 gtk_window_set_title (GTK_WINDOW (window), "menus");
3825 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3828 box1 = gtk_vbox_new (FALSE, 0);
3829 gtk_container_add (GTK_CONTAINER (window), box1);
3830 gtk_widget_show (box1);
3832 menubar = gtk_menu_bar_new ();
3833 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3834 gtk_widget_show (menubar);
3836 menu = create_menu (screen, 2, 50, TRUE);
3838 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3839 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3840 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3841 gtk_widget_show (menuitem);
3843 menu = create_table_menu (screen, 2, 50, TRUE);
3845 menuitem = gtk_menu_item_new_with_label ("table");
3846 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3847 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3848 gtk_widget_show (menuitem);
3850 menuitem = gtk_menu_item_new_with_label ("foo");
3851 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3852 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3853 gtk_widget_show (menuitem);
3855 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3856 GTK_ICON_SIZE_MENU);
3857 gtk_widget_show (image);
3858 menuitem = gtk_image_menu_item_new_with_label ("Help");
3859 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3860 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3861 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3862 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3863 gtk_widget_show (menuitem);
3865 menubar = gtk_menu_bar_new ();
3866 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3867 gtk_widget_show (menubar);
3869 menu = create_menu (screen, 2, 10, TRUE);
3871 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3872 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3873 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3874 gtk_widget_show (menuitem);
3876 box2 = gtk_vbox_new (FALSE, 10);
3877 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3878 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3879 gtk_widget_show (box2);
3881 menu = create_menu (screen, 1, 5, FALSE);
3882 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3884 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3885 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3886 gtk_widget_show (menuitem);
3888 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3889 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3890 gtk_widget_show (menuitem);
3891 gtk_widget_add_accelerator (menuitem,
3897 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3898 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3899 gtk_widget_show (menuitem);
3900 gtk_widget_add_accelerator (menuitem,
3905 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3906 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3907 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3908 gtk_widget_show (menuitem);
3909 gtk_widget_add_accelerator (menuitem,
3915 gtk_widget_add_accelerator (menuitem,
3922 optionmenu = gtk_combo_box_new_text ();
3923 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3924 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3925 gtk_widget_show (optionmenu);
3927 separator = gtk_hseparator_new ();
3928 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3929 gtk_widget_show (separator);
3931 box2 = gtk_vbox_new (FALSE, 10);
3932 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3933 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3934 gtk_widget_show (box2);
3936 button = gtk_button_new_with_label ("close");
3937 g_signal_connect_swapped (button, "clicked",
3938 G_CALLBACK (gtk_widget_destroy),
3940 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3941 gtk_widget_set_can_default (button, TRUE);
3942 gtk_widget_grab_default (button);
3943 gtk_widget_show (button);
3946 if (!gtk_widget_get_visible (window))
3947 gtk_widget_show (window);
3949 gtk_widget_destroy (window);
3952 /* GdkPixbuf RGBA C-Source image dump */
3954 static const guint8 apple[] =
3956 /* Pixbuf magic (0x47646b50) */
3958 /* length: header (24) + pixel_data (2304) */
3960 /* pixdata_type (0x1010002) */
3962 /* rowstride (96) */
3969 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3970 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3971 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3972 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3973 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3974 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3975 "\0\0\0\0\0\0\0\0\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"
3976 "\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"
3977 "\0\0\0\0\0\0\0\0\0\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"
3978 "[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"
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`l[Blza\373s\202d\354w\206g\372p~c"
3981 "\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"
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`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3984 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3985 "\0\0\0\0\0\0\0\0\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"
3986 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3987 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3988 "\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["
3989 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3990 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3991 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3992 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3993 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3994 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3995 "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"
3996 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3997 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3998 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3999 "\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"
4000 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
4001 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
4002 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
4003 "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"
4004 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
4005 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
4006 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
4007 "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"
4008 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
4009 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
4010 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4011 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4012 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4013 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4014 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4015 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4016 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4017 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4018 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4019 "\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>"
4020 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4021 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4022 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4023 "\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"
4024 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4025 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4026 "\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"
4027 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4028 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4029 "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"
4030 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4031 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4032 "\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"
4033 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4034 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4035 "\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"
4036 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4037 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4038 "\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"
4039 "\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"
4040 "\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"
4041 "\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"
4042 "\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"
4043 "\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"
4044 "\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"
4045 "\0\0\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"
4046 "\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"
4047 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4051 accel_button_new (GtkAccelGroup *accel_group,
4056 GdkModifierType modifiers;
4060 gtk_accelerator_parse (accel, &keyval, &modifiers);
4063 button = gtk_button_new ();
4064 gtk_widget_add_accelerator (button, "activate", accel_group,
4065 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4067 label = gtk_accel_label_new (text);
4068 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4069 gtk_widget_show (label);
4071 gtk_container_add (GTK_CONTAINER (button), label);
4077 create_key_lookup (GtkWidget *widget)
4079 static GtkWidget *window = NULL;
4080 gpointer window_ptr;
4084 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4086 GtkWidget *content_area;
4088 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4089 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4092 gtk_window_set_screen (GTK_WINDOW (window),
4093 gtk_widget_get_screen (widget));
4095 /* We have to expand it so the accel labels will draw their labels
4097 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4099 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4101 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4103 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4104 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4105 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4106 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4107 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4108 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4109 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4110 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4111 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4112 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4113 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4114 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4115 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4116 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4117 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4118 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4119 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4120 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4121 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4122 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4123 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4124 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4125 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4126 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4127 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4128 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4129 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4130 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
4132 window_ptr = &window;
4133 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
4134 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4136 gtk_widget_show_all (window);
4139 gtk_widget_destroy (window);
4148 cmw_destroy_cb(GtkWidget *widget)
4150 /* This is needed to get out of gtk_main */
4157 cmw_color (GtkWidget *widget, GtkWidget *parent)
4160 GtkWidget *colorsel;
4161 GtkWidget *ok_button, *cancel_button;
4163 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4165 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4167 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
4168 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
4172 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4174 /* And mark it as a transient dialog */
4175 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4177 g_signal_connect (csd, "destroy",
4178 G_CALLBACK (cmw_destroy_cb), NULL);
4181 "ok-button", &ok_button,
4182 "cancel-button", &cancel_button,
4185 g_signal_connect_swapped (ok_button,
4186 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4187 g_signal_connect_swapped (cancel_button,
4188 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4190 /* wait until destroy calls gtk_main_quit */
4191 gtk_widget_show (csd);
4196 cmw_file (GtkWidget *widget, GtkWidget *parent)
4200 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
4201 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
4202 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
4203 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
4205 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4206 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
4208 g_signal_connect (fs, "destroy",
4209 G_CALLBACK (cmw_destroy_cb), NULL);
4210 g_signal_connect_swapped (fs, "response",
4211 G_CALLBACK (gtk_widget_destroy), fs);
4213 /* wait until destroy calls gtk_main_quit */
4214 gtk_widget_show (fs);
4220 create_modal_window (GtkWidget *widget)
4222 GtkWidget *window = NULL;
4223 GtkWidget *box1,*box2;
4225 GtkWidget *btnColor,*btnFile,*btnClose;
4227 /* Create modal window (Here you can use any window descendent )*/
4228 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4229 gtk_window_set_screen (GTK_WINDOW (window),
4230 gtk_widget_get_screen (widget));
4232 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4234 /* Set window as modal */
4235 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4237 /* Create widgets */
4238 box1 = gtk_vbox_new (FALSE,5);
4239 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4240 box2 = gtk_vbox_new (TRUE,5);
4241 btnColor = gtk_button_new_with_label ("Color");
4242 btnFile = gtk_button_new_with_label ("File Selection");
4243 btnClose = gtk_button_new_with_label ("Close");
4246 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4247 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4250 gtk_container_add (GTK_CONTAINER (window), box1);
4251 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4252 gtk_container_add (GTK_CONTAINER (frame1), box2);
4253 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4254 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4255 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4256 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4258 /* connect signals */
4259 g_signal_connect_swapped (btnClose, "clicked",
4260 G_CALLBACK (gtk_widget_destroy), window);
4262 g_signal_connect (window, "destroy",
4263 G_CALLBACK (cmw_destroy_cb), NULL);
4265 g_signal_connect (btnColor, "clicked",
4266 G_CALLBACK (cmw_color), window);
4267 g_signal_connect (btnFile, "clicked",
4268 G_CALLBACK (cmw_file), window);
4271 gtk_widget_show_all (window);
4273 /* wait until dialog get destroyed */
4282 make_message_dialog (GdkScreen *screen,
4284 GtkMessageType type,
4285 GtkButtonsType buttons,
4286 guint default_response)
4290 gtk_widget_destroy (*dialog);
4295 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4296 "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.)");
4298 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4300 g_signal_connect_swapped (*dialog,
4302 G_CALLBACK (gtk_widget_destroy),
4305 g_signal_connect (*dialog,
4307 G_CALLBACK (gtk_widget_destroyed),
4310 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4312 gtk_widget_show (*dialog);
4316 create_message_dialog (GtkWidget *widget)
4318 static GtkWidget *info = NULL;
4319 static GtkWidget *warning = NULL;
4320 static GtkWidget *error = NULL;
4321 static GtkWidget *question = NULL;
4322 GdkScreen *screen = gtk_widget_get_screen (widget);
4324 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4325 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
4326 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4327 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
4334 static GtkWidget *sw_parent = NULL;
4335 static GtkWidget *sw_float_parent;
4336 static guint sw_destroyed_handler = 0;
4339 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4341 gtk_widget_reparent (scrollwin, sw_parent);
4343 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4344 sw_float_parent = NULL;
4346 sw_destroyed_handler = 0;
4352 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4354 gtk_widget_destroy (sw_float_parent);
4356 sw_float_parent = NULL;
4358 sw_destroyed_handler = 0;
4362 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4366 gtk_widget_reparent (scrollwin, sw_parent);
4367 gtk_widget_destroy (sw_float_parent);
4369 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4370 sw_float_parent = NULL;
4372 sw_destroyed_handler = 0;
4376 sw_parent = scrollwin->parent;
4377 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4378 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4379 gtk_widget_get_screen (widget));
4381 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4383 gtk_widget_reparent (scrollwin, sw_float_parent);
4384 gtk_widget_show (sw_float_parent);
4386 sw_destroyed_handler =
4387 g_signal_connect (sw_parent, "destroy",
4388 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4389 g_signal_connect (sw_float_parent, "delete_event",
4390 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4395 create_scrolled_windows (GtkWidget *widget)
4397 static GtkWidget *window;
4398 GtkWidget *content_area, *action_area;
4399 GtkWidget *scrolled_window;
4407 window = gtk_dialog_new ();
4409 gtk_window_set_screen (GTK_WINDOW (window),
4410 gtk_widget_get_screen (widget));
4412 g_signal_connect (window, "destroy",
4413 G_CALLBACK (gtk_widget_destroyed),
4416 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4417 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
4419 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4420 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4422 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4423 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4424 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4425 GTK_POLICY_AUTOMATIC,
4426 GTK_POLICY_AUTOMATIC);
4427 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
4428 gtk_widget_show (scrolled_window);
4430 table = gtk_table_new (20, 20, FALSE);
4431 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4432 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4433 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4434 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4435 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4436 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4437 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4438 gtk_widget_show (table);
4440 for (i = 0; i < 20; i++)
4441 for (j = 0; j < 20; j++)
4443 sprintf (buffer, "button (%d,%d)\n", i, j);
4444 button = gtk_toggle_button_new_with_label (buffer);
4445 gtk_table_attach_defaults (GTK_TABLE (table), button,
4447 gtk_widget_show (button);
4451 button = gtk_button_new_with_label ("Close");
4452 g_signal_connect_swapped (button, "clicked",
4453 G_CALLBACK (gtk_widget_destroy),
4455 gtk_widget_set_can_default (button, TRUE);
4456 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4457 gtk_widget_grab_default (button);
4458 gtk_widget_show (button);
4460 button = gtk_button_new_with_label ("Reparent Out");
4461 g_signal_connect (button, "clicked",
4462 G_CALLBACK (scrolled_windows_remove),
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 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4472 if (!gtk_widget_get_visible (window))
4473 gtk_widget_show (window);
4475 gtk_widget_destroy (window);
4483 entry_toggle_frame (GtkWidget *checkbutton,
4486 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4487 GTK_TOGGLE_BUTTON(checkbutton)->active);
4491 entry_toggle_sensitive (GtkWidget *checkbutton,
4494 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4498 entry_progress_timeout (gpointer data)
4500 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
4502 gtk_entry_progress_pulse (GTK_ENTRY (data));
4508 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
4511 if (fraction > 1.0001)
4514 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
4521 entry_remove_timeout (gpointer data)
4523 g_source_remove (GPOINTER_TO_UINT (data));
4527 entry_toggle_progress (GtkWidget *checkbutton,
4530 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
4532 guint timeout = gdk_threads_add_timeout (100,
4533 entry_progress_timeout,
4535 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
4536 GUINT_TO_POINTER (timeout),
4537 entry_remove_timeout);
4541 g_object_set_data (G_OBJECT (entry), "timeout-id",
4542 GUINT_TO_POINTER (0));
4544 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
4549 entry_toggle_pulse (GtkWidget *checkbutton,
4552 g_object_set_data (G_OBJECT (entry), "progress-pulse",
4553 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
4557 props_clicked (GtkWidget *button,
4560 GtkWidget *window = create_prop_editor (object, 0);
4562 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
4566 create_entry (GtkWidget *widget)
4568 static GtkWidget *window = NULL;
4572 GtkWidget *has_frame_check;
4573 GtkWidget *sensitive_check;
4574 GtkWidget *progress_check;
4577 GtkWidget *cb_entry;
4579 GtkWidget *separator;
4583 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4584 gtk_window_set_screen (GTK_WINDOW (window),
4585 gtk_widget_get_screen (widget));
4587 g_signal_connect (window, "destroy",
4588 G_CALLBACK (gtk_widget_destroyed),
4591 gtk_window_set_title (GTK_WINDOW (window), "entry");
4592 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4595 box1 = gtk_vbox_new (FALSE, 0);
4596 gtk_container_add (GTK_CONTAINER (window), box1);
4599 box2 = gtk_vbox_new (FALSE, 10);
4600 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4601 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4603 hbox = gtk_hbox_new (FALSE, 5);
4604 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4606 entry = gtk_entry_new ();
4607 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");
4608 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4609 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4611 button = gtk_button_new_with_mnemonic ("_Props");
4612 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4613 g_signal_connect (button, "clicked",
4614 G_CALLBACK (props_clicked),
4617 cb = GTK_COMBO_BOX (gtk_combo_box_entry_new_text ());
4618 gtk_combo_box_append_text (cb, "item0");
4619 gtk_combo_box_append_text (cb, "item0");
4620 gtk_combo_box_append_text (cb, "item1 item1");
4621 gtk_combo_box_append_text (cb, "item2 item2 item2");
4622 gtk_combo_box_append_text (cb, "item3 item3 item3 item3");
4623 gtk_combo_box_append_text (cb, "item4 item4 item4 item4 item4");
4624 gtk_combo_box_append_text (cb, "item5 item5 item5 item5 item5 item5");
4625 gtk_combo_box_append_text (cb, "item6 item6 item6 item6 item6");
4626 gtk_combo_box_append_text (cb, "item7 item7 item7 item7");
4627 gtk_combo_box_append_text (cb, "item8 item8 item8");
4628 gtk_combo_box_append_text (cb, "item9 item9");
4630 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4631 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4632 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4633 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4635 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4636 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4637 g_signal_connect (sensitive_check, "toggled",
4638 G_CALLBACK (entry_toggle_sensitive), entry);
4639 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4641 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4642 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4643 g_signal_connect (has_frame_check, "toggled",
4644 G_CALLBACK (entry_toggle_frame), entry);
4645 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4647 progress_check = gtk_check_button_new_with_label("Show Progress");
4648 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4649 g_signal_connect (progress_check, "toggled",
4650 G_CALLBACK (entry_toggle_progress), entry);
4652 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4653 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4654 g_signal_connect (progress_check, "toggled",
4655 G_CALLBACK (entry_toggle_pulse), entry);
4657 separator = gtk_hseparator_new ();
4658 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4660 box2 = gtk_vbox_new (FALSE, 10);
4661 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4662 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4664 button = gtk_button_new_with_label ("close");
4665 g_signal_connect_swapped (button, "clicked",
4666 G_CALLBACK (gtk_widget_destroy),
4668 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4669 gtk_widget_set_can_default (button, TRUE);
4670 gtk_widget_grab_default (button);
4673 if (!gtk_widget_get_visible (window))
4674 gtk_widget_show_all (window);
4676 gtk_widget_destroy (window);
4680 create_expander (GtkWidget *widget)
4683 GtkWidget *expander;
4685 static GtkWidget *window = NULL;
4689 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4690 gtk_window_set_screen (GTK_WINDOW (window),
4691 gtk_widget_get_screen (widget));
4693 g_signal_connect (window, "destroy",
4694 G_CALLBACK (gtk_widget_destroyed),
4697 gtk_window_set_title (GTK_WINDOW (window), "expander");
4698 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4700 box1 = gtk_vbox_new (FALSE, 0);
4701 gtk_container_add (GTK_CONTAINER (window), box1);
4703 expander = gtk_expander_new ("The Hidden");
4705 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4707 hidden = gtk_label_new ("Revealed!");
4709 gtk_container_add (GTK_CONTAINER (expander), hidden);
4712 if (!gtk_widget_get_visible (window))
4713 gtk_widget_show_all (window);
4715 gtk_widget_destroy (window);
4723 event_box_label_pressed (GtkWidget *widget,
4724 GdkEventButton *event,
4727 g_print ("clicked on event box\n");
4731 event_box_button_clicked (GtkWidget *widget,
4735 g_print ("pushed button\n");
4739 event_box_toggle_visible_window (GtkWidget *checkbutton,
4740 GtkEventBox *event_box)
4742 gtk_event_box_set_visible_window (event_box,
4743 GTK_TOGGLE_BUTTON(checkbutton)->active);
4747 event_box_toggle_above_child (GtkWidget *checkbutton,
4748 GtkEventBox *event_box)
4750 gtk_event_box_set_above_child (event_box,
4751 GTK_TOGGLE_BUTTON(checkbutton)->active);
4755 create_event_box (GtkWidget *widget)
4757 static GtkWidget *window = NULL;
4763 GtkWidget *separator;
4764 GtkWidget *event_box;
4766 GtkWidget *visible_window_check;
4767 GtkWidget *above_child_check;
4776 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4777 gtk_window_set_screen (GTK_WINDOW (window),
4778 gtk_widget_get_screen (widget));
4780 g_signal_connect (window, "destroy",
4781 G_CALLBACK (gtk_widget_destroyed),
4784 gtk_window_set_title (GTK_WINDOW (window), "event box");
4785 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4787 box1 = gtk_vbox_new (FALSE, 0);
4788 gtk_container_add (GTK_CONTAINER (window), box1);
4789 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4791 hbox = gtk_hbox_new (FALSE, 0);
4792 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4794 event_box = gtk_event_box_new ();
4795 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4797 vbox = gtk_vbox_new (FALSE, 0);
4798 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4799 g_signal_connect (event_box, "button_press_event",
4800 G_CALLBACK (event_box_label_pressed),
4803 label = gtk_label_new ("Click on this label");
4804 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4806 button = gtk_button_new_with_label ("button in eventbox");
4807 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4808 g_signal_connect (button, "clicked",
4809 G_CALLBACK (event_box_button_clicked),
4813 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4814 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4815 g_signal_connect (visible_window_check, "toggled",
4816 G_CALLBACK (event_box_toggle_visible_window), event_box);
4817 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4819 above_child_check = gtk_check_button_new_with_label("Above Child");
4820 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4821 g_signal_connect (above_child_check, "toggled",
4822 G_CALLBACK (event_box_toggle_above_child), event_box);
4823 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4825 separator = gtk_hseparator_new ();
4826 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4828 box2 = gtk_vbox_new (FALSE, 10);
4829 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4830 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4832 button = gtk_button_new_with_label ("close");
4833 g_signal_connect_swapped (button, "clicked",
4834 G_CALLBACK (gtk_widget_destroy),
4836 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4837 gtk_widget_set_can_default (button, TRUE);
4838 gtk_widget_grab_default (button);
4841 if (!gtk_widget_get_visible (window))
4842 gtk_widget_show_all (window);
4844 gtk_widget_destroy (window);
4852 #define SIZE_GROUP_INITIAL_SIZE 50
4855 size_group_hsize_changed (GtkSpinButton *spin_button,
4858 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4859 gtk_spin_button_get_value_as_int (spin_button),
4864 size_group_vsize_changed (GtkSpinButton *spin_button,
4867 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4869 gtk_spin_button_get_value_as_int (spin_button));
4873 create_size_group_window (GdkScreen *screen,
4874 GtkSizeGroup *master_size_group)
4876 GtkWidget *content_area;
4879 GtkWidget *main_button;
4881 GtkWidget *spin_button;
4883 GtkSizeGroup *hgroup1;
4884 GtkSizeGroup *hgroup2;
4885 GtkSizeGroup *vgroup1;
4886 GtkSizeGroup *vgroup2;
4888 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4894 gtk_window_set_screen (GTK_WINDOW (window), screen);
4896 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4898 g_signal_connect (window, "response",
4899 G_CALLBACK (gtk_widget_destroy),
4902 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4904 table = gtk_table_new (2, 2, FALSE);
4905 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4907 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4908 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4909 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4910 gtk_widget_set_size_request (table, 250, 250);
4912 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4913 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4914 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4915 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4917 main_button = gtk_button_new_with_label ("X");
4919 gtk_table_attach (GTK_TABLE (table), main_button,
4921 GTK_EXPAND, GTK_EXPAND,
4923 gtk_size_group_add_widget (master_size_group, main_button);
4924 gtk_size_group_add_widget (hgroup1, main_button);
4925 gtk_size_group_add_widget (vgroup1, main_button);
4926 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4927 SIZE_GROUP_INITIAL_SIZE,
4928 SIZE_GROUP_INITIAL_SIZE);
4930 button = gtk_button_new ();
4931 gtk_table_attach (GTK_TABLE (table), button,
4933 GTK_EXPAND, GTK_EXPAND,
4935 gtk_size_group_add_widget (vgroup1, button);
4936 gtk_size_group_add_widget (vgroup2, button);
4938 button = gtk_button_new ();
4939 gtk_table_attach (GTK_TABLE (table), button,
4941 GTK_EXPAND, GTK_EXPAND,
4943 gtk_size_group_add_widget (hgroup1, button);
4944 gtk_size_group_add_widget (hgroup2, button);
4946 button = gtk_button_new ();
4947 gtk_table_attach (GTK_TABLE (table), button,
4949 GTK_EXPAND, GTK_EXPAND,
4951 gtk_size_group_add_widget (hgroup2, button);
4952 gtk_size_group_add_widget (vgroup2, button);
4954 g_object_unref (hgroup1);
4955 g_object_unref (hgroup2);
4956 g_object_unref (vgroup1);
4957 g_object_unref (vgroup2);
4959 hbox = gtk_hbox_new (FALSE, 5);
4960 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4962 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4963 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4964 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4965 g_signal_connect (spin_button, "value_changed",
4966 G_CALLBACK (size_group_hsize_changed), main_button);
4968 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4969 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4970 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4971 g_signal_connect (spin_button, "value_changed",
4972 G_CALLBACK (size_group_vsize_changed), main_button);
4978 create_size_groups (GtkWidget *widget)
4980 static GtkWidget *window1 = NULL;
4981 static GtkWidget *window2 = NULL;
4982 static GtkSizeGroup *master_size_group;
4984 if (!master_size_group)
4985 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4989 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4992 g_signal_connect (window1, "destroy",
4993 G_CALLBACK (gtk_widget_destroyed),
4999 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5002 g_signal_connect (window2, "destroy",
5003 G_CALLBACK (gtk_widget_destroyed),
5007 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
5009 gtk_widget_destroy (window1);
5010 gtk_widget_destroy (window2);
5014 if (!gtk_widget_get_visible (window1))
5015 gtk_widget_show_all (window1);
5016 if (!gtk_widget_get_visible (window2))
5017 gtk_widget_show_all (window2);
5025 static GtkWidget *spinner1;
5028 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5030 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5034 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5036 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5040 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5042 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5043 gtk_spin_button_get_value_as_int (spin));
5047 get_value (GtkWidget *widget, gpointer data)
5051 GtkSpinButton *spin;
5053 spin = GTK_SPIN_BUTTON (spinner1);
5054 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5055 if (GPOINTER_TO_INT (data) == 1)
5056 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5058 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5059 gtk_label_set_text (label, buf);
5063 get_spin_value (GtkWidget *widget, gpointer data)
5067 GtkSpinButton *spin;
5069 spin = GTK_SPIN_BUTTON (widget);
5070 label = GTK_LABEL (data);
5072 buffer = g_strdup_printf ("%0.*f", spin->digits,
5073 gtk_spin_button_get_value (spin));
5074 gtk_label_set_text (label, buffer);
5080 spin_button_time_output_func (GtkSpinButton *spin_button)
5082 static gchar buf[6];
5086 hours = spin_button->adjustment->value / 60.0;
5087 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5088 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5089 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5090 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5095 spin_button_month_input_func (GtkSpinButton *spin_button,
5099 static gchar *month[12] = { "January", "February", "March", "April",
5100 "May", "June", "July", "August",
5101 "September", "October", "November", "December" };
5103 gboolean found = FALSE;
5105 for (i = 1; i <= 12; i++)
5107 tmp1 = g_ascii_strup (month[i - 1], -1);
5108 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5109 if (strstr (tmp1, tmp2) == tmp1)
5119 return GTK_INPUT_ERROR;
5121 *new_val = (gdouble) i;
5126 spin_button_month_output_func (GtkSpinButton *spin_button)
5129 static gchar *month[12] = { "January", "February", "March", "April",
5130 "May", "June", "July", "August", "September",
5131 "October", "November", "December" };
5133 for (i = 1; i <= 12; i++)
5134 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5136 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5137 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5143 spin_button_hex_input_func (GtkSpinButton *spin_button,
5150 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5151 res = strtol(buf, &err, 16);
5154 return GTK_INPUT_ERROR;
5160 spin_button_hex_output_func (GtkSpinButton *spin_button)
5162 static gchar buf[7];
5165 val = (gint) spin_button->adjustment->value;
5166 if (fabs (val) < 1e-5)
5167 sprintf (buf, "0x00");
5169 sprintf (buf, "0x%.2X", val);
5170 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5171 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5176 create_spins (GtkWidget *widget)
5178 static GtkWidget *window = NULL;
5181 GtkWidget *main_vbox;
5184 GtkWidget *spinner2;
5188 GtkWidget *val_label;
5193 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5194 gtk_window_set_screen (GTK_WINDOW (window),
5195 gtk_widget_get_screen (widget));
5197 g_signal_connect (window, "destroy",
5198 G_CALLBACK (gtk_widget_destroyed),
5201 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5203 main_vbox = gtk_vbox_new (FALSE, 5);
5204 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5205 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5207 frame = gtk_frame_new ("Not accelerated");
5208 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5210 vbox = gtk_vbox_new (FALSE, 0);
5211 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5212 gtk_container_add (GTK_CONTAINER (frame), vbox);
5214 /* Time, month, hex spinners */
5216 hbox = gtk_hbox_new (FALSE, 0);
5217 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5219 vbox2 = gtk_vbox_new (FALSE, 0);
5220 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5222 label = gtk_label_new ("Time :");
5223 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5224 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5226 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5227 spinner = gtk_spin_button_new (adj, 0, 0);
5228 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5229 g_signal_connect (spinner,
5231 G_CALLBACK (spin_button_time_output_func),
5233 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5234 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5235 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5237 vbox2 = gtk_vbox_new (FALSE, 0);
5238 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5240 label = gtk_label_new ("Month :");
5241 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5242 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5244 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5246 spinner = gtk_spin_button_new (adj, 0, 0);
5247 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5248 GTK_UPDATE_IF_VALID);
5249 g_signal_connect (spinner,
5251 G_CALLBACK (spin_button_month_input_func),
5253 g_signal_connect (spinner,
5255 G_CALLBACK (spin_button_month_output_func),
5257 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5258 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5259 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5261 vbox2 = gtk_vbox_new (FALSE, 0);
5262 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5264 label = gtk_label_new ("Hex :");
5265 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5266 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5268 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5269 spinner = gtk_spin_button_new (adj, 0, 0);
5270 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5271 g_signal_connect (spinner,
5273 G_CALLBACK (spin_button_hex_input_func),
5275 g_signal_connect (spinner,
5277 G_CALLBACK (spin_button_hex_output_func),
5279 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5280 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
5281 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5283 frame = gtk_frame_new ("Accelerated");
5284 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5286 vbox = gtk_vbox_new (FALSE, 0);
5287 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5288 gtk_container_add (GTK_CONTAINER (frame), vbox);
5290 hbox = gtk_hbox_new (FALSE, 0);
5291 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5293 vbox2 = gtk_vbox_new (FALSE, 0);
5294 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5296 label = gtk_label_new ("Value :");
5297 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5298 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5300 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
5302 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5303 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5304 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
5306 vbox2 = gtk_vbox_new (FALSE, 0);
5307 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5309 label = gtk_label_new ("Digits :");
5310 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5311 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5313 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
5314 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
5315 g_signal_connect (adj, "value_changed",
5316 G_CALLBACK (change_digits),
5318 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
5320 hbox = gtk_hbox_new (FALSE, 0);
5321 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
5323 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
5324 g_signal_connect (button, "clicked",
5325 G_CALLBACK (toggle_snap),
5327 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5328 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5330 button = gtk_check_button_new_with_label ("Numeric only input mode");
5331 g_signal_connect (button, "clicked",
5332 G_CALLBACK (toggle_numeric),
5334 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5335 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5337 val_label = gtk_label_new ("");
5339 hbox = gtk_hbox_new (FALSE, 0);
5340 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5342 button = gtk_button_new_with_label ("Value as Int");
5343 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5344 g_signal_connect (button, "clicked",
5345 G_CALLBACK (get_value),
5346 GINT_TO_POINTER (1));
5347 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5349 button = gtk_button_new_with_label ("Value as Float");
5350 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5351 g_signal_connect (button, "clicked",
5352 G_CALLBACK (get_value),
5353 GINT_TO_POINTER (2));
5354 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5356 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
5357 gtk_label_set_text (GTK_LABEL (val_label), "0");
5359 frame = gtk_frame_new ("Using Convenience Constructor");
5360 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5362 hbox = gtk_hbox_new (FALSE, 0);
5363 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5364 gtk_container_add (GTK_CONTAINER (frame), hbox);
5366 val_label = gtk_label_new ("0.0");
5368 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5369 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5370 g_signal_connect (spinner, "value_changed",
5371 G_CALLBACK (get_spin_value), val_label);
5372 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5373 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5375 hbox = gtk_hbox_new (FALSE, 0);
5376 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5378 button = gtk_button_new_with_label ("Close");
5379 g_signal_connect_swapped (button, "clicked",
5380 G_CALLBACK (gtk_widget_destroy),
5382 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5385 if (!gtk_widget_get_visible (window))
5386 gtk_widget_show_all (window);
5388 gtk_widget_destroy (window);
5397 cursor_expose_event (GtkWidget *widget,
5401 GtkDrawingArea *darea;
5402 GdkDrawable *drawable;
5409 g_return_val_if_fail (widget != NULL, TRUE);
5410 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5412 darea = GTK_DRAWING_AREA (widget);
5413 drawable = widget->window;
5414 white_gc = widget->style->white_gc;
5415 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5416 black_gc = widget->style->black_gc;
5417 max_width = widget->allocation.width;
5418 max_height = widget->allocation.height;
5420 gdk_draw_rectangle (drawable, white_gc,
5427 gdk_draw_rectangle (drawable, black_gc,
5434 gdk_draw_rectangle (drawable, gray_gc,
5445 set_cursor (GtkWidget *spinner,
5454 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5457 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5459 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
5460 vals = class->values;
5462 while (vals && vals->value != c)
5465 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5467 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5469 g_type_class_unref (class);
5471 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5472 gdk_window_set_cursor (widget->window, cursor);
5473 gdk_cursor_unref (cursor);
5477 cursor_event (GtkWidget *widget,
5479 GtkSpinButton *spinner)
5481 if ((event->type == GDK_BUTTON_PRESS) &&
5482 ((event->button.button == 1) ||
5483 (event->button.button == 3)))
5485 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5486 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5493 #ifdef GDK_WINDOWING_X11
5494 #include "x11/gdkx.h"
5497 change_cursor_theme (GtkWidget *widget,
5504 children = gtk_container_get_children (GTK_CONTAINER (data));
5506 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
5507 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
5509 g_list_free (children);
5511 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
5518 create_cursors (GtkWidget *widget)
5520 static GtkWidget *window = NULL;
5523 GtkWidget *main_vbox;
5536 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5537 gtk_window_set_screen (GTK_WINDOW (window),
5538 gtk_widget_get_screen (widget));
5540 g_signal_connect (window, "destroy",
5541 G_CALLBACK (gtk_widget_destroyed),
5544 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5546 main_vbox = gtk_vbox_new (FALSE, 5);
5547 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5548 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5551 g_object_new (gtk_vbox_get_type (),
5552 "GtkBox::homogeneous", FALSE,
5553 "GtkBox::spacing", 5,
5554 "GtkContainer::border_width", 10,
5555 "GtkWidget::parent", main_vbox,
5556 "GtkWidget::visible", TRUE,
5559 #ifdef GDK_WINDOWING_X11
5560 hbox = gtk_hbox_new (FALSE, 0);
5561 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5562 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5564 label = gtk_label_new ("Cursor Theme : ");
5565 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5566 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5568 entry = gtk_entry_new ();
5569 gtk_entry_set_text (GTK_ENTRY (entry), "default");
5570 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
5572 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
5573 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
5574 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5576 g_signal_connect (entry, "changed",
5577 G_CALLBACK (change_cursor_theme), hbox);
5578 g_signal_connect (size, "changed",
5579 G_CALLBACK (change_cursor_theme), hbox);
5582 hbox = gtk_hbox_new (FALSE, 0);
5583 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5584 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5586 label = gtk_label_new ("Cursor Value : ");
5587 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5588 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5590 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5594 spinner = gtk_spin_button_new (adj, 0, 0);
5595 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5598 g_object_new (gtk_frame_get_type (),
5599 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5600 "GtkFrame::label_xalign", 0.5,
5601 "GtkFrame::label", "Cursor Area",
5602 "GtkContainer::border_width", 10,
5603 "GtkWidget::parent", vbox,
5604 "GtkWidget::visible", TRUE,
5607 darea = gtk_drawing_area_new ();
5608 gtk_widget_set_size_request (darea, 80, 80);
5609 gtk_container_add (GTK_CONTAINER (frame), darea);
5610 g_signal_connect (darea,
5612 G_CALLBACK (cursor_expose_event),
5614 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5615 g_signal_connect (darea,
5616 "button_press_event",
5617 G_CALLBACK (cursor_event),
5619 gtk_widget_show (darea);
5621 g_signal_connect (spinner, "changed",
5622 G_CALLBACK (set_cursor),
5625 label = g_object_new (GTK_TYPE_LABEL,
5630 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5633 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5636 g_object_new (gtk_hseparator_get_type (),
5637 "GtkWidget::visible", TRUE,
5639 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5641 hbox = gtk_hbox_new (FALSE, 0);
5642 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5643 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5645 button = gtk_button_new_with_label ("Close");
5646 g_signal_connect_swapped (button, "clicked",
5647 G_CALLBACK (gtk_widget_destroy),
5649 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5651 gtk_widget_show_all (window);
5653 set_cursor (spinner, darea);
5656 gtk_widget_destroy (window);
5664 color_selection_ok (GtkWidget *w,
5665 GtkColorSelectionDialog *cs)
5667 GtkWidget *colorsel;
5670 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5672 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5673 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5677 color_selection_changed (GtkWidget *w,
5678 GtkColorSelectionDialog *cs)
5680 GtkWidget *colorsel;
5683 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5684 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5685 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5690 opacity_toggled_cb (GtkWidget *w,
5691 GtkColorSelectionDialog *cs)
5693 GtkColorSelection *colorsel;
5695 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5696 gtk_color_selection_set_has_opacity_control (colorsel,
5697 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5701 palette_toggled_cb (GtkWidget *w,
5702 GtkColorSelectionDialog *cs)
5704 GtkColorSelection *colorsel;
5706 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5707 gtk_color_selection_set_has_palette (colorsel,
5708 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5713 create_color_selection (GtkWidget *widget)
5715 static GtkWidget *window = NULL;
5724 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5725 gtk_window_set_screen (GTK_WINDOW (window),
5726 gtk_widget_get_screen (widget));
5728 g_signal_connect (window, "destroy",
5729 G_CALLBACK (gtk_widget_destroyed),
5732 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5733 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5735 hbox = gtk_hbox_new (FALSE, 8);
5736 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5737 gtk_container_add (GTK_CONTAINER (window), hbox);
5739 label = gtk_label_new ("Pick a color");
5740 gtk_container_add (GTK_CONTAINER (hbox), label);
5742 picker = gtk_color_button_new ();
5743 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5744 gtk_container_add (GTK_CONTAINER (hbox), picker);
5746 button = gtk_button_new_with_mnemonic ("_Props");
5747 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5748 g_signal_connect (button, "clicked",
5749 G_CALLBACK (props_clicked),
5753 if (!gtk_widget_get_visible (window))
5754 gtk_widget_show_all (window);
5756 gtk_widget_destroy (window);
5760 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5762 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5763 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5765 gtk_widget_set_default_direction (new_direction);
5769 orientable_toggle_orientation (GtkOrientable *orientable)
5771 GtkOrientation orientation;
5773 orientation = gtk_orientable_get_orientation (orientable);
5774 gtk_orientable_set_orientation (orientable,
5775 orientation == GTK_ORIENTATION_HORIZONTAL ?
5776 GTK_ORIENTATION_VERTICAL :
5777 GTK_ORIENTATION_HORIZONTAL);
5779 if (GTK_IS_CONTAINER (orientable))
5784 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5786 for (child = children; child; child = child->next)
5788 if (GTK_IS_ORIENTABLE (child->data))
5789 orientable_toggle_orientation (child->data);
5792 g_list_free (children);
5797 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5799 GtkWidget *content_area;
5800 GtkWidget *toplevel;
5802 toplevel = gtk_widget_get_toplevel (widget);
5803 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5804 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5808 set_direction_recurse (GtkWidget *widget,
5811 GtkTextDirection *dir = data;
5813 gtk_widget_set_direction (widget, *dir);
5814 if (GTK_IS_CONTAINER (widget))
5815 gtk_container_foreach (GTK_CONTAINER (widget),
5816 set_direction_recurse,
5821 create_forward_back (const char *title,
5822 GtkTextDirection text_dir)
5824 GtkWidget *frame = gtk_frame_new (title);
5825 GtkWidget *bbox = gtk_hbutton_box_new ();
5826 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5827 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5829 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5831 gtk_container_add (GTK_CONTAINER (frame), bbox);
5832 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5833 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5835 set_direction_recurse (frame, &text_dir);
5841 create_flipping (GtkWidget *widget)
5843 static GtkWidget *window = NULL;
5844 GtkWidget *check_button, *button;
5845 GtkWidget *action_area, *content_area;
5849 window = gtk_dialog_new ();
5851 gtk_window_set_screen (GTK_WINDOW (window),
5852 gtk_widget_get_screen (widget));
5854 g_signal_connect (window, "destroy",
5855 G_CALLBACK (gtk_widget_destroyed),
5858 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5859 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5861 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5863 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5864 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5865 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5867 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5868 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5870 g_signal_connect (check_button, "toggled",
5871 G_CALLBACK (flipping_toggled_cb), NULL);
5873 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5874 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5875 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5877 g_signal_connect (check_button, "toggled",
5878 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5880 gtk_box_pack_start (GTK_BOX (content_area),
5881 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5884 gtk_box_pack_start (GTK_BOX (content_area),
5885 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5888 gtk_box_pack_start (GTK_BOX (content_area),
5889 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5892 button = gtk_button_new_with_label ("Close");
5893 g_signal_connect_swapped (button, "clicked",
5894 G_CALLBACK (gtk_widget_destroy), window);
5895 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5898 if (!gtk_widget_get_visible (window))
5899 gtk_widget_show_all (window);
5901 gtk_widget_destroy (window);
5909 make_focus_table (GList **list)
5914 table = gtk_table_new (5, 5, FALSE);
5927 widget = gtk_entry_new ();
5929 widget = gtk_button_new_with_label ("Foo");
5931 *list = g_list_prepend (*list, widget);
5933 gtk_table_attach (GTK_TABLE (table),
5937 GTK_EXPAND | GTK_FILL,
5938 GTK_EXPAND | GTK_FILL,
5947 *list = g_list_reverse (*list);
5953 create_focus (GtkWidget *widget)
5955 static GtkWidget *window = NULL;
5959 GtkWidget *content_area;
5964 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5970 gtk_window_set_screen (GTK_WINDOW (window),
5971 gtk_widget_get_screen (widget));
5973 g_signal_connect (window, "destroy",
5974 G_CALLBACK (gtk_widget_destroyed),
5977 g_signal_connect (window, "response",
5978 G_CALLBACK (gtk_widget_destroy),
5981 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5983 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5985 frame = gtk_frame_new ("Weird tab focus chain");
5987 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5989 table = make_focus_table (&list);
5991 gtk_container_add (GTK_CONTAINER (frame), table);
5993 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5998 frame = gtk_frame_new ("Default tab focus chain");
6000 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
6003 table = make_focus_table (&list);
6007 gtk_container_add (GTK_CONTAINER (frame), table);
6010 if (!gtk_widget_get_visible (window))
6011 gtk_widget_show_all (window);
6013 gtk_widget_destroy (window);
6021 font_selection_ok (GtkWidget *w,
6022 GtkFontSelectionDialog *fs)
6024 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
6026 g_print ("%s\n", s);
6028 gtk_widget_destroy (GTK_WIDGET (fs));
6032 create_font_selection (GtkWidget *widget)
6034 static GtkWidget *window = NULL;
6042 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6043 gtk_window_set_screen (GTK_WINDOW (window),
6044 gtk_widget_get_screen (widget));
6046 g_signal_connect (window, "destroy",
6047 G_CALLBACK (gtk_widget_destroyed),
6050 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
6051 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6053 hbox = gtk_hbox_new (FALSE, 8);
6054 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6055 gtk_container_add (GTK_CONTAINER (window), hbox);
6057 label = gtk_label_new ("Pick a font");
6058 gtk_container_add (GTK_CONTAINER (hbox), label);
6060 picker = gtk_font_button_new ();
6061 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
6062 gtk_container_add (GTK_CONTAINER (hbox), picker);
6065 if (!gtk_widget_get_visible (window))
6066 gtk_widget_show_all (window);
6068 gtk_widget_destroy (window);
6075 static GtkWidget *dialog_window = NULL;
6078 label_toggle (GtkWidget *widget,
6083 *label = gtk_label_new ("Dialog Test");
6084 g_signal_connect (*label,
6086 G_CALLBACK (gtk_widget_destroyed),
6088 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
6089 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
6090 *label, TRUE, TRUE, 0);
6091 gtk_widget_show (*label);
6094 gtk_widget_destroy (*label);
6097 #define RESPONSE_TOGGLE_SEPARATOR 1
6100 print_response (GtkWidget *dialog,
6104 g_print ("response signal received (%d)\n", response_id);
6106 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
6108 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
6109 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
6114 create_dialog (GtkWidget *widget)
6116 static GtkWidget *label;
6117 GtkWidget *action_area;
6122 /* This is a terrible example; it's much simpler to create
6123 * dialogs than this. Don't use testgtk for example code,
6127 dialog_window = gtk_dialog_new ();
6128 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6129 gtk_widget_get_screen (widget));
6131 g_signal_connect (dialog_window,
6133 G_CALLBACK (print_response),
6136 g_signal_connect (dialog_window, "destroy",
6137 G_CALLBACK (gtk_widget_destroyed),
6140 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
6142 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
6143 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6145 button = gtk_button_new_with_label ("OK");
6146 gtk_widget_set_can_default (button, TRUE);
6147 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6148 gtk_widget_grab_default (button);
6149 gtk_widget_show (button);
6151 button = gtk_button_new_with_label ("Toggle");
6152 g_signal_connect (button, "clicked",
6153 G_CALLBACK (label_toggle),
6155 gtk_widget_set_can_default (button, TRUE);
6156 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6157 gtk_widget_show (button);
6161 button = gtk_button_new_with_label ("Separator");
6163 gtk_widget_set_can_default (button, TRUE);
6165 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
6167 RESPONSE_TOGGLE_SEPARATOR);
6168 gtk_widget_show (button);
6171 if (!gtk_widget_get_visible (dialog_window))
6172 gtk_widget_show (dialog_window);
6174 gtk_widget_destroy (dialog_window);
6177 /* Display & Screen test
6184 GtkWidget *radio_dpy;
6185 GtkWidget *toplevel;
6186 GtkWidget *dialog_window;
6187 } ScreenDisplaySelection;
6190 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
6192 const gchar *display_name;
6193 GdkDisplay *display = gtk_widget_get_display (widget);
6195 GdkScreen *new_screen = NULL;
6196 GdkScreen *current_screen = gtk_widget_get_screen (widget);
6198 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
6200 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
6201 display = gdk_display_open (display_name);
6205 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
6206 GTK_DIALOG_DESTROY_WITH_PARENT,
6209 "The display :\n%s\ncannot be opened",
6211 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
6212 gtk_widget_show (dialog);
6213 g_signal_connect (dialog, "response",
6214 G_CALLBACK (gtk_widget_destroy),
6219 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
6222 gboolean found = FALSE;
6223 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
6226 gtk_tree_model_get (model, &iter, 0, &name, -1);
6227 found = !g_ascii_strcasecmp (display_name, name);
6234 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
6235 new_screen = gdk_display_get_default_screen (display);
6240 gint number_of_screens = gdk_display_get_n_screens (display);
6241 gint screen_num = gdk_screen_get_number (current_screen);
6242 if ((screen_num +1) < number_of_screens)
6243 new_screen = gdk_display_get_screen (display, screen_num + 1);
6245 new_screen = gdk_display_get_screen (display, 0);
6250 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
6251 gtk_widget_destroy (data->dialog_window);
6256 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
6258 gtk_widget_destroy (data);
6262 create_display_screen (GtkWidget *widget)
6264 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
6265 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
6267 ScreenDisplaySelection *scr_dpy_data;
6268 GdkScreen *screen = gtk_widget_get_screen (widget);
6269 GdkDisplay *display = gdk_screen_get_display (screen);
6271 window = g_object_new (gtk_window_get_type (),
6274 "type", GTK_WINDOW_TOPLEVEL,
6276 "Screen or Display selection",
6277 "border_width", 10, NULL);
6278 g_signal_connect (window, "destroy",
6279 G_CALLBACK (gtk_widget_destroy), NULL);
6281 vbox = gtk_vbox_new (FALSE, 3);
6282 gtk_container_add (GTK_CONTAINER (window), vbox);
6284 frame = gtk_frame_new ("Select screen or display");
6285 gtk_container_add (GTK_CONTAINER (vbox), frame);
6287 table = gtk_table_new (2, 2, TRUE);
6288 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
6289 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
6291 gtk_container_add (GTK_CONTAINER (frame), table);
6293 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
6294 if (gdk_display_get_n_screens(display) > 1)
6295 radio_scr = gtk_radio_button_new_with_label
6296 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
6299 radio_scr = gtk_radio_button_new_with_label
6300 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
6301 "only one screen on the current display");
6302 gtk_widget_set_sensitive (radio_scr, FALSE);
6304 combo_dpy = gtk_combo_box_new_text ();
6305 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
6306 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
6307 "<hostname>:<X Server Num>.<Screen Num>");
6309 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
6310 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
6311 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
6313 bbox = gtk_hbutton_box_new ();
6314 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
6315 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
6317 gtk_container_add (GTK_CONTAINER (vbox), bbox);
6319 gtk_container_add (GTK_CONTAINER (bbox), applyb);
6320 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
6322 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
6324 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
6325 scr_dpy_data->radio_dpy = radio_dpy;
6326 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
6327 scr_dpy_data->dialog_window = window;
6329 g_signal_connect (cancelb, "clicked",
6330 G_CALLBACK (screen_display_destroy_diag), window);
6331 g_signal_connect (applyb, "clicked",
6332 G_CALLBACK (screen_display_check), scr_dpy_data);
6333 gtk_widget_show_all (window);
6338 static gboolean event_watcher_enter_id = 0;
6339 static gboolean event_watcher_leave_id = 0;
6342 event_watcher (GSignalInvocationHint *ihint,
6343 guint n_param_values,
6344 const GValue *param_values,
6347 g_print ("Watch: \"%s\" emitted for %s\n",
6348 g_signal_name (ihint->signal_id),
6349 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
6355 event_watcher_down (void)
6357 if (event_watcher_enter_id)
6361 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6362 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
6363 event_watcher_enter_id = 0;
6364 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6365 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
6366 event_watcher_leave_id = 0;
6371 event_watcher_toggle (void)
6373 if (event_watcher_enter_id)
6374 event_watcher_down ();
6379 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6380 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6381 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6382 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6387 create_event_watcher (GtkWidget *widget)
6389 GtkWidget *action_area, *content_area;
6394 dialog_window = gtk_dialog_new ();
6395 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6396 gtk_widget_get_screen (widget));
6398 g_signal_connect (dialog_window, "destroy",
6399 G_CALLBACK (gtk_widget_destroyed),
6401 g_signal_connect (dialog_window, "destroy",
6402 G_CALLBACK (event_watcher_down),
6405 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
6406 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
6408 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6409 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6410 gtk_widget_set_size_request (dialog_window, 200, 110);
6412 button = gtk_toggle_button_new_with_label ("Activate Watch");
6413 g_signal_connect (button, "clicked",
6414 G_CALLBACK (event_watcher_toggle),
6416 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6417 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
6418 gtk_widget_show (button);
6420 button = gtk_button_new_with_label ("Close");
6421 g_signal_connect_swapped (button, "clicked",
6422 G_CALLBACK (gtk_widget_destroy),
6424 gtk_widget_set_can_default (button, TRUE);
6425 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
6426 gtk_widget_grab_default (button);
6427 gtk_widget_show (button);
6430 if (!gtk_widget_get_visible (dialog_window))
6431 gtk_widget_show (dialog_window);
6433 gtk_widget_destroy (dialog_window);
6441 reformat_value (GtkScale *scale,
6444 return g_strdup_printf ("-->%0.*g<--",
6445 gtk_scale_get_digits (scale), value);
6449 create_range_controls (GtkWidget *widget)
6451 static GtkWidget *window = NULL;
6455 GtkWidget *scrollbar;
6457 GtkWidget *separator;
6458 GtkObject *adjustment;
6463 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6465 gtk_window_set_screen (GTK_WINDOW (window),
6466 gtk_widget_get_screen (widget));
6468 g_signal_connect (window, "destroy",
6469 G_CALLBACK (gtk_widget_destroyed),
6472 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6473 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6476 box1 = gtk_vbox_new (FALSE, 0);
6477 gtk_container_add (GTK_CONTAINER (window), box1);
6478 gtk_widget_show (box1);
6481 box2 = gtk_vbox_new (FALSE, 10);
6482 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6483 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6484 gtk_widget_show (box2);
6487 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6489 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6490 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6491 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6492 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6493 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6494 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6495 gtk_widget_show (scale);
6497 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6498 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6499 GTK_UPDATE_CONTINUOUS);
6500 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6501 gtk_widget_show (scrollbar);
6503 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6504 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6505 g_signal_connect (scale,
6507 G_CALLBACK (reformat_value),
6509 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6510 gtk_widget_show (scale);
6512 hbox = gtk_hbox_new (FALSE, 0);
6514 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6515 gtk_widget_set_size_request (scale, -1, 200);
6516 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6517 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6518 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6519 gtk_widget_show (scale);
6521 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6522 gtk_widget_set_size_request (scale, -1, 200);
6523 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6524 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6525 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6526 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6527 gtk_widget_show (scale);
6529 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6530 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6531 g_signal_connect (scale,
6533 G_CALLBACK (reformat_value),
6535 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6536 gtk_widget_show (scale);
6539 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6540 gtk_widget_show (hbox);
6542 separator = gtk_hseparator_new ();
6543 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6544 gtk_widget_show (separator);
6547 box2 = gtk_vbox_new (FALSE, 10);
6548 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6549 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6550 gtk_widget_show (box2);
6553 button = gtk_button_new_with_label ("close");
6554 g_signal_connect_swapped (button, "clicked",
6555 G_CALLBACK (gtk_widget_destroy),
6557 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6558 gtk_widget_set_can_default (button, TRUE);
6559 gtk_widget_grab_default (button);
6560 gtk_widget_show (button);
6563 if (!gtk_widget_get_visible (window))
6564 gtk_widget_show (window);
6566 gtk_widget_destroy (window);
6574 create_rulers (GtkWidget *widget)
6576 static GtkWidget *window = NULL;
6582 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6584 gtk_window_set_screen (GTK_WINDOW (window),
6585 gtk_widget_get_screen (widget));
6587 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
6589 g_signal_connect (window, "destroy",
6590 G_CALLBACK (gtk_widget_destroyed),
6593 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6594 gtk_widget_set_size_request (window, 300, 300);
6595 gtk_widget_set_events (window,
6596 GDK_POINTER_MOTION_MASK
6597 | GDK_POINTER_MOTION_HINT_MASK);
6598 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6600 table = gtk_table_new (2, 2, FALSE);
6601 gtk_container_add (GTK_CONTAINER (window), table);
6602 gtk_widget_show (table);
6604 ruler = gtk_hruler_new ();
6605 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6606 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6608 g_signal_connect_swapped (window,
6609 "motion_notify_event",
6610 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6613 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6614 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6615 gtk_widget_show (ruler);
6618 ruler = gtk_vruler_new ();
6619 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6621 g_signal_connect_swapped (window,
6622 "motion_notify_event",
6623 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6626 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6627 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6628 gtk_widget_show (ruler);
6631 if (!gtk_widget_get_visible (window))
6632 gtk_widget_show (window);
6634 gtk_widget_destroy (window);
6641 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6642 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6643 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6644 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6645 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6646 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6647 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6648 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6651 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6657 static char * book_open_xpm[] = {
6680 static char * book_closed_xpm[] = {
6705 GdkPixbuf *book_open;
6706 GdkPixbuf *book_closed;
6707 GtkWidget *sample_notebook;
6710 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6712 GtkWidget *page_widget;
6715 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6717 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6718 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6720 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6721 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6725 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6727 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6728 gint old_page_num = gtk_notebook_get_current_page (notebook);
6730 if (page_num == old_page_num)
6733 set_page_image (notebook, page_num, book_open);
6735 if (old_page_num != -1)
6736 set_page_image (notebook, old_page_num, book_closed);
6740 tab_fill (GtkToggleButton *button, GtkWidget *child)
6742 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6743 "tab-fill", gtk_toggle_button_get_active (button),
6748 tab_expand (GtkToggleButton *button, GtkWidget *child)
6750 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6751 "tab-expand", gtk_toggle_button_get_active (button),
6756 create_pages (GtkNotebook *notebook, gint start, gint end)
6758 GtkWidget *child = NULL;
6763 GtkWidget *label_box;
6764 GtkWidget *menu_box;
6768 char accel_buffer[32];
6770 for (i = start; i <= end; i++)
6772 sprintf (buffer, "Page %d", i);
6773 sprintf (accel_buffer, "Page _%d", i);
6775 child = gtk_frame_new (buffer);
6776 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6778 vbox = gtk_vbox_new (TRUE,0);
6779 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6780 gtk_container_add (GTK_CONTAINER (child), vbox);
6782 hbox = gtk_hbox_new (TRUE,0);
6783 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6785 button = gtk_check_button_new_with_label ("Fill Tab");
6786 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6787 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6788 g_signal_connect (button, "toggled",
6789 G_CALLBACK (tab_fill), child);
6791 button = gtk_check_button_new_with_label ("Expand Tab");
6792 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6793 g_signal_connect (button, "toggled",
6794 G_CALLBACK (tab_expand), child);
6796 button = gtk_button_new_with_label ("Hide Page");
6797 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6798 g_signal_connect_swapped (button, "clicked",
6799 G_CALLBACK (gtk_widget_hide),
6802 gtk_widget_show_all (child);
6804 label_box = gtk_hbox_new (FALSE, 0);
6805 pixwid = gtk_image_new_from_pixbuf (book_closed);
6806 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6808 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6809 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6810 label = gtk_label_new_with_mnemonic (accel_buffer);
6811 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6812 gtk_widget_show_all (label_box);
6815 menu_box = gtk_hbox_new (FALSE, 0);
6816 pixwid = gtk_image_new_from_pixbuf (book_closed);
6817 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6819 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6820 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6821 label = gtk_label_new (buffer);
6822 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6823 gtk_widget_show_all (menu_box);
6825 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6830 rotate_notebook (GtkButton *button,
6831 GtkNotebook *notebook)
6833 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6837 show_all_pages (GtkButton *button,
6838 GtkNotebook *notebook)
6840 gtk_container_foreach (GTK_CONTAINER (notebook),
6841 (GtkCallback) gtk_widget_show, NULL);
6845 notebook_type_changed (GtkWidget *optionmenu,
6848 GtkNotebook *notebook;
6858 notebook = GTK_NOTEBOOK (data);
6860 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6865 /* standard notebook */
6866 gtk_notebook_set_show_tabs (notebook, TRUE);
6867 gtk_notebook_set_show_border (notebook, TRUE);
6868 gtk_notebook_set_scrollable (notebook, FALSE);
6872 /* notabs notebook */
6873 gtk_notebook_set_show_tabs (notebook, FALSE);
6874 gtk_notebook_set_show_border (notebook, TRUE);
6879 gtk_notebook_set_show_tabs (notebook, FALSE);
6880 gtk_notebook_set_show_border (notebook, FALSE);
6885 gtk_notebook_set_show_tabs (notebook, TRUE);
6886 gtk_notebook_set_show_border (notebook, TRUE);
6887 gtk_notebook_set_scrollable (notebook, TRUE);
6888 if (gtk_notebook_get_n_pages (notebook) == 5)
6889 create_pages (notebook, 6, 15);
6895 if (gtk_notebook_get_n_pages (notebook) == 15)
6896 for (i = 0; i < 10; i++)
6897 gtk_notebook_remove_page (notebook, 5);
6901 notebook_popup (GtkToggleButton *button,
6902 GtkNotebook *notebook)
6905 gtk_notebook_popup_enable (notebook);
6907 gtk_notebook_popup_disable (notebook);
6911 create_notebook (GtkWidget *widget)
6913 static GtkWidget *window = NULL;
6917 GtkWidget *separator;
6921 static gchar *items[] =
6931 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6932 gtk_window_set_screen (GTK_WINDOW (window),
6933 gtk_widget_get_screen (widget));
6935 g_signal_connect (window, "destroy",
6936 G_CALLBACK (gtk_widget_destroyed),
6939 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6940 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6942 box1 = gtk_vbox_new (FALSE, 0);
6943 gtk_container_add (GTK_CONTAINER (window), box1);
6945 sample_notebook = gtk_notebook_new ();
6946 g_signal_connect (sample_notebook, "switch_page",
6947 G_CALLBACK (page_switch), NULL);
6948 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6949 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6950 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6952 gtk_widget_realize (sample_notebook);
6955 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
6958 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
6960 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6962 separator = gtk_hseparator_new ();
6963 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6965 box2 = gtk_hbox_new (FALSE, 5);
6966 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6967 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6969 button = gtk_check_button_new_with_label ("popup menu");
6970 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6971 g_signal_connect (button, "clicked",
6972 G_CALLBACK (notebook_popup),
6975 box2 = gtk_hbox_new (FALSE, 5);
6976 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6977 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6979 label = gtk_label_new ("Notebook Style :");
6980 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6982 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6983 notebook_type_changed,
6985 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6987 button = gtk_button_new_with_label ("Show all Pages");
6988 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6989 g_signal_connect (button, "clicked",
6990 G_CALLBACK (show_all_pages), sample_notebook);
6992 box2 = gtk_hbox_new (TRUE, 10);
6993 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6994 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6996 button = gtk_button_new_with_label ("prev");
6997 g_signal_connect_swapped (button, "clicked",
6998 G_CALLBACK (gtk_notebook_prev_page),
7000 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7002 button = gtk_button_new_with_label ("next");
7003 g_signal_connect_swapped (button, "clicked",
7004 G_CALLBACK (gtk_notebook_next_page),
7006 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7008 button = gtk_button_new_with_label ("rotate");
7009 g_signal_connect (button, "clicked",
7010 G_CALLBACK (rotate_notebook), sample_notebook);
7011 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7013 separator = gtk_hseparator_new ();
7014 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
7016 button = gtk_button_new_with_label ("close");
7017 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
7018 g_signal_connect_swapped (button, "clicked",
7019 G_CALLBACK (gtk_widget_destroy),
7021 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
7022 gtk_widget_set_can_default (button, TRUE);
7023 gtk_widget_grab_default (button);
7026 if (!gtk_widget_get_visible (window))
7027 gtk_widget_show_all (window);
7029 gtk_widget_destroy (window);
7037 toggle_resize (GtkWidget *widget, GtkWidget *child)
7039 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7040 GValue value = { 0, };
7041 g_value_init (&value, G_TYPE_BOOLEAN);
7042 gtk_container_child_get_property (container, child, "resize", &value);
7043 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7044 gtk_container_child_set_property (container, child, "resize", &value);
7048 toggle_shrink (GtkWidget *widget, GtkWidget *child)
7050 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7051 GValue value = { 0, };
7052 g_value_init (&value, G_TYPE_BOOLEAN);
7053 gtk_container_child_get_property (container, child, "shrink", &value);
7054 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7055 gtk_container_child_set_property (container, child, "shrink", &value);
7059 paned_props_clicked (GtkWidget *button,
7062 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
7064 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
7068 create_pane_options (GtkPaned *paned,
7069 const gchar *frame_label,
7070 const gchar *label1,
7071 const gchar *label2)
7077 GtkWidget *check_button;
7079 frame = gtk_frame_new (frame_label);
7080 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
7082 table = gtk_table_new (4, 2, 4);
7083 gtk_container_add (GTK_CONTAINER (frame), table);
7085 label = gtk_label_new (label1);
7086 gtk_table_attach_defaults (GTK_TABLE (table), label,
7089 check_button = gtk_check_button_new_with_label ("Resize");
7090 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7092 g_signal_connect (check_button, "toggled",
7093 G_CALLBACK (toggle_resize),
7096 check_button = gtk_check_button_new_with_label ("Shrink");
7097 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7099 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7101 g_signal_connect (check_button, "toggled",
7102 G_CALLBACK (toggle_shrink),
7105 label = gtk_label_new (label2);
7106 gtk_table_attach_defaults (GTK_TABLE (table), label,
7109 check_button = gtk_check_button_new_with_label ("Resize");
7110 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7112 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7114 g_signal_connect (check_button, "toggled",
7115 G_CALLBACK (toggle_resize),
7118 check_button = gtk_check_button_new_with_label ("Shrink");
7119 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7121 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7123 g_signal_connect (check_button, "toggled",
7124 G_CALLBACK (toggle_shrink),
7127 button = gtk_button_new_with_mnemonic ("_Properties");
7128 gtk_table_attach_defaults (GTK_TABLE (table), button,
7130 g_signal_connect (button, "clicked",
7131 G_CALLBACK (paned_props_clicked),
7138 create_panes (GtkWidget *widget)
7140 static GtkWidget *window = NULL;
7149 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7151 gtk_window_set_screen (GTK_WINDOW (window),
7152 gtk_widget_get_screen (widget));
7154 g_signal_connect (window, "destroy",
7155 G_CALLBACK (gtk_widget_destroyed),
7158 gtk_window_set_title (GTK_WINDOW (window), "Panes");
7159 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7161 vbox = gtk_vbox_new (FALSE, 0);
7162 gtk_container_add (GTK_CONTAINER (window), vbox);
7164 vpaned = gtk_vpaned_new ();
7165 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
7166 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
7168 hpaned = gtk_hpaned_new ();
7169 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
7171 frame = gtk_frame_new (NULL);
7172 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7173 gtk_widget_set_size_request (frame, 60, 60);
7174 gtk_paned_add1 (GTK_PANED (hpaned), frame);
7176 button = gtk_button_new_with_label ("Hi there");
7177 gtk_container_add (GTK_CONTAINER(frame), button);
7179 frame = gtk_frame_new (NULL);
7180 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7181 gtk_widget_set_size_request (frame, 80, 60);
7182 gtk_paned_add2 (GTK_PANED (hpaned), frame);
7184 frame = gtk_frame_new (NULL);
7185 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7186 gtk_widget_set_size_request (frame, 60, 80);
7187 gtk_paned_add2 (GTK_PANED (vpaned), frame);
7189 /* Now create toggle buttons to control sizing */
7191 gtk_box_pack_start (GTK_BOX (vbox),
7192 create_pane_options (GTK_PANED (hpaned),
7198 gtk_box_pack_start (GTK_BOX (vbox),
7199 create_pane_options (GTK_PANED (vpaned),
7205 gtk_widget_show_all (vbox);
7208 if (!gtk_widget_get_visible (window))
7209 gtk_widget_show (window);
7211 gtk_widget_destroy (window);
7215 * Paned keyboard navigation
7219 paned_keyboard_window1 (GtkWidget *widget)
7242 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7243 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
7244 gtk_window_set_screen (GTK_WINDOW (window1),
7245 gtk_widget_get_screen (widget));
7247 hpaned1 = gtk_hpaned_new ();
7248 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
7250 frame1 = gtk_frame_new (NULL);
7251 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
7252 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
7254 vbox1 = gtk_vbox_new (FALSE, 0);
7255 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
7257 button7 = gtk_button_new_with_label ("button7");
7258 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
7260 button8 = gtk_button_new_with_label ("button8");
7261 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
7263 button9 = gtk_button_new_with_label ("button9");
7264 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
7266 vpaned1 = gtk_vpaned_new ();
7267 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
7269 frame2 = gtk_frame_new (NULL);
7270 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
7271 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
7273 frame5 = gtk_frame_new (NULL);
7274 gtk_container_add (GTK_CONTAINER (frame2), frame5);
7276 hbox1 = gtk_hbox_new (FALSE, 0);
7277 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
7279 button5 = gtk_button_new_with_label ("button5");
7280 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
7282 button6 = gtk_button_new_with_label ("button6");
7283 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
7285 frame3 = gtk_frame_new (NULL);
7286 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
7287 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
7289 frame4 = gtk_frame_new ("Buttons");
7290 gtk_container_add (GTK_CONTAINER (frame3), frame4);
7291 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
7293 table1 = gtk_table_new (2, 2, FALSE);
7294 gtk_container_add (GTK_CONTAINER (frame4), table1);
7295 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
7297 button1 = gtk_button_new_with_label ("button1");
7298 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
7299 (GtkAttachOptions) (GTK_FILL),
7300 (GtkAttachOptions) (0), 0, 0);
7302 button2 = gtk_button_new_with_label ("button2");
7303 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
7304 (GtkAttachOptions) (GTK_FILL),
7305 (GtkAttachOptions) (0), 0, 0);
7307 button3 = gtk_button_new_with_label ("button3");
7308 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
7309 (GtkAttachOptions) (GTK_FILL),
7310 (GtkAttachOptions) (0), 0, 0);
7312 button4 = gtk_button_new_with_label ("button4");
7313 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
7314 (GtkAttachOptions) (GTK_FILL),
7315 (GtkAttachOptions) (0), 0, 0);
7321 paned_keyboard_window2 (GtkWidget *widget)
7326 GtkWidget *button13;
7330 GtkWidget *button12;
7332 GtkWidget *button11;
7333 GtkWidget *button10;
7335 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7336 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
7338 gtk_window_set_screen (GTK_WINDOW (window2),
7339 gtk_widget_get_screen (widget));
7341 hpaned2 = gtk_hpaned_new ();
7342 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
7344 frame6 = gtk_frame_new (NULL);
7345 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
7346 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
7348 button13 = gtk_button_new_with_label ("button13");
7349 gtk_container_add (GTK_CONTAINER (frame6), button13);
7351 hbox2 = gtk_hbox_new (FALSE, 0);
7352 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
7354 vpaned2 = gtk_vpaned_new ();
7355 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
7357 frame7 = gtk_frame_new (NULL);
7358 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
7359 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
7361 button12 = gtk_button_new_with_label ("button12");
7362 gtk_container_add (GTK_CONTAINER (frame7), button12);
7364 frame8 = gtk_frame_new (NULL);
7365 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
7366 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
7368 button11 = gtk_button_new_with_label ("button11");
7369 gtk_container_add (GTK_CONTAINER (frame8), button11);
7371 button10 = gtk_button_new_with_label ("button10");
7372 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
7378 paned_keyboard_window3 (GtkWidget *widget)
7385 GtkWidget *button14;
7388 GtkWidget *button15;
7391 GtkWidget *button16;
7393 GtkWidget *button17;
7395 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7396 g_object_set_data (G_OBJECT (window3), "window3", window3);
7397 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
7399 gtk_window_set_screen (GTK_WINDOW (window3),
7400 gtk_widget_get_screen (widget));
7403 vbox2 = gtk_vbox_new (FALSE, 0);
7404 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7406 label1 = gtk_label_new ("Three panes nested inside each other");
7407 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7409 hpaned3 = gtk_hpaned_new ();
7410 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7412 frame9 = gtk_frame_new (NULL);
7413 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7414 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7416 button14 = gtk_button_new_with_label ("button14");
7417 gtk_container_add (GTK_CONTAINER (frame9), button14);
7419 hpaned4 = gtk_hpaned_new ();
7420 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7422 frame10 = gtk_frame_new (NULL);
7423 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7424 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7426 button15 = gtk_button_new_with_label ("button15");
7427 gtk_container_add (GTK_CONTAINER (frame10), button15);
7429 hpaned5 = gtk_hpaned_new ();
7430 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7432 frame11 = gtk_frame_new (NULL);
7433 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7434 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7436 button16 = gtk_button_new_with_label ("button16");
7437 gtk_container_add (GTK_CONTAINER (frame11), button16);
7439 frame12 = gtk_frame_new (NULL);
7440 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7441 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7443 button17 = gtk_button_new_with_label ("button17");
7444 gtk_container_add (GTK_CONTAINER (frame12), button17);
7450 paned_keyboard_window4 (GtkWidget *widget)
7457 GtkWidget *button19;
7458 GtkWidget *button18;
7461 GtkWidget *button21;
7462 GtkWidget *button20;
7464 GtkWidget *button23;
7465 GtkWidget *button22;
7467 GtkWidget *button25;
7468 GtkWidget *button24;
7470 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7471 g_object_set_data (G_OBJECT (window4), "window4", window4);
7472 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7474 gtk_window_set_screen (GTK_WINDOW (window4),
7475 gtk_widget_get_screen (widget));
7477 vbox3 = gtk_vbox_new (FALSE, 0);
7478 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7480 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7481 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7482 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7484 hpaned6 = gtk_hpaned_new ();
7485 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7487 vpaned3 = gtk_vpaned_new ();
7488 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7490 button19 = gtk_button_new_with_label ("button19");
7491 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7493 button18 = gtk_button_new_with_label ("button18");
7494 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7496 hbox3 = gtk_hbox_new (FALSE, 0);
7497 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7499 vpaned4 = gtk_vpaned_new ();
7500 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7502 button21 = gtk_button_new_with_label ("button21");
7503 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7505 button20 = gtk_button_new_with_label ("button20");
7506 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7508 vpaned5 = gtk_vpaned_new ();
7509 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7511 button23 = gtk_button_new_with_label ("button23");
7512 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7514 button22 = gtk_button_new_with_label ("button22");
7515 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7517 vpaned6 = gtk_vpaned_new ();
7518 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7520 button25 = gtk_button_new_with_label ("button25");
7521 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7523 button24 = gtk_button_new_with_label ("button24");
7524 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7530 create_paned_keyboard_navigation (GtkWidget *widget)
7532 static GtkWidget *window1 = NULL;
7533 static GtkWidget *window2 = NULL;
7534 static GtkWidget *window3 = NULL;
7535 static GtkWidget *window4 = NULL;
7538 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7540 gtk_widget_destroy (window1);
7541 gtk_widget_destroy (window2);
7542 gtk_widget_destroy (window3);
7543 gtk_widget_destroy (window4);
7548 window1 = paned_keyboard_window1 (widget);
7549 g_signal_connect (window1, "destroy",
7550 G_CALLBACK (gtk_widget_destroyed),
7556 window2 = paned_keyboard_window2 (widget);
7557 g_signal_connect (window2, "destroy",
7558 G_CALLBACK (gtk_widget_destroyed),
7564 window3 = paned_keyboard_window3 (widget);
7565 g_signal_connect (window3, "destroy",
7566 G_CALLBACK (gtk_widget_destroyed),
7572 window4 = paned_keyboard_window4 (widget);
7573 g_signal_connect (window4, "destroy",
7574 G_CALLBACK (gtk_widget_destroyed),
7578 if (gtk_widget_get_visible (window1))
7579 gtk_widget_destroy (GTK_WIDGET (window1));
7581 gtk_widget_show_all (GTK_WIDGET (window1));
7583 if (gtk_widget_get_visible (window2))
7584 gtk_widget_destroy (GTK_WIDGET (window2));
7586 gtk_widget_show_all (GTK_WIDGET (window2));
7588 if (gtk_widget_get_visible (window3))
7589 gtk_widget_destroy (GTK_WIDGET (window3));
7591 gtk_widget_show_all (GTK_WIDGET (window3));
7593 if (gtk_widget_get_visible (window4))
7594 gtk_widget_destroy (GTK_WIDGET (window4));
7596 gtk_widget_show_all (GTK_WIDGET (window4));
7604 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7607 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7611 /* ignore double and triple click */
7612 if (event->type != GDK_BUTTON_PRESS)
7615 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7616 p->x = (int) event->x;
7617 p->y = (int) event->y;
7619 gtk_grab_add (widget);
7620 gdk_pointer_grab (widget->window, TRUE,
7621 GDK_BUTTON_RELEASE_MASK |
7622 GDK_BUTTON_MOTION_MASK |
7623 GDK_POINTER_MOTION_HINT_MASK,
7628 shape_released (GtkWidget *widget)
7630 gtk_grab_remove (widget);
7631 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7636 shape_motion (GtkWidget *widget,
7637 GdkEventMotion *event)
7641 GdkModifierType mask;
7643 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7646 * Can't use event->x / event->y here
7647 * because I need absolute coordinates.
7649 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7650 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7654 shape_create_icon (GdkScreen *screen,
7665 CursorOffset* icon_pos;
7667 GdkBitmap *gdk_pixmap_mask;
7668 GdkPixmap *gdk_pixmap;
7671 style = gtk_widget_get_default_style ();
7672 gc = style->black_gc;
7675 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7677 window = gtk_window_new (window_type);
7678 gtk_window_set_screen (GTK_WINDOW (window), screen);
7680 fixed = gtk_fixed_new ();
7681 gtk_widget_set_size_request (fixed, 100, 100);
7682 gtk_container_add (GTK_CONTAINER (window), fixed);
7683 gtk_widget_show (fixed);
7685 gtk_widget_set_events (window,
7686 gtk_widget_get_events (window) |
7687 GDK_BUTTON_MOTION_MASK |
7688 GDK_POINTER_MOTION_HINT_MASK |
7689 GDK_BUTTON_PRESS_MASK);
7691 gtk_widget_realize (window);
7692 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
7693 &style->bg[GTK_STATE_NORMAL],
7696 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
7697 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
7698 gtk_widget_show (pixmap);
7700 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
7702 g_object_unref (gdk_pixmap_mask);
7703 g_object_unref (gdk_pixmap);
7705 g_signal_connect (window, "button_press_event",
7706 G_CALLBACK (shape_pressed), NULL);
7707 g_signal_connect (window, "button_release_event",
7708 G_CALLBACK (shape_released), NULL);
7709 g_signal_connect (window, "motion_notify_event",
7710 G_CALLBACK (shape_motion), NULL);
7712 icon_pos = g_new (CursorOffset, 1);
7713 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7715 gtk_window_move (GTK_WINDOW (window), x, y);
7716 gtk_widget_show (window);
7722 create_shapes (GtkWidget *widget)
7724 /* Variables used by the Drag/Drop and Shape Window demos */
7725 static GtkWidget *modeller = NULL;
7726 static GtkWidget *sheets = NULL;
7727 static GtkWidget *rings = NULL;
7728 static GtkWidget *with_region = NULL;
7729 GdkScreen *screen = gtk_widget_get_screen (widget);
7731 if (!(file_exists ("Modeller.xpm") &&
7732 file_exists ("FilesQueue.xpm") &&
7733 file_exists ("3DRings.xpm")))
7739 modeller = shape_create_icon (screen, "Modeller.xpm",
7740 440, 140, 0,0, GTK_WINDOW_POPUP);
7742 g_signal_connect (modeller, "destroy",
7743 G_CALLBACK (gtk_widget_destroyed),
7747 gtk_widget_destroy (modeller);
7751 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7752 580, 170, 0,0, GTK_WINDOW_POPUP);
7754 g_signal_connect (sheets, "destroy",
7755 G_CALLBACK (gtk_widget_destroyed),
7760 gtk_widget_destroy (sheets);
7764 rings = shape_create_icon (screen, "3DRings.xpm",
7765 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7767 g_signal_connect (rings, "destroy",
7768 G_CALLBACK (gtk_widget_destroyed),
7772 gtk_widget_destroy (rings);
7776 cairo_region_t *region;
7779 with_region = shape_create_icon (screen, "3DRings.xpm",
7780 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7782 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7784 g_signal_connect (with_region, "destroy",
7785 G_CALLBACK (gtk_widget_destroyed),
7788 /* reset shape from mask to a region */
7791 region = cairo_region_create ();
7803 cairo_region_union_rectangle (region, &rect);
7811 gdk_window_shape_combine_region (with_region->window,
7816 gtk_widget_destroy (with_region);
7824 create_wmhints (GtkWidget *widget)
7826 static GtkWidget *window = NULL;
7828 GtkWidget *separator;
7837 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7839 gtk_window_set_screen (GTK_WINDOW (window),
7840 gtk_widget_get_screen (widget));
7842 g_signal_connect (window, "destroy",
7843 G_CALLBACK (gtk_widget_destroyed),
7846 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7847 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7849 gtk_widget_realize (window);
7851 circles = gdk_bitmap_create_from_data (window->window,
7852 (gchar *) circles_bits,
7855 gdk_window_set_icon (window->window, NULL,
7858 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
7860 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7861 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7863 box1 = gtk_vbox_new (FALSE, 0);
7864 gtk_container_add (GTK_CONTAINER (window), box1);
7865 gtk_widget_show (box1);
7867 label = gtk_label_new ("Try iconizing me!");
7868 gtk_widget_set_size_request (label, 150, 50);
7869 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7870 gtk_widget_show (label);
7873 separator = gtk_hseparator_new ();
7874 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7875 gtk_widget_show (separator);
7878 box2 = gtk_vbox_new (FALSE, 10);
7879 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7880 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7881 gtk_widget_show (box2);
7884 button = gtk_button_new_with_label ("close");
7886 g_signal_connect_swapped (button, "clicked",
7887 G_CALLBACK (gtk_widget_destroy),
7890 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7891 gtk_widget_set_can_default (button, TRUE);
7892 gtk_widget_grab_default (button);
7893 gtk_widget_show (button);
7896 if (!gtk_widget_get_visible (window))
7897 gtk_widget_show (window);
7899 gtk_widget_destroy (window);
7904 * Window state tracking
7908 window_state_callback (GtkWidget *widget,
7909 GdkEventWindowState *event,
7912 GtkWidget *label = data;
7915 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
7916 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7917 "withdrawn" : "not withdrawn", ", ",
7918 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7919 "iconified" : "not iconified", ", ",
7920 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7921 "sticky" : "not sticky", ", ",
7922 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7923 "maximized" : "not maximized", ", ",
7924 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7925 "fullscreen" : "not fullscreen",
7926 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7927 "above" : "not above", ", ",
7928 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7929 "below" : "not below", ", ",
7932 gtk_label_set_text (GTK_LABEL (label), msg);
7940 tracking_label (GtkWidget *window)
7946 hbox = gtk_hbox_new (FALSE, 5);
7948 g_signal_connect_object (hbox,
7950 G_CALLBACK (gtk_widget_destroy),
7954 label = gtk_label_new ("<no window state events received>");
7955 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7956 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7958 g_signal_connect (window,
7959 "window_state_event",
7960 G_CALLBACK (window_state_callback),
7963 button = gtk_button_new_with_label ("Deiconify");
7964 g_signal_connect_object (button,
7966 G_CALLBACK (gtk_window_deiconify),
7969 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7971 button = gtk_button_new_with_label ("Iconify");
7972 g_signal_connect_object (button,
7974 G_CALLBACK (gtk_window_iconify),
7977 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7979 button = gtk_button_new_with_label ("Fullscreen");
7980 g_signal_connect_object (button,
7982 G_CALLBACK (gtk_window_fullscreen),
7985 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7987 button = gtk_button_new_with_label ("Unfullscreen");
7988 g_signal_connect_object (button,
7990 G_CALLBACK (gtk_window_unfullscreen),
7993 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7995 button = gtk_button_new_with_label ("Present");
7996 g_signal_connect_object (button,
7998 G_CALLBACK (gtk_window_present),
8001 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8003 button = gtk_button_new_with_label ("Show");
8004 g_signal_connect_object (button,
8006 G_CALLBACK (gtk_widget_show),
8009 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8011 gtk_widget_show_all (hbox);
8017 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
8019 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8021 gtk_window_set_keep_above (GTK_WINDOW (data),
8022 gtk_toggle_button_get_active (togglebutton));
8024 if (gtk_toggle_button_get_active (togglebutton))
8025 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8029 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
8031 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8033 gtk_window_set_keep_below (GTK_WINDOW (data),
8034 gtk_toggle_button_get_active (togglebutton));
8036 if (gtk_toggle_button_get_active (togglebutton))
8037 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8042 get_state_controls (GtkWidget *window)
8046 GtkWidget *button_above;
8047 GtkWidget *button_below;
8049 vbox = gtk_vbox_new (FALSE, 0);
8051 button = gtk_button_new_with_label ("Stick");
8052 g_signal_connect_object (button,
8054 G_CALLBACK (gtk_window_stick),
8057 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8059 button = gtk_button_new_with_label ("Unstick");
8060 g_signal_connect_object (button,
8062 G_CALLBACK (gtk_window_unstick),
8065 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8067 button = gtk_button_new_with_label ("Maximize");
8068 g_signal_connect_object (button,
8070 G_CALLBACK (gtk_window_maximize),
8073 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8075 button = gtk_button_new_with_label ("Unmaximize");
8076 g_signal_connect_object (button,
8078 G_CALLBACK (gtk_window_unmaximize),
8081 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8083 button = gtk_button_new_with_label ("Iconify");
8084 g_signal_connect_object (button,
8086 G_CALLBACK (gtk_window_iconify),
8089 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8091 button = gtk_button_new_with_label ("Fullscreen");
8092 g_signal_connect_object (button,
8094 G_CALLBACK (gtk_window_fullscreen),
8097 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8099 button = gtk_button_new_with_label ("Unfullscreen");
8100 g_signal_connect_object (button,
8102 G_CALLBACK (gtk_window_unfullscreen),
8105 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8107 button_above = gtk_toggle_button_new_with_label ("Keep above");
8108 g_signal_connect (button_above,
8110 G_CALLBACK (keep_window_above),
8112 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
8114 button_below = gtk_toggle_button_new_with_label ("Keep below");
8115 g_signal_connect (button_below,
8117 G_CALLBACK (keep_window_below),
8119 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
8121 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
8122 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
8124 button = gtk_button_new_with_label ("Hide (withdraw)");
8125 g_signal_connect_object (button,
8127 G_CALLBACK (gtk_widget_hide),
8130 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8132 gtk_widget_show_all (vbox);
8138 create_window_states (GtkWidget *widget)
8140 static GtkWidget *window = NULL;
8143 GtkWidget *iconified;
8145 GtkWidget *controls;
8149 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8150 gtk_window_set_screen (GTK_WINDOW (window),
8151 gtk_widget_get_screen (widget));
8153 g_signal_connect (window, "destroy",
8154 G_CALLBACK (gtk_widget_destroyed),
8157 gtk_window_set_title (GTK_WINDOW (window), "Window states");
8159 box1 = gtk_vbox_new (FALSE, 0);
8160 gtk_container_add (GTK_CONTAINER (window), box1);
8162 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8164 gtk_window_set_screen (GTK_WINDOW (iconified),
8165 gtk_widget_get_screen (widget));
8167 g_signal_connect_object (iconified, "destroy",
8168 G_CALLBACK (gtk_widget_destroy),
8171 gtk_window_iconify (GTK_WINDOW (iconified));
8172 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
8173 controls = get_state_controls (iconified);
8174 gtk_container_add (GTK_CONTAINER (iconified), controls);
8176 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8178 gtk_window_set_screen (GTK_WINDOW (normal),
8179 gtk_widget_get_screen (widget));
8181 g_signal_connect_object (normal, "destroy",
8182 G_CALLBACK (gtk_widget_destroy),
8186 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
8187 controls = get_state_controls (normal);
8188 gtk_container_add (GTK_CONTAINER (normal), controls);
8190 label = tracking_label (iconified);
8191 gtk_container_add (GTK_CONTAINER (box1), label);
8193 label = tracking_label (normal);
8194 gtk_container_add (GTK_CONTAINER (box1), label);
8196 gtk_widget_show_all (iconified);
8197 gtk_widget_show_all (normal);
8198 gtk_widget_show_all (box1);
8201 if (!gtk_widget_get_visible (window))
8202 gtk_widget_show (window);
8204 gtk_widget_destroy (window);
8212 configure_event_callback (GtkWidget *widget,
8213 GdkEventConfigure *event,
8216 GtkWidget *label = data;
8220 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
8222 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
8224 event->x, event->y, event->width, event->height,
8227 gtk_label_set_text (GTK_LABEL (label), msg);
8235 get_ints (GtkWidget *window,
8242 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
8243 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
8245 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
8246 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
8250 set_size_callback (GtkWidget *widget,
8255 get_ints (data, &w, &h);
8257 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
8261 unset_default_size_callback (GtkWidget *widget,
8264 gtk_window_set_default_size (g_object_get_data (data, "target"),
8269 set_default_size_callback (GtkWidget *widget,
8274 get_ints (data, &w, &h);
8276 gtk_window_set_default_size (g_object_get_data (data, "target"),
8281 unset_size_request_callback (GtkWidget *widget,
8284 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8289 set_size_request_callback (GtkWidget *widget,
8294 get_ints (data, &w, &h);
8296 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8301 set_location_callback (GtkWidget *widget,
8306 get_ints (data, &x, &y);
8308 gtk_window_move (g_object_get_data (data, "target"), x, y);
8312 move_to_position_callback (GtkWidget *widget,
8318 window = g_object_get_data (data, "target");
8320 gtk_window_get_position (window, &x, &y);
8322 gtk_window_move (window, x, y);
8326 set_geometry_callback (GtkWidget *entry,
8332 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
8334 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
8336 if (!gtk_window_parse_geometry (target, text))
8337 g_print ("Bad geometry string '%s'\n", text);
8343 allow_shrink_callback (GtkWidget *widget,
8346 g_object_set (g_object_get_data (data, "target"),
8348 GTK_TOGGLE_BUTTON (widget)->active,
8353 allow_grow_callback (GtkWidget *widget,
8356 g_object_set (g_object_get_data (data, "target"),
8358 GTK_TOGGLE_BUTTON (widget)->active,
8363 gravity_selected (GtkWidget *widget,
8366 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
8367 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
8371 pos_selected (GtkWidget *widget,
8374 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
8375 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
8379 move_gravity_window_to_current_position (GtkWidget *widget,
8385 window = GTK_WINDOW (data);
8387 gtk_window_get_position (window, &x, &y);
8389 gtk_window_move (window, x, y);
8393 get_screen_corner (GtkWindow *window,
8398 GdkScreen * screen = gtk_window_get_screen (window);
8400 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
8402 switch (gtk_window_get_gravity (window))
8404 case GDK_GRAVITY_SOUTH_EAST:
8405 *x = gdk_screen_get_width (screen) - w;
8406 *y = gdk_screen_get_height (screen) - h;
8409 case GDK_GRAVITY_NORTH_EAST:
8410 *x = gdk_screen_get_width (screen) - w;
8414 case GDK_GRAVITY_SOUTH_WEST:
8416 *y = gdk_screen_get_height (screen) - h;
8419 case GDK_GRAVITY_NORTH_WEST:
8424 case GDK_GRAVITY_SOUTH:
8425 *x = (gdk_screen_get_width (screen) - w) / 2;
8426 *y = gdk_screen_get_height (screen) - h;
8429 case GDK_GRAVITY_NORTH:
8430 *x = (gdk_screen_get_width (screen) - w) / 2;
8434 case GDK_GRAVITY_WEST:
8436 *y = (gdk_screen_get_height (screen) - h) / 2;
8439 case GDK_GRAVITY_EAST:
8440 *x = gdk_screen_get_width (screen) - w;
8441 *y = (gdk_screen_get_height (screen) - h) / 2;
8444 case GDK_GRAVITY_CENTER:
8445 *x = (gdk_screen_get_width (screen) - w) / 2;
8446 *y = (gdk_screen_get_height (screen) - h) / 2;
8449 case GDK_GRAVITY_STATIC:
8450 /* pick some random numbers */
8456 g_assert_not_reached ();
8462 move_gravity_window_to_starting_position (GtkWidget *widget,
8468 window = GTK_WINDOW (data);
8470 get_screen_corner (window,
8473 gtk_window_move (window, x, y);
8477 make_gravity_window (GtkWidget *destroy_with,
8486 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8488 gtk_window_set_screen (GTK_WINDOW (window),
8489 gtk_widget_get_screen (destroy_with));
8491 vbox = gtk_vbox_new (FALSE, 0);
8492 gtk_widget_show (vbox);
8494 gtk_container_add (GTK_CONTAINER (window), vbox);
8495 gtk_window_set_title (GTK_WINDOW (window), title);
8496 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8498 g_signal_connect_object (destroy_with,
8500 G_CALLBACK (gtk_widget_destroy),
8505 button = gtk_button_new_with_mnemonic ("_Move to current position");
8507 g_signal_connect (button, "clicked",
8508 G_CALLBACK (move_gravity_window_to_current_position),
8511 gtk_container_add (GTK_CONTAINER (vbox), button);
8512 gtk_widget_show (button);
8514 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8516 g_signal_connect (button, "clicked",
8517 G_CALLBACK (move_gravity_window_to_starting_position),
8520 gtk_container_add (GTK_CONTAINER (vbox), button);
8521 gtk_widget_show (button);
8523 /* Pretend this is the result of --geometry.
8524 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8525 * and in that case you probably should just use gtk_window_parse_geometry().
8526 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8527 * you are parsing --geometry or equivalent.
8529 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8533 gtk_window_set_default_size (GTK_WINDOW (window),
8536 get_screen_corner (GTK_WINDOW (window), &x, &y);
8538 gtk_window_move (GTK_WINDOW (window),
8545 do_gravity_test (GtkWidget *widget,
8548 GtkWidget *destroy_with = data;
8551 /* We put a window at each gravity point on the screen. */
8552 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8554 gtk_widget_show (window);
8556 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8558 gtk_widget_show (window);
8560 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8562 gtk_widget_show (window);
8564 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8566 gtk_widget_show (window);
8568 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8570 gtk_widget_show (window);
8572 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8574 gtk_widget_show (window);
8577 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8579 gtk_widget_show (window);
8582 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8584 gtk_widget_show (window);
8586 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8588 gtk_widget_show (window);
8590 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8592 gtk_widget_show (window);
8596 window_controls (GtkWidget *window)
8598 GtkWidget *control_window;
8608 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8610 gtk_window_set_screen (GTK_WINDOW (control_window),
8611 gtk_widget_get_screen (window));
8613 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8615 g_object_set_data (G_OBJECT (control_window),
8619 g_signal_connect_object (control_window,
8621 G_CALLBACK (gtk_widget_destroy),
8625 vbox = gtk_vbox_new (FALSE, 5);
8627 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8629 label = gtk_label_new ("<no configure events>");
8630 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8632 g_signal_connect (window,
8634 G_CALLBACK (configure_event_callback),
8637 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8639 spin = gtk_spin_button_new (adj, 0, 0);
8641 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8643 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8645 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8647 spin = gtk_spin_button_new (adj, 0, 0);
8649 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8651 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8653 entry = gtk_entry_new ();
8654 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8656 g_signal_connect (entry, "changed",
8657 G_CALLBACK (set_geometry_callback),
8660 button = gtk_button_new_with_label ("Show gravity test windows");
8661 g_signal_connect_swapped (button,
8663 G_CALLBACK (do_gravity_test),
8665 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8667 button = gtk_button_new_with_label ("Reshow with initial size");
8668 g_signal_connect_object (button,
8670 G_CALLBACK (gtk_window_reshow_with_initial_size),
8673 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8675 button = gtk_button_new_with_label ("Queue resize");
8676 g_signal_connect_object (button,
8678 G_CALLBACK (gtk_widget_queue_resize),
8681 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8683 button = gtk_button_new_with_label ("Resize");
8684 g_signal_connect (button,
8686 G_CALLBACK (set_size_callback),
8688 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8690 button = gtk_button_new_with_label ("Set default size");
8691 g_signal_connect (button,
8693 G_CALLBACK (set_default_size_callback),
8695 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8697 button = gtk_button_new_with_label ("Unset default size");
8698 g_signal_connect (button,
8700 G_CALLBACK (unset_default_size_callback),
8702 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8704 button = gtk_button_new_with_label ("Set size request");
8705 g_signal_connect (button,
8707 G_CALLBACK (set_size_request_callback),
8709 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8711 button = gtk_button_new_with_label ("Unset size request");
8712 g_signal_connect (button,
8714 G_CALLBACK (unset_size_request_callback),
8716 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8718 button = gtk_button_new_with_label ("Move");
8719 g_signal_connect (button,
8721 G_CALLBACK (set_location_callback),
8723 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8725 button = gtk_button_new_with_label ("Move to current position");
8726 g_signal_connect (button,
8728 G_CALLBACK (move_to_position_callback),
8730 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8732 button = gtk_check_button_new_with_label ("Allow shrink");
8733 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8734 g_signal_connect (button,
8736 G_CALLBACK (allow_shrink_callback),
8738 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8740 button = gtk_check_button_new_with_label ("Allow grow");
8741 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8742 g_signal_connect (button,
8744 G_CALLBACK (allow_grow_callback),
8746 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8748 button = gtk_button_new_with_mnemonic ("_Show");
8749 g_signal_connect_object (button,
8751 G_CALLBACK (gtk_widget_show),
8754 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8756 button = gtk_button_new_with_mnemonic ("_Hide");
8757 g_signal_connect_object (button,
8759 G_CALLBACK (gtk_widget_hide),
8762 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8764 om = gtk_combo_box_new_text ();
8768 static gchar *names[] = {
8769 "GDK_GRAVITY_NORTH_WEST",
8770 "GDK_GRAVITY_NORTH",
8771 "GDK_GRAVITY_NORTH_EAST",
8773 "GDK_GRAVITY_CENTER",
8775 "GDK_GRAVITY_SOUTH_WEST",
8776 "GDK_GRAVITY_SOUTH",
8777 "GDK_GRAVITY_SOUTH_EAST",
8778 "GDK_GRAVITY_STATIC",
8782 g_assert (names[i]);
8783 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8788 g_signal_connect (om,
8790 G_CALLBACK (gravity_selected),
8793 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8796 om = gtk_combo_box_new_text ();
8800 static gchar *names[] = {
8802 "GTK_WIN_POS_CENTER",
8803 "GTK_WIN_POS_MOUSE",
8804 "GTK_WIN_POS_CENTER_ALWAYS",
8805 "GTK_WIN_POS_CENTER_ON_PARENT",
8809 g_assert (names[i]);
8810 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8815 g_signal_connect (om,
8817 G_CALLBACK (pos_selected),
8820 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8822 gtk_widget_show_all (vbox);
8824 return control_window;
8828 create_window_sizing (GtkWidget *widget)
8830 static GtkWidget *window = NULL;
8831 static GtkWidget *target_window = NULL;
8837 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8838 gtk_window_set_screen (GTK_WINDOW (target_window),
8839 gtk_widget_get_screen (widget));
8840 label = gtk_label_new (NULL);
8841 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");
8842 gtk_container_add (GTK_CONTAINER (target_window), label);
8843 gtk_widget_show (label);
8845 g_signal_connect (target_window, "destroy",
8846 G_CALLBACK (gtk_widget_destroyed),
8849 window = window_controls (target_window);
8851 g_signal_connect (window, "destroy",
8852 G_CALLBACK (gtk_widget_destroyed),
8855 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8858 /* don't show target window by default, we want to allow testing
8859 * of behavior on first show.
8862 if (!gtk_widget_get_visible (window))
8863 gtk_widget_show (window);
8865 gtk_widget_destroy (window);
8872 typedef struct _ProgressData {
8875 GtkWidget *block_spin;
8876 GtkWidget *x_align_spin;
8877 GtkWidget *y_align_spin;
8878 GtkWidget *step_spin;
8879 GtkWidget *act_blocks_spin;
8890 progress_timeout (gpointer data)
8892 ProgressData *pdata = data;
8896 if (pdata->activity)
8898 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8900 text = g_strdup_printf ("%s", "???");
8904 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8907 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8909 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8912 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8919 destroy_progress (GtkWidget *widget,
8920 ProgressData **pdata)
8922 g_source_remove ((*pdata)->timer);
8923 (*pdata)->timer = 0;
8924 (*pdata)->window = NULL;
8930 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8932 ProgressData *pdata;
8935 pdata = (ProgressData *) data;
8937 if (!gtk_widget_get_mapped (widget))
8940 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8942 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
8943 (GtkProgressBarOrientation) i);
8947 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8951 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8952 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8956 progressbar_toggle_ellipsize (GtkWidget *widget,
8959 ProgressData *pdata = data;
8960 if (gtk_widget_is_drawable (widget))
8962 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8963 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8968 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8970 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8974 entry_changed (GtkWidget *widget, ProgressData *pdata)
8976 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8977 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8981 create_progress_bar (GtkWidget *widget)
8983 GtkWidget *action_area, *content_area;
8993 static ProgressData *pdata = NULL;
8995 static gchar *items1[] =
9003 static char *ellipsize_items[] = {
9004 "None", // PANGO_ELLIPSIZE_NONE,
9005 "Start", // PANGO_ELLIPSIZE_START,
9006 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
9007 "End", // PANGO_ELLIPSIZE_END
9011 pdata = g_new0 (ProgressData, 1);
9015 pdata->window = gtk_dialog_new ();
9017 gtk_window_set_screen (GTK_WINDOW (pdata->window),
9018 gtk_widget_get_screen (widget));
9020 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
9022 g_signal_connect (pdata->window, "destroy",
9023 G_CALLBACK (destroy_progress),
9027 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
9028 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
9030 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
9031 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
9033 vbox = gtk_vbox_new (FALSE, 5);
9034 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9035 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
9037 frame = gtk_frame_new ("Progress");
9038 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9040 vbox2 = gtk_vbox_new (FALSE, 5);
9041 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9043 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9044 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9046 pdata->pbar = gtk_progress_bar_new ();
9047 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
9048 PANGO_ELLIPSIZE_MIDDLE);
9050 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
9051 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
9053 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9054 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9056 hbox = gtk_hbox_new (FALSE, 5);
9057 gtk_container_add (GTK_CONTAINER (align), hbox);
9058 label = gtk_label_new ("Label updated by user :");
9059 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9060 pdata->label = gtk_label_new ("");
9061 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
9063 frame = gtk_frame_new ("Options");
9064 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9066 vbox2 = gtk_vbox_new (FALSE, 5);
9067 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9069 tab = gtk_table_new (7, 2, FALSE);
9070 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
9072 label = gtk_label_new ("Orientation :");
9073 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
9074 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9076 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9078 pdata->omenu1 = build_option_menu (items1, 4, 0,
9079 progressbar_toggle_orientation,
9081 hbox = gtk_hbox_new (FALSE, 0);
9082 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
9083 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9085 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
9087 check = gtk_check_button_new_with_label ("Show text");
9088 g_signal_connect (check, "clicked",
9089 G_CALLBACK (toggle_show_text),
9091 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
9092 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9095 hbox = gtk_hbox_new (FALSE, 0);
9096 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
9097 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9100 label = gtk_label_new ("Text: ");
9101 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9103 pdata->entry = gtk_entry_new ();
9104 g_signal_connect (pdata->entry, "changed",
9105 G_CALLBACK (entry_changed),
9107 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
9108 gtk_widget_set_size_request (pdata->entry, 100, -1);
9110 label = gtk_label_new ("Ellipsize text :");
9111 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
9112 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9114 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9115 pdata->elmenu = build_option_menu (ellipsize_items,
9116 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
9117 2, // PANGO_ELLIPSIZE_MIDDLE
9118 progressbar_toggle_ellipsize,
9120 hbox = gtk_hbox_new (FALSE, 0);
9121 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
9122 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9124 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
9126 check = gtk_check_button_new_with_label ("Activity mode");
9127 g_signal_connect (check, "clicked",
9128 G_CALLBACK (toggle_activity_mode), pdata);
9129 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
9130 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9133 button = gtk_button_new_with_label ("close");
9134 g_signal_connect_swapped (button, "clicked",
9135 G_CALLBACK (gtk_widget_destroy),
9137 gtk_widget_set_can_default (button, TRUE);
9138 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9139 gtk_widget_grab_default (button);
9142 if (!gtk_widget_get_visible (pdata->window))
9143 gtk_widget_show_all (pdata->window);
9145 gtk_widget_destroy (pdata->window);
9157 GtkWidget *res_widget;
9161 find_widget (GtkWidget *widget, FindWidgetData *data)
9163 GtkAllocation new_allocation;
9167 new_allocation = widget->allocation;
9169 if (data->found || !gtk_widget_get_mapped (widget))
9172 /* Note that in the following code, we only count the
9173 * position as being inside a WINDOW widget if it is inside
9174 * widget->window; points that are outside of widget->window
9175 * but within the allocation are not counted. This is consistent
9176 * with the way we highlight drag targets.
9178 if (gtk_widget_get_has_window (widget))
9180 new_allocation.x = 0;
9181 new_allocation.y = 0;
9184 if (widget->parent && !data->first)
9186 GdkWindow *window = widget->window;
9187 while (window != widget->parent->window)
9189 gint tx, ty, twidth, theight;
9190 gdk_drawable_get_size (window, &twidth, &theight);
9192 if (new_allocation.x < 0)
9194 new_allocation.width += new_allocation.x;
9195 new_allocation.x = 0;
9197 if (new_allocation.y < 0)
9199 new_allocation.height += new_allocation.y;
9200 new_allocation.y = 0;
9202 if (new_allocation.x + new_allocation.width > twidth)
9203 new_allocation.width = twidth - new_allocation.x;
9204 if (new_allocation.y + new_allocation.height > theight)
9205 new_allocation.height = theight - new_allocation.y;
9207 gdk_window_get_position (window, &tx, &ty);
9208 new_allocation.x += tx;
9210 new_allocation.y += ty;
9213 window = gdk_window_get_parent (window);
9217 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
9218 (data->x < new_allocation.x + new_allocation.width) &&
9219 (data->y < new_allocation.y + new_allocation.height))
9221 /* First, check if the drag is in a valid drop site in
9222 * one of our children
9224 if (GTK_IS_CONTAINER (widget))
9226 FindWidgetData new_data = *data;
9228 new_data.x -= x_offset;
9229 new_data.y -= y_offset;
9230 new_data.found = FALSE;
9231 new_data.first = FALSE;
9233 gtk_container_forall (GTK_CONTAINER (widget),
9234 (GtkCallback)find_widget,
9237 data->found = new_data.found;
9239 data->res_widget = new_data.res_widget;
9242 /* If not, and this widget is registered as a drop site, check to
9243 * emit "drag_motion" to check if we are actually in
9249 data->res_widget = widget;
9255 find_widget_at_pointer (GdkDisplay *display)
9257 GtkWidget *widget = NULL;
9258 GdkWindow *pointer_window;
9260 FindWidgetData data;
9262 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
9266 gpointer widget_ptr;
9268 gdk_window_get_user_data (pointer_window, &widget_ptr);
9269 widget = widget_ptr;
9274 gdk_window_get_pointer (widget->window,
9282 find_widget (widget, &data);
9284 return data.res_widget;
9290 struct PropertiesData {
9298 destroy_properties (GtkWidget *widget,
9299 struct PropertiesData *data)
9303 *data->window = NULL;
9304 data->window = NULL;
9309 gdk_cursor_unref (data->cursor);
9310 data->cursor = NULL;
9315 g_signal_handler_disconnect (widget, data->handler);
9323 property_query_event (GtkWidget *widget,
9325 struct PropertiesData *data)
9327 GtkWidget *res_widget = NULL;
9329 if (!data->in_query)
9332 if (event->type == GDK_BUTTON_RELEASE)
9334 gtk_grab_remove (widget);
9335 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9338 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9341 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
9342 gtk_widget_get_screen (widget));
9343 create_prop_editor (G_OBJECT (res_widget), 0);
9346 data->in_query = FALSE;
9353 query_properties (GtkButton *button,
9354 struct PropertiesData *data)
9358 g_signal_connect (button, "event",
9359 G_CALLBACK (property_query_event), data);
9363 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9366 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9368 GDK_BUTTON_RELEASE_MASK,
9373 gtk_grab_add (GTK_WIDGET (button));
9375 data->in_query = TRUE;
9379 create_properties (GtkWidget *widget)
9381 static GtkWidget *window = NULL;
9385 struct PropertiesData *data;
9387 data = g_new (struct PropertiesData, 1);
9388 data->window = &window;
9389 data->in_query = FALSE;
9390 data->cursor = NULL;
9395 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9397 gtk_window_set_screen (GTK_WINDOW (window),
9398 gtk_widget_get_screen (widget));
9400 data->handler = g_signal_connect (window, "destroy",
9401 G_CALLBACK (destroy_properties),
9404 gtk_window_set_title (GTK_WINDOW (window), "test properties");
9405 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9407 vbox = gtk_vbox_new (FALSE, 1);
9408 gtk_container_add (GTK_CONTAINER (window), vbox);
9410 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9411 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9413 button = gtk_button_new_with_label ("Query properties");
9414 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9415 g_signal_connect (button, "clicked",
9416 G_CALLBACK (query_properties),
9420 if (!gtk_widget_get_visible (window))
9421 gtk_widget_show_all (window);
9423 gtk_widget_destroy (window);
9427 struct SnapshotData {
9428 GtkWidget *toplevel_button;
9432 gboolean is_toplevel;
9437 destroy_snapshot_data (GtkWidget *widget,
9438 struct SnapshotData *data)
9441 *data->window = NULL;
9445 gdk_cursor_unref (data->cursor);
9446 data->cursor = NULL;
9451 g_signal_handler_disconnect (widget, data->handler);
9459 snapshot_widget_event (GtkWidget *widget,
9461 struct SnapshotData *data)
9463 GtkWidget *res_widget = NULL;
9465 if (!data->in_query)
9468 if (event->type == GDK_BUTTON_RELEASE)
9470 gtk_grab_remove (widget);
9471 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9474 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9475 if (data->is_toplevel && res_widget)
9476 res_widget = gtk_widget_get_toplevel (res_widget);
9480 GtkWidget *window, *image;
9482 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9483 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9484 gtk_widget_realize (window);
9485 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
9487 /* this branch is needed to convert ARGB -> RGB */
9490 gdk_drawable_get_size (pixmap, &width, &height);
9491 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9492 gtk_widget_get_colormap (res_widget),
9496 image = gtk_image_new_from_pixbuf (pixbuf);
9497 g_object_unref (pixbuf);
9500 image = gtk_image_new_from_pixmap (pixmap, NULL);
9501 gtk_container_add (GTK_CONTAINER (window), image);
9502 g_object_unref (pixmap);
9503 gtk_widget_show_all (window);
9506 data->in_query = FALSE;
9513 snapshot_widget (GtkButton *button,
9514 struct SnapshotData *data)
9518 g_signal_connect (button, "event",
9519 G_CALLBACK (snapshot_widget_event), data);
9521 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
9524 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9527 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9529 GDK_BUTTON_RELEASE_MASK,
9534 gtk_grab_add (GTK_WIDGET (button));
9536 data->in_query = TRUE;
9540 create_snapshot (GtkWidget *widget)
9542 static GtkWidget *window = NULL;
9545 struct SnapshotData *data;
9547 data = g_new (struct SnapshotData, 1);
9548 data->window = &window;
9549 data->in_query = FALSE;
9550 data->cursor = NULL;
9555 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9557 gtk_window_set_screen (GTK_WINDOW (window),
9558 gtk_widget_get_screen (widget));
9560 data->handler = g_signal_connect (window, "destroy",
9561 G_CALLBACK (destroy_snapshot_data),
9564 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9565 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9567 vbox = gtk_vbox_new (FALSE, 1);
9568 gtk_container_add (GTK_CONTAINER (window), vbox);
9570 button = gtk_button_new_with_label ("Snapshot widget");
9571 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9572 g_signal_connect (button, "clicked",
9573 G_CALLBACK (snapshot_widget),
9576 button = gtk_button_new_with_label ("Snapshot toplevel");
9577 data->toplevel_button = button;
9578 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9579 g_signal_connect (button, "clicked",
9580 G_CALLBACK (snapshot_widget),
9584 if (!gtk_widget_get_visible (window))
9585 gtk_widget_show_all (window);
9587 gtk_widget_destroy (window);
9596 selection_test_received (GtkWidget *tree_view,
9597 GtkSelectionData *data)
9599 GtkTreeModel *model;
9600 GtkListStore *store;
9604 if (data->length < 0)
9606 g_print ("Selection retrieval failed\n");
9609 if (data->type != GDK_SELECTION_TYPE_ATOM)
9611 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9615 /* Clear out any current list items */
9617 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9618 store = GTK_LIST_STORE (model);
9619 gtk_list_store_clear (store);
9621 /* Add new items to list */
9623 atoms = (GdkAtom *)data->data;
9625 l = data->length / sizeof (GdkAtom);
9626 for (i = 0; i < l; i++)
9631 name = gdk_atom_name (atoms[i]);
9634 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9638 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9645 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9647 static GdkAtom targets_atom = GDK_NONE;
9649 if (targets_atom == GDK_NONE)
9650 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9652 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9657 create_selection_test (GtkWidget *widget)
9659 static GtkWidget *window = NULL;
9660 GtkWidget *action_area, *content_area;
9663 GtkWidget *scrolled_win;
9664 GtkListStore* store;
9665 GtkWidget *tree_view;
9666 GtkTreeViewColumn *column;
9667 GtkCellRenderer *renderer;
9672 window = gtk_dialog_new ();
9674 gtk_window_set_screen (GTK_WINDOW (window),
9675 gtk_widget_get_screen (widget));
9677 g_signal_connect (window, "destroy",
9678 G_CALLBACK (gtk_widget_destroyed),
9681 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9682 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9684 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9685 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9687 /* Create the list */
9689 vbox = gtk_vbox_new (FALSE, 5);
9690 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9691 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9693 label = gtk_label_new ("Gets available targets for current selection");
9694 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9696 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9697 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9698 GTK_POLICY_AUTOMATIC,
9699 GTK_POLICY_AUTOMATIC);
9700 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9701 gtk_widget_set_size_request (scrolled_win, 100, 200);
9703 store = gtk_list_store_new (1, G_TYPE_STRING);
9704 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9705 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9707 renderer = gtk_cell_renderer_text_new ();
9708 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9710 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9712 g_signal_connect (tree_view, "selection_received",
9713 G_CALLBACK (selection_test_received), NULL);
9715 /* .. And create some buttons */
9716 button = gtk_button_new_with_label ("Get Targets");
9717 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9719 g_signal_connect (button, "clicked",
9720 G_CALLBACK (selection_test_get_targets), tree_view);
9722 button = gtk_button_new_with_label ("Quit");
9723 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9725 g_signal_connect_swapped (button, "clicked",
9726 G_CALLBACK (gtk_widget_destroy),
9730 if (!gtk_widget_get_visible (window))
9731 gtk_widget_show_all (window);
9733 gtk_widget_destroy (window);
9740 static int scroll_test_pos = 0.0;
9743 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9747 gint imin, imax, jmin, jmax;
9749 imin = (event->area.x) / 10;
9750 imax = (event->area.x + event->area.width + 9) / 10;
9752 jmin = ((int)adj->value + event->area.y) / 10;
9753 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9755 gdk_window_clear_area (widget->window,
9756 event->area.x, event->area.y,
9757 event->area.width, event->area.height);
9759 for (i=imin; i<imax; i++)
9760 for (j=jmin; j<jmax; j++)
9762 gdk_draw_rectangle (widget->window,
9763 widget->style->black_gc,
9765 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9771 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9774 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9775 -adj->page_increment / 2:
9776 adj->page_increment / 2);
9777 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9778 gtk_adjustment_set_value (adj, new_value);
9784 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9787 adj->page_increment = 0.9 * widget->allocation.height;
9788 adj->page_size = widget->allocation.height;
9790 g_signal_emit_by_name (adj, "changed");
9794 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9796 /* gint source_min = (int)adj->value - scroll_test_pos; */
9799 dy = scroll_test_pos - (int)adj->value;
9800 scroll_test_pos = adj->value;
9802 if (!gtk_widget_is_drawable (widget))
9804 gdk_window_scroll (widget->window, 0, dy);
9805 gdk_window_process_updates (widget->window, FALSE);
9810 create_scroll_test (GtkWidget *widget)
9812 static GtkWidget *window = NULL;
9813 GtkWidget *action_area, *content_area;
9815 GtkWidget *drawing_area;
9816 GtkWidget *scrollbar;
9819 GdkGeometry geometry;
9820 GdkWindowHints geometry_mask;
9824 window = gtk_dialog_new ();
9826 gtk_window_set_screen (GTK_WINDOW (window),
9827 gtk_widget_get_screen (widget));
9829 g_signal_connect (window, "destroy",
9830 G_CALLBACK (gtk_widget_destroyed),
9833 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9834 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9836 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9837 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9839 hbox = gtk_hbox_new (FALSE, 0);
9840 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9841 gtk_widget_show (hbox);
9843 drawing_area = gtk_drawing_area_new ();
9844 gtk_widget_set_size_request (drawing_area, 200, 200);
9845 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9846 gtk_widget_show (drawing_area);
9848 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9850 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9851 scroll_test_pos = 0.0;
9853 scrollbar = gtk_vscrollbar_new (adj);
9854 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9855 gtk_widget_show (scrollbar);
9857 g_signal_connect (drawing_area, "expose_event",
9858 G_CALLBACK (scroll_test_expose), adj);
9859 g_signal_connect (drawing_area, "configure_event",
9860 G_CALLBACK (scroll_test_configure), adj);
9861 g_signal_connect (drawing_area, "scroll_event",
9862 G_CALLBACK (scroll_test_scroll), adj);
9864 g_signal_connect (adj, "value_changed",
9865 G_CALLBACK (scroll_test_adjustment_changed),
9868 /* .. And create some buttons */
9870 button = gtk_button_new_with_label ("Quit");
9871 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9873 g_signal_connect_swapped (button, "clicked",
9874 G_CALLBACK (gtk_widget_destroy),
9876 gtk_widget_show (button);
9878 /* Set up gridded geometry */
9880 geometry_mask = GDK_HINT_MIN_SIZE |
9881 GDK_HINT_BASE_SIZE |
9882 GDK_HINT_RESIZE_INC;
9884 geometry.min_width = 20;
9885 geometry.min_height = 20;
9886 geometry.base_width = 0;
9887 geometry.base_height = 0;
9888 geometry.width_inc = 10;
9889 geometry.height_inc = 10;
9891 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9892 drawing_area, &geometry, geometry_mask);
9895 if (!gtk_widget_get_visible (window))
9896 gtk_widget_show (window);
9898 gtk_widget_destroy (window);
9905 static int timer = 0;
9908 timeout_test (GtkWidget *label)
9910 static int count = 0;
9911 static char buffer[32];
9913 sprintf (buffer, "count: %d", ++count);
9914 gtk_label_set_text (GTK_LABEL (label), buffer);
9920 start_timeout_test (GtkWidget *widget,
9925 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9930 stop_timeout_test (GtkWidget *widget,
9935 g_source_remove (timer);
9941 destroy_timeout_test (GtkWidget *widget,
9944 stop_timeout_test (NULL, NULL);
9950 create_timeout_test (GtkWidget *widget)
9952 static GtkWidget *window = NULL;
9953 GtkWidget *action_area, *content_area;
9959 window = gtk_dialog_new ();
9961 gtk_window_set_screen (GTK_WINDOW (window),
9962 gtk_widget_get_screen (widget));
9964 g_signal_connect (window, "destroy",
9965 G_CALLBACK (destroy_timeout_test),
9968 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9969 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9971 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9972 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9974 label = gtk_label_new ("count: 0");
9975 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9976 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9977 gtk_widget_show (label);
9979 button = gtk_button_new_with_label ("close");
9980 g_signal_connect_swapped (button, "clicked",
9981 G_CALLBACK (gtk_widget_destroy),
9983 gtk_widget_set_can_default (button, TRUE);
9984 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9985 gtk_widget_grab_default (button);
9986 gtk_widget_show (button);
9988 button = gtk_button_new_with_label ("start");
9989 g_signal_connect (button, "clicked",
9990 G_CALLBACK(start_timeout_test),
9992 gtk_widget_set_can_default (button, TRUE);
9993 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9994 gtk_widget_show (button);
9996 button = gtk_button_new_with_label ("stop");
9997 g_signal_connect (button, "clicked",
9998 G_CALLBACK (stop_timeout_test),
10000 gtk_widget_set_can_default (button, TRUE);
10001 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10002 gtk_widget_show (button);
10005 if (!gtk_widget_get_visible (window))
10006 gtk_widget_show (window);
10008 gtk_widget_destroy (window);
10015 static int idle_id = 0;
10018 idle_test (GtkWidget *label)
10020 static int count = 0;
10021 static char buffer[32];
10023 sprintf (buffer, "count: %d", ++count);
10024 gtk_label_set_text (GTK_LABEL (label), buffer);
10030 start_idle_test (GtkWidget *widget,
10035 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
10040 stop_idle_test (GtkWidget *widget,
10045 g_source_remove (idle_id);
10051 destroy_idle_test (GtkWidget *widget,
10052 GtkWidget **window)
10054 stop_idle_test (NULL, NULL);
10060 toggle_idle_container (GObject *button,
10061 GtkContainer *container)
10063 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
10067 create_idle_test (GtkWidget *widget)
10069 static GtkWidget *window = NULL;
10072 GtkWidget *container;
10076 GtkWidget *action_area, *content_area;
10077 GtkWidget *button2;
10081 window = gtk_dialog_new ();
10083 gtk_window_set_screen (GTK_WINDOW (window),
10084 gtk_widget_get_screen (widget));
10086 g_signal_connect (window, "destroy",
10087 G_CALLBACK (destroy_idle_test),
10090 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10091 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10093 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
10094 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10096 label = gtk_label_new ("count: 0");
10097 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10098 gtk_widget_show (label);
10101 g_object_new (GTK_TYPE_HBOX,
10103 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
10104 * "GtkWidget::visible", TRUE,
10109 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
10112 g_object_new (GTK_TYPE_FRAME,
10114 "label", "Label Container",
10116 "parent", content_area,
10119 g_object_new (GTK_TYPE_VBOX,
10124 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
10125 "label", "Resize-Parent",
10126 "user_data", (void*)GTK_RESIZE_PARENT,
10130 "signal::clicked", toggle_idle_container, container,
10132 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
10133 "label", "Resize-Queue",
10134 "user_data", (void*)GTK_RESIZE_QUEUE,
10139 g_object_connect (button,
10140 "signal::clicked", toggle_idle_container, container,
10142 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
10143 "label", "Resize-Immediate",
10144 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
10146 g_object_connect (button2,
10147 "signal::clicked", toggle_idle_container, container,
10149 g_object_set (button2,
10155 button = gtk_button_new_with_label ("close");
10156 g_signal_connect_swapped (button, "clicked",
10157 G_CALLBACK (gtk_widget_destroy),
10159 gtk_widget_set_can_default (button, TRUE);
10160 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10161 gtk_widget_grab_default (button);
10162 gtk_widget_show (button);
10164 button = gtk_button_new_with_label ("start");
10165 g_signal_connect (button, "clicked",
10166 G_CALLBACK (start_idle_test),
10168 gtk_widget_set_can_default (button, TRUE);
10169 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10170 gtk_widget_show (button);
10172 button = gtk_button_new_with_label ("stop");
10173 g_signal_connect (button, "clicked",
10174 G_CALLBACK (stop_idle_test),
10176 gtk_widget_set_can_default (button, TRUE);
10177 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10178 gtk_widget_show (button);
10181 if (!gtk_widget_get_visible (window))
10182 gtk_widget_show (window);
10184 gtk_widget_destroy (window);
10192 reload_all_rc_files (void)
10194 static GdkAtom atom_rcfiles = GDK_NONE;
10196 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
10200 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
10202 for(i = 0; i < 5; i++)
10203 send_event->client.data.l[i] = 0;
10204 send_event->client.data_format = 32;
10205 send_event->client.message_type = atom_rcfiles;
10206 gdk_event_send_clientmessage_toall (send_event);
10208 gdk_event_free (send_event);
10212 create_rc_file (GtkWidget *widget)
10214 static GtkWidget *window = NULL;
10215 GtkWidget *action_area, *content_area;
10223 window = gtk_dialog_new ();
10225 gtk_window_set_screen (GTK_WINDOW (window),
10226 gtk_widget_get_screen (widget));
10228 g_signal_connect (window, "destroy",
10229 G_CALLBACK (gtk_widget_destroyed),
10232 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10233 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10235 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
10236 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
10238 vbox = gtk_vbox_new (FALSE, 0);
10239 gtk_container_add (GTK_CONTAINER (frame), vbox);
10241 label = gtk_label_new ("This label should be red");
10242 gtk_widget_set_name (label, "testgtk-red-label");
10243 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10245 label = gtk_label_new ("This label should be green");
10246 gtk_widget_set_name (label, "testgtk-green-label");
10247 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10249 label = gtk_label_new ("This label should be blue");
10250 gtk_widget_set_name (label, "testgtk-blue-label");
10251 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10253 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
10254 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10256 button = gtk_button_new_with_label ("Reload");
10257 g_signal_connect (button, "clicked",
10258 G_CALLBACK (gtk_rc_reparse_all), NULL);
10259 gtk_widget_set_can_default (button, TRUE);
10260 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10261 gtk_widget_grab_default (button);
10263 button = gtk_button_new_with_label ("Reload All");
10264 g_signal_connect (button, "clicked",
10265 G_CALLBACK (reload_all_rc_files), NULL);
10266 gtk_widget_set_can_default (button, TRUE);
10267 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10269 button = gtk_button_new_with_label ("Close");
10270 g_signal_connect_swapped (button, "clicked",
10271 G_CALLBACK (gtk_widget_destroy),
10273 gtk_widget_set_can_default (button, TRUE);
10274 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10277 if (!gtk_widget_get_visible (window))
10278 gtk_widget_show_all (window);
10280 gtk_widget_destroy (window);
10284 * Test of recursive mainloop
10288 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
10295 create_mainloop (GtkWidget *widget)
10297 static GtkWidget *window = NULL;
10298 GtkWidget *action_area, *content_area;
10304 window = gtk_dialog_new ();
10306 gtk_window_set_screen (GTK_WINDOW (window),
10307 gtk_widget_get_screen (widget));
10309 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
10311 g_signal_connect (window, "destroy",
10312 G_CALLBACK (mainloop_destroyed),
10315 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10316 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10318 label = gtk_label_new ("In recursive main loop...");
10319 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
10321 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
10322 gtk_widget_show (label);
10324 button = gtk_button_new_with_label ("Leave");
10325 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
10327 g_signal_connect_swapped (button, "clicked",
10328 G_CALLBACK (gtk_widget_destroy),
10331 gtk_widget_set_can_default (button, TRUE);
10332 gtk_widget_grab_default (button);
10334 gtk_widget_show (button);
10337 if (!gtk_widget_get_visible (window))
10339 gtk_widget_show (window);
10341 g_print ("create_mainloop: start\n");
10343 g_print ("create_mainloop: done\n");
10346 gtk_widget_destroy (window);
10350 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
10355 gint imin, imax, jmin, jmax;
10357 layout = GTK_LAYOUT (widget);
10359 if (event->window != layout->bin_window)
10362 imin = (event->area.x) / 10;
10363 imax = (event->area.x + event->area.width + 9) / 10;
10365 jmin = (event->area.y) / 10;
10366 jmax = (event->area.y + event->area.height + 9) / 10;
10368 for (i=imin; i<imax; i++)
10369 for (j=jmin; j<jmax; j++)
10371 gdk_draw_rectangle (layout->bin_window,
10372 widget->style->black_gc,
10380 void create_layout (GtkWidget *widget)
10382 static GtkWidget *window = NULL;
10384 GtkWidget *scrolledwindow;
10393 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10394 gtk_window_set_screen (GTK_WINDOW (window),
10395 gtk_widget_get_screen (widget));
10397 g_signal_connect (window, "destroy",
10398 G_CALLBACK (gtk_widget_destroyed),
10401 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10402 gtk_widget_set_size_request (window, 200, 200);
10404 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10405 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10407 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10408 GTK_CORNER_TOP_RIGHT);
10410 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10412 layout = gtk_layout_new (NULL, NULL);
10413 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
10415 /* We set step sizes here since GtkLayout does not set
10418 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
10419 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
10421 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
10422 g_signal_connect (layout, "expose_event",
10423 G_CALLBACK (layout_expose_handler), NULL);
10425 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
10427 for (i=0 ; i < 16 ; i++)
10428 for (j=0 ; j < 16 ; j++)
10430 sprintf(buf, "Button %d, %d", i, j);
10432 button = gtk_button_new_with_label (buf);
10434 button = gtk_label_new (buf);
10436 gtk_layout_put (GTK_LAYOUT (layout), button,
10440 for (i=16; i < 1280; i++)
10442 sprintf(buf, "Button %d, %d", i, 0);
10444 button = gtk_button_new_with_label (buf);
10446 button = gtk_label_new (buf);
10448 gtk_layout_put (GTK_LAYOUT (layout), button,
10453 if (!gtk_widget_get_visible (window))
10454 gtk_widget_show_all (window);
10456 gtk_widget_destroy (window);
10460 create_styles (GtkWidget *widget)
10462 static GtkWidget *window = NULL;
10463 GtkWidget *content_area, *action_area;
10468 static GdkColor red = { 0, 0xffff, 0, 0 };
10469 static GdkColor green = { 0, 0, 0xffff, 0 };
10470 static GdkColor blue = { 0, 0, 0, 0xffff };
10471 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10472 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10473 PangoFontDescription *font_desc;
10475 GtkRcStyle *rc_style;
10479 window = gtk_dialog_new ();
10480 gtk_window_set_screen (GTK_WINDOW (window),
10481 gtk_widget_get_screen (widget));
10483 g_signal_connect (window, "destroy",
10484 G_CALLBACK (gtk_widget_destroyed),
10487 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
10488 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
10490 button = gtk_button_new_with_label ("Close");
10491 g_signal_connect_swapped (button, "clicked",
10492 G_CALLBACK (gtk_widget_destroy),
10494 gtk_widget_set_can_default (button, TRUE);
10495 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
10496 gtk_widget_show (button);
10498 vbox = gtk_vbox_new (FALSE, 5);
10499 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10500 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
10502 label = gtk_label_new ("Font:");
10503 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10504 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10506 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10508 button = gtk_button_new_with_label ("Some Text");
10509 gtk_widget_modify_font (gtk_bin_get_child (GTK_BIN (button)),
10511 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10513 label = gtk_label_new ("Foreground:");
10514 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10515 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10517 button = gtk_button_new_with_label ("Some Text");
10518 gtk_widget_modify_fg (gtk_bin_get_child (GTK_BIN (button)),
10519 GTK_STATE_NORMAL, &red);
10520 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10522 label = gtk_label_new ("Background:");
10523 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10524 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10526 button = gtk_button_new_with_label ("Some Text");
10527 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10528 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10530 label = gtk_label_new ("Text:");
10531 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10532 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10534 entry = gtk_entry_new ();
10535 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10536 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10537 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10539 label = gtk_label_new ("Base:");
10540 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10541 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10543 entry = gtk_entry_new ();
10544 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10545 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10546 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10548 label = gtk_label_new ("Cursor:");
10549 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10550 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10552 entry = gtk_entry_new ();
10553 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10554 gtk_widget_modify_cursor (entry, &red, &red);
10555 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10557 label = gtk_label_new ("Multiple:");
10558 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10559 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10561 button = gtk_button_new_with_label ("Some Text");
10563 rc_style = gtk_rc_style_new ();
10565 rc_style->font_desc = pango_font_description_copy (font_desc);
10566 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10567 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10568 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10569 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10570 rc_style->bg[GTK_STATE_NORMAL] = blue;
10571 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10572 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10573 rc_style->fg[GTK_STATE_ACTIVE] = red;
10574 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10575 rc_style->xthickness = 5;
10576 rc_style->ythickness = 5;
10578 gtk_widget_modify_style (button, rc_style);
10579 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
10581 g_object_unref (rc_style);
10583 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10586 if (!gtk_widget_get_visible (window))
10587 gtk_widget_show_all (window);
10589 gtk_widget_destroy (window);
10593 * Main Window and Exit
10597 do_exit (GtkWidget *widget, GtkWidget *window)
10599 gtk_widget_destroy (window);
10605 void (*func) (GtkWidget *widget);
10606 gboolean do_not_benchmark;
10609 { "alpha window", create_alpha_window },
10610 { "big windows", create_big_windows },
10611 { "button box", create_button_box },
10612 { "buttons", create_buttons },
10613 { "check buttons", create_check_buttons },
10614 { "color selection", create_color_selection },
10615 { "composited window", create_composited_window },
10616 { "cursors", create_cursors },
10617 { "dialog", create_dialog },
10618 { "display & screen", create_display_screen, TRUE },
10619 { "entry", create_entry },
10620 { "event box", create_event_box },
10621 { "event watcher", create_event_watcher },
10622 { "expander", create_expander },
10623 { "flipping", create_flipping },
10624 { "focus", create_focus },
10625 { "font selection", create_font_selection },
10626 { "gridded geometry", create_gridded_geometry },
10627 { "handle box", create_handle_box },
10628 { "image from drawable", create_get_image },
10629 { "image", create_image },
10630 { "key lookup", create_key_lookup },
10631 { "labels", create_labels },
10632 { "layout", create_layout },
10633 { "menus", create_menus },
10634 { "message dialog", create_message_dialog },
10635 { "modal window", create_modal_window, TRUE },
10636 { "notebook", create_notebook },
10637 { "panes", create_panes },
10638 { "paned keyboard", create_paned_keyboard_navigation },
10639 { "pixmap", create_pixmap },
10640 { "progress bar", create_progress_bar },
10641 { "properties", create_properties },
10642 { "radio buttons", create_radio_buttons },
10643 { "range controls", create_range_controls },
10644 { "rc file", create_rc_file },
10645 { "reparent", create_reparent },
10646 { "resize grips", create_resize_grips },
10647 { "rotated label", create_rotated_label },
10648 { "rotated text", create_rotated_text },
10649 { "rulers", create_rulers },
10650 { "saved position", create_saved_position },
10651 { "scrolled windows", create_scrolled_windows },
10652 { "shapes", create_shapes },
10653 { "size groups", create_size_groups },
10654 { "snapshot", create_snapshot },
10655 { "spinbutton", create_spins },
10656 { "statusbar", create_statusbar },
10657 { "styles", create_styles },
10658 { "test idle", create_idle_test },
10659 { "test mainloop", create_mainloop, TRUE },
10660 { "test scrolling", create_scroll_test },
10661 { "test selection", create_selection_test },
10662 { "test timeout", create_timeout_test },
10663 { "toggle buttons", create_toggle_buttons },
10664 { "toolbar", create_toolbar },
10665 { "tooltips", create_tooltips },
10666 { "WM hints", create_wmhints },
10667 { "window sizing", create_window_sizing },
10668 { "window states", create_window_states }
10670 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10673 create_main_window (void)
10678 GtkWidget *scrolled_window;
10682 GtkWidget *separator;
10683 GdkGeometry geometry;
10686 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10687 gtk_widget_set_name (window, "main window");
10688 gtk_window_move (GTK_WINDOW (window), 50, 20);
10689 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10691 geometry.min_width = -1;
10692 geometry.min_height = -1;
10693 geometry.max_width = -1;
10694 geometry.max_height = G_MAXSHORT;
10695 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10697 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10699 g_signal_connect (window, "destroy",
10700 G_CALLBACK (gtk_main_quit),
10702 g_signal_connect (window, "delete-event",
10703 G_CALLBACK (gtk_false),
10706 box1 = gtk_vbox_new (FALSE, 0);
10707 gtk_container_add (GTK_CONTAINER (window), box1);
10709 if (gtk_micro_version > 0)
10714 gtk_micro_version);
10719 gtk_minor_version);
10721 label = gtk_label_new (buffer);
10722 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10723 gtk_widget_set_name (label, "testgtk-version-label");
10725 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10726 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10727 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10729 GTK_POLICY_AUTOMATIC);
10730 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10732 box2 = gtk_vbox_new (FALSE, 0);
10733 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10734 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10735 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10736 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10737 gtk_widget_show (box2);
10739 for (i = 0; i < nbuttons; i++)
10741 button = gtk_button_new_with_label (buttons[i].label);
10742 if (buttons[i].func)
10743 g_signal_connect (button,
10745 G_CALLBACK(buttons[i].func),
10748 gtk_widget_set_sensitive (button, FALSE);
10749 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10752 separator = gtk_hseparator_new ();
10753 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10755 box2 = gtk_vbox_new (FALSE, 10);
10756 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10757 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10759 button = gtk_button_new_with_mnemonic ("_Close");
10760 g_signal_connect (button, "clicked",
10761 G_CALLBACK (do_exit),
10763 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10764 gtk_widget_set_can_default (button, TRUE);
10765 gtk_widget_grab_default (button);
10767 gtk_widget_show_all (window);
10773 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10774 G_FILE_TEST_EXISTS))
10776 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10777 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10782 pad (const char *str, int to)
10784 static char buf[256];
10785 int len = strlen (str);
10788 for (i = 0; i < to; i++)
10793 memcpy (buf, str, len);
10799 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10801 fn (widget); /* on */
10802 while (g_main_context_iteration (NULL, FALSE));
10803 fn (widget); /* off */
10804 while (g_main_context_iteration (NULL, FALSE));
10808 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10814 static gboolean printed_headers = FALSE;
10816 if (!printed_headers) {
10817 g_print ("Test Iters First Other\n");
10818 g_print ("-------------------- ----- ---------- ----------\n");
10819 printed_headers = TRUE;
10822 g_get_current_time (&tv0);
10823 bench_iteration (widget, fn);
10824 g_get_current_time (&tv1);
10826 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10827 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10829 g_get_current_time (&tv0);
10830 for (n = 0; n < num - 1; n++)
10831 bench_iteration (widget, fn);
10832 g_get_current_time (&tv1);
10833 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10834 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10836 g_print ("%s %5d ", pad (name, 20), num);
10838 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10840 g_print ("%10.1f\n", dt_first);
10844 do_bench (char* what, int num)
10848 void (* fn) (GtkWidget *widget);
10850 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10852 if (g_ascii_strcasecmp (what, "ALL") == 0)
10854 for (i = 0; i < nbuttons; i++)
10856 if (!buttons[i].do_not_benchmark)
10857 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10864 for (i = 0; i < nbuttons; i++)
10866 if (strcmp (buttons[i].label, what) == 0)
10868 fn = buttons[i].func;
10874 g_print ("Can't bench: \"%s\" not found.\n", what);
10876 do_real_bench (widget, fn, buttons[i].label, num);
10883 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10888 main (int argc, char *argv[])
10890 GtkBindingSet *binding_set;
10892 gboolean done_benchmarks = FALSE;
10894 srand (time (NULL));
10898 /* Check to see if we are being run from the correct
10901 if (file_exists ("testgtkrc"))
10902 gtk_rc_add_default_file ("testgtkrc");
10903 else if (file_exists ("tests/testgtkrc"))
10904 gtk_rc_add_default_file ("tests/testgtkrc");
10906 g_warning ("Couldn't find file \"testgtkrc\".");
10908 g_set_application_name ("GTK+ Test Program");
10910 gtk_init (&argc, &argv);
10912 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10921 for (i = 1; i < argc; i++)
10923 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10930 nextarg = strchr (argv[i], '=');
10941 count = strchr (nextarg, ':');
10944 what = g_strndup (nextarg, count - nextarg);
10946 num = atoi (count);
10951 what = g_strdup (nextarg);
10953 do_bench (what, num ? num : 1);
10954 done_benchmarks = TRUE;
10959 if (done_benchmarks)
10964 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10965 gtk_binding_entry_add_signal (binding_set,
10966 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10969 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10971 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
10975 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
10976 " fg[NORMAL] = \"#ff0000\"\n"
10977 " font = \"Sans 18\"\n"
10979 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
10981 create_main_window ();
10987 while (g_main_context_pending (NULL))
10988 g_main_context_iteration (NULL, FALSE);
10991 while (g_main_context_pending (NULL))
10992 g_main_context_iteration (NULL, FALSE);