1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
27 #undef GTK_DISABLE_DEPRECATED
43 #define GTK_ENABLE_BROKEN
46 #include "gdk/gdkkeysyms.h"
49 #define sleep(n) _sleep(n)
52 #include "prop-editor.h"
54 #include "circles.xbm"
58 file_exists (const char *filename)
62 return stat (filename, &statbuf) == 0;
66 shape_create_icon (GdkScreen *screen,
75 build_option_menu (gchar *items[],
78 void (*func) (GtkWidget *widget, gpointer data),
81 /* macro, structure and variables used by tree window demos */
82 #define DEFAULT_NUMBER_OF_ITEM 3
83 #define DEFAULT_RECURSION_LEVEL 3
86 GSList* selection_mode_group;
87 GtkWidget* single_button;
88 GtkWidget* browse_button;
89 GtkWidget* multiple_button;
90 GtkWidget* draw_line_button;
91 GtkWidget* view_line_button;
92 GtkWidget* no_root_item_button;
93 GtkWidget* nb_item_spinner;
94 GtkWidget* recursion_spinner;
95 } sTreeSampleSelection;
97 typedef struct sTreeButtons {
99 GtkWidget* add_button;
100 GtkWidget* remove_button;
101 GtkWidget* subtree_button;
103 /* end of tree section */
106 build_option_menu (gchar *items[],
109 void (*func)(GtkWidget *widget, gpointer data),
115 omenu = gtk_combo_box_new_text ();
116 g_signal_connect (omenu, "changed",
117 G_CALLBACK (func), data);
119 for (i = 0; i < num_items; i++)
120 gtk_combo_box_append_text (GTK_COMBO_BOX (omenu), items[i]);
122 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
128 * Windows with an alpha channel
133 on_alpha_window_expose (GtkWidget *widget,
134 GdkEventExpose *expose)
137 cairo_pattern_t *pattern;
140 cr = gdk_cairo_create (widget->window);
142 radius = MIN (widget->allocation.width, widget->allocation.height) / 2;
143 pattern = cairo_pattern_create_radial (widget->allocation.width / 2,
144 widget->allocation.height / 2,
146 widget->allocation.width / 2,
147 widget->allocation.height / 2,
150 if (gdk_screen_get_rgba_colormap (gtk_widget_get_screen (widget)) &&
151 gtk_widget_is_composited (widget))
152 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
154 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
156 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
159 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
160 1.0, 0.75, 0.0, 1.0); /* solid orange */
161 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
162 1.0, 0.75, 0.0, 0.0); /* transparent orange */
164 cairo_set_source (cr, pattern);
165 cairo_pattern_destroy (pattern);
167 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
176 build_alpha_widgets (void)
179 GtkWidget *radio_button;
184 table = gtk_table_new (1, 1, FALSE);
186 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
187 gtk_table_attach (GTK_TABLE (table),
190 GTK_EXPAND | GTK_FILL, 0,
193 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
194 gtk_table_attach (GTK_TABLE (table),
197 GTK_EXPAND | GTK_FILL, 0,
200 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
201 gtk_table_attach (GTK_TABLE (table),
204 GTK_EXPAND | GTK_FILL, 0,
207 gtk_table_attach (GTK_TABLE (table),
208 gtk_check_button_new_with_label ("Sedentary"),
210 GTK_EXPAND | GTK_FILL, 0,
212 gtk_table_attach (GTK_TABLE (table),
213 gtk_check_button_new_with_label ("Nocturnal"),
215 GTK_EXPAND | GTK_FILL, 0,
217 gtk_table_attach (GTK_TABLE (table),
218 gtk_check_button_new_with_label ("Compulsive"),
220 GTK_EXPAND | GTK_FILL, 0,
223 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
224 gtk_table_attach (GTK_TABLE (table),
227 GTK_EXPAND | GTK_FILL, 0,
230 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
231 gtk_table_attach (GTK_TABLE (table),
234 GTK_EXPAND | GTK_FILL, 0,
237 hbox = gtk_hbox_new (FALSE, 0);
238 label = gtk_label_new (NULL);
239 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
240 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
241 entry = gtk_entry_new ();
242 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
243 gtk_table_attach (GTK_TABLE (table),
246 GTK_EXPAND | GTK_FILL, 0,
253 on_alpha_drawing_expose (GtkWidget *widget,
254 GdkEventExpose *expose)
256 int x = widget->allocation.x;
257 int y = widget->allocation.y;
258 int width = widget->allocation.width;
259 int height = widget->allocation.height;
265 buffer = g_malloc (64 * 64 * 4);
267 gdk_draw_rectangle (widget->window, widget->style->black_gc, FALSE,
269 width - 1, height - 1);
272 for (i = 0; i < 64; i++) {
273 for (j = 0; j < 64; j++) {
277 *(p++) = MIN (255, ((32 - i) * (32 - i) + (32 - j) * (32 - j)) / 8);
282 gdk_draw_rgb_32_image (widget->window, widget->style->black_gc,
283 x + 18, y + (height - 64) /2,
284 64, 64, GDK_RGB_DITHER_NORMAL, buffer, 64 * 4);
286 pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, TRUE,
287 8, 64, 64, 4 * 64, NULL, NULL);
289 gdk_draw_pixbuf (widget->window, widget->style->black_gc, pixbuf,
290 0, 0, x + width - 18 - 64, y + (height - 64) /2,
291 64, 64, GDK_RGB_DITHER_NORMAL, 0, 0);
293 g_object_unref (pixbuf);
301 build_alpha_drawing ()
305 hbox = gtk_hbox_new (FALSE, 0);
306 gtk_widget_set_size_request (hbox, 100, 100);
308 g_signal_connect (hbox, "expose-event",
309 G_CALLBACK (on_alpha_drawing_expose), NULL);
315 on_alpha_screen_changed (GtkWidget *widget,
316 GdkScreen *old_screen,
319 GdkScreen *screen = gtk_widget_get_screen (widget);
320 GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
324 colormap = gdk_screen_get_rgb_colormap (screen);
325 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
329 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
332 gtk_widget_set_colormap (widget, colormap);
336 on_composited_changed (GtkWidget *window,
339 gboolean is_composited = gtk_widget_is_composited (window);
342 gtk_label_set_text (label, "Composited");
344 gtk_label_set_text (label, "Not composited");
348 create_alpha_window (GtkWidget *widget)
350 static GtkWidget *window;
357 window = gtk_dialog_new_with_buttons ("Alpha Window",
358 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
362 gtk_widget_set_app_paintable (window, TRUE);
363 g_signal_connect (window, "expose-event",
364 G_CALLBACK (on_alpha_window_expose), NULL);
366 vbox = gtk_vbox_new (FALSE, 8);
367 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
368 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
371 label = gtk_label_new (NULL);
372 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
373 on_alpha_screen_changed (window, NULL, label);
374 g_signal_connect (window, "screen-changed",
375 G_CALLBACK (on_alpha_screen_changed), label);
377 label = gtk_label_new (NULL);
378 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
379 on_composited_changed (window, GTK_LABEL (label));
380 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
382 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
383 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_drawing (), TRUE, TRUE, 0);
385 g_signal_connect (window, "destroy",
386 G_CALLBACK (gtk_widget_destroyed),
389 g_signal_connect (window, "response",
390 G_CALLBACK (gtk_widget_destroy),
394 if (!gtk_widget_get_visible (window))
395 gtk_widget_show_all (window);
397 gtk_widget_destroy (window);
401 * Composited non-toplevel window
404 /* The expose event handler for the event box.
406 * This function simply draws a transparency onto a widget on the area
407 * for which it receives expose events. This is intended to give the
408 * event box a "transparent" background.
410 * In order for this to work properly, the widget must have an RGBA
411 * colourmap. The widget should also be set as app-paintable since it
412 * doesn't make sense for GTK to draw a background if we are drawing it
413 * (and because GTK might actually replace our transparency with its
414 * default background colour).
417 transparent_expose (GtkWidget *widget,
418 GdkEventExpose *event)
422 cr = gdk_cairo_create (widget->window);
423 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
424 gdk_cairo_region (cr, event->region);
431 /* The expose event handler for the window.
433 * This function performs the actual compositing of the event box onto
434 * the already-existing background of the window at 50% normal opacity.
436 * In this case we do not want app-paintable to be set on the widget
437 * since we want it to draw its own (red) background. Because of this,
438 * however, we must ensure that we use g_signal_register_after so that
439 * this handler is called after the red has been drawn. If it was
440 * called before then GTK would just blindly paint over our work.
443 window_expose_event (GtkWidget *widget,
444 GdkEventExpose *event)
450 /* get our child (in this case, the event box) */
451 child = gtk_bin_get_child (GTK_BIN (widget));
453 /* create a cairo context to draw to the window */
454 cr = gdk_cairo_create (widget->window);
456 /* the source data is the (composited) event box */
457 gdk_cairo_set_source_pixmap (cr, child->window,
459 child->allocation.y);
461 /* draw no more than our expose event intersects our child */
462 region = gdk_region_rectangle (&child->allocation);
463 gdk_region_intersect (region, event->region);
464 gdk_cairo_region (cr, region);
467 /* composite, with a 50% opacity */
468 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
469 cairo_paint_with_alpha (cr, 0.5);
478 create_composited_window (GtkWidget *widget)
480 static GtkWidget *window;
484 GtkWidget *event, *button;
489 /* make the widgets */
490 button = gtk_button_new_with_label ("A Button");
491 event = gtk_event_box_new ();
492 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
494 g_signal_connect (window, "destroy",
495 G_CALLBACK (gtk_widget_destroyed),
498 /* put a red background on the window */
499 gdk_color_parse ("red", &red);
500 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
502 /* set the colourmap for the event box.
503 * must be done before the event box is realised.
505 screen = gtk_widget_get_screen (event);
506 rgba = gdk_screen_get_rgba_colormap (screen);
507 gtk_widget_set_colormap (event, rgba);
509 /* set our event box to have a fully-transparent background
510 * drawn on it. currently there is no way to simply tell gtk
511 * that "transparency" is the background colour for a widget.
513 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
514 g_signal_connect (event, "expose-event",
515 G_CALLBACK (transparent_expose), NULL);
517 /* put them inside one another */
518 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
519 gtk_container_add (GTK_CONTAINER (window), event);
520 gtk_container_add (GTK_CONTAINER (event), button);
522 /* realise and show everything */
523 gtk_widget_realize (button);
525 /* set the event box GdkWindow to be composited.
526 * obviously must be performed after event box is realised.
528 gdk_window_set_composited (event->window, TRUE);
530 /* set up the compositing handler.
531 * note that we do _after so that the normal (red) background is drawn
532 * by gtk before our compositing occurs.
534 g_signal_connect_after (window, "expose-event",
535 G_CALLBACK (window_expose_event), NULL);
538 if (!gtk_widget_get_visible (window))
539 gtk_widget_show_all (window);
541 gtk_widget_destroy (window);
545 * Big windows and guffaw scrolling
549 pattern_expose (GtkWidget *widget,
550 GdkEventExpose *event,
554 GdkWindow *window = event->window;
556 color = g_object_get_data (G_OBJECT (window), "pattern-color");
559 GdkGC *tmp_gc = gdk_gc_new (window);
560 gdk_gc_set_rgb_fg_color (tmp_gc, color);
562 gdk_draw_rectangle (window, tmp_gc, TRUE,
563 event->area.x, event->area.y,
564 event->area.width, event->area.height);
566 g_object_unref (tmp_gc);
573 pattern_set_bg (GtkWidget *widget,
577 static const GdkColor colors[] = {
578 { 0, 0x4444, 0x4444, 0xffff },
579 { 0, 0x8888, 0x8888, 0xffff },
580 { 0, 0xaaaa, 0xaaaa, 0xffff }
583 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
584 gdk_window_set_user_data (child, widget);
588 create_pattern (GtkWidget *widget,
599 while (2 * h <= height)
604 while (2 * w <= width)
606 if ((i + j) % 2 == 0)
611 GdkWindowAttr attributes;
613 attributes.window_type = GDK_WINDOW_CHILD;
616 attributes.width = w;
617 attributes.height = h;
618 attributes.wclass = GDK_INPUT_OUTPUT;
619 attributes.event_mask = GDK_EXPOSURE_MASK;
620 attributes.visual = gtk_widget_get_visual (widget);
621 attributes.colormap = gtk_widget_get_colormap (widget);
623 child = gdk_window_new (parent, &attributes,
624 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
626 pattern_set_bg (widget, child, level);
629 create_pattern (widget, child, level + 1, w, h);
631 gdk_window_show (child);
641 #define PATTERN_SIZE (1 << 18)
644 pattern_hadj_changed (GtkAdjustment *adj,
647 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
648 gint new_value = adj->value;
650 if (gtk_widget_get_realized (darea))
652 gdk_window_scroll (darea->window, *old_value - new_value, 0);
653 *old_value = new_value;
658 pattern_vadj_changed (GtkAdjustment *adj,
661 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
662 gint new_value = adj->value;
664 if (gtk_widget_get_realized (darea))
666 gdk_window_scroll (darea->window, 0, *old_value - new_value);
667 *old_value = new_value;
672 pattern_realize (GtkWidget *widget,
675 pattern_set_bg (widget, widget->window, 0);
676 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
680 create_big_windows (GtkWidget *widget)
682 static GtkWidget *window = NULL;
683 GtkWidget *darea, *table, *scrollbar;
687 static gint current_x;
688 static gint current_y;
695 window = gtk_dialog_new_with_buttons ("Big Windows",
701 gtk_window_set_screen (GTK_WINDOW (window),
702 gtk_widget_get_screen (widget));
704 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
706 g_signal_connect (window, "destroy",
707 G_CALLBACK (gtk_widget_destroyed),
710 g_signal_connect (window, "response",
711 G_CALLBACK (gtk_widget_destroy),
714 table = gtk_table_new (2, 2, FALSE);
715 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
716 table, TRUE, TRUE, 0);
718 darea = gtk_drawing_area_new ();
720 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
721 g_signal_connect (hadj, "value_changed",
722 G_CALLBACK (pattern_hadj_changed), darea);
723 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
725 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
726 g_signal_connect (vadj, "value_changed",
727 G_CALLBACK (pattern_vadj_changed), darea);
728 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
730 g_signal_connect (darea, "realize",
731 G_CALLBACK (pattern_realize),
733 g_signal_connect (darea, "expose_event",
734 G_CALLBACK (pattern_expose),
737 eventbox = gtk_event_box_new ();
738 gtk_table_attach (GTK_TABLE (table), eventbox,
740 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
743 gtk_container_add (GTK_CONTAINER (eventbox), darea);
745 scrollbar = gtk_hscrollbar_new (hadj);
746 gtk_table_attach (GTK_TABLE (table), scrollbar,
748 GTK_FILL | GTK_EXPAND, GTK_FILL,
751 scrollbar = gtk_vscrollbar_new (vadj);
752 gtk_table_attach (GTK_TABLE (table), scrollbar,
754 GTK_FILL, GTK_EXPAND | GTK_FILL,
759 if (!gtk_widget_get_visible (window))
760 gtk_widget_show_all (window);
762 gtk_widget_hide (window);
770 button_window (GtkWidget *widget,
773 if (!gtk_widget_get_visible (button))
774 gtk_widget_show (button);
776 gtk_widget_hide (button);
780 create_buttons (GtkWidget *widget)
782 static GtkWidget *window = NULL;
786 GtkWidget *button[10];
787 GtkWidget *separator;
791 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
792 gtk_window_set_screen (GTK_WINDOW (window),
793 gtk_widget_get_screen (widget));
795 g_signal_connect (window, "destroy",
796 G_CALLBACK (gtk_widget_destroyed),
799 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
800 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
802 box1 = gtk_vbox_new (FALSE, 0);
803 gtk_container_add (GTK_CONTAINER (window), box1);
805 table = gtk_table_new (3, 3, FALSE);
806 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
807 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
808 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
809 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
811 button[0] = gtk_button_new_with_label ("button1");
812 button[1] = gtk_button_new_with_mnemonic ("_button2");
813 button[2] = gtk_button_new_with_mnemonic ("_button3");
814 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
815 button[4] = gtk_button_new_with_label ("button5");
816 button[5] = gtk_button_new_with_label ("button6");
817 button[6] = gtk_button_new_with_label ("button7");
818 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
819 button[8] = gtk_button_new_with_label ("button9");
821 g_signal_connect (button[0], "clicked",
822 G_CALLBACK (button_window),
825 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
826 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
828 g_signal_connect (button[1], "clicked",
829 G_CALLBACK (button_window),
832 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
833 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
835 g_signal_connect (button[2], "clicked",
836 G_CALLBACK (button_window),
838 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
839 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
841 g_signal_connect (button[3], "clicked",
842 G_CALLBACK (button_window),
844 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
845 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
847 g_signal_connect (button[4], "clicked",
848 G_CALLBACK (button_window),
850 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
851 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
853 g_signal_connect (button[5], "clicked",
854 G_CALLBACK (button_window),
856 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
857 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
859 g_signal_connect (button[6], "clicked",
860 G_CALLBACK (button_window),
862 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
863 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
865 g_signal_connect (button[7], "clicked",
866 G_CALLBACK (button_window),
868 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
869 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
871 g_signal_connect (button[8], "clicked",
872 G_CALLBACK (button_window),
874 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
875 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
877 separator = gtk_hseparator_new ();
878 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
880 box2 = gtk_vbox_new (FALSE, 10);
881 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
882 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
884 button[9] = gtk_button_new_with_label ("close");
885 g_signal_connect_swapped (button[9], "clicked",
886 G_CALLBACK (gtk_widget_destroy),
888 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
889 gtk_widget_set_can_default (button[9], TRUE);
890 gtk_widget_grab_default (button[9]);
893 if (!gtk_widget_get_visible (window))
894 gtk_widget_show_all (window);
896 gtk_widget_destroy (window);
904 create_toggle_buttons (GtkWidget *widget)
906 static GtkWidget *window = NULL;
910 GtkWidget *separator;
914 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
915 gtk_window_set_screen (GTK_WINDOW (window),
916 gtk_widget_get_screen (widget));
918 g_signal_connect (window, "destroy",
919 G_CALLBACK (gtk_widget_destroyed),
922 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
923 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
925 box1 = gtk_vbox_new (FALSE, 0);
926 gtk_container_add (GTK_CONTAINER (window), box1);
928 box2 = gtk_vbox_new (FALSE, 10);
929 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
930 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
932 button = gtk_toggle_button_new_with_label ("button1");
933 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
935 button = gtk_toggle_button_new_with_label ("button2");
936 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
938 button = gtk_toggle_button_new_with_label ("button3");
939 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
941 button = gtk_toggle_button_new_with_label ("inconsistent");
942 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
943 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
945 separator = gtk_hseparator_new ();
946 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
948 box2 = gtk_vbox_new (FALSE, 10);
949 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
950 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
952 button = gtk_button_new_with_label ("close");
953 g_signal_connect_swapped (button, "clicked",
954 G_CALLBACK (gtk_widget_destroy),
956 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
957 gtk_widget_set_can_default (button, TRUE);
958 gtk_widget_grab_default (button);
961 if (!gtk_widget_get_visible (window))
962 gtk_widget_show_all (window);
964 gtk_widget_destroy (window);
968 create_widget_grid (GType widget_type)
971 GtkWidget *group_widget = NULL;
974 table = gtk_table_new (FALSE, 3, 3);
976 for (i = 0; i < 5; i++)
978 for (j = 0; j < 5; j++)
983 if (i == 0 && j == 0)
989 tmp = g_strdup_printf ("%d", j);
990 widget = gtk_label_new (tmp);
995 tmp = g_strdup_printf ("%c", 'A' + i - 1);
996 widget = gtk_label_new (tmp);
1001 widget = g_object_new (widget_type, NULL);
1003 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
1006 group_widget = widget;
1008 g_object_set (widget, "group", group_widget, NULL);
1013 gtk_table_attach (GTK_TABLE (table), widget,
1028 create_check_buttons (GtkWidget *widget)
1030 static GtkWidget *window = NULL;
1034 GtkWidget *separator;
1039 window = gtk_dialog_new_with_buttons ("Check Buttons",
1045 gtk_window_set_screen (GTK_WINDOW (window),
1046 gtk_widget_get_screen (widget));
1048 g_signal_connect (window, "destroy",
1049 G_CALLBACK (gtk_widget_destroyed),
1051 g_signal_connect (window, "response",
1052 G_CALLBACK (gtk_widget_destroy),
1055 box1 = GTK_DIALOG (window)->vbox;
1057 box2 = gtk_vbox_new (FALSE, 10);
1058 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1059 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1061 button = gtk_check_button_new_with_mnemonic ("_button1");
1062 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1064 button = gtk_check_button_new_with_label ("button2");
1065 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1067 button = gtk_check_button_new_with_label ("button3");
1068 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1070 button = gtk_check_button_new_with_label ("inconsistent");
1071 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1072 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1074 separator = gtk_hseparator_new ();
1075 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1077 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
1078 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1079 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1082 if (!gtk_widget_get_visible (window))
1083 gtk_widget_show_all (window);
1085 gtk_widget_destroy (window);
1093 create_radio_buttons (GtkWidget *widget)
1095 static GtkWidget *window = NULL;
1099 GtkWidget *separator;
1104 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1110 gtk_window_set_screen (GTK_WINDOW (window),
1111 gtk_widget_get_screen (widget));
1113 g_signal_connect (window, "destroy",
1114 G_CALLBACK (gtk_widget_destroyed),
1116 g_signal_connect (window, "response",
1117 G_CALLBACK (gtk_widget_destroy),
1120 box1 = GTK_DIALOG (window)->vbox;
1122 box2 = gtk_vbox_new (FALSE, 10);
1123 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1124 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1126 button = gtk_radio_button_new_with_label (NULL, "button1");
1127 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1129 button = gtk_radio_button_new_with_label (
1130 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1132 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1133 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1135 button = gtk_radio_button_new_with_label (
1136 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1138 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1140 button = gtk_radio_button_new_with_label (
1141 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1143 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1144 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1146 separator = gtk_hseparator_new ();
1147 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1149 box2 = gtk_vbox_new (FALSE, 10);
1150 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1151 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1153 button = gtk_radio_button_new_with_label (NULL, "button4");
1154 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1155 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1157 button = gtk_radio_button_new_with_label (
1158 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1160 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1161 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1162 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1164 button = gtk_radio_button_new_with_label (
1165 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1167 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1168 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1170 separator = gtk_hseparator_new ();
1171 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1173 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1174 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1175 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1178 if (!gtk_widget_get_visible (window))
1179 gtk_widget_show_all (window);
1181 gtk_widget_destroy (window);
1189 create_bbox (gint horizontal,
1200 frame = gtk_frame_new (title);
1203 bbox = gtk_hbutton_box_new ();
1205 bbox = gtk_vbutton_box_new ();
1207 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1208 gtk_container_add (GTK_CONTAINER (frame), bbox);
1210 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1211 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1213 "child-min-width", child_w,
1214 "child-min-height", child_h,
1217 button = gtk_button_new_with_label ("OK");
1218 gtk_container_add (GTK_CONTAINER (bbox), button);
1220 button = gtk_button_new_with_label ("Cancel");
1221 gtk_container_add (GTK_CONTAINER (bbox), button);
1223 button = gtk_button_new_with_label ("Help");
1224 gtk_container_add (GTK_CONTAINER (bbox), button);
1230 create_button_box (GtkWidget *widget)
1232 static GtkWidget* window = NULL;
1233 GtkWidget *main_vbox;
1236 GtkWidget *frame_horz;
1237 GtkWidget *frame_vert;
1241 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1242 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1243 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1245 g_signal_connect (window, "destroy",
1246 G_CALLBACK (gtk_widget_destroyed),
1249 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1251 main_vbox = gtk_vbox_new (FALSE, 0);
1252 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1254 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1255 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1257 vbox = gtk_vbox_new (FALSE, 0);
1258 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1259 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1261 gtk_box_pack_start (GTK_BOX (vbox),
1262 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1265 gtk_box_pack_start (GTK_BOX (vbox),
1266 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1269 gtk_box_pack_start (GTK_BOX (vbox),
1270 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1273 gtk_box_pack_start (GTK_BOX (vbox),
1274 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1277 gtk_box_pack_start (GTK_BOX (vbox),
1278 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1281 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1282 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1284 hbox = gtk_hbox_new (FALSE, 0);
1285 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1286 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1288 gtk_box_pack_start (GTK_BOX (hbox),
1289 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1292 gtk_box_pack_start (GTK_BOX (hbox),
1293 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1296 gtk_box_pack_start (GTK_BOX (hbox),
1297 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1300 gtk_box_pack_start (GTK_BOX (hbox),
1301 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1304 gtk_box_pack_start (GTK_BOX (hbox),
1305 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1309 if (!gtk_widget_get_visible (window))
1310 gtk_widget_show_all (window);
1312 gtk_widget_destroy (window);
1320 new_pixmap (char *filename,
1322 GdkColor *background)
1328 if (strcmp (filename, "test.xpm") == 0 ||
1329 !file_exists (filename))
1331 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask,
1336 pixmap = gdk_pixmap_create_from_xpm (window, &mask,
1340 wpixmap = gtk_image_new_from_pixmap (pixmap, mask);
1347 set_toolbar_small_stock (GtkWidget *widget,
1350 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1354 set_toolbar_large_stock (GtkWidget *widget,
1357 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1361 set_toolbar_horizontal (GtkWidget *widget,
1364 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1368 set_toolbar_vertical (GtkWidget *widget,
1371 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1375 set_toolbar_icons (GtkWidget *widget,
1378 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1382 set_toolbar_text (GtkWidget *widget,
1385 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1389 set_toolbar_both (GtkWidget *widget,
1392 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1396 set_toolbar_both_horiz (GtkWidget *widget,
1399 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1403 set_toolbar_enable (GtkWidget *widget,
1406 GtkSettings *settings = gtk_widget_get_settings (widget);
1407 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1411 set_toolbar_disable (GtkWidget *widget,
1414 GtkSettings *settings = gtk_widget_get_settings (widget);
1415 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1418 static GtkActionEntry create_toolbar_items[] = {
1419 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1420 G_CALLBACK (set_toolbar_small_stock) },
1421 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1422 G_CALLBACK (set_toolbar_large_stock) },
1423 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1424 G_CALLBACK (set_toolbar_horizontal) },
1425 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1426 G_CALLBACK (set_toolbar_vertical) },
1428 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1429 G_CALLBACK (set_toolbar_icons) },
1430 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1431 G_CALLBACK (set_toolbar_text) },
1432 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1433 G_CALLBACK (set_toolbar_both) },
1434 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1435 G_CALLBACK (set_toolbar_both_horiz) },
1437 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1441 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1442 G_CALLBACK (set_toolbar_enable) },
1443 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1444 G_CALLBACK (set_toolbar_disable) },
1446 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1448 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1451 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1453 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1458 create_toolbar (GtkWidget *widget)
1460 static GtkWidget *window = NULL;
1467 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1468 gtk_window_set_screen (GTK_WINDOW (window),
1469 gtk_widget_get_screen (widget));
1471 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1473 g_signal_connect (window, "destroy",
1474 G_CALLBACK (gtk_widget_destroyed),
1477 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1478 gtk_widget_realize (window);
1480 toolbar = gtk_toolbar_new ();
1481 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1483 GtkToolItem *toolitem;
1485 if (create_toolbar_items[i].tooltip == NULL)
1486 toolitem = gtk_separator_tool_item_new ();
1487 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1491 toolitem = gtk_tool_item_new ();
1492 entry = gtk_entry_new ();
1493 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1495 else if (create_toolbar_items[i].stock_id)
1496 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1501 icon = new_pixmap ("test.xpm", window->window,
1502 &window->style->bg[GTK_STATE_NORMAL]);
1503 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1505 if (create_toolbar_items[i].callback)
1506 g_signal_connect (toolitem, "clicked",
1507 create_toolbar_items[i].callback, toolbar);
1508 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1509 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1512 gtk_container_add (GTK_CONTAINER (window), toolbar);
1514 gtk_widget_set_size_request (toolbar, 200, -1);
1517 if (!gtk_widget_get_visible (window))
1518 gtk_widget_show_all (window);
1520 gtk_widget_destroy (window);
1523 static GtkActionEntry make_toolbar_items[] = {
1524 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1525 G_CALLBACK (set_toolbar_horizontal) },
1526 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1527 G_CALLBACK (set_toolbar_vertical) },
1529 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1530 G_CALLBACK (set_toolbar_icons) },
1531 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1532 G_CALLBACK (set_toolbar_text) },
1533 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1534 G_CALLBACK (set_toolbar_both) },
1536 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1538 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1541 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1542 G_CALLBACK (set_toolbar_enable) },
1543 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1544 G_CALLBACK (set_toolbar_disable) },
1546 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1548 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1553 make_toolbar (GtkWidget *window)
1558 if (!gtk_widget_get_realized (window))
1559 gtk_widget_realize (window);
1561 toolbar = gtk_toolbar_new ();
1562 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1565 GtkToolItem *toolitem;
1567 if (make_toolbar_items[i].label == NULL)
1569 toolitem = gtk_separator_tool_item_new ();
1572 icon = new_pixmap ("test.xpm", window->window,
1573 &window->style->bg[GTK_STATE_NORMAL]);
1574 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1575 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1576 if (make_toolbar_items[i].callback != NULL)
1577 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1578 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1588 static guint statusbar_counter = 1;
1591 statusbar_push (GtkWidget *button,
1592 GtkStatusbar *statusbar)
1596 sprintf (text, "something %d", statusbar_counter++);
1598 gtk_statusbar_push (statusbar, 1, text);
1602 statusbar_push_long (GtkWidget *button,
1603 GtkStatusbar *statusbar)
1607 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\").");
1609 gtk_statusbar_push (statusbar, 1, text);
1613 statusbar_pop (GtkWidget *button,
1614 GtkStatusbar *statusbar)
1616 gtk_statusbar_pop (statusbar, 1);
1620 statusbar_steal (GtkWidget *button,
1621 GtkStatusbar *statusbar)
1623 gtk_statusbar_remove (statusbar, 1, 4);
1627 statusbar_popped (GtkStatusbar *statusbar,
1631 if (!statusbar->messages)
1632 statusbar_counter = 1;
1636 statusbar_contexts (GtkStatusbar *statusbar)
1640 string = "any context";
1641 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1643 gtk_statusbar_get_context_id (statusbar, string));
1645 string = "idle messages";
1646 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1648 gtk_statusbar_get_context_id (statusbar, string));
1650 string = "some text";
1651 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1653 gtk_statusbar_get_context_id (statusbar, string));
1655 string = "hit the mouse";
1656 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1658 gtk_statusbar_get_context_id (statusbar, string));
1660 string = "hit the mouse2";
1661 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1663 gtk_statusbar_get_context_id (statusbar, string));
1667 create_statusbar (GtkWidget *widget)
1669 static GtkWidget *window = NULL;
1673 GtkWidget *separator;
1674 GtkWidget *statusbar;
1678 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1679 gtk_window_set_screen (GTK_WINDOW (window),
1680 gtk_widget_get_screen (widget));
1682 g_signal_connect (window, "destroy",
1683 G_CALLBACK (gtk_widget_destroyed),
1686 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1687 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1689 box1 = gtk_vbox_new (FALSE, 0);
1690 gtk_container_add (GTK_CONTAINER (window), box1);
1692 box2 = gtk_vbox_new (FALSE, 10);
1693 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1694 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1696 statusbar = gtk_statusbar_new ();
1697 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1698 g_signal_connect (statusbar,
1700 G_CALLBACK (statusbar_popped),
1703 button = g_object_new (gtk_button_get_type (),
1704 "label", "push something",
1708 g_object_connect (button,
1709 "signal::clicked", statusbar_push, statusbar,
1712 button = g_object_connect (g_object_new (gtk_button_get_type (),
1717 "signal_after::clicked", statusbar_pop, statusbar,
1720 button = g_object_connect (g_object_new (gtk_button_get_type (),
1721 "label", "steal #4",
1725 "signal_after::clicked", statusbar_steal, statusbar,
1728 button = g_object_connect (g_object_new (gtk_button_get_type (),
1729 "label", "test contexts",
1733 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1736 button = g_object_connect (g_object_new (gtk_button_get_type (),
1737 "label", "push something long",
1741 "signal_after::clicked", statusbar_push_long, statusbar,
1744 separator = gtk_hseparator_new ();
1745 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1747 box2 = gtk_vbox_new (FALSE, 10);
1748 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1749 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1751 button = gtk_button_new_with_label ("close");
1752 g_signal_connect_swapped (button, "clicked",
1753 G_CALLBACK (gtk_widget_destroy),
1755 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1756 gtk_widget_set_can_default (button, TRUE);
1757 gtk_widget_grab_default (button);
1760 if (!gtk_widget_get_visible (window))
1761 gtk_widget_show_all (window);
1763 gtk_widget_destroy (window);
1769 #define GRID_SIZE 20
1770 #define DEFAULT_GEOMETRY "10x10"
1773 gridded_geometry_expose (GtkWidget *widget,
1774 GdkEventExpose *event)
1778 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
1779 0, 0, widget->allocation.width, widget->allocation.height);
1781 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
1782 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
1784 if ((i + j) % 2 == 0)
1785 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
1786 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1793 gridded_geometry_subresponse (GtkDialog *dialog,
1795 gchar *geometry_string)
1797 if (response_id == GTK_RESPONSE_NONE)
1799 gtk_widget_destroy (GTK_WIDGET (dialog));
1803 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1805 g_print ("Can't parse geometry string %s\n", geometry_string);
1806 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1812 gridded_geometry_response (GtkDialog *dialog,
1816 if (response_id == GTK_RESPONSE_NONE)
1818 gtk_widget_destroy (GTK_WIDGET (dialog));
1822 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1823 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
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 box = gtk_vbox_new (FALSE, 0);
1842 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), box, TRUE, TRUE, 0);
1844 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1846 drawing_area = gtk_drawing_area_new ();
1847 g_signal_connect (drawing_area, "expose_event",
1848 G_CALLBACK (gridded_geometry_expose), NULL);
1849 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1851 /* Gross hack to work around bug 68668... if we set the size request
1852 * large enough, then the current
1854 * request_of_window - request_of_geometry_widget
1856 * method of getting the base size works more or less works.
1858 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1860 geometry.base_width = 0;
1861 geometry.base_height = 0;
1862 geometry.min_width = 2 * GRID_SIZE;
1863 geometry.min_height = 2 * GRID_SIZE;
1864 geometry.width_inc = GRID_SIZE;
1865 geometry.height_inc = GRID_SIZE;
1867 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1869 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1871 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1873 g_print ("Can't parse geometry string %s\n", geometry_string);
1874 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1877 gtk_widget_show_all (window);
1882 create_gridded_geometry (GtkWidget *widget)
1884 static GtkWidget *window = NULL;
1885 gpointer window_ptr;
1891 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1894 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1897 gtk_window_set_screen (GTK_WINDOW (window),
1898 gtk_widget_get_screen (widget));
1900 label = gtk_label_new ("Geometry string:");
1901 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0);
1903 entry = gtk_entry_new ();
1904 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1905 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), entry, FALSE, FALSE, 0);
1907 g_signal_connect (window, "response",
1908 G_CALLBACK (gridded_geometry_response), entry);
1909 window_ptr = &window;
1910 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
1912 gtk_widget_show_all (window);
1915 gtk_widget_destroy (window);
1923 handle_box_child_signal (GtkHandleBox *hb,
1925 const gchar *action)
1927 printf ("%s: child <%s> %sed\n",
1928 g_type_name (G_OBJECT_TYPE (hb)),
1929 g_type_name (G_OBJECT_TYPE (child)),
1934 create_handle_box (GtkWidget *widget)
1936 static GtkWidget* window = NULL;
1937 GtkWidget *handle_box;
1938 GtkWidget *handle_box2;
1943 GtkWidget *separator;
1947 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1949 gtk_window_set_screen (GTK_WINDOW (window),
1950 gtk_widget_get_screen (widget));
1951 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1952 gtk_window_set_title (GTK_WINDOW (window),
1954 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1956 g_signal_connect (window, "destroy",
1957 G_CALLBACK (gtk_widget_destroyed),
1960 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1962 vbox = gtk_vbox_new (FALSE, 0);
1963 gtk_container_add (GTK_CONTAINER (window), vbox);
1964 gtk_widget_show (vbox);
1966 label = gtk_label_new ("Above");
1967 gtk_container_add (GTK_CONTAINER (vbox), label);
1968 gtk_widget_show (label);
1970 separator = gtk_hseparator_new ();
1971 gtk_container_add (GTK_CONTAINER (vbox), separator);
1972 gtk_widget_show (separator);
1974 hbox = gtk_hbox_new (FALSE, 10);
1975 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1976 gtk_widget_show (hbox);
1978 separator = gtk_hseparator_new ();
1979 gtk_container_add (GTK_CONTAINER (vbox), separator);
1980 gtk_widget_show (separator);
1982 label = gtk_label_new ("Below");
1983 gtk_container_add (GTK_CONTAINER (vbox), label);
1984 gtk_widget_show (label);
1986 handle_box = gtk_handle_box_new ();
1987 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1988 g_signal_connect (handle_box,
1990 G_CALLBACK (handle_box_child_signal),
1992 g_signal_connect (handle_box,
1994 G_CALLBACK (handle_box_child_signal),
1996 gtk_widget_show (handle_box);
1998 toolbar = make_toolbar (window);
2000 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2001 gtk_widget_show (toolbar);
2003 handle_box = gtk_handle_box_new ();
2004 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2005 g_signal_connect (handle_box,
2007 G_CALLBACK (handle_box_child_signal),
2009 g_signal_connect (handle_box,
2011 G_CALLBACK (handle_box_child_signal),
2013 gtk_widget_show (handle_box);
2015 handle_box2 = gtk_handle_box_new ();
2016 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2017 g_signal_connect (handle_box2,
2019 G_CALLBACK (handle_box_child_signal),
2021 g_signal_connect (handle_box2,
2023 G_CALLBACK (handle_box_child_signal),
2025 gtk_widget_show (handle_box2);
2027 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
2028 label = gtk_label_new ("Fooo!");
2029 gtk_container_add (GTK_CONTAINER (hbox), label);
2030 gtk_widget_show (label);
2031 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
2034 if (!gtk_widget_get_visible (window))
2035 gtk_widget_show (window);
2037 gtk_widget_destroy (window);
2041 * Test for getting an image from a drawable
2052 take_snapshot (GtkWidget *button,
2055 struct GetImageData *gid = data;
2056 GdkRectangle visible;
2058 int height_fraction;
2061 GdkColor color = { 0, 30000, 0, 0 };
2062 GdkRectangle target;
2065 /* Do some begin_paint_rect on some random rects, draw some
2066 * distinctive stuff into those rects, then take the snapshot.
2067 * figure out whether any rects were overlapped and report to
2071 visible = gid->sw->allocation;
2073 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2074 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2076 width_fraction = visible.width / 4;
2077 height_fraction = visible.height / 4;
2079 gc = gdk_gc_new (gid->src->window);
2080 black_gc = gid->src->style->black_gc;
2082 gdk_gc_set_rgb_fg_color (gc, &color);
2085 target.x = visible.x + width_fraction;
2086 target.y = visible.y + height_fraction * 3;
2087 target.width = width_fraction;
2088 target.height = height_fraction / 2;
2090 gdk_window_begin_paint_rect (gid->src->window,
2093 gdk_draw_rectangle (gid->src->window,
2097 target.width, target.height);
2099 gdk_draw_rectangle (gid->src->window,
2102 target.x + 10, target.y + 10,
2103 target.width - 20, target.height - 20);
2105 target.x = visible.x + width_fraction;
2106 target.y = visible.y + height_fraction;
2107 target.width = width_fraction;
2108 target.height = height_fraction;
2110 gdk_window_begin_paint_rect (gid->src->window,
2113 gdk_draw_rectangle (gid->src->window,
2117 target.width, target.height);
2119 gdk_draw_rectangle (gid->src->window,
2122 target.x + 10, target.y + 10,
2123 target.width - 20, target.height - 20);
2125 target.x = visible.x + width_fraction * 3;
2126 target.y = visible.y + height_fraction;
2127 target.width = width_fraction / 2;
2128 target.height = height_fraction;
2130 gdk_window_begin_paint_rect (gid->src->window,
2133 gdk_draw_rectangle (gid->src->window,
2137 target.width, target.height);
2139 gdk_draw_rectangle (gid->src->window,
2142 target.x + 10, target.y + 10,
2143 target.width - 20, target.height - 20);
2145 target.x = visible.x + width_fraction * 2;
2146 target.y = visible.y + height_fraction * 2;
2147 target.width = width_fraction / 4;
2148 target.height = height_fraction / 4;
2150 gdk_window_begin_paint_rect (gid->src->window,
2153 gdk_draw_rectangle (gid->src->window,
2157 target.width, target.height);
2159 gdk_draw_rectangle (gid->src->window,
2162 target.x + 10, target.y + 10,
2163 target.width - 20, target.height - 20);
2165 target.x += target.width / 2;
2166 target.y += target.width / 2;
2168 gdk_window_begin_paint_rect (gid->src->window,
2171 gdk_draw_rectangle (gid->src->window,
2175 target.width, target.height);
2177 gdk_draw_rectangle (gid->src->window,
2180 target.x + 10, target.y + 10,
2181 target.width - 20, target.height - 20);
2183 /* Screen shot area */
2185 target.x = visible.x + width_fraction * 1.5;
2186 target.y = visible.y + height_fraction * 1.5;
2187 target.width = width_fraction * 2;
2188 target.height = height_fraction * 2;
2190 shot = gdk_drawable_get_image (gid->src->window,
2192 target.width, target.height);
2194 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2197 g_object_unref (shot);
2199 gdk_window_end_paint (gid->src->window);
2200 gdk_window_end_paint (gid->src->window);
2201 gdk_window_end_paint (gid->src->window);
2202 gdk_window_end_paint (gid->src->window);
2203 gdk_window_end_paint (gid->src->window);
2205 gdk_draw_rectangle (gid->src->window,
2206 gid->src->style->black_gc,
2209 target.width, target.height);
2211 g_object_unref (gc);
2215 image_source_expose (GtkWidget *da,
2216 GdkEventExpose *event,
2219 int x = event->area.x;
2220 GdkColor red = { 0, 65535, 0, 0 };
2221 GdkColor green = { 0, 0, 65535, 0 };
2222 GdkColor blue = { 0, 0, 0, 65535 };
2225 gc = gdk_gc_new (event->window);
2227 while (x < (event->area.x + event->area.width))
2234 gdk_gc_set_rgb_fg_color (gc, &red);
2240 gdk_gc_set_rgb_fg_color (gc, &green);
2246 gdk_gc_set_rgb_fg_color (gc, &blue);
2250 g_assert_not_reached ();
2254 gdk_draw_line (event->window,
2257 x, event->area.y + event->area.height);
2262 g_object_unref (gc);
2268 create_get_image (GtkWidget *widget)
2270 static GtkWidget *window = NULL;
2273 gtk_widget_destroy (window);
2282 struct GetImageData *gid;
2284 gid = g_new (struct GetImageData, 1);
2286 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2288 gtk_window_set_screen (GTK_WINDOW (window),
2289 gtk_widget_get_screen (widget));
2291 g_signal_connect (window,
2293 G_CALLBACK (gtk_widget_destroyed),
2296 g_object_set_data_full (G_OBJECT (window),
2297 "testgtk-get-image-data",
2301 hbox = gtk_hbox_new (FALSE, 0);
2303 gtk_container_add (GTK_CONTAINER (window), hbox);
2305 sw = gtk_scrolled_window_new (NULL, NULL);
2306 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2307 GTK_POLICY_AUTOMATIC,
2308 GTK_POLICY_AUTOMATIC);
2312 gtk_widget_set_size_request (sw, 400, 400);
2314 src = gtk_drawing_area_new ();
2315 gtk_widget_set_size_request (src, 10000, 10000);
2317 g_signal_connect (src,
2319 G_CALLBACK (image_source_expose),
2324 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2327 gtk_box_pack_start (GTK_BOX (hbox),
2331 vbox = gtk_vbox_new (FALSE, 3);
2333 snap = g_object_new (GTK_TYPE_IMAGE, NULL);
2337 sw = gtk_scrolled_window_new (NULL, NULL);
2338 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2339 GTK_POLICY_AUTOMATIC,
2340 GTK_POLICY_AUTOMATIC);
2341 gtk_widget_set_size_request (sw, 300, 300);
2343 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2345 gtk_box_pack_end (GTK_BOX (vbox), sw, FALSE, FALSE, 5);
2347 button = gtk_button_new_with_label ("Get image from drawable");
2349 g_signal_connect (button,
2351 G_CALLBACK (take_snapshot),
2354 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2356 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2358 gtk_widget_show_all (window);
2366 sensitivity_toggled (GtkWidget *toggle,
2369 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2373 create_sensitivity_control (GtkWidget *widget)
2377 button = gtk_toggle_button_new_with_label ("Sensitive");
2379 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2380 gtk_widget_is_sensitive (widget));
2382 g_signal_connect (button,
2384 G_CALLBACK (sensitivity_toggled),
2387 gtk_widget_show_all (button);
2393 set_selectable_recursive (GtkWidget *widget,
2396 if (GTK_IS_CONTAINER (widget))
2401 children = gtk_container_get_children (GTK_CONTAINER (widget));
2405 set_selectable_recursive (tmp->data, setting);
2409 g_list_free (children);
2411 else if (GTK_IS_LABEL (widget))
2413 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2418 selectable_toggled (GtkWidget *toggle,
2421 set_selectable_recursive (widget,
2422 GTK_TOGGLE_BUTTON (toggle)->active);
2426 create_selectable_control (GtkWidget *widget)
2430 button = gtk_toggle_button_new_with_label ("Selectable");
2432 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2435 g_signal_connect (button,
2437 G_CALLBACK (selectable_toggled),
2440 gtk_widget_show_all (button);
2446 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
2450 gtk_widget_destroy (dialog);
2452 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2453 "as hyperlinks, which can be clicked\n"
2454 "or activated via <a href=\"keynav\">keynav</a>.\n"
2455 "The links remain the same.";
2456 gtk_label_set_markup (label, text);
2460 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
2462 if (g_strcmp0 (uri, "keynav") == 0)
2466 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
2467 GTK_DIALOG_DESTROY_WITH_PARENT,
2470 "The term <i>keynav</i> is a shorthand for "
2471 "keyboard navigation and refers to the process of using a program "
2472 "(exclusively) via keyboard input.");
2474 gtk_window_present (GTK_WINDOW (dialog));
2476 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
2484 void create_labels (GtkWidget *widget)
2486 static GtkWidget *window = NULL;
2495 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2497 gtk_window_set_screen (GTK_WINDOW (window),
2498 gtk_widget_get_screen (widget));
2500 g_signal_connect (window, "destroy",
2501 G_CALLBACK (gtk_widget_destroyed),
2504 gtk_window_set_title (GTK_WINDOW (window), "Label");
2506 vbox = gtk_vbox_new (FALSE, 5);
2508 hbox = gtk_hbox_new (FALSE, 5);
2509 gtk_container_add (GTK_CONTAINER (window), vbox);
2511 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2513 button = create_sensitivity_control (hbox);
2515 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2517 button = create_selectable_control (hbox);
2519 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2521 vbox = gtk_vbox_new (FALSE, 5);
2523 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2524 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2526 frame = gtk_frame_new ("Normal Label");
2527 label = gtk_label_new ("This is a Normal label");
2528 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2529 gtk_container_add (GTK_CONTAINER (frame), label);
2530 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2532 frame = gtk_frame_new ("Multi-line Label");
2533 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2534 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
2535 gtk_container_add (GTK_CONTAINER (frame), label);
2536 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2538 frame = gtk_frame_new ("Left Justified Label");
2539 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2540 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
2541 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2542 gtk_container_add (GTK_CONTAINER (frame), label);
2543 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2545 frame = gtk_frame_new ("Right Justified Label");
2546 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2547 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2548 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2549 gtk_container_add (GTK_CONTAINER (frame), label);
2550 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2552 frame = gtk_frame_new ("Internationalized Label");
2553 label = gtk_label_new (NULL);
2554 gtk_label_set_markup (GTK_LABEL (label),
2555 "French (Fran\303\247ais) Bonjour, Salut\n"
2556 "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"
2557 "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"
2558 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2559 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2560 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2561 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2562 gtk_container_add (GTK_CONTAINER (frame), label);
2563 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2565 frame = gtk_frame_new ("Bidirection Label");
2566 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"
2567 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
2568 gtk_container_add (GTK_CONTAINER (frame), label);
2569 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2571 frame = gtk_frame_new ("Links in a label");
2572 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2573 "as hyperlinks, which can be clicked\n"
2574 "or activated via <a href=\"keynav\">keynav</a>");
2575 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
2576 gtk_container_add (GTK_CONTAINER (frame), label);
2577 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2578 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
2580 vbox = gtk_vbox_new (FALSE, 5);
2581 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2582 frame = gtk_frame_new ("Line wrapped label");
2583 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2584 "up the entire "/* big space to test spacing */\
2585 "width allocated to it, but automatically wraps the words to fit. "\
2586 "The time has come, for all good men, to come to the aid of their party. "\
2587 "The sixth sheik's six sheep's sick.\n"\
2588 " It supports multiple paragraphs correctly, and correctly adds "\
2589 "many extra spaces. ");
2591 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2592 gtk_container_add (GTK_CONTAINER (frame), label);
2593 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2595 frame = gtk_frame_new ("Filled, wrapped label");
2596 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2597 "up the entire width allocated to it. Here is a seneance to prove "\
2598 "my point. Here is another sentence. "\
2599 "Here comes the sun, do de do de do.\n"\
2600 " This is a new paragraph.\n"\
2601 " This is another newer, longer, better paragraph. It is coming to an end, "\
2603 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2604 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2605 gtk_container_add (GTK_CONTAINER (frame), label);
2606 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2608 frame = gtk_frame_new ("Underlined label");
2609 label = gtk_label_new ("This label is underlined!\n"
2610 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2611 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2612 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2613 gtk_container_add (GTK_CONTAINER (frame), label);
2614 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2616 frame = gtk_frame_new ("Markup label");
2617 label = gtk_label_new (NULL);
2619 /* There's also a gtk_label_set_markup() without accel if you
2620 * don't have an accelerator key
2622 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2623 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2624 "<b>markup</b> _such as "
2625 "<big><i>Big Italics</i></big>\n"
2626 "<tt>Monospace font</tt>\n"
2627 "<u>Underline!</u>\n"
2629 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2630 "and nothing on this line,\n"
2633 "or even on this one\n"
2634 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2635 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2636 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2638 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2640 gtk_container_add (GTK_CONTAINER (frame), label);
2641 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2644 if (!gtk_widget_get_visible (window))
2645 gtk_widget_show_all (window);
2647 gtk_widget_destroy (window);
2651 on_angle_scale_changed (GtkRange *range,
2654 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2658 create_rotated_label (GtkWidget *widget)
2660 static GtkWidget *window = NULL;
2664 GtkWidget *scale_label;
2665 GtkWidget *scale_hbox;
2669 window = gtk_dialog_new_with_buttons ("Rotated Label",
2670 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2671 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2674 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2676 gtk_window_set_screen (GTK_WINDOW (window),
2677 gtk_widget_get_screen (widget));
2679 g_signal_connect (window, "response",
2680 G_CALLBACK (gtk_object_destroy), NULL);
2681 g_signal_connect (window, "destroy",
2682 G_CALLBACK (gtk_widget_destroyed), &window);
2684 vbox = gtk_vbox_new (FALSE, 5);
2685 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0);
2686 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2688 label = gtk_label_new (NULL);
2689 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2690 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2692 scale_hbox = gtk_hbox_new (FALSE, 0);
2693 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2695 scale_label = gtk_label_new (NULL);
2696 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2697 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2699 hscale = gtk_hscale_new_with_range (0, 360, 5);
2700 g_signal_connect (hscale, "value-changed",
2701 G_CALLBACK (on_angle_scale_changed), label);
2703 gtk_range_set_value (GTK_RANGE (hscale), 45);
2704 gtk_widget_set_size_request (hscale, 200, -1);
2705 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2708 if (!gtk_widget_get_visible (window))
2709 gtk_widget_show_all (window);
2711 gtk_widget_destroy (window);
2714 #define DEFAULT_TEXT_RADIUS 200
2717 on_rotated_text_unrealize (GtkWidget *widget)
2719 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2723 on_rotated_text_expose (GtkWidget *widget,
2724 GdkEventExpose *event,
2725 GdkPixbuf *tile_pixbuf)
2727 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2728 "had", "10,000", "men" };
2729 PangoRenderer *renderer;
2734 PangoMatrix matrix = PANGO_MATRIX_INIT;
2735 PangoLayout *layout;
2736 PangoContext *context;
2737 PangoFontDescription *desc;
2739 gc = g_object_get_data (G_OBJECT (widget), "text-gc");
2742 static GdkColor black = { 0, 0, 0, 0 };
2744 gc = gdk_gc_new (widget->window);
2745 gdk_gc_set_rgb_fg_color (gc, &black);
2751 gint width = gdk_pixbuf_get_width (tile_pixbuf);
2752 gint height = gdk_pixbuf_get_height (tile_pixbuf);
2754 tile = gdk_pixmap_new (widget->window, width, height, -1);
2755 gdk_draw_pixbuf (tile, gc, tile_pixbuf,
2756 0, 0, 0, 0, width, height,
2757 GDK_RGB_DITHER_NORMAL, 0, 0);
2759 gdk_gc_set_tile (gc, tile);
2760 gdk_gc_set_fill (gc, GDK_TILED);
2762 g_object_unref (tile);
2765 g_object_set_data_full (G_OBJECT (widget), "text-gc", gc, (GDestroyNotify)g_object_unref);
2768 renderer = gdk_pango_renderer_get_default (gtk_widget_get_screen (widget));
2769 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), widget->window);
2770 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), gc);
2772 radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
2774 pango_matrix_translate (&matrix,
2775 radius + (widget->allocation.width - 2 * radius) / 2,
2776 radius + (widget->allocation.height - 2 * radius) / 2);
2777 pango_matrix_scale (&matrix, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2779 context = gtk_widget_get_pango_context (widget);
2780 layout = pango_layout_new (context);
2781 desc = pango_font_description_from_string ("Sans Bold 30");
2782 pango_layout_set_font_description (layout, desc);
2783 pango_font_description_free (desc);
2785 n_words = G_N_ELEMENTS (words);
2786 for (i = 0; i < n_words; i++)
2788 PangoMatrix rotated_matrix = matrix;
2791 pango_matrix_rotate (&rotated_matrix, - (360. * i) / n_words);
2793 pango_context_set_matrix (context, &rotated_matrix);
2794 pango_layout_context_changed (layout);
2795 pango_layout_set_text (layout, words[i], -1);
2797 pango_layout_get_size (layout, &width, &height);
2799 pango_renderer_draw_layout (renderer, layout,
2800 - width / 2, - DEFAULT_TEXT_RADIUS * PANGO_SCALE);
2803 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL);
2804 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL);
2806 g_object_unref (layout);
2812 create_rotated_text (GtkWidget *widget)
2814 static GtkWidget *window = NULL;
2818 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
2819 GtkRequisition requisition;
2820 GtkWidget *drawing_area;
2821 GdkPixbuf *tile_pixbuf;
2823 window = gtk_dialog_new_with_buttons ("Rotated Text",
2824 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2825 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2828 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2830 gtk_window_set_screen (GTK_WINDOW (window),
2831 gtk_widget_get_screen (widget));
2833 g_signal_connect (window, "response",
2834 G_CALLBACK (gtk_object_destroy), NULL);
2835 g_signal_connect (window, "destroy",
2836 G_CALLBACK (gtk_widget_destroyed), &window);
2838 drawing_area = gtk_drawing_area_new ();
2839 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), drawing_area, TRUE, TRUE, 0);
2840 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
2842 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2844 g_signal_connect (drawing_area, "expose-event",
2845 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
2846 g_signal_connect (drawing_area, "unrealize",
2847 G_CALLBACK (on_rotated_text_unrealize), NULL);
2849 gtk_widget_show_all (GTK_BIN (window)->child);
2851 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2852 gtk_widget_size_request (window, &requisition);
2853 gtk_widget_set_size_request (drawing_area, -1, -1);
2854 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2857 if (!gtk_widget_get_visible (window))
2858 gtk_widget_show (window);
2860 gtk_widget_destroy (window);
2868 reparent_label (GtkWidget *widget,
2869 GtkWidget *new_parent)
2873 label = g_object_get_data (G_OBJECT (widget), "user_data");
2875 gtk_widget_reparent (label, new_parent);
2879 set_parent_signal (GtkWidget *child,
2880 GtkWidget *old_parent,
2883 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2884 g_type_name (G_OBJECT_TYPE (child)),
2885 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
2886 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2887 GPOINTER_TO_INT (func_data));
2891 create_reparent (GtkWidget *widget)
2893 static GtkWidget *window = NULL;
2900 GtkWidget *separator;
2901 GtkWidget *event_box;
2905 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2907 gtk_window_set_screen (GTK_WINDOW (window),
2908 gtk_widget_get_screen (widget));
2910 g_signal_connect (window, "destroy",
2911 G_CALLBACK (gtk_widget_destroyed),
2914 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2915 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2917 box1 = gtk_vbox_new (FALSE, 0);
2918 gtk_container_add (GTK_CONTAINER (window), box1);
2920 box2 = gtk_hbox_new (FALSE, 5);
2921 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2922 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2924 label = gtk_label_new ("Hello World");
2926 frame = gtk_frame_new ("Frame 1");
2927 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2929 box3 = gtk_vbox_new (FALSE, 5);
2930 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2931 gtk_container_add (GTK_CONTAINER (frame), box3);
2933 button = gtk_button_new_with_label ("switch");
2934 g_object_set_data (G_OBJECT (button), "user_data", label);
2935 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2937 event_box = gtk_event_box_new ();
2938 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2939 gtk_container_add (GTK_CONTAINER (event_box), label);
2941 g_signal_connect (button, "clicked",
2942 G_CALLBACK (reparent_label),
2945 g_signal_connect (label, "parent_set",
2946 G_CALLBACK (set_parent_signal),
2947 GINT_TO_POINTER (42));
2949 frame = gtk_frame_new ("Frame 2");
2950 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2952 box3 = gtk_vbox_new (FALSE, 5);
2953 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2954 gtk_container_add (GTK_CONTAINER (frame), box3);
2956 button = gtk_button_new_with_label ("switch");
2957 g_object_set_data (G_OBJECT (button), "user_data", label);
2958 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2960 event_box = gtk_event_box_new ();
2961 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2963 g_signal_connect (button, "clicked",
2964 G_CALLBACK (reparent_label),
2967 separator = gtk_hseparator_new ();
2968 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2970 box2 = gtk_vbox_new (FALSE, 10);
2971 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2972 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2974 button = gtk_button_new_with_label ("close");
2975 g_signal_connect_swapped (button, "clicked",
2976 G_CALLBACK (gtk_widget_destroy), window);
2977 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2978 gtk_widget_set_can_default (button, TRUE);
2979 gtk_widget_grab_default (button);
2982 if (!gtk_widget_get_visible (window))
2983 gtk_widget_show_all (window);
2985 gtk_widget_destroy (window);
2992 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2994 if (event->type == GDK_BUTTON_PRESS)
2996 if (event->button == 1)
2997 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2998 event->button, event->x_root, event->y_root,
3000 else if (event->button == 2)
3001 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
3002 event->button, event->x_root, event->y_root,
3009 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
3011 gtk_paint_resize_grip (area->style,
3013 gtk_widget_get_state (area),
3019 area->allocation.width,
3020 area->allocation.height);
3026 create_resize_grips (GtkWidget *widget)
3028 static GtkWidget *window = NULL;
3030 GtkWidget *hbox, *vbox;
3033 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3035 gtk_window_set_screen (GTK_WINDOW (window),
3036 gtk_widget_get_screen (widget));
3038 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
3040 g_signal_connect (window, "destroy",
3041 G_CALLBACK (gtk_widget_destroyed),
3044 vbox = gtk_vbox_new (FALSE, 0);
3045 gtk_container_add (GTK_CONTAINER (window), vbox);
3047 hbox = gtk_hbox_new (FALSE, 0);
3048 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3051 area = gtk_drawing_area_new ();
3052 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3053 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3054 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3055 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3056 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3057 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3060 area = gtk_drawing_area_new ();
3061 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3062 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3063 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3064 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3065 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3066 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3069 area = gtk_drawing_area_new ();
3070 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3071 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3072 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3073 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3074 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3075 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3077 hbox = gtk_hbox_new (FALSE, 0);
3078 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3081 area = gtk_drawing_area_new ();
3082 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3083 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3084 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3085 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3086 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3087 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3090 area = gtk_drawing_area_new ();
3091 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3094 area = gtk_drawing_area_new ();
3095 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3096 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3097 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3098 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3099 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3100 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3103 hbox = gtk_hbox_new (FALSE, 0);
3104 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3107 area = gtk_drawing_area_new ();
3108 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3109 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3110 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3111 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3112 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3113 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3115 area = gtk_drawing_area_new ();
3116 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3117 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3118 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3119 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3120 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3121 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3124 area = gtk_drawing_area_new ();
3125 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3126 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3127 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3128 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3129 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3130 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3133 if (!gtk_widget_get_visible (window))
3134 gtk_widget_show_all (window);
3136 gtk_widget_destroy (window);
3142 gint upositionx = 0;
3143 gint upositiony = 0;
3146 uposition_configure (GtkWidget *window)
3152 lx = g_object_get_data (G_OBJECT (window), "x");
3153 ly = g_object_get_data (G_OBJECT (window), "y");
3155 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
3156 sprintf (buffer, "%d", upositionx);
3157 gtk_label_set_text (lx, buffer);
3158 sprintf (buffer, "%d", upositiony);
3159 gtk_label_set_text (ly, buffer);
3165 uposition_stop_configure (GtkToggleButton *toggle,
3169 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
3171 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
3175 create_saved_position (GtkWidget *widget)
3177 static GtkWidget *window = NULL;
3182 GtkWidget *main_vbox;
3190 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
3191 "type", GTK_WINDOW_TOPLEVEL,
3192 "title", "Saved Position",
3194 "signal::configure_event", uposition_configure, NULL,
3197 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3199 gtk_window_set_screen (GTK_WINDOW (window),
3200 gtk_widget_get_screen (widget));
3203 g_signal_connect (window, "destroy",
3204 G_CALLBACK (gtk_widget_destroyed),
3207 main_vbox = gtk_vbox_new (FALSE, 5);
3208 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3209 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3212 g_object_new (gtk_vbox_get_type (),
3213 "GtkBox::homogeneous", FALSE,
3214 "GtkBox::spacing", 5,
3215 "GtkContainer::border_width", 10,
3216 "GtkWidget::parent", main_vbox,
3217 "GtkWidget::visible", TRUE,
3218 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
3219 "label", "Stop Events",
3223 "signal::clicked", uposition_stop_configure, window,
3227 hbox = gtk_hbox_new (FALSE, 0);
3228 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3229 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3231 label = gtk_label_new ("X Origin : ");
3232 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3233 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3235 x_label = gtk_label_new ("");
3236 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3237 g_object_set_data (G_OBJECT (window), "x", x_label);
3239 hbox = gtk_hbox_new (FALSE, 0);
3240 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3241 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3243 label = gtk_label_new ("Y Origin : ");
3244 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3245 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3247 y_label = gtk_label_new ("");
3248 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3249 g_object_set_data (G_OBJECT (window), "y", y_label);
3252 g_object_new (gtk_hseparator_get_type (),
3253 "GtkWidget::visible", TRUE,
3255 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3257 hbox = gtk_hbox_new (FALSE, 0);
3258 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3259 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3261 button = gtk_button_new_with_label ("Close");
3262 g_signal_connect_swapped (button, "clicked",
3263 G_CALLBACK (gtk_widget_destroy),
3265 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3266 gtk_widget_set_can_default (button, TRUE);
3267 gtk_widget_grab_default (button);
3269 gtk_widget_show_all (window);
3272 gtk_widget_destroy (window);
3280 create_pixmap (GtkWidget *widget)
3282 static GtkWidget *window = NULL;
3288 GtkWidget *separator;
3289 GtkWidget *pixmapwid;
3293 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3295 gtk_window_set_screen (GTK_WINDOW (window),
3296 gtk_widget_get_screen (widget));
3298 g_signal_connect (window, "destroy",
3299 G_CALLBACK (gtk_widget_destroyed),
3302 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3303 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3304 gtk_widget_realize(window);
3306 box1 = gtk_vbox_new (FALSE, 0);
3307 gtk_container_add (GTK_CONTAINER (window), box1);
3309 box2 = gtk_vbox_new (FALSE, 10);
3310 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3311 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3313 button = gtk_button_new ();
3314 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3316 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3318 label = gtk_label_new ("Pixmap\ntest");
3319 box3 = gtk_hbox_new (FALSE, 0);
3320 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3321 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3322 gtk_container_add (GTK_CONTAINER (box3), label);
3323 gtk_container_add (GTK_CONTAINER (button), box3);
3325 button = gtk_button_new ();
3326 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3328 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3330 label = gtk_label_new ("Pixmap\ntest");
3331 box3 = gtk_hbox_new (FALSE, 0);
3332 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3333 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3334 gtk_container_add (GTK_CONTAINER (box3), label);
3335 gtk_container_add (GTK_CONTAINER (button), box3);
3337 gtk_widget_set_sensitive (button, FALSE);
3339 separator = gtk_hseparator_new ();
3340 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3342 box2 = gtk_vbox_new (FALSE, 10);
3343 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3344 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3346 button = gtk_button_new_with_label ("close");
3347 g_signal_connect_swapped (button, "clicked",
3348 G_CALLBACK (gtk_widget_destroy),
3350 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3351 gtk_widget_set_can_default (button, TRUE);
3352 gtk_widget_grab_default (button);
3355 if (!gtk_widget_get_visible (window))
3356 gtk_widget_show_all (window);
3358 gtk_widget_destroy (window);
3362 create_tooltips (GtkWidget *widget)
3364 static GtkWidget *window = NULL;
3371 GtkWidget *separator;
3376 g_object_new (gtk_window_get_type (),
3377 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3378 "GtkContainer::border_width", 0,
3379 "GtkWindow::title", "Tooltips",
3380 "GtkWindow::allow_shrink", TRUE,
3381 "GtkWindow::allow_grow", FALSE,
3384 gtk_window_set_screen (GTK_WINDOW (window),
3385 gtk_widget_get_screen (widget));
3387 box1 = gtk_vbox_new (FALSE, 0);
3388 gtk_container_add (GTK_CONTAINER (window), box1);
3390 box2 = gtk_vbox_new (FALSE, 10);
3391 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3392 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3394 button = gtk_toggle_button_new_with_label ("button1");
3395 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3397 gtk_widget_set_tooltip_text (button, "This is button 1");
3399 button = gtk_toggle_button_new_with_label ("button2");
3400 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3402 gtk_widget_set_tooltip_text (button,
3403 "This is button 2. This is also a really long tooltip which probably "
3404 "won't fit on a single line and will therefore need to be wrapped. "
3405 "Hopefully the wrapping will work correctly.");
3407 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3408 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3410 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
3413 g_object_new (gtk_vbox_get_type (),
3414 "homogeneous", FALSE,
3421 g_object_new (gtk_button_get_type (),
3426 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3427 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
3429 frame = g_object_new (gtk_frame_get_type (),
3430 "label", "ToolTips Inspector",
3431 "label_xalign", (double) 0.5,
3437 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3439 separator = gtk_hseparator_new ();
3440 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3442 box2 = gtk_vbox_new (FALSE, 10);
3443 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3444 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3446 button = gtk_button_new_with_label ("close");
3447 g_signal_connect_swapped (button, "clicked",
3448 G_CALLBACK (gtk_widget_destroy),
3450 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3451 gtk_widget_set_can_default (button, TRUE);
3452 gtk_widget_grab_default (button);
3454 gtk_widget_set_tooltip_text (button, "Push this button to close window");
3457 if (!gtk_widget_get_visible (window))
3458 gtk_widget_show_all (window);
3460 gtk_widget_destroy (window);
3468 pack_image (GtkWidget *box,
3472 gtk_box_pack_start (GTK_BOX (box),
3473 gtk_label_new (text),
3476 gtk_box_pack_start (GTK_BOX (box),
3482 create_image (GtkWidget *widget)
3484 static GtkWidget *window = NULL;
3492 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3494 gtk_window_set_screen (GTK_WINDOW (window),
3495 gtk_widget_get_screen (widget));
3497 /* this is bogus for testing drawing when allocation < request,
3498 * don't copy into real code
3500 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
3502 g_signal_connect (window, "destroy",
3503 G_CALLBACK (gtk_widget_destroyed),
3506 vbox = gtk_vbox_new (FALSE, 5);
3508 gtk_container_add (GTK_CONTAINER (window), vbox);
3510 pack_image (vbox, "Stock Warning Dialog",
3511 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3512 GTK_ICON_SIZE_DIALOG));
3514 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
3515 gtk_widget_get_colormap (window),
3520 pack_image (vbox, "Pixmap",
3521 gtk_image_new_from_pixmap (pixmap, mask));
3524 if (!gtk_widget_get_visible (window))
3525 gtk_widget_show_all (window);
3527 gtk_widget_destroy (window);
3535 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3538 GtkWidget *menuitem;
3547 menu = gtk_menu_new ();
3548 gtk_menu_set_screen (GTK_MENU (menu), screen);
3554 menuitem = gtk_tearoff_menu_item_new ();
3555 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3556 gtk_widget_show (menuitem);
3559 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3560 GTK_ICON_SIZE_MENU);
3561 gtk_widget_show (image);
3562 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3563 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3564 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3565 gtk_widget_show (menuitem);
3567 for (i = 0, j = 1; i < length; i++, j++)
3569 sprintf (buf, "item %2d - %d", depth, j);
3571 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3572 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3574 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3575 gtk_widget_show (menuitem);
3577 gtk_widget_set_sensitive (menuitem, FALSE);
3580 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3584 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3585 create_menu (screen, depth - 1, 5, TRUE));
3592 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3595 GtkWidget *menuitem;
3601 menu = gtk_menu_new ();
3602 gtk_menu_set_screen (GTK_MENU (menu), screen);
3607 menuitem = gtk_tearoff_menu_item_new ();
3608 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3609 gtk_widget_show (menuitem);
3613 menuitem = gtk_menu_item_new_with_label ("items");
3614 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3616 submenu = gtk_menu_new ();
3617 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3618 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3619 gtk_widget_show (menuitem);
3622 /* now fill the items submenu */
3623 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3624 GTK_ICON_SIZE_MENU);
3625 gtk_widget_show (image);
3626 menuitem = gtk_image_menu_item_new_with_label ("Image");
3627 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3628 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3629 gtk_widget_show (menuitem);
3631 menuitem = gtk_menu_item_new_with_label ("x");
3632 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3633 gtk_widget_show (menuitem);
3635 menuitem = gtk_menu_item_new_with_label ("x");
3636 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3637 gtk_widget_show (menuitem);
3639 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3640 GTK_ICON_SIZE_MENU);
3641 gtk_widget_show (image);
3642 menuitem = gtk_image_menu_item_new_with_label ("Image");
3643 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3644 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3645 gtk_widget_show (menuitem);
3647 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3648 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3649 gtk_widget_show (menuitem);
3651 menuitem = gtk_menu_item_new_with_label ("x");
3652 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3653 gtk_widget_show (menuitem);
3655 menuitem = gtk_menu_item_new_with_label ("x");
3656 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3657 gtk_widget_show (menuitem);
3659 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3660 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3661 gtk_widget_show (menuitem);
3663 menuitem = gtk_check_menu_item_new_with_label ("Check");
3664 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3665 gtk_widget_show (menuitem);
3667 menuitem = gtk_menu_item_new_with_label ("x");
3668 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3669 gtk_widget_show (menuitem);
3671 menuitem = gtk_menu_item_new_with_label ("x");
3672 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3673 gtk_widget_show (menuitem);
3675 menuitem = gtk_check_menu_item_new_with_label ("Check");
3676 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3677 gtk_widget_show (menuitem);
3679 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3680 gtk_widget_show (menuitem);
3681 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3683 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3684 gtk_widget_show (menuitem);
3685 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3687 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3688 gtk_widget_show (menuitem);
3689 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3691 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3692 gtk_widget_show (menuitem);
3693 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3695 /* end of items submenu */
3697 menuitem = gtk_menu_item_new_with_label ("spanning");
3698 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3700 submenu = gtk_menu_new ();
3701 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3702 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3703 gtk_widget_show (menuitem);
3706 /* now fill the spanning submenu */
3707 menuitem = gtk_menu_item_new_with_label ("a");
3708 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3709 gtk_widget_show (menuitem);
3711 menuitem = gtk_menu_item_new_with_label ("b");
3712 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3713 gtk_widget_show (menuitem);
3715 menuitem = gtk_menu_item_new_with_label ("c");
3716 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3717 gtk_widget_show (menuitem);
3719 menuitem = gtk_menu_item_new_with_label ("d");
3720 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3721 gtk_widget_show (menuitem);
3723 menuitem = gtk_menu_item_new_with_label ("e");
3724 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3725 gtk_widget_show (menuitem);
3726 /* end of spanning submenu */
3728 menuitem = gtk_menu_item_new_with_label ("left");
3729 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3730 submenu = gtk_menu_new ();
3731 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3732 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3733 gtk_widget_show (menuitem);
3735 menuitem = gtk_menu_item_new_with_label ("Empty");
3736 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3737 submenu = gtk_menu_new ();
3738 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3739 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3740 gtk_widget_show (menuitem);
3742 menuitem = gtk_menu_item_new_with_label ("right");
3743 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3744 submenu = gtk_menu_new ();
3745 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3746 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3747 gtk_widget_show (menuitem);
3749 menuitem = gtk_menu_item_new_with_label ("Empty");
3750 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3751 gtk_widget_show (menuitem);
3755 for (; j < rows; j++)
3756 for (i = 0; i < cols; i++)
3758 sprintf (buf, "(%d %d)", i, j);
3759 menuitem = gtk_menu_item_new_with_label (buf);
3760 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3761 gtk_widget_show (menuitem);
3764 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3765 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3766 gtk_widget_show (menuitem);
3767 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3768 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3769 gtk_widget_show (menuitem);
3770 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3771 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3772 gtk_widget_show (menuitem);
3773 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3774 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3775 gtk_widget_show (menuitem);
3781 create_menus (GtkWidget *widget)
3783 static GtkWidget *window = NULL;
3787 GtkWidget *optionmenu;
3788 GtkWidget *separator;
3794 GtkWidget *menuitem;
3795 GtkAccelGroup *accel_group;
3797 GdkScreen *screen = gtk_widget_get_screen (widget);
3799 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3801 gtk_window_set_screen (GTK_WINDOW (window), screen);
3803 g_signal_connect (window, "destroy",
3804 G_CALLBACK (gtk_widget_destroyed),
3806 g_signal_connect (window, "delete-event",
3807 G_CALLBACK (gtk_true),
3810 accel_group = gtk_accel_group_new ();
3811 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3813 gtk_window_set_title (GTK_WINDOW (window), "menus");
3814 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3817 box1 = gtk_vbox_new (FALSE, 0);
3818 gtk_container_add (GTK_CONTAINER (window), box1);
3819 gtk_widget_show (box1);
3821 menubar = gtk_menu_bar_new ();
3822 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3823 gtk_widget_show (menubar);
3825 menu = create_menu (screen, 2, 50, TRUE);
3827 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3828 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3829 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3830 gtk_widget_show (menuitem);
3832 menu = create_table_menu (screen, 2, 50, TRUE);
3834 menuitem = gtk_menu_item_new_with_label ("table");
3835 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3836 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3837 gtk_widget_show (menuitem);
3839 menuitem = gtk_menu_item_new_with_label ("foo");
3840 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3841 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3842 gtk_widget_show (menuitem);
3844 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3845 GTK_ICON_SIZE_MENU);
3846 gtk_widget_show (image);
3847 menuitem = gtk_image_menu_item_new_with_label ("Help");
3848 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3849 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3850 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3851 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3852 gtk_widget_show (menuitem);
3854 menubar = gtk_menu_bar_new ();
3855 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3856 gtk_widget_show (menubar);
3858 menu = create_menu (screen, 2, 10, TRUE);
3860 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3861 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3862 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3863 gtk_widget_show (menuitem);
3865 box2 = gtk_vbox_new (FALSE, 10);
3866 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3867 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3868 gtk_widget_show (box2);
3870 menu = create_menu (screen, 1, 5, FALSE);
3871 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3873 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3874 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3875 gtk_widget_show (menuitem);
3877 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3878 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3879 gtk_widget_show (menuitem);
3880 gtk_widget_add_accelerator (menuitem,
3886 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3887 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3888 gtk_widget_show (menuitem);
3889 gtk_widget_add_accelerator (menuitem,
3894 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3895 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3896 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3897 gtk_widget_show (menuitem);
3898 gtk_widget_add_accelerator (menuitem,
3904 gtk_widget_add_accelerator (menuitem,
3911 optionmenu = gtk_combo_box_new_text ();
3912 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3913 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3914 gtk_widget_show (optionmenu);
3916 separator = gtk_hseparator_new ();
3917 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3918 gtk_widget_show (separator);
3920 box2 = gtk_vbox_new (FALSE, 10);
3921 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3922 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3923 gtk_widget_show (box2);
3925 button = gtk_button_new_with_label ("close");
3926 g_signal_connect_swapped (button, "clicked",
3927 G_CALLBACK (gtk_widget_destroy),
3929 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3930 gtk_widget_set_can_default (button, TRUE);
3931 gtk_widget_grab_default (button);
3932 gtk_widget_show (button);
3935 if (!gtk_widget_get_visible (window))
3936 gtk_widget_show (window);
3938 gtk_widget_destroy (window);
3941 /* GdkPixbuf RGBA C-Source image dump */
3943 static const guint8 apple[] =
3945 /* Pixbuf magic (0x47646b50) */
3947 /* length: header (24) + pixel_data (2304) */
3949 /* pixdata_type (0x1010002) */
3951 /* rowstride (96) */
3958 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3959 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3960 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3961 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3962 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3963 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3964 "\0\0\0\0\0\0\0\0\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"
3965 "\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"
3966 "\0\0\0\0\0\0\0\0\0\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"
3967 "[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"
3968 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3969 "\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"
3970 "\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"
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`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3973 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
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\0eq"
3975 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3976 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3977 "\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["
3978 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3979 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3980 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3981 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3982 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3983 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3984 "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"
3985 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3986 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3987 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3988 "\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"
3989 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3990 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3991 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3992 "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"
3993 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3994 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3995 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3996 "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"
3997 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3998 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3999 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4000 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4001 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4002 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4003 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4004 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4005 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4006 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4007 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4008 "\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>"
4009 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4010 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4011 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4012 "\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"
4013 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4014 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4015 "\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"
4016 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4017 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4018 "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"
4019 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4020 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4021 "\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"
4022 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4023 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4024 "\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"
4025 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4026 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4027 "\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"
4028 "\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"
4029 "\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"
4030 "\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"
4031 "\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"
4032 "\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"
4033 "\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"
4034 "\0\0\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"
4035 "\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"
4036 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4040 accel_button_new (GtkAccelGroup *accel_group,
4045 GdkModifierType modifiers;
4049 gtk_accelerator_parse (accel, &keyval, &modifiers);
4052 button = gtk_button_new ();
4053 gtk_widget_add_accelerator (button, "activate", accel_group,
4054 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4056 label = gtk_accel_label_new (text);
4057 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4058 gtk_widget_show (label);
4060 gtk_container_add (GTK_CONTAINER (button), label);
4066 create_key_lookup (GtkWidget *widget)
4068 static GtkWidget *window = NULL;
4069 gpointer window_ptr;
4073 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4076 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4077 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4080 gtk_window_set_screen (GTK_WINDOW (window),
4081 gtk_widget_get_screen (widget));
4083 /* We have to expand it so the accel labels will draw their labels
4085 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4087 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4089 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4090 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4091 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4092 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4093 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4094 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4095 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4096 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4097 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4098 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4099 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4100 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4101 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4102 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4103 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4104 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4105 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4106 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4107 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4108 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4109 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4110 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4111 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4112 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4113 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4114 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4115 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4116 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4118 window_ptr = &window;
4119 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
4120 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4122 gtk_widget_show_all (window);
4125 gtk_widget_destroy (window);
4134 cmw_destroy_cb(GtkWidget *widget)
4136 /* This is needed to get out of gtk_main */
4143 cmw_color (GtkWidget *widget, GtkWidget *parent)
4147 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4149 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4151 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4155 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4157 /* And mark it as a transient dialog */
4158 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4160 g_signal_connect (csd, "destroy",
4161 G_CALLBACK (cmw_destroy_cb), NULL);
4163 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4164 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4165 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4166 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4168 /* wait until destroy calls gtk_main_quit */
4169 gtk_widget_show (csd);
4174 cmw_file (GtkWidget *widget, GtkWidget *parent)
4178 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
4179 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
4180 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
4181 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
4183 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4184 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
4186 g_signal_connect (fs, "destroy",
4187 G_CALLBACK (cmw_destroy_cb), NULL);
4188 g_signal_connect_swapped (fs, "response",
4189 G_CALLBACK (gtk_widget_destroy), fs);
4191 /* wait until destroy calls gtk_main_quit */
4192 gtk_widget_show (fs);
4198 create_modal_window (GtkWidget *widget)
4200 GtkWidget *window = NULL;
4201 GtkWidget *box1,*box2;
4203 GtkWidget *btnColor,*btnFile,*btnClose;
4205 /* Create modal window (Here you can use any window descendent )*/
4206 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4207 gtk_window_set_screen (GTK_WINDOW (window),
4208 gtk_widget_get_screen (widget));
4210 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4212 /* Set window as modal */
4213 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4215 /* Create widgets */
4216 box1 = gtk_vbox_new (FALSE,5);
4217 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4218 box2 = gtk_vbox_new (TRUE,5);
4219 btnColor = gtk_button_new_with_label ("Color");
4220 btnFile = gtk_button_new_with_label ("File Selection");
4221 btnClose = gtk_button_new_with_label ("Close");
4224 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4225 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4228 gtk_container_add (GTK_CONTAINER (window), box1);
4229 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4230 gtk_container_add (GTK_CONTAINER (frame1), box2);
4231 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4232 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4233 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4234 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4236 /* connect signals */
4237 g_signal_connect_swapped (btnClose, "clicked",
4238 G_CALLBACK (gtk_widget_destroy), window);
4240 g_signal_connect (window, "destroy",
4241 G_CALLBACK (cmw_destroy_cb), NULL);
4243 g_signal_connect (btnColor, "clicked",
4244 G_CALLBACK (cmw_color), window);
4245 g_signal_connect (btnFile, "clicked",
4246 G_CALLBACK (cmw_file), window);
4249 gtk_widget_show_all (window);
4251 /* wait until dialog get destroyed */
4260 make_message_dialog (GdkScreen *screen,
4262 GtkMessageType type,
4263 GtkButtonsType buttons,
4264 guint default_response)
4268 gtk_widget_destroy (*dialog);
4273 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4274 "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.)");
4276 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4278 g_signal_connect_swapped (*dialog,
4280 G_CALLBACK (gtk_widget_destroy),
4283 g_signal_connect (*dialog,
4285 G_CALLBACK (gtk_widget_destroyed),
4288 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4290 gtk_widget_show (*dialog);
4294 create_message_dialog (GtkWidget *widget)
4296 static GtkWidget *info = NULL;
4297 static GtkWidget *warning = NULL;
4298 static GtkWidget *error = NULL;
4299 static GtkWidget *question = NULL;
4300 GdkScreen *screen = gtk_widget_get_screen (widget);
4302 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4303 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
4304 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4305 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
4312 static GtkWidget *sw_parent = NULL;
4313 static GtkWidget *sw_float_parent;
4314 static guint sw_destroyed_handler = 0;
4317 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4319 gtk_widget_reparent (scrollwin, sw_parent);
4321 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4322 sw_float_parent = NULL;
4324 sw_destroyed_handler = 0;
4330 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4332 gtk_widget_destroy (sw_float_parent);
4334 sw_float_parent = NULL;
4336 sw_destroyed_handler = 0;
4340 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4344 gtk_widget_reparent (scrollwin, sw_parent);
4345 gtk_widget_destroy (sw_float_parent);
4347 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4348 sw_float_parent = NULL;
4350 sw_destroyed_handler = 0;
4354 sw_parent = scrollwin->parent;
4355 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4356 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4357 gtk_widget_get_screen (widget));
4359 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4361 gtk_widget_reparent (scrollwin, sw_float_parent);
4362 gtk_widget_show (sw_float_parent);
4364 sw_destroyed_handler =
4365 g_signal_connect (sw_parent, "destroy",
4366 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4367 g_signal_connect (sw_float_parent, "delete_event",
4368 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4373 create_scrolled_windows (GtkWidget *widget)
4375 static GtkWidget *window;
4376 GtkWidget *scrolled_window;
4384 window = gtk_dialog_new ();
4386 gtk_window_set_screen (GTK_WINDOW (window),
4387 gtk_widget_get_screen (widget));
4389 g_signal_connect (window, "destroy",
4390 G_CALLBACK (gtk_widget_destroyed),
4393 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4394 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4397 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4398 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4399 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4400 GTK_POLICY_AUTOMATIC,
4401 GTK_POLICY_AUTOMATIC);
4402 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
4403 scrolled_window, TRUE, TRUE, 0);
4404 gtk_widget_show (scrolled_window);
4406 table = gtk_table_new (20, 20, FALSE);
4407 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4408 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4409 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4410 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4411 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4412 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4413 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4414 gtk_widget_show (table);
4416 for (i = 0; i < 20; i++)
4417 for (j = 0; j < 20; j++)
4419 sprintf (buffer, "button (%d,%d)\n", i, j);
4420 button = gtk_toggle_button_new_with_label (buffer);
4421 gtk_table_attach_defaults (GTK_TABLE (table), button,
4423 gtk_widget_show (button);
4427 button = gtk_button_new_with_label ("Close");
4428 g_signal_connect_swapped (button, "clicked",
4429 G_CALLBACK (gtk_widget_destroy),
4431 gtk_widget_set_can_default (button, TRUE);
4432 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4433 button, TRUE, TRUE, 0);
4434 gtk_widget_grab_default (button);
4435 gtk_widget_show (button);
4437 button = gtk_button_new_with_label ("Reparent Out");
4438 g_signal_connect (button, "clicked",
4439 G_CALLBACK (scrolled_windows_remove),
4441 gtk_widget_set_can_default (button, TRUE);
4442 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4443 button, TRUE, TRUE, 0);
4444 gtk_widget_grab_default (button);
4445 gtk_widget_show (button);
4447 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4450 if (!gtk_widget_get_visible (window))
4451 gtk_widget_show (window);
4453 gtk_widget_destroy (window);
4461 entry_toggle_frame (GtkWidget *checkbutton,
4464 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4465 GTK_TOGGLE_BUTTON(checkbutton)->active);
4469 entry_toggle_sensitive (GtkWidget *checkbutton,
4472 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4476 entry_progress_timeout (gpointer data)
4478 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
4480 gtk_entry_progress_pulse (GTK_ENTRY (data));
4486 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
4489 if (fraction > 1.0001)
4492 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
4499 entry_remove_timeout (gpointer data)
4501 g_source_remove (GPOINTER_TO_UINT (data));
4505 entry_toggle_progress (GtkWidget *checkbutton,
4508 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
4510 guint timeout = gdk_threads_add_timeout (100,
4511 entry_progress_timeout,
4513 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
4514 GUINT_TO_POINTER (timeout),
4515 entry_remove_timeout);
4519 g_object_set_data (G_OBJECT (entry), "timeout-id",
4520 GUINT_TO_POINTER (0));
4522 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
4527 entry_toggle_pulse (GtkWidget *checkbutton,
4530 g_object_set_data (G_OBJECT (entry), "progress-pulse",
4531 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
4535 props_clicked (GtkWidget *button,
4538 GtkWidget *window = create_prop_editor (object, 0);
4540 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
4544 create_entry (GtkWidget *widget)
4546 static GtkWidget *window = NULL;
4550 GtkWidget *has_frame_check;
4551 GtkWidget *sensitive_check;
4552 GtkWidget *progress_check;
4555 GtkWidget *cb_entry;
4557 GtkWidget *separator;
4561 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4562 gtk_window_set_screen (GTK_WINDOW (window),
4563 gtk_widget_get_screen (widget));
4565 g_signal_connect (window, "destroy",
4566 G_CALLBACK (gtk_widget_destroyed),
4569 gtk_window_set_title (GTK_WINDOW (window), "entry");
4570 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4573 box1 = gtk_vbox_new (FALSE, 0);
4574 gtk_container_add (GTK_CONTAINER (window), box1);
4577 box2 = gtk_vbox_new (FALSE, 10);
4578 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4579 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4581 hbox = gtk_hbox_new (FALSE, 5);
4582 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4584 entry = gtk_entry_new ();
4585 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");
4586 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4587 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4589 button = gtk_button_new_with_mnemonic ("_Props");
4590 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4591 g_signal_connect (button, "clicked",
4592 G_CALLBACK (props_clicked),
4595 cb = GTK_COMBO_BOX (gtk_combo_box_entry_new_text ());
4596 gtk_combo_box_append_text (cb, "item0");
4597 gtk_combo_box_append_text (cb, "item0");
4598 gtk_combo_box_append_text (cb, "item1 item1");
4599 gtk_combo_box_append_text (cb, "item2 item2 item2");
4600 gtk_combo_box_append_text (cb, "item3 item3 item3 item3");
4601 gtk_combo_box_append_text (cb, "item4 item4 item4 item4 item4");
4602 gtk_combo_box_append_text (cb, "item5 item5 item5 item5 item5 item5");
4603 gtk_combo_box_append_text (cb, "item6 item6 item6 item6 item6");
4604 gtk_combo_box_append_text (cb, "item7 item7 item7 item7");
4605 gtk_combo_box_append_text (cb, "item8 item8 item8");
4606 gtk_combo_box_append_text (cb, "item9 item9");
4608 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4609 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4610 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4611 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4613 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4614 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4615 g_signal_connect (sensitive_check, "toggled",
4616 G_CALLBACK (entry_toggle_sensitive), entry);
4617 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4619 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4620 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4621 g_signal_connect (has_frame_check, "toggled",
4622 G_CALLBACK (entry_toggle_frame), entry);
4623 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4625 progress_check = gtk_check_button_new_with_label("Show Progress");
4626 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4627 g_signal_connect (progress_check, "toggled",
4628 G_CALLBACK (entry_toggle_progress), entry);
4630 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4631 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4632 g_signal_connect (progress_check, "toggled",
4633 G_CALLBACK (entry_toggle_pulse), entry);
4635 separator = gtk_hseparator_new ();
4636 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4638 box2 = gtk_vbox_new (FALSE, 10);
4639 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4640 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4642 button = gtk_button_new_with_label ("close");
4643 g_signal_connect_swapped (button, "clicked",
4644 G_CALLBACK (gtk_widget_destroy),
4646 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4647 gtk_widget_set_can_default (button, TRUE);
4648 gtk_widget_grab_default (button);
4651 if (!gtk_widget_get_visible (window))
4652 gtk_widget_show_all (window);
4654 gtk_widget_destroy (window);
4658 create_expander (GtkWidget *widget)
4661 GtkWidget *expander;
4663 static GtkWidget *window = NULL;
4667 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4668 gtk_window_set_screen (GTK_WINDOW (window),
4669 gtk_widget_get_screen (widget));
4671 g_signal_connect (window, "destroy",
4672 G_CALLBACK (gtk_widget_destroyed),
4675 gtk_window_set_title (GTK_WINDOW (window), "expander");
4676 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4678 box1 = gtk_vbox_new (FALSE, 0);
4679 gtk_container_add (GTK_CONTAINER (window), box1);
4681 expander = gtk_expander_new ("The Hidden");
4683 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4685 hidden = gtk_label_new ("Revealed!");
4687 gtk_container_add (GTK_CONTAINER (expander), hidden);
4690 if (!gtk_widget_get_visible (window))
4691 gtk_widget_show_all (window);
4693 gtk_widget_destroy (window);
4701 event_box_label_pressed (GtkWidget *widget,
4702 GdkEventButton *event,
4705 g_print ("clicked on event box\n");
4709 event_box_button_clicked (GtkWidget *widget,
4713 g_print ("pushed button\n");
4717 event_box_toggle_visible_window (GtkWidget *checkbutton,
4718 GtkEventBox *event_box)
4720 gtk_event_box_set_visible_window (event_box,
4721 GTK_TOGGLE_BUTTON(checkbutton)->active);
4725 event_box_toggle_above_child (GtkWidget *checkbutton,
4726 GtkEventBox *event_box)
4728 gtk_event_box_set_above_child (event_box,
4729 GTK_TOGGLE_BUTTON(checkbutton)->active);
4733 create_event_box (GtkWidget *widget)
4735 static GtkWidget *window = NULL;
4741 GtkWidget *separator;
4742 GtkWidget *event_box;
4744 GtkWidget *visible_window_check;
4745 GtkWidget *above_child_check;
4754 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4755 gtk_window_set_screen (GTK_WINDOW (window),
4756 gtk_widget_get_screen (widget));
4758 g_signal_connect (window, "destroy",
4759 G_CALLBACK (gtk_widget_destroyed),
4762 gtk_window_set_title (GTK_WINDOW (window), "event box");
4763 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4765 box1 = gtk_vbox_new (FALSE, 0);
4766 gtk_container_add (GTK_CONTAINER (window), box1);
4767 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4769 hbox = gtk_hbox_new (FALSE, 0);
4770 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4772 event_box = gtk_event_box_new ();
4773 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4775 vbox = gtk_vbox_new (FALSE, 0);
4776 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4777 g_signal_connect (event_box, "button_press_event",
4778 G_CALLBACK (event_box_label_pressed),
4781 label = gtk_label_new ("Click on this label");
4782 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4784 button = gtk_button_new_with_label ("button in eventbox");
4785 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4786 g_signal_connect (button, "clicked",
4787 G_CALLBACK (event_box_button_clicked),
4791 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4792 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4793 g_signal_connect (visible_window_check, "toggled",
4794 G_CALLBACK (event_box_toggle_visible_window), event_box);
4795 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4797 above_child_check = gtk_check_button_new_with_label("Above Child");
4798 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4799 g_signal_connect (above_child_check, "toggled",
4800 G_CALLBACK (event_box_toggle_above_child), event_box);
4801 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4803 separator = gtk_hseparator_new ();
4804 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4806 box2 = gtk_vbox_new (FALSE, 10);
4807 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4808 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4810 button = gtk_button_new_with_label ("close");
4811 g_signal_connect_swapped (button, "clicked",
4812 G_CALLBACK (gtk_widget_destroy),
4814 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4815 gtk_widget_set_can_default (button, TRUE);
4816 gtk_widget_grab_default (button);
4819 if (!gtk_widget_get_visible (window))
4820 gtk_widget_show_all (window);
4822 gtk_widget_destroy (window);
4830 #define SIZE_GROUP_INITIAL_SIZE 50
4833 size_group_hsize_changed (GtkSpinButton *spin_button,
4836 gtk_widget_set_size_request (GTK_BIN (button)->child,
4837 gtk_spin_button_get_value_as_int (spin_button),
4842 size_group_vsize_changed (GtkSpinButton *spin_button,
4845 gtk_widget_set_size_request (GTK_BIN (button)->child,
4847 gtk_spin_button_get_value_as_int (spin_button));
4851 create_size_group_window (GdkScreen *screen,
4852 GtkSizeGroup *master_size_group)
4856 GtkWidget *main_button;
4858 GtkWidget *spin_button;
4860 GtkSizeGroup *hgroup1;
4861 GtkSizeGroup *hgroup2;
4862 GtkSizeGroup *vgroup1;
4863 GtkSizeGroup *vgroup2;
4865 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4871 gtk_window_set_screen (GTK_WINDOW (window), screen);
4873 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4875 g_signal_connect (window, "response",
4876 G_CALLBACK (gtk_widget_destroy),
4879 table = gtk_table_new (2, 2, FALSE);
4880 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
4882 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4883 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4884 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4885 gtk_widget_set_size_request (table, 250, 250);
4887 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4888 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4889 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4890 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4892 main_button = gtk_button_new_with_label ("X");
4894 gtk_table_attach (GTK_TABLE (table), main_button,
4896 GTK_EXPAND, GTK_EXPAND,
4898 gtk_size_group_add_widget (master_size_group, main_button);
4899 gtk_size_group_add_widget (hgroup1, main_button);
4900 gtk_size_group_add_widget (vgroup1, main_button);
4901 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
4902 SIZE_GROUP_INITIAL_SIZE,
4903 SIZE_GROUP_INITIAL_SIZE);
4905 button = gtk_button_new ();
4906 gtk_table_attach (GTK_TABLE (table), button,
4908 GTK_EXPAND, GTK_EXPAND,
4910 gtk_size_group_add_widget (vgroup1, button);
4911 gtk_size_group_add_widget (vgroup2, button);
4913 button = gtk_button_new ();
4914 gtk_table_attach (GTK_TABLE (table), button,
4916 GTK_EXPAND, GTK_EXPAND,
4918 gtk_size_group_add_widget (hgroup1, button);
4919 gtk_size_group_add_widget (hgroup2, button);
4921 button = gtk_button_new ();
4922 gtk_table_attach (GTK_TABLE (table), button,
4924 GTK_EXPAND, GTK_EXPAND,
4926 gtk_size_group_add_widget (hgroup2, button);
4927 gtk_size_group_add_widget (vgroup2, button);
4929 g_object_unref (hgroup1);
4930 g_object_unref (hgroup2);
4931 g_object_unref (vgroup1);
4932 g_object_unref (vgroup2);
4934 hbox = gtk_hbox_new (FALSE, 5);
4935 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
4937 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4938 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4939 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4940 g_signal_connect (spin_button, "value_changed",
4941 G_CALLBACK (size_group_hsize_changed), main_button);
4943 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4944 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4945 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4946 g_signal_connect (spin_button, "value_changed",
4947 G_CALLBACK (size_group_vsize_changed), main_button);
4953 create_size_groups (GtkWidget *widget)
4955 static GtkWidget *window1 = NULL;
4956 static GtkWidget *window2 = NULL;
4957 static GtkSizeGroup *master_size_group;
4959 if (!master_size_group)
4960 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4964 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4967 g_signal_connect (window1, "destroy",
4968 G_CALLBACK (gtk_widget_destroyed),
4974 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4977 g_signal_connect (window2, "destroy",
4978 G_CALLBACK (gtk_widget_destroyed),
4982 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4984 gtk_widget_destroy (window1);
4985 gtk_widget_destroy (window2);
4989 if (!gtk_widget_get_visible (window1))
4990 gtk_widget_show_all (window1);
4991 if (!gtk_widget_get_visible (window2))
4992 gtk_widget_show_all (window2);
5000 static GtkWidget *spinner1;
5003 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5005 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5009 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5011 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5015 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5017 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5018 gtk_spin_button_get_value_as_int (spin));
5022 get_value (GtkWidget *widget, gpointer data)
5026 GtkSpinButton *spin;
5028 spin = GTK_SPIN_BUTTON (spinner1);
5029 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5030 if (GPOINTER_TO_INT (data) == 1)
5031 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5033 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5034 gtk_label_set_text (label, buf);
5038 get_spin_value (GtkWidget *widget, gpointer data)
5042 GtkSpinButton *spin;
5044 spin = GTK_SPIN_BUTTON (widget);
5045 label = GTK_LABEL (data);
5047 buffer = g_strdup_printf ("%0.*f", spin->digits,
5048 gtk_spin_button_get_value (spin));
5049 gtk_label_set_text (label, buffer);
5055 spin_button_time_output_func (GtkSpinButton *spin_button)
5057 static gchar buf[6];
5061 hours = spin_button->adjustment->value / 60.0;
5062 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5063 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5064 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5065 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5070 spin_button_month_input_func (GtkSpinButton *spin_button,
5074 static gchar *month[12] = { "January", "February", "March", "April",
5075 "May", "June", "July", "August",
5076 "September", "October", "November", "December" };
5078 gboolean found = FALSE;
5080 for (i = 1; i <= 12; i++)
5082 tmp1 = g_ascii_strup (month[i - 1], -1);
5083 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5084 if (strstr (tmp1, tmp2) == tmp1)
5094 return GTK_INPUT_ERROR;
5096 *new_val = (gdouble) i;
5101 spin_button_month_output_func (GtkSpinButton *spin_button)
5104 static gchar *month[12] = { "January", "February", "March", "April",
5105 "May", "June", "July", "August", "September",
5106 "October", "November", "December" };
5108 for (i = 1; i <= 12; i++)
5109 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5111 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5112 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5118 spin_button_hex_input_func (GtkSpinButton *spin_button,
5125 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5126 res = strtol(buf, &err, 16);
5129 return GTK_INPUT_ERROR;
5135 spin_button_hex_output_func (GtkSpinButton *spin_button)
5137 static gchar buf[7];
5140 val = (gint) spin_button->adjustment->value;
5141 if (fabs (val) < 1e-5)
5142 sprintf (buf, "0x00");
5144 sprintf (buf, "0x%.2X", val);
5145 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5146 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5151 create_spins (GtkWidget *widget)
5153 static GtkWidget *window = NULL;
5156 GtkWidget *main_vbox;
5159 GtkWidget *spinner2;
5163 GtkWidget *val_label;
5168 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5169 gtk_window_set_screen (GTK_WINDOW (window),
5170 gtk_widget_get_screen (widget));
5172 g_signal_connect (window, "destroy",
5173 G_CALLBACK (gtk_widget_destroyed),
5176 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5178 main_vbox = gtk_vbox_new (FALSE, 5);
5179 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5180 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5182 frame = gtk_frame_new ("Not accelerated");
5183 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5185 vbox = gtk_vbox_new (FALSE, 0);
5186 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5187 gtk_container_add (GTK_CONTAINER (frame), vbox);
5189 /* Time, month, hex spinners */
5191 hbox = gtk_hbox_new (FALSE, 0);
5192 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5194 vbox2 = gtk_vbox_new (FALSE, 0);
5195 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5197 label = gtk_label_new ("Time :");
5198 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5199 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5201 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5202 spinner = gtk_spin_button_new (adj, 0, 0);
5203 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5204 g_signal_connect (spinner,
5206 G_CALLBACK (spin_button_time_output_func),
5208 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5209 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5210 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5212 vbox2 = gtk_vbox_new (FALSE, 0);
5213 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5215 label = gtk_label_new ("Month :");
5216 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5217 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5219 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5221 spinner = gtk_spin_button_new (adj, 0, 0);
5222 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5223 GTK_UPDATE_IF_VALID);
5224 g_signal_connect (spinner,
5226 G_CALLBACK (spin_button_month_input_func),
5228 g_signal_connect (spinner,
5230 G_CALLBACK (spin_button_month_output_func),
5232 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5233 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5234 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5236 vbox2 = gtk_vbox_new (FALSE, 0);
5237 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5239 label = gtk_label_new ("Hex :");
5240 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5241 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5243 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5244 spinner = gtk_spin_button_new (adj, 0, 0);
5245 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5246 g_signal_connect (spinner,
5248 G_CALLBACK (spin_button_hex_input_func),
5250 g_signal_connect (spinner,
5252 G_CALLBACK (spin_button_hex_output_func),
5254 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5255 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
5256 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5258 frame = gtk_frame_new ("Accelerated");
5259 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5261 vbox = gtk_vbox_new (FALSE, 0);
5262 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5263 gtk_container_add (GTK_CONTAINER (frame), vbox);
5265 hbox = gtk_hbox_new (FALSE, 0);
5266 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5268 vbox2 = gtk_vbox_new (FALSE, 0);
5269 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5271 label = gtk_label_new ("Value :");
5272 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5273 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5275 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
5277 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5278 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5279 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
5281 vbox2 = gtk_vbox_new (FALSE, 0);
5282 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5284 label = gtk_label_new ("Digits :");
5285 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5286 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5288 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
5289 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
5290 g_signal_connect (adj, "value_changed",
5291 G_CALLBACK (change_digits),
5293 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
5295 hbox = gtk_hbox_new (FALSE, 0);
5296 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
5298 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
5299 g_signal_connect (button, "clicked",
5300 G_CALLBACK (toggle_snap),
5302 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5303 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5305 button = gtk_check_button_new_with_label ("Numeric only input mode");
5306 g_signal_connect (button, "clicked",
5307 G_CALLBACK (toggle_numeric),
5309 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5310 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5312 val_label = gtk_label_new ("");
5314 hbox = gtk_hbox_new (FALSE, 0);
5315 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5317 button = gtk_button_new_with_label ("Value as Int");
5318 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5319 g_signal_connect (button, "clicked",
5320 G_CALLBACK (get_value),
5321 GINT_TO_POINTER (1));
5322 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5324 button = gtk_button_new_with_label ("Value as Float");
5325 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5326 g_signal_connect (button, "clicked",
5327 G_CALLBACK (get_value),
5328 GINT_TO_POINTER (2));
5329 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5331 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
5332 gtk_label_set_text (GTK_LABEL (val_label), "0");
5334 frame = gtk_frame_new ("Using Convenience Constructor");
5335 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5337 hbox = gtk_hbox_new (FALSE, 0);
5338 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5339 gtk_container_add (GTK_CONTAINER (frame), hbox);
5341 val_label = gtk_label_new ("0.0");
5343 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5344 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5345 g_signal_connect (spinner, "value_changed",
5346 G_CALLBACK (get_spin_value), val_label);
5347 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5348 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5350 hbox = gtk_hbox_new (FALSE, 0);
5351 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5353 button = gtk_button_new_with_label ("Close");
5354 g_signal_connect_swapped (button, "clicked",
5355 G_CALLBACK (gtk_widget_destroy),
5357 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5360 if (!gtk_widget_get_visible (window))
5361 gtk_widget_show_all (window);
5363 gtk_widget_destroy (window);
5372 cursor_expose_event (GtkWidget *widget,
5376 GtkDrawingArea *darea;
5377 GdkDrawable *drawable;
5384 g_return_val_if_fail (widget != NULL, TRUE);
5385 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5387 darea = GTK_DRAWING_AREA (widget);
5388 drawable = widget->window;
5389 white_gc = widget->style->white_gc;
5390 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5391 black_gc = widget->style->black_gc;
5392 max_width = widget->allocation.width;
5393 max_height = widget->allocation.height;
5395 gdk_draw_rectangle (drawable, white_gc,
5402 gdk_draw_rectangle (drawable, black_gc,
5409 gdk_draw_rectangle (drawable, gray_gc,
5420 set_cursor (GtkWidget *spinner,
5429 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5432 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5434 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
5435 vals = class->values;
5437 while (vals && vals->value != c)
5440 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5442 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5444 g_type_class_unref (class);
5446 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5447 gdk_window_set_cursor (widget->window, cursor);
5448 gdk_cursor_unref (cursor);
5452 cursor_event (GtkWidget *widget,
5454 GtkSpinButton *spinner)
5456 if ((event->type == GDK_BUTTON_PRESS) &&
5457 ((event->button.button == 1) ||
5458 (event->button.button == 3)))
5460 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5461 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5468 #ifdef GDK_WINDOWING_X11
5469 #include "x11/gdkx.h"
5472 change_cursor_theme (GtkWidget *widget,
5479 children = gtk_container_get_children (GTK_CONTAINER (data));
5481 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
5482 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
5484 g_list_free (children);
5486 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
5493 create_cursors (GtkWidget *widget)
5495 static GtkWidget *window = NULL;
5498 GtkWidget *main_vbox;
5511 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5512 gtk_window_set_screen (GTK_WINDOW (window),
5513 gtk_widget_get_screen (widget));
5515 g_signal_connect (window, "destroy",
5516 G_CALLBACK (gtk_widget_destroyed),
5519 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5521 main_vbox = gtk_vbox_new (FALSE, 5);
5522 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5523 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5526 g_object_new (gtk_vbox_get_type (),
5527 "GtkBox::homogeneous", FALSE,
5528 "GtkBox::spacing", 5,
5529 "GtkContainer::border_width", 10,
5530 "GtkWidget::parent", main_vbox,
5531 "GtkWidget::visible", TRUE,
5534 #ifdef GDK_WINDOWING_X11
5535 hbox = gtk_hbox_new (FALSE, 0);
5536 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5537 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5539 label = gtk_label_new ("Cursor Theme : ");
5540 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5541 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5543 entry = gtk_entry_new ();
5544 gtk_entry_set_text (GTK_ENTRY (entry), "default");
5545 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
5547 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
5548 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
5549 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5551 g_signal_connect (entry, "changed",
5552 G_CALLBACK (change_cursor_theme), hbox);
5553 g_signal_connect (size, "changed",
5554 G_CALLBACK (change_cursor_theme), hbox);
5557 hbox = gtk_hbox_new (FALSE, 0);
5558 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5559 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5561 label = gtk_label_new ("Cursor Value : ");
5562 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5563 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5565 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5569 spinner = gtk_spin_button_new (adj, 0, 0);
5570 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5573 g_object_new (gtk_frame_get_type (),
5574 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5575 "GtkFrame::label_xalign", 0.5,
5576 "GtkFrame::label", "Cursor Area",
5577 "GtkContainer::border_width", 10,
5578 "GtkWidget::parent", vbox,
5579 "GtkWidget::visible", TRUE,
5582 darea = gtk_drawing_area_new ();
5583 gtk_widget_set_size_request (darea, 80, 80);
5584 gtk_container_add (GTK_CONTAINER (frame), darea);
5585 g_signal_connect (darea,
5587 G_CALLBACK (cursor_expose_event),
5589 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5590 g_signal_connect (darea,
5591 "button_press_event",
5592 G_CALLBACK (cursor_event),
5594 gtk_widget_show (darea);
5596 g_signal_connect (spinner, "changed",
5597 G_CALLBACK (set_cursor),
5600 label = g_object_new (GTK_TYPE_LABEL,
5605 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5608 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5611 g_object_new (gtk_hseparator_get_type (),
5612 "GtkWidget::visible", TRUE,
5614 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5616 hbox = gtk_hbox_new (FALSE, 0);
5617 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5618 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5620 button = gtk_button_new_with_label ("Close");
5621 g_signal_connect_swapped (button, "clicked",
5622 G_CALLBACK (gtk_widget_destroy),
5624 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5626 gtk_widget_show_all (window);
5628 set_cursor (spinner, darea);
5631 gtk_widget_destroy (window);
5639 color_selection_ok (GtkWidget *w,
5640 GtkColorSelectionDialog *cs)
5642 GtkWidget *colorsel;
5645 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5647 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5648 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5652 color_selection_changed (GtkWidget *w,
5653 GtkColorSelectionDialog *cs)
5655 GtkWidget *colorsel;
5658 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5659 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5660 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5665 opacity_toggled_cb (GtkWidget *w,
5666 GtkColorSelectionDialog *cs)
5668 GtkColorSelection *colorsel;
5670 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5671 gtk_color_selection_set_has_opacity_control (colorsel,
5672 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5676 palette_toggled_cb (GtkWidget *w,
5677 GtkColorSelectionDialog *cs)
5679 GtkColorSelection *colorsel;
5681 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5682 gtk_color_selection_set_has_palette (colorsel,
5683 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5688 create_color_selection (GtkWidget *widget)
5690 static GtkWidget *window = NULL;
5699 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5700 gtk_window_set_screen (GTK_WINDOW (window),
5701 gtk_widget_get_screen (widget));
5703 g_signal_connect (window, "destroy",
5704 G_CALLBACK (gtk_widget_destroyed),
5707 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5708 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5710 hbox = gtk_hbox_new (FALSE, 8);
5711 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5712 gtk_container_add (GTK_CONTAINER (window), hbox);
5714 label = gtk_label_new ("Pick a color");
5715 gtk_container_add (GTK_CONTAINER (hbox), label);
5717 picker = gtk_color_button_new ();
5718 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5719 gtk_container_add (GTK_CONTAINER (hbox), picker);
5721 button = gtk_button_new_with_mnemonic ("_Props");
5722 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5723 g_signal_connect (button, "clicked",
5724 G_CALLBACK (props_clicked),
5728 if (!gtk_widget_get_visible (window))
5729 gtk_widget_show_all (window);
5731 gtk_widget_destroy (window);
5735 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5737 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5738 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5740 gtk_widget_set_default_direction (new_direction);
5744 orientable_toggle_orientation (GtkOrientable *orientable)
5746 GtkOrientation orientation;
5748 orientation = gtk_orientable_get_orientation (orientable);
5749 gtk_orientable_set_orientation (orientable,
5750 orientation == GTK_ORIENTATION_HORIZONTAL ?
5751 GTK_ORIENTATION_VERTICAL :
5752 GTK_ORIENTATION_HORIZONTAL);
5754 if (GTK_IS_CONTAINER (orientable))
5759 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5761 for (child = children; child; child = child->next)
5763 if (GTK_IS_ORIENTABLE (child->data))
5764 orientable_toggle_orientation (child->data);
5767 g_list_free (children);
5772 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5774 orientable_toggle_orientation (GTK_ORIENTABLE (GTK_DIALOG (gtk_widget_get_toplevel (widget))->vbox));
5778 set_direction_recurse (GtkWidget *widget,
5781 GtkTextDirection *dir = data;
5783 gtk_widget_set_direction (widget, *dir);
5784 if (GTK_IS_CONTAINER (widget))
5785 gtk_container_foreach (GTK_CONTAINER (widget),
5786 set_direction_recurse,
5791 create_forward_back (const char *title,
5792 GtkTextDirection text_dir)
5794 GtkWidget *frame = gtk_frame_new (title);
5795 GtkWidget *bbox = gtk_hbutton_box_new ();
5796 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5797 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5799 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5801 gtk_container_add (GTK_CONTAINER (frame), bbox);
5802 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5803 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5805 set_direction_recurse (frame, &text_dir);
5811 create_flipping (GtkWidget *widget)
5813 static GtkWidget *window = NULL;
5814 GtkWidget *check_button, *button;
5818 window = gtk_dialog_new ();
5820 gtk_window_set_screen (GTK_WINDOW (window),
5821 gtk_widget_get_screen (widget));
5823 g_signal_connect (window, "destroy",
5824 G_CALLBACK (gtk_widget_destroyed),
5827 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5829 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5830 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5831 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5832 check_button, TRUE, TRUE, 0);
5834 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5835 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5837 g_signal_connect (check_button, "toggled",
5838 G_CALLBACK (flipping_toggled_cb), NULL);
5840 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5841 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5842 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5843 check_button, TRUE, TRUE, 0);
5845 g_signal_connect (check_button, "toggled",
5846 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5848 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5849 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5852 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5853 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5856 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5857 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5860 button = gtk_button_new_with_label ("Close");
5861 g_signal_connect_swapped (button, "clicked",
5862 G_CALLBACK (gtk_widget_destroy), window);
5863 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5864 button, TRUE, TRUE, 0);
5867 if (!gtk_widget_get_visible (window))
5868 gtk_widget_show_all (window);
5870 gtk_widget_destroy (window);
5878 make_focus_table (GList **list)
5883 table = gtk_table_new (5, 5, FALSE);
5896 widget = gtk_entry_new ();
5898 widget = gtk_button_new_with_label ("Foo");
5900 *list = g_list_prepend (*list, widget);
5902 gtk_table_attach (GTK_TABLE (table),
5906 GTK_EXPAND | GTK_FILL,
5907 GTK_EXPAND | GTK_FILL,
5916 *list = g_list_reverse (*list);
5922 create_focus (GtkWidget *widget)
5924 static GtkWidget *window = NULL;
5932 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5938 gtk_window_set_screen (GTK_WINDOW (window),
5939 gtk_widget_get_screen (widget));
5941 g_signal_connect (window, "destroy",
5942 G_CALLBACK (gtk_widget_destroyed),
5945 g_signal_connect (window, "response",
5946 G_CALLBACK (gtk_widget_destroy),
5949 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5951 frame = gtk_frame_new ("Weird tab focus chain");
5953 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5954 frame, TRUE, TRUE, 0);
5956 table = make_focus_table (&list);
5958 gtk_container_add (GTK_CONTAINER (frame), table);
5960 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5965 frame = gtk_frame_new ("Default tab focus chain");
5967 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5968 frame, TRUE, TRUE, 0);
5971 table = make_focus_table (&list);
5975 gtk_container_add (GTK_CONTAINER (frame), table);
5978 if (!gtk_widget_get_visible (window))
5979 gtk_widget_show_all (window);
5981 gtk_widget_destroy (window);
5989 font_selection_ok (GtkWidget *w,
5990 GtkFontSelectionDialog *fs)
5992 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5994 g_print ("%s\n", s);
5996 gtk_widget_destroy (GTK_WIDGET (fs));
6000 create_font_selection (GtkWidget *widget)
6002 static GtkWidget *window = NULL;
6010 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6011 gtk_window_set_screen (GTK_WINDOW (window),
6012 gtk_widget_get_screen (widget));
6014 g_signal_connect (window, "destroy",
6015 G_CALLBACK (gtk_widget_destroyed),
6018 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
6019 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6021 hbox = gtk_hbox_new (FALSE, 8);
6022 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6023 gtk_container_add (GTK_CONTAINER (window), hbox);
6025 label = gtk_label_new ("Pick a font");
6026 gtk_container_add (GTK_CONTAINER (hbox), label);
6028 picker = gtk_font_button_new ();
6029 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
6030 gtk_container_add (GTK_CONTAINER (hbox), picker);
6033 if (!gtk_widget_get_visible (window))
6034 gtk_widget_show_all (window);
6036 gtk_widget_destroy (window);
6043 static GtkWidget *dialog_window = NULL;
6046 label_toggle (GtkWidget *widget,
6051 *label = gtk_label_new ("Dialog Test");
6052 g_signal_connect (*label,
6054 G_CALLBACK (gtk_widget_destroyed),
6056 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
6057 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6058 *label, TRUE, TRUE, 0);
6059 gtk_widget_show (*label);
6062 gtk_widget_destroy (*label);
6065 #define RESPONSE_TOGGLE_SEPARATOR 1
6068 print_response (GtkWidget *dialog,
6072 g_print ("response signal received (%d)\n", response_id);
6074 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
6076 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
6077 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
6082 create_dialog (GtkWidget *widget)
6084 static GtkWidget *label;
6089 /* This is a terrible example; it's much simpler to create
6090 * dialogs than this. Don't use testgtk for example code,
6094 dialog_window = gtk_dialog_new ();
6095 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6096 gtk_widget_get_screen (widget));
6098 g_signal_connect (dialog_window,
6100 G_CALLBACK (print_response),
6103 g_signal_connect (dialog_window, "destroy",
6104 G_CALLBACK (gtk_widget_destroyed),
6107 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
6108 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6110 button = gtk_button_new_with_label ("OK");
6111 gtk_widget_set_can_default (button, TRUE);
6112 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6113 button, TRUE, TRUE, 0);
6114 gtk_widget_grab_default (button);
6115 gtk_widget_show (button);
6117 button = gtk_button_new_with_label ("Toggle");
6118 g_signal_connect (button, "clicked",
6119 G_CALLBACK (label_toggle),
6121 gtk_widget_set_can_default (button, TRUE);
6122 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6123 button, TRUE, TRUE, 0);
6124 gtk_widget_show (button);
6128 button = gtk_button_new_with_label ("Separator");
6130 gtk_widget_set_can_default (button, TRUE);
6132 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
6134 RESPONSE_TOGGLE_SEPARATOR);
6135 gtk_widget_show (button);
6138 if (!gtk_widget_get_visible (dialog_window))
6139 gtk_widget_show (dialog_window);
6141 gtk_widget_destroy (dialog_window);
6144 /* Display & Screen test
6151 GtkWidget *radio_dpy;
6152 GtkWidget *toplevel;
6153 GtkWidget *dialog_window;
6154 } ScreenDisplaySelection;
6157 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
6159 const gchar *display_name;
6160 GdkDisplay *display = gtk_widget_get_display (widget);
6162 GdkScreen *new_screen = NULL;
6163 GdkScreen *current_screen = gtk_widget_get_screen (widget);
6165 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
6167 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
6168 display = gdk_display_open (display_name);
6172 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
6173 GTK_DIALOG_DESTROY_WITH_PARENT,
6176 "The display :\n%s\ncannot be opened",
6178 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
6179 gtk_widget_show (dialog);
6180 g_signal_connect (dialog, "response",
6181 G_CALLBACK (gtk_widget_destroy),
6186 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
6189 gboolean found = FALSE;
6190 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
6193 gtk_tree_model_get (model, &iter, 0, &name, -1);
6194 found = !g_ascii_strcasecmp (display_name, name);
6201 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
6202 new_screen = gdk_display_get_default_screen (display);
6207 gint number_of_screens = gdk_display_get_n_screens (display);
6208 gint screen_num = gdk_screen_get_number (current_screen);
6209 if ((screen_num +1) < number_of_screens)
6210 new_screen = gdk_display_get_screen (display, screen_num + 1);
6212 new_screen = gdk_display_get_screen (display, 0);
6217 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
6218 gtk_widget_destroy (data->dialog_window);
6223 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
6225 gtk_widget_destroy (data);
6229 create_display_screen (GtkWidget *widget)
6231 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
6232 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
6234 ScreenDisplaySelection *scr_dpy_data;
6235 GdkScreen *screen = gtk_widget_get_screen (widget);
6236 GdkDisplay *display = gdk_screen_get_display (screen);
6238 window = g_object_new (gtk_window_get_type (),
6241 "type", GTK_WINDOW_TOPLEVEL,
6243 "Screen or Display selection",
6244 "border_width", 10, NULL);
6245 g_signal_connect (window, "destroy",
6246 G_CALLBACK (gtk_widget_destroy), NULL);
6248 vbox = gtk_vbox_new (FALSE, 3);
6249 gtk_container_add (GTK_CONTAINER (window), vbox);
6251 frame = gtk_frame_new ("Select screen or display");
6252 gtk_container_add (GTK_CONTAINER (vbox), frame);
6254 table = gtk_table_new (2, 2, TRUE);
6255 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
6256 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
6258 gtk_container_add (GTK_CONTAINER (frame), table);
6260 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
6261 if (gdk_display_get_n_screens(display) > 1)
6262 radio_scr = gtk_radio_button_new_with_label
6263 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
6266 radio_scr = gtk_radio_button_new_with_label
6267 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
6268 "only one screen on the current display");
6269 gtk_widget_set_sensitive (radio_scr, FALSE);
6271 combo_dpy = gtk_combo_box_new_text ();
6272 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
6273 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
6274 "<hostname>:<X Server Num>.<Screen Num>");
6276 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
6277 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
6278 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
6280 bbox = gtk_hbutton_box_new ();
6281 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
6282 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
6284 gtk_container_add (GTK_CONTAINER (vbox), bbox);
6286 gtk_container_add (GTK_CONTAINER (bbox), applyb);
6287 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
6289 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
6291 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
6292 scr_dpy_data->radio_dpy = radio_dpy;
6293 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
6294 scr_dpy_data->dialog_window = window;
6296 g_signal_connect (cancelb, "clicked",
6297 G_CALLBACK (screen_display_destroy_diag), window);
6298 g_signal_connect (applyb, "clicked",
6299 G_CALLBACK (screen_display_check), scr_dpy_data);
6300 gtk_widget_show_all (window);
6305 static gboolean event_watcher_enter_id = 0;
6306 static gboolean event_watcher_leave_id = 0;
6309 event_watcher (GSignalInvocationHint *ihint,
6310 guint n_param_values,
6311 const GValue *param_values,
6314 g_print ("Watch: \"%s\" emitted for %s\n",
6315 g_signal_name (ihint->signal_id),
6316 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
6322 event_watcher_down (void)
6324 if (event_watcher_enter_id)
6328 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6329 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
6330 event_watcher_enter_id = 0;
6331 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6332 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
6333 event_watcher_leave_id = 0;
6338 event_watcher_toggle (void)
6340 if (event_watcher_enter_id)
6341 event_watcher_down ();
6346 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6347 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6348 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6349 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6354 create_event_watcher (GtkWidget *widget)
6360 dialog_window = gtk_dialog_new ();
6361 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6362 gtk_widget_get_screen (widget));
6364 g_signal_connect (dialog_window, "destroy",
6365 G_CALLBACK (gtk_widget_destroyed),
6367 g_signal_connect (dialog_window, "destroy",
6368 G_CALLBACK (event_watcher_down),
6371 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6372 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6373 gtk_widget_set_size_request (dialog_window, 200, 110);
6375 button = gtk_toggle_button_new_with_label ("Activate Watch");
6376 g_signal_connect (button, "clicked",
6377 G_CALLBACK (event_watcher_toggle),
6379 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6380 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6381 button, TRUE, TRUE, 0);
6382 gtk_widget_show (button);
6384 button = gtk_button_new_with_label ("Close");
6385 g_signal_connect_swapped (button, "clicked",
6386 G_CALLBACK (gtk_widget_destroy),
6388 gtk_widget_set_can_default (button, TRUE);
6389 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6390 button, TRUE, TRUE, 0);
6391 gtk_widget_grab_default (button);
6392 gtk_widget_show (button);
6395 if (!gtk_widget_get_visible (dialog_window))
6396 gtk_widget_show (dialog_window);
6398 gtk_widget_destroy (dialog_window);
6406 reformat_value (GtkScale *scale,
6409 return g_strdup_printf ("-->%0.*g<--",
6410 gtk_scale_get_digits (scale), value);
6414 create_range_controls (GtkWidget *widget)
6416 static GtkWidget *window = NULL;
6420 GtkWidget *scrollbar;
6422 GtkWidget *separator;
6423 GtkObject *adjustment;
6428 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6430 gtk_window_set_screen (GTK_WINDOW (window),
6431 gtk_widget_get_screen (widget));
6433 g_signal_connect (window, "destroy",
6434 G_CALLBACK (gtk_widget_destroyed),
6437 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6438 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6441 box1 = gtk_vbox_new (FALSE, 0);
6442 gtk_container_add (GTK_CONTAINER (window), box1);
6443 gtk_widget_show (box1);
6446 box2 = gtk_vbox_new (FALSE, 10);
6447 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6448 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6449 gtk_widget_show (box2);
6452 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6454 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6455 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6456 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6457 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6458 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6459 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6460 gtk_widget_show (scale);
6462 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6463 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6464 GTK_UPDATE_CONTINUOUS);
6465 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6466 gtk_widget_show (scrollbar);
6468 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6469 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6470 g_signal_connect (scale,
6472 G_CALLBACK (reformat_value),
6474 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6475 gtk_widget_show (scale);
6477 hbox = gtk_hbox_new (FALSE, 0);
6479 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6480 gtk_widget_set_size_request (scale, -1, 200);
6481 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6482 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6483 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6484 gtk_widget_show (scale);
6486 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6487 gtk_widget_set_size_request (scale, -1, 200);
6488 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6489 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6490 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6491 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6492 gtk_widget_show (scale);
6494 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6495 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6496 g_signal_connect (scale,
6498 G_CALLBACK (reformat_value),
6500 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6501 gtk_widget_show (scale);
6504 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6505 gtk_widget_show (hbox);
6507 separator = gtk_hseparator_new ();
6508 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6509 gtk_widget_show (separator);
6512 box2 = gtk_vbox_new (FALSE, 10);
6513 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6514 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6515 gtk_widget_show (box2);
6518 button = gtk_button_new_with_label ("close");
6519 g_signal_connect_swapped (button, "clicked",
6520 G_CALLBACK (gtk_widget_destroy),
6522 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6523 gtk_widget_set_can_default (button, TRUE);
6524 gtk_widget_grab_default (button);
6525 gtk_widget_show (button);
6528 if (!gtk_widget_get_visible (window))
6529 gtk_widget_show (window);
6531 gtk_widget_destroy (window);
6539 create_rulers (GtkWidget *widget)
6541 static GtkWidget *window = NULL;
6547 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6549 gtk_window_set_screen (GTK_WINDOW (window),
6550 gtk_widget_get_screen (widget));
6552 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
6554 g_signal_connect (window, "destroy",
6555 G_CALLBACK (gtk_widget_destroyed),
6558 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6559 gtk_widget_set_size_request (window, 300, 300);
6560 gtk_widget_set_events (window,
6561 GDK_POINTER_MOTION_MASK
6562 | GDK_POINTER_MOTION_HINT_MASK);
6563 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6565 table = gtk_table_new (2, 2, FALSE);
6566 gtk_container_add (GTK_CONTAINER (window), table);
6567 gtk_widget_show (table);
6569 ruler = gtk_hruler_new ();
6570 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6571 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6573 g_signal_connect_swapped (window,
6574 "motion_notify_event",
6575 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6578 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6579 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6580 gtk_widget_show (ruler);
6583 ruler = gtk_vruler_new ();
6584 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6586 g_signal_connect_swapped (window,
6587 "motion_notify_event",
6588 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6591 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6592 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6593 gtk_widget_show (ruler);
6596 if (!gtk_widget_get_visible (window))
6597 gtk_widget_show (window);
6599 gtk_widget_destroy (window);
6606 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6607 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6608 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6609 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6610 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6611 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6612 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6613 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6616 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6622 GdkPixbuf *book_open;
6623 GdkPixbuf *book_closed;
6624 GtkWidget *sample_notebook;
6627 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6629 GtkWidget *page_widget;
6632 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6634 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6635 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6637 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6638 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6642 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
6644 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6645 gint old_page_num = gtk_notebook_get_current_page (notebook);
6647 if (page_num == old_page_num)
6650 set_page_image (notebook, page_num, book_open);
6652 if (old_page_num != -1)
6653 set_page_image (notebook, old_page_num, book_closed);
6657 tab_fill (GtkToggleButton *button, GtkWidget *child)
6660 GtkPackType pack_type;
6662 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6663 &expand, NULL, &pack_type);
6664 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6665 expand, button->active, pack_type);
6669 tab_expand (GtkToggleButton *button, GtkWidget *child)
6672 GtkPackType pack_type;
6674 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6675 NULL, &fill, &pack_type);
6676 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6677 button->active, fill, pack_type);
6681 tab_pack (GtkToggleButton *button, GtkWidget *child)
6687 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6688 &expand, &fill, NULL);
6689 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6690 expand, fill, button->active);
6694 create_pages (GtkNotebook *notebook, gint start, gint end)
6696 GtkWidget *child = NULL;
6701 GtkWidget *label_box;
6702 GtkWidget *menu_box;
6706 char accel_buffer[32];
6708 for (i = start; i <= end; i++)
6710 sprintf (buffer, "Page %d", i);
6711 sprintf (accel_buffer, "Page _%d", i);
6713 child = gtk_frame_new (buffer);
6714 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6716 vbox = gtk_vbox_new (TRUE,0);
6717 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6718 gtk_container_add (GTK_CONTAINER (child), vbox);
6720 hbox = gtk_hbox_new (TRUE,0);
6721 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6723 button = gtk_check_button_new_with_label ("Fill Tab");
6724 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6725 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6726 g_signal_connect (button, "toggled",
6727 G_CALLBACK (tab_fill), child);
6729 button = gtk_check_button_new_with_label ("Expand Tab");
6730 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6731 g_signal_connect (button, "toggled",
6732 G_CALLBACK (tab_expand), child);
6734 button = gtk_check_button_new_with_label ("Pack end");
6735 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6736 g_signal_connect (button, "toggled",
6737 G_CALLBACK (tab_pack), child);
6739 button = gtk_button_new_with_label ("Hide Page");
6740 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6741 g_signal_connect_swapped (button, "clicked",
6742 G_CALLBACK (gtk_widget_hide),
6745 gtk_widget_show_all (child);
6747 label_box = gtk_hbox_new (FALSE, 0);
6748 pixwid = gtk_image_new_from_pixbuf (book_closed);
6749 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6751 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6752 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6753 label = gtk_label_new_with_mnemonic (accel_buffer);
6754 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6755 gtk_widget_show_all (label_box);
6758 menu_box = gtk_hbox_new (FALSE, 0);
6759 pixwid = gtk_image_new_from_pixbuf (book_closed);
6760 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6762 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6763 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6764 label = gtk_label_new (buffer);
6765 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6766 gtk_widget_show_all (menu_box);
6768 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6773 rotate_notebook (GtkButton *button,
6774 GtkNotebook *notebook)
6776 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
6780 show_all_pages (GtkButton *button,
6781 GtkNotebook *notebook)
6783 gtk_container_foreach (GTK_CONTAINER (notebook),
6784 (GtkCallback) gtk_widget_show, NULL);
6788 notebook_type_changed (GtkWidget *optionmenu,
6791 GtkNotebook *notebook;
6801 notebook = GTK_NOTEBOOK (data);
6803 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6808 /* standard notebook */
6809 gtk_notebook_set_show_tabs (notebook, TRUE);
6810 gtk_notebook_set_show_border (notebook, TRUE);
6811 gtk_notebook_set_scrollable (notebook, FALSE);
6815 /* notabs notebook */
6816 gtk_notebook_set_show_tabs (notebook, FALSE);
6817 gtk_notebook_set_show_border (notebook, TRUE);
6822 gtk_notebook_set_show_tabs (notebook, FALSE);
6823 gtk_notebook_set_show_border (notebook, FALSE);
6828 gtk_notebook_set_show_tabs (notebook, TRUE);
6829 gtk_notebook_set_show_border (notebook, TRUE);
6830 gtk_notebook_set_scrollable (notebook, TRUE);
6831 if (g_list_length (notebook->children) == 5)
6832 create_pages (notebook, 6, 15);
6838 if (g_list_length (notebook->children) == 15)
6839 for (i = 0; i < 10; i++)
6840 gtk_notebook_remove_page (notebook, 5);
6844 notebook_popup (GtkToggleButton *button,
6845 GtkNotebook *notebook)
6848 gtk_notebook_popup_enable (notebook);
6850 gtk_notebook_popup_disable (notebook);
6854 notebook_homogeneous (GtkToggleButton *button,
6855 GtkNotebook *notebook)
6857 g_object_set (notebook, "homogeneous", button->active, NULL);
6861 create_notebook (GtkWidget *widget)
6863 static GtkWidget *window = NULL;
6867 GtkWidget *separator;
6870 GdkPixbuf *book_open_xpm;
6871 GdkPixbuf *book_closed_xpm;
6873 static gchar *items[] =
6883 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6884 gtk_window_set_screen (GTK_WINDOW (window),
6885 gtk_widget_get_screen (widget));
6887 g_signal_connect (window, "destroy",
6888 G_CALLBACK (gtk_widget_destroyed),
6891 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6892 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6894 box1 = gtk_vbox_new (FALSE, 0);
6895 gtk_container_add (GTK_CONTAINER (window), box1);
6897 sample_notebook = gtk_notebook_new ();
6898 g_signal_connect (sample_notebook, "switch_page",
6899 G_CALLBACK (page_switch), NULL);
6900 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6901 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6902 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6904 gtk_widget_realize (sample_notebook);
6907 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
6910 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
6912 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6914 separator = gtk_hseparator_new ();
6915 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6917 box2 = gtk_hbox_new (FALSE, 5);
6918 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6919 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6921 button = gtk_check_button_new_with_label ("popup menu");
6922 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6923 g_signal_connect (button, "clicked",
6924 G_CALLBACK (notebook_popup),
6927 button = gtk_check_button_new_with_label ("homogeneous tabs");
6928 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6929 g_signal_connect (button, "clicked",
6930 G_CALLBACK (notebook_homogeneous),
6933 box2 = gtk_hbox_new (FALSE, 5);
6934 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6935 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6937 label = gtk_label_new ("Notebook Style :");
6938 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6940 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6941 notebook_type_changed,
6943 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6945 button = gtk_button_new_with_label ("Show all Pages");
6946 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6947 g_signal_connect (button, "clicked",
6948 G_CALLBACK (show_all_pages), sample_notebook);
6950 box2 = gtk_hbox_new (TRUE, 10);
6951 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6952 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6954 button = gtk_button_new_with_label ("prev");
6955 g_signal_connect_swapped (button, "clicked",
6956 G_CALLBACK (gtk_notebook_prev_page),
6958 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6960 button = gtk_button_new_with_label ("next");
6961 g_signal_connect_swapped (button, "clicked",
6962 G_CALLBACK (gtk_notebook_next_page),
6964 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6966 button = gtk_button_new_with_label ("rotate");
6967 g_signal_connect (button, "clicked",
6968 G_CALLBACK (rotate_notebook), sample_notebook);
6969 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6971 separator = gtk_hseparator_new ();
6972 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6974 button = gtk_button_new_with_label ("close");
6975 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6976 g_signal_connect_swapped (button, "clicked",
6977 G_CALLBACK (gtk_widget_destroy),
6979 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6980 gtk_widget_set_can_default (button, TRUE);
6981 gtk_widget_grab_default (button);
6984 if (!gtk_widget_get_visible (window))
6985 gtk_widget_show_all (window);
6987 gtk_widget_destroy (window);
6995 toggle_resize (GtkWidget *widget, GtkWidget *child)
6997 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6998 GValue value = { 0, };
6999 g_value_init (&value, G_TYPE_BOOLEAN);
7000 gtk_container_child_get_property (container, child, "resize", &value);
7001 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7002 gtk_container_child_set_property (container, child, "resize", &value);
7006 toggle_shrink (GtkWidget *widget, GtkWidget *child)
7008 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7009 GValue value = { 0, };
7010 g_value_init (&value, G_TYPE_BOOLEAN);
7011 gtk_container_child_get_property (container, child, "shrink", &value);
7012 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7013 gtk_container_child_set_property (container, child, "shrink", &value);
7017 paned_props_clicked (GtkWidget *button,
7020 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
7022 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
7026 create_pane_options (GtkPaned *paned,
7027 const gchar *frame_label,
7028 const gchar *label1,
7029 const gchar *label2)
7035 GtkWidget *check_button;
7037 frame = gtk_frame_new (frame_label);
7038 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
7040 table = gtk_table_new (4, 2, 4);
7041 gtk_container_add (GTK_CONTAINER (frame), table);
7043 label = gtk_label_new (label1);
7044 gtk_table_attach_defaults (GTK_TABLE (table), label,
7047 check_button = gtk_check_button_new_with_label ("Resize");
7048 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7050 g_signal_connect (check_button, "toggled",
7051 G_CALLBACK (toggle_resize),
7054 check_button = gtk_check_button_new_with_label ("Shrink");
7055 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7057 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7059 g_signal_connect (check_button, "toggled",
7060 G_CALLBACK (toggle_shrink),
7063 label = gtk_label_new (label2);
7064 gtk_table_attach_defaults (GTK_TABLE (table), label,
7067 check_button = gtk_check_button_new_with_label ("Resize");
7068 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7070 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7072 g_signal_connect (check_button, "toggled",
7073 G_CALLBACK (toggle_resize),
7076 check_button = gtk_check_button_new_with_label ("Shrink");
7077 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7079 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7081 g_signal_connect (check_button, "toggled",
7082 G_CALLBACK (toggle_shrink),
7085 button = gtk_button_new_with_mnemonic ("_Properties");
7086 gtk_table_attach_defaults (GTK_TABLE (table), button,
7088 g_signal_connect (button, "clicked",
7089 G_CALLBACK (paned_props_clicked),
7096 create_panes (GtkWidget *widget)
7098 static GtkWidget *window = NULL;
7107 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7109 gtk_window_set_screen (GTK_WINDOW (window),
7110 gtk_widget_get_screen (widget));
7112 g_signal_connect (window, "destroy",
7113 G_CALLBACK (gtk_widget_destroyed),
7116 gtk_window_set_title (GTK_WINDOW (window), "Panes");
7117 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7119 vbox = gtk_vbox_new (FALSE, 0);
7120 gtk_container_add (GTK_CONTAINER (window), vbox);
7122 vpaned = gtk_vpaned_new ();
7123 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
7124 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
7126 hpaned = gtk_hpaned_new ();
7127 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
7129 frame = gtk_frame_new (NULL);
7130 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7131 gtk_widget_set_size_request (frame, 60, 60);
7132 gtk_paned_add1 (GTK_PANED (hpaned), frame);
7134 button = gtk_button_new_with_label ("Hi there");
7135 gtk_container_add (GTK_CONTAINER(frame), button);
7137 frame = gtk_frame_new (NULL);
7138 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7139 gtk_widget_set_size_request (frame, 80, 60);
7140 gtk_paned_add2 (GTK_PANED (hpaned), frame);
7142 frame = gtk_frame_new (NULL);
7143 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7144 gtk_widget_set_size_request (frame, 60, 80);
7145 gtk_paned_add2 (GTK_PANED (vpaned), frame);
7147 /* Now create toggle buttons to control sizing */
7149 gtk_box_pack_start (GTK_BOX (vbox),
7150 create_pane_options (GTK_PANED (hpaned),
7156 gtk_box_pack_start (GTK_BOX (vbox),
7157 create_pane_options (GTK_PANED (vpaned),
7163 gtk_widget_show_all (vbox);
7166 if (!gtk_widget_get_visible (window))
7167 gtk_widget_show (window);
7169 gtk_widget_destroy (window);
7173 * Paned keyboard navigation
7177 paned_keyboard_window1 (GtkWidget *widget)
7200 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7201 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
7202 gtk_window_set_screen (GTK_WINDOW (window1),
7203 gtk_widget_get_screen (widget));
7205 hpaned1 = gtk_hpaned_new ();
7206 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
7208 frame1 = gtk_frame_new (NULL);
7209 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
7210 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
7212 vbox1 = gtk_vbox_new (FALSE, 0);
7213 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
7215 button7 = gtk_button_new_with_label ("button7");
7216 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
7218 button8 = gtk_button_new_with_label ("button8");
7219 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
7221 button9 = gtk_button_new_with_label ("button9");
7222 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
7224 vpaned1 = gtk_vpaned_new ();
7225 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
7227 frame2 = gtk_frame_new (NULL);
7228 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
7229 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
7231 frame5 = gtk_frame_new (NULL);
7232 gtk_container_add (GTK_CONTAINER (frame2), frame5);
7234 hbox1 = gtk_hbox_new (FALSE, 0);
7235 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
7237 button5 = gtk_button_new_with_label ("button5");
7238 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
7240 button6 = gtk_button_new_with_label ("button6");
7241 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
7243 frame3 = gtk_frame_new (NULL);
7244 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
7245 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
7247 frame4 = gtk_frame_new ("Buttons");
7248 gtk_container_add (GTK_CONTAINER (frame3), frame4);
7249 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
7251 table1 = gtk_table_new (2, 2, FALSE);
7252 gtk_container_add (GTK_CONTAINER (frame4), table1);
7253 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
7255 button1 = gtk_button_new_with_label ("button1");
7256 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
7257 (GtkAttachOptions) (GTK_FILL),
7258 (GtkAttachOptions) (0), 0, 0);
7260 button2 = gtk_button_new_with_label ("button2");
7261 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
7262 (GtkAttachOptions) (GTK_FILL),
7263 (GtkAttachOptions) (0), 0, 0);
7265 button3 = gtk_button_new_with_label ("button3");
7266 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
7267 (GtkAttachOptions) (GTK_FILL),
7268 (GtkAttachOptions) (0), 0, 0);
7270 button4 = gtk_button_new_with_label ("button4");
7271 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
7272 (GtkAttachOptions) (GTK_FILL),
7273 (GtkAttachOptions) (0), 0, 0);
7279 paned_keyboard_window2 (GtkWidget *widget)
7284 GtkWidget *button13;
7288 GtkWidget *button12;
7290 GtkWidget *button11;
7291 GtkWidget *button10;
7293 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7294 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
7296 gtk_window_set_screen (GTK_WINDOW (window2),
7297 gtk_widget_get_screen (widget));
7299 hpaned2 = gtk_hpaned_new ();
7300 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
7302 frame6 = gtk_frame_new (NULL);
7303 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
7304 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
7306 button13 = gtk_button_new_with_label ("button13");
7307 gtk_container_add (GTK_CONTAINER (frame6), button13);
7309 hbox2 = gtk_hbox_new (FALSE, 0);
7310 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
7312 vpaned2 = gtk_vpaned_new ();
7313 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
7315 frame7 = gtk_frame_new (NULL);
7316 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
7317 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
7319 button12 = gtk_button_new_with_label ("button12");
7320 gtk_container_add (GTK_CONTAINER (frame7), button12);
7322 frame8 = gtk_frame_new (NULL);
7323 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
7324 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
7326 button11 = gtk_button_new_with_label ("button11");
7327 gtk_container_add (GTK_CONTAINER (frame8), button11);
7329 button10 = gtk_button_new_with_label ("button10");
7330 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
7336 paned_keyboard_window3 (GtkWidget *widget)
7343 GtkWidget *button14;
7346 GtkWidget *button15;
7349 GtkWidget *button16;
7351 GtkWidget *button17;
7353 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7354 g_object_set_data (G_OBJECT (window3), "window3", window3);
7355 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
7357 gtk_window_set_screen (GTK_WINDOW (window3),
7358 gtk_widget_get_screen (widget));
7361 vbox2 = gtk_vbox_new (FALSE, 0);
7362 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7364 label1 = gtk_label_new ("Three panes nested inside each other");
7365 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7367 hpaned3 = gtk_hpaned_new ();
7368 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7370 frame9 = gtk_frame_new (NULL);
7371 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7372 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7374 button14 = gtk_button_new_with_label ("button14");
7375 gtk_container_add (GTK_CONTAINER (frame9), button14);
7377 hpaned4 = gtk_hpaned_new ();
7378 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7380 frame10 = gtk_frame_new (NULL);
7381 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7382 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7384 button15 = gtk_button_new_with_label ("button15");
7385 gtk_container_add (GTK_CONTAINER (frame10), button15);
7387 hpaned5 = gtk_hpaned_new ();
7388 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7390 frame11 = gtk_frame_new (NULL);
7391 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7392 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7394 button16 = gtk_button_new_with_label ("button16");
7395 gtk_container_add (GTK_CONTAINER (frame11), button16);
7397 frame12 = gtk_frame_new (NULL);
7398 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7399 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7401 button17 = gtk_button_new_with_label ("button17");
7402 gtk_container_add (GTK_CONTAINER (frame12), button17);
7408 paned_keyboard_window4 (GtkWidget *widget)
7415 GtkWidget *button19;
7416 GtkWidget *button18;
7419 GtkWidget *button21;
7420 GtkWidget *button20;
7422 GtkWidget *button23;
7423 GtkWidget *button22;
7425 GtkWidget *button25;
7426 GtkWidget *button24;
7428 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7429 g_object_set_data (G_OBJECT (window4), "window4", window4);
7430 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7432 gtk_window_set_screen (GTK_WINDOW (window4),
7433 gtk_widget_get_screen (widget));
7435 vbox3 = gtk_vbox_new (FALSE, 0);
7436 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7438 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7439 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7440 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7442 hpaned6 = gtk_hpaned_new ();
7443 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7445 vpaned3 = gtk_vpaned_new ();
7446 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7448 button19 = gtk_button_new_with_label ("button19");
7449 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7451 button18 = gtk_button_new_with_label ("button18");
7452 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7454 hbox3 = gtk_hbox_new (FALSE, 0);
7455 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7457 vpaned4 = gtk_vpaned_new ();
7458 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7460 button21 = gtk_button_new_with_label ("button21");
7461 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7463 button20 = gtk_button_new_with_label ("button20");
7464 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7466 vpaned5 = gtk_vpaned_new ();
7467 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7469 button23 = gtk_button_new_with_label ("button23");
7470 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7472 button22 = gtk_button_new_with_label ("button22");
7473 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7475 vpaned6 = gtk_vpaned_new ();
7476 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7478 button25 = gtk_button_new_with_label ("button25");
7479 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7481 button24 = gtk_button_new_with_label ("button24");
7482 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7488 create_paned_keyboard_navigation (GtkWidget *widget)
7490 static GtkWidget *window1 = NULL;
7491 static GtkWidget *window2 = NULL;
7492 static GtkWidget *window3 = NULL;
7493 static GtkWidget *window4 = NULL;
7496 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7498 gtk_widget_destroy (window1);
7499 gtk_widget_destroy (window2);
7500 gtk_widget_destroy (window3);
7501 gtk_widget_destroy (window4);
7506 window1 = paned_keyboard_window1 (widget);
7507 g_signal_connect (window1, "destroy",
7508 G_CALLBACK (gtk_widget_destroyed),
7514 window2 = paned_keyboard_window2 (widget);
7515 g_signal_connect (window2, "destroy",
7516 G_CALLBACK (gtk_widget_destroyed),
7522 window3 = paned_keyboard_window3 (widget);
7523 g_signal_connect (window3, "destroy",
7524 G_CALLBACK (gtk_widget_destroyed),
7530 window4 = paned_keyboard_window4 (widget);
7531 g_signal_connect (window4, "destroy",
7532 G_CALLBACK (gtk_widget_destroyed),
7536 if (gtk_widget_get_visible (window1))
7537 gtk_widget_destroy (GTK_WIDGET (window1));
7539 gtk_widget_show_all (GTK_WIDGET (window1));
7541 if (gtk_widget_get_visible (window2))
7542 gtk_widget_destroy (GTK_WIDGET (window2));
7544 gtk_widget_show_all (GTK_WIDGET (window2));
7546 if (gtk_widget_get_visible (window3))
7547 gtk_widget_destroy (GTK_WIDGET (window3));
7549 gtk_widget_show_all (GTK_WIDGET (window3));
7551 if (gtk_widget_get_visible (window4))
7552 gtk_widget_destroy (GTK_WIDGET (window4));
7554 gtk_widget_show_all (GTK_WIDGET (window4));
7562 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7565 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7569 /* ignore double and triple click */
7570 if (event->type != GDK_BUTTON_PRESS)
7573 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7574 p->x = (int) event->x;
7575 p->y = (int) event->y;
7577 gtk_grab_add (widget);
7578 gdk_pointer_grab (widget->window, TRUE,
7579 GDK_BUTTON_RELEASE_MASK |
7580 GDK_BUTTON_MOTION_MASK |
7581 GDK_POINTER_MOTION_HINT_MASK,
7586 shape_released (GtkWidget *widget)
7588 gtk_grab_remove (widget);
7589 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7594 shape_motion (GtkWidget *widget,
7595 GdkEventMotion *event)
7599 GdkModifierType mask;
7601 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7604 * Can't use event->x / event->y here
7605 * because I need absolute coordinates.
7607 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7608 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7612 shape_create_icon (GdkScreen *screen,
7623 CursorOffset* icon_pos;
7625 GdkBitmap *gdk_pixmap_mask;
7626 GdkPixmap *gdk_pixmap;
7629 style = gtk_widget_get_default_style ();
7630 gc = style->black_gc;
7633 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7635 window = gtk_window_new (window_type);
7636 gtk_window_set_screen (GTK_WINDOW (window), screen);
7638 fixed = gtk_fixed_new ();
7639 gtk_widget_set_size_request (fixed, 100, 100);
7640 gtk_container_add (GTK_CONTAINER (window), fixed);
7641 gtk_widget_show (fixed);
7643 gtk_widget_set_events (window,
7644 gtk_widget_get_events (window) |
7645 GDK_BUTTON_MOTION_MASK |
7646 GDK_POINTER_MOTION_HINT_MASK |
7647 GDK_BUTTON_PRESS_MASK);
7649 gtk_widget_realize (window);
7650 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
7651 &style->bg[GTK_STATE_NORMAL],
7654 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
7655 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
7656 gtk_widget_show (pixmap);
7658 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
7660 g_object_unref (gdk_pixmap_mask);
7661 g_object_unref (gdk_pixmap);
7663 g_signal_connect (window, "button_press_event",
7664 G_CALLBACK (shape_pressed), NULL);
7665 g_signal_connect (window, "button_release_event",
7666 G_CALLBACK (shape_released), NULL);
7667 g_signal_connect (window, "motion_notify_event",
7668 G_CALLBACK (shape_motion), NULL);
7670 icon_pos = g_new (CursorOffset, 1);
7671 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7673 gtk_window_move (GTK_WINDOW (window), x, y);
7674 gtk_widget_show (window);
7680 create_shapes (GtkWidget *widget)
7682 /* Variables used by the Drag/Drop and Shape Window demos */
7683 static GtkWidget *modeller = NULL;
7684 static GtkWidget *sheets = NULL;
7685 static GtkWidget *rings = NULL;
7686 static GtkWidget *with_region = NULL;
7687 GdkScreen *screen = gtk_widget_get_screen (widget);
7689 if (!(file_exists ("Modeller.xpm") &&
7690 file_exists ("FilesQueue.xpm") &&
7691 file_exists ("3DRings.xpm")))
7697 modeller = shape_create_icon (screen, "Modeller.xpm",
7698 440, 140, 0,0, GTK_WINDOW_POPUP);
7700 g_signal_connect (modeller, "destroy",
7701 G_CALLBACK (gtk_widget_destroyed),
7705 gtk_widget_destroy (modeller);
7709 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7710 580, 170, 0,0, GTK_WINDOW_POPUP);
7712 g_signal_connect (sheets, "destroy",
7713 G_CALLBACK (gtk_widget_destroyed),
7718 gtk_widget_destroy (sheets);
7722 rings = shape_create_icon (screen, "3DRings.xpm",
7723 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7725 g_signal_connect (rings, "destroy",
7726 G_CALLBACK (gtk_widget_destroyed),
7730 gtk_widget_destroy (rings);
7737 with_region = shape_create_icon (screen, "3DRings.xpm",
7738 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7740 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7742 g_signal_connect (with_region, "destroy",
7743 G_CALLBACK (gtk_widget_destroyed),
7746 /* reset shape from mask to a region */
7749 region = gdk_region_new ();
7761 gdk_region_union_with_rect (region, &rect);
7769 gdk_window_shape_combine_region (with_region->window,
7774 gtk_widget_destroy (with_region);
7782 create_wmhints (GtkWidget *widget)
7784 static GtkWidget *window = NULL;
7786 GtkWidget *separator;
7795 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7797 gtk_window_set_screen (GTK_WINDOW (window),
7798 gtk_widget_get_screen (widget));
7800 g_signal_connect (window, "destroy",
7801 G_CALLBACK (gtk_widget_destroyed),
7804 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7805 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7807 gtk_widget_realize (window);
7809 circles = gdk_bitmap_create_from_data (window->window,
7810 (gchar *) circles_bits,
7813 gdk_window_set_icon (window->window, NULL,
7816 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
7818 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7819 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7821 box1 = gtk_vbox_new (FALSE, 0);
7822 gtk_container_add (GTK_CONTAINER (window), box1);
7823 gtk_widget_show (box1);
7825 label = gtk_label_new ("Try iconizing me!");
7826 gtk_widget_set_size_request (label, 150, 50);
7827 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7828 gtk_widget_show (label);
7831 separator = gtk_hseparator_new ();
7832 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7833 gtk_widget_show (separator);
7836 box2 = gtk_vbox_new (FALSE, 10);
7837 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7838 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7839 gtk_widget_show (box2);
7842 button = gtk_button_new_with_label ("close");
7844 g_signal_connect_swapped (button, "clicked",
7845 G_CALLBACK (gtk_widget_destroy),
7848 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7849 gtk_widget_set_can_default (button, TRUE);
7850 gtk_widget_grab_default (button);
7851 gtk_widget_show (button);
7854 if (!gtk_widget_get_visible (window))
7855 gtk_widget_show (window);
7857 gtk_widget_destroy (window);
7862 * Window state tracking
7866 window_state_callback (GtkWidget *widget,
7867 GdkEventWindowState *event,
7870 GtkWidget *label = data;
7873 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
7874 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7875 "withdrawn" : "not withdrawn", ", ",
7876 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7877 "iconified" : "not iconified", ", ",
7878 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7879 "sticky" : "not sticky", ", ",
7880 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7881 "maximized" : "not maximized", ", ",
7882 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7883 "fullscreen" : "not fullscreen",
7884 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7885 "above" : "not above", ", ",
7886 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7887 "below" : "not below", ", ",
7890 gtk_label_set_text (GTK_LABEL (label), msg);
7898 tracking_label (GtkWidget *window)
7904 hbox = gtk_hbox_new (FALSE, 5);
7906 g_signal_connect_object (hbox,
7908 G_CALLBACK (gtk_widget_destroy),
7912 label = gtk_label_new ("<no window state events received>");
7913 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7914 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7916 g_signal_connect (window,
7917 "window_state_event",
7918 G_CALLBACK (window_state_callback),
7921 button = gtk_button_new_with_label ("Deiconify");
7922 g_signal_connect_object (button,
7924 G_CALLBACK (gtk_window_deiconify),
7927 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7929 button = gtk_button_new_with_label ("Iconify");
7930 g_signal_connect_object (button,
7932 G_CALLBACK (gtk_window_iconify),
7935 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7937 button = gtk_button_new_with_label ("Fullscreen");
7938 g_signal_connect_object (button,
7940 G_CALLBACK (gtk_window_fullscreen),
7943 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7945 button = gtk_button_new_with_label ("Unfullscreen");
7946 g_signal_connect_object (button,
7948 G_CALLBACK (gtk_window_unfullscreen),
7951 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7953 button = gtk_button_new_with_label ("Present");
7954 g_signal_connect_object (button,
7956 G_CALLBACK (gtk_window_present),
7959 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7961 button = gtk_button_new_with_label ("Show");
7962 g_signal_connect_object (button,
7964 G_CALLBACK (gtk_widget_show),
7967 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7969 gtk_widget_show_all (hbox);
7975 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7977 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7979 gtk_window_set_keep_above (GTK_WINDOW (data),
7980 gtk_toggle_button_get_active (togglebutton));
7982 if (gtk_toggle_button_get_active (togglebutton))
7983 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7987 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7989 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7991 gtk_window_set_keep_below (GTK_WINDOW (data),
7992 gtk_toggle_button_get_active (togglebutton));
7994 if (gtk_toggle_button_get_active (togglebutton))
7995 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8000 get_state_controls (GtkWidget *window)
8004 GtkWidget *button_above;
8005 GtkWidget *button_below;
8007 vbox = gtk_vbox_new (FALSE, 0);
8009 button = gtk_button_new_with_label ("Stick");
8010 g_signal_connect_object (button,
8012 G_CALLBACK (gtk_window_stick),
8015 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8017 button = gtk_button_new_with_label ("Unstick");
8018 g_signal_connect_object (button,
8020 G_CALLBACK (gtk_window_unstick),
8023 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8025 button = gtk_button_new_with_label ("Maximize");
8026 g_signal_connect_object (button,
8028 G_CALLBACK (gtk_window_maximize),
8031 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8033 button = gtk_button_new_with_label ("Unmaximize");
8034 g_signal_connect_object (button,
8036 G_CALLBACK (gtk_window_unmaximize),
8039 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8041 button = gtk_button_new_with_label ("Iconify");
8042 g_signal_connect_object (button,
8044 G_CALLBACK (gtk_window_iconify),
8047 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8049 button = gtk_button_new_with_label ("Fullscreen");
8050 g_signal_connect_object (button,
8052 G_CALLBACK (gtk_window_fullscreen),
8055 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8057 button = gtk_button_new_with_label ("Unfullscreen");
8058 g_signal_connect_object (button,
8060 G_CALLBACK (gtk_window_unfullscreen),
8063 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8065 button_above = gtk_toggle_button_new_with_label ("Keep above");
8066 g_signal_connect (button_above,
8068 G_CALLBACK (keep_window_above),
8070 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
8072 button_below = gtk_toggle_button_new_with_label ("Keep below");
8073 g_signal_connect (button_below,
8075 G_CALLBACK (keep_window_below),
8077 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
8079 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
8080 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
8082 button = gtk_button_new_with_label ("Hide (withdraw)");
8083 g_signal_connect_object (button,
8085 G_CALLBACK (gtk_widget_hide),
8088 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8090 gtk_widget_show_all (vbox);
8096 create_window_states (GtkWidget *widget)
8098 static GtkWidget *window = NULL;
8101 GtkWidget *iconified;
8103 GtkWidget *controls;
8107 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8108 gtk_window_set_screen (GTK_WINDOW (window),
8109 gtk_widget_get_screen (widget));
8111 g_signal_connect (window, "destroy",
8112 G_CALLBACK (gtk_widget_destroyed),
8115 gtk_window_set_title (GTK_WINDOW (window), "Window states");
8117 box1 = gtk_vbox_new (FALSE, 0);
8118 gtk_container_add (GTK_CONTAINER (window), box1);
8120 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8122 gtk_window_set_screen (GTK_WINDOW (iconified),
8123 gtk_widget_get_screen (widget));
8125 g_signal_connect_object (iconified, "destroy",
8126 G_CALLBACK (gtk_widget_destroy),
8129 gtk_window_iconify (GTK_WINDOW (iconified));
8130 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
8131 controls = get_state_controls (iconified);
8132 gtk_container_add (GTK_CONTAINER (iconified), controls);
8134 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8136 gtk_window_set_screen (GTK_WINDOW (normal),
8137 gtk_widget_get_screen (widget));
8139 g_signal_connect_object (normal, "destroy",
8140 G_CALLBACK (gtk_widget_destroy),
8144 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
8145 controls = get_state_controls (normal);
8146 gtk_container_add (GTK_CONTAINER (normal), controls);
8148 label = tracking_label (iconified);
8149 gtk_container_add (GTK_CONTAINER (box1), label);
8151 label = tracking_label (normal);
8152 gtk_container_add (GTK_CONTAINER (box1), label);
8154 gtk_widget_show_all (iconified);
8155 gtk_widget_show_all (normal);
8156 gtk_widget_show_all (box1);
8159 if (!gtk_widget_get_visible (window))
8160 gtk_widget_show (window);
8162 gtk_widget_destroy (window);
8170 configure_event_callback (GtkWidget *widget,
8171 GdkEventConfigure *event,
8174 GtkWidget *label = data;
8178 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
8180 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
8182 event->x, event->y, event->width, event->height,
8185 gtk_label_set_text (GTK_LABEL (label), msg);
8193 get_ints (GtkWidget *window,
8200 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
8201 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
8203 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
8204 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
8208 set_size_callback (GtkWidget *widget,
8213 get_ints (data, &w, &h);
8215 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
8219 unset_default_size_callback (GtkWidget *widget,
8222 gtk_window_set_default_size (g_object_get_data (data, "target"),
8227 set_default_size_callback (GtkWidget *widget,
8232 get_ints (data, &w, &h);
8234 gtk_window_set_default_size (g_object_get_data (data, "target"),
8239 unset_size_request_callback (GtkWidget *widget,
8242 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8247 set_size_request_callback (GtkWidget *widget,
8252 get_ints (data, &w, &h);
8254 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8259 set_location_callback (GtkWidget *widget,
8264 get_ints (data, &x, &y);
8266 gtk_window_move (g_object_get_data (data, "target"), x, y);
8270 move_to_position_callback (GtkWidget *widget,
8276 window = g_object_get_data (data, "target");
8278 gtk_window_get_position (window, &x, &y);
8280 gtk_window_move (window, x, y);
8284 set_geometry_callback (GtkWidget *entry,
8290 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
8292 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
8294 if (!gtk_window_parse_geometry (target, text))
8295 g_print ("Bad geometry string '%s'\n", text);
8301 allow_shrink_callback (GtkWidget *widget,
8304 g_object_set (g_object_get_data (data, "target"),
8306 GTK_TOGGLE_BUTTON (widget)->active,
8311 allow_grow_callback (GtkWidget *widget,
8314 g_object_set (g_object_get_data (data, "target"),
8316 GTK_TOGGLE_BUTTON (widget)->active,
8321 gravity_selected (GtkWidget *widget,
8324 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
8325 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
8329 pos_selected (GtkWidget *widget,
8332 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
8333 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
8337 move_gravity_window_to_current_position (GtkWidget *widget,
8343 window = GTK_WINDOW (data);
8345 gtk_window_get_position (window, &x, &y);
8347 gtk_window_move (window, x, y);
8351 get_screen_corner (GtkWindow *window,
8356 GdkScreen * screen = gtk_window_get_screen (window);
8358 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
8360 switch (gtk_window_get_gravity (window))
8362 case GDK_GRAVITY_SOUTH_EAST:
8363 *x = gdk_screen_get_width (screen) - w;
8364 *y = gdk_screen_get_height (screen) - h;
8367 case GDK_GRAVITY_NORTH_EAST:
8368 *x = gdk_screen_get_width (screen) - w;
8372 case GDK_GRAVITY_SOUTH_WEST:
8374 *y = gdk_screen_get_height (screen) - h;
8377 case GDK_GRAVITY_NORTH_WEST:
8382 case GDK_GRAVITY_SOUTH:
8383 *x = (gdk_screen_get_width (screen) - w) / 2;
8384 *y = gdk_screen_get_height (screen) - h;
8387 case GDK_GRAVITY_NORTH:
8388 *x = (gdk_screen_get_width (screen) - w) / 2;
8392 case GDK_GRAVITY_WEST:
8394 *y = (gdk_screen_get_height (screen) - h) / 2;
8397 case GDK_GRAVITY_EAST:
8398 *x = gdk_screen_get_width (screen) - w;
8399 *y = (gdk_screen_get_height (screen) - h) / 2;
8402 case GDK_GRAVITY_CENTER:
8403 *x = (gdk_screen_get_width (screen) - w) / 2;
8404 *y = (gdk_screen_get_height (screen) - h) / 2;
8407 case GDK_GRAVITY_STATIC:
8408 /* pick some random numbers */
8414 g_assert_not_reached ();
8420 move_gravity_window_to_starting_position (GtkWidget *widget,
8426 window = GTK_WINDOW (data);
8428 get_screen_corner (window,
8431 gtk_window_move (window, x, y);
8435 make_gravity_window (GtkWidget *destroy_with,
8444 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8446 gtk_window_set_screen (GTK_WINDOW (window),
8447 gtk_widget_get_screen (destroy_with));
8449 vbox = gtk_vbox_new (FALSE, 0);
8450 gtk_widget_show (vbox);
8452 gtk_container_add (GTK_CONTAINER (window), vbox);
8453 gtk_window_set_title (GTK_WINDOW (window), title);
8454 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8456 g_signal_connect_object (destroy_with,
8458 G_CALLBACK (gtk_widget_destroy),
8463 button = gtk_button_new_with_mnemonic ("_Move to current position");
8465 g_signal_connect (button, "clicked",
8466 G_CALLBACK (move_gravity_window_to_current_position),
8469 gtk_container_add (GTK_CONTAINER (vbox), button);
8470 gtk_widget_show (button);
8472 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8474 g_signal_connect (button, "clicked",
8475 G_CALLBACK (move_gravity_window_to_starting_position),
8478 gtk_container_add (GTK_CONTAINER (vbox), button);
8479 gtk_widget_show (button);
8481 /* Pretend this is the result of --geometry.
8482 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8483 * and in that case you probably should just use gtk_window_parse_geometry().
8484 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8485 * you are parsing --geometry or equivalent.
8487 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8491 gtk_window_set_default_size (GTK_WINDOW (window),
8494 get_screen_corner (GTK_WINDOW (window), &x, &y);
8496 gtk_window_move (GTK_WINDOW (window),
8503 do_gravity_test (GtkWidget *widget,
8506 GtkWidget *destroy_with = data;
8509 /* We put a window at each gravity point on the screen. */
8510 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8512 gtk_widget_show (window);
8514 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8516 gtk_widget_show (window);
8518 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8520 gtk_widget_show (window);
8522 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8524 gtk_widget_show (window);
8526 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8528 gtk_widget_show (window);
8530 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8532 gtk_widget_show (window);
8535 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8537 gtk_widget_show (window);
8540 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8542 gtk_widget_show (window);
8544 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8546 gtk_widget_show (window);
8548 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8550 gtk_widget_show (window);
8554 window_controls (GtkWidget *window)
8556 GtkWidget *control_window;
8566 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8568 gtk_window_set_screen (GTK_WINDOW (control_window),
8569 gtk_widget_get_screen (window));
8571 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8573 g_object_set_data (G_OBJECT (control_window),
8577 g_signal_connect_object (control_window,
8579 G_CALLBACK (gtk_widget_destroy),
8583 vbox = gtk_vbox_new (FALSE, 5);
8585 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8587 label = gtk_label_new ("<no configure events>");
8588 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8590 g_signal_connect (window,
8592 G_CALLBACK (configure_event_callback),
8595 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8597 spin = gtk_spin_button_new (adj, 0, 0);
8599 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8601 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8603 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8605 spin = gtk_spin_button_new (adj, 0, 0);
8607 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8609 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8611 entry = gtk_entry_new ();
8612 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8614 g_signal_connect (entry, "changed",
8615 G_CALLBACK (set_geometry_callback),
8618 button = gtk_button_new_with_label ("Show gravity test windows");
8619 g_signal_connect_swapped (button,
8621 G_CALLBACK (do_gravity_test),
8623 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8625 button = gtk_button_new_with_label ("Reshow with initial size");
8626 g_signal_connect_object (button,
8628 G_CALLBACK (gtk_window_reshow_with_initial_size),
8631 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8633 button = gtk_button_new_with_label ("Queue resize");
8634 g_signal_connect_object (button,
8636 G_CALLBACK (gtk_widget_queue_resize),
8639 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8641 button = gtk_button_new_with_label ("Resize");
8642 g_signal_connect (button,
8644 G_CALLBACK (set_size_callback),
8646 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8648 button = gtk_button_new_with_label ("Set default size");
8649 g_signal_connect (button,
8651 G_CALLBACK (set_default_size_callback),
8653 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8655 button = gtk_button_new_with_label ("Unset default size");
8656 g_signal_connect (button,
8658 G_CALLBACK (unset_default_size_callback),
8660 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8662 button = gtk_button_new_with_label ("Set size request");
8663 g_signal_connect (button,
8665 G_CALLBACK (set_size_request_callback),
8667 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8669 button = gtk_button_new_with_label ("Unset size request");
8670 g_signal_connect (button,
8672 G_CALLBACK (unset_size_request_callback),
8674 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8676 button = gtk_button_new_with_label ("Move");
8677 g_signal_connect (button,
8679 G_CALLBACK (set_location_callback),
8681 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8683 button = gtk_button_new_with_label ("Move to current position");
8684 g_signal_connect (button,
8686 G_CALLBACK (move_to_position_callback),
8688 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8690 button = gtk_check_button_new_with_label ("Allow shrink");
8691 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8692 g_signal_connect (button,
8694 G_CALLBACK (allow_shrink_callback),
8696 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8698 button = gtk_check_button_new_with_label ("Allow grow");
8699 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8700 g_signal_connect (button,
8702 G_CALLBACK (allow_grow_callback),
8704 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8706 button = gtk_button_new_with_mnemonic ("_Show");
8707 g_signal_connect_object (button,
8709 G_CALLBACK (gtk_widget_show),
8712 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8714 button = gtk_button_new_with_mnemonic ("_Hide");
8715 g_signal_connect_object (button,
8717 G_CALLBACK (gtk_widget_hide),
8720 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8722 om = gtk_combo_box_new_text ();
8726 static gchar *names[] = {
8727 "GDK_GRAVITY_NORTH_WEST",
8728 "GDK_GRAVITY_NORTH",
8729 "GDK_GRAVITY_NORTH_EAST",
8731 "GDK_GRAVITY_CENTER",
8733 "GDK_GRAVITY_SOUTH_WEST",
8734 "GDK_GRAVITY_SOUTH",
8735 "GDK_GRAVITY_SOUTH_EAST",
8736 "GDK_GRAVITY_STATIC",
8740 g_assert (names[i]);
8741 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8746 g_signal_connect (om,
8748 G_CALLBACK (gravity_selected),
8751 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8754 om = gtk_combo_box_new_text ();
8758 static gchar *names[] = {
8760 "GTK_WIN_POS_CENTER",
8761 "GTK_WIN_POS_MOUSE",
8762 "GTK_WIN_POS_CENTER_ALWAYS",
8763 "GTK_WIN_POS_CENTER_ON_PARENT",
8767 g_assert (names[i]);
8768 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8773 g_signal_connect (om,
8775 G_CALLBACK (pos_selected),
8778 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8780 gtk_widget_show_all (vbox);
8782 return control_window;
8786 create_window_sizing (GtkWidget *widget)
8788 static GtkWidget *window = NULL;
8789 static GtkWidget *target_window = NULL;
8795 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8796 gtk_window_set_screen (GTK_WINDOW (target_window),
8797 gtk_widget_get_screen (widget));
8798 label = gtk_label_new (NULL);
8799 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");
8800 gtk_container_add (GTK_CONTAINER (target_window), label);
8801 gtk_widget_show (label);
8803 g_signal_connect (target_window, "destroy",
8804 G_CALLBACK (gtk_widget_destroyed),
8807 window = window_controls (target_window);
8809 g_signal_connect (window, "destroy",
8810 G_CALLBACK (gtk_widget_destroyed),
8813 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8816 /* don't show target window by default, we want to allow testing
8817 * of behavior on first show.
8820 if (!gtk_widget_get_visible (window))
8821 gtk_widget_show (window);
8823 gtk_widget_destroy (window);
8830 typedef struct _ProgressData {
8833 GtkWidget *block_spin;
8834 GtkWidget *x_align_spin;
8835 GtkWidget *y_align_spin;
8836 GtkWidget *step_spin;
8837 GtkWidget *act_blocks_spin;
8848 progress_timeout (gpointer data)
8850 ProgressData *pdata = data;
8853 if (pdata->activity)
8855 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8859 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8863 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8869 destroy_progress (GtkWidget *widget,
8870 ProgressData **pdata)
8872 g_source_remove ((*pdata)->timer);
8873 (*pdata)->timer = 0;
8874 (*pdata)->window = NULL;
8880 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8882 ProgressData *pdata;
8885 pdata = (ProgressData *) data;
8887 if (!gtk_widget_get_mapped (widget))
8890 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8892 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
8893 (GtkProgressBarOrientation) i);
8897 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8899 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
8900 GTK_TOGGLE_BUTTON (widget)->active);
8901 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
8905 progressbar_toggle_ellipsize (GtkWidget *widget,
8908 ProgressData *pdata = data;
8909 if (gtk_widget_is_drawable (widget))
8911 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8912 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8917 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
8921 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
8922 sprintf (buf, "???");
8924 sprintf (buf, "%.0f%%", 100 *
8925 gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)));
8926 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
8930 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
8932 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
8933 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
8934 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
8938 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8940 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8944 entry_changed (GtkWidget *widget, ProgressData *pdata)
8946 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8947 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8951 create_progress_bar (GtkWidget *widget)
8963 static ProgressData *pdata = NULL;
8965 static gchar *items1[] =
8973 static char *ellipsize_items[] = {
8974 "None", // PANGO_ELLIPSIZE_NONE,
8975 "Start", // PANGO_ELLIPSIZE_START,
8976 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8977 "End", // PANGO_ELLIPSIZE_END
8981 pdata = g_new0 (ProgressData, 1);
8985 pdata->window = gtk_dialog_new ();
8987 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8988 gtk_widget_get_screen (widget));
8990 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8992 g_signal_connect (pdata->window, "destroy",
8993 G_CALLBACK (destroy_progress),
8998 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8999 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
9001 vbox = gtk_vbox_new (FALSE, 5);
9002 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9003 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
9004 vbox, FALSE, TRUE, 0);
9006 frame = gtk_frame_new ("Progress");
9007 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9009 vbox2 = gtk_vbox_new (FALSE, 5);
9010 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9012 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9013 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9015 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
9016 g_signal_connect (adj, "value_changed",
9017 G_CALLBACK (progress_value_changed), pdata);
9019 pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
9021 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
9023 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
9024 "%v from [%l,%u] (=%p%%)");
9025 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
9026 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
9028 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9029 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9031 hbox = gtk_hbox_new (FALSE, 5);
9032 gtk_container_add (GTK_CONTAINER (align), hbox);
9033 label = gtk_label_new ("Label updated by user :");
9034 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9035 pdata->label = gtk_label_new ("");
9036 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
9038 frame = gtk_frame_new ("Options");
9039 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9041 vbox2 = gtk_vbox_new (FALSE, 5);
9042 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9044 tab = gtk_table_new (7, 2, FALSE);
9045 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
9047 label = gtk_label_new ("Orientation :");
9048 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
9049 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9051 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9053 pdata->omenu1 = build_option_menu (items1, 4, 0,
9054 progressbar_toggle_orientation,
9056 hbox = gtk_hbox_new (FALSE, 0);
9057 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
9058 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9060 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
9062 check = gtk_check_button_new_with_label ("Show text");
9063 g_signal_connect (check, "clicked",
9064 G_CALLBACK (toggle_show_text),
9066 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
9067 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9070 hbox = gtk_hbox_new (FALSE, 0);
9071 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
9072 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9075 label = gtk_label_new ("Format : ");
9076 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9078 pdata->entry = gtk_entry_new ();
9079 g_signal_connect (pdata->entry, "changed",
9080 G_CALLBACK (entry_changed),
9082 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
9083 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
9084 gtk_widget_set_size_request (pdata->entry, 100, -1);
9085 gtk_widget_set_sensitive (pdata->entry, FALSE);
9087 label = gtk_label_new ("Text align :");
9088 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
9089 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9091 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9093 hbox = gtk_hbox_new (FALSE, 0);
9094 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
9095 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9098 label = gtk_label_new ("x :");
9099 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
9101 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
9102 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
9103 g_signal_connect (adj, "value_changed",
9104 G_CALLBACK (adjust_align), pdata);
9105 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
9106 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
9108 label = gtk_label_new ("y :");
9109 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
9111 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
9112 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
9113 g_signal_connect (adj, "value_changed",
9114 G_CALLBACK (adjust_align), pdata);
9115 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
9116 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
9118 label = gtk_label_new ("Ellipsize text :");
9119 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
9120 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9122 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9123 pdata->elmenu = build_option_menu (ellipsize_items,
9124 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
9125 2, // PANGO_ELLIPSIZE_MIDDLE
9126 progressbar_toggle_ellipsize,
9128 hbox = gtk_hbox_new (FALSE, 0);
9129 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
9130 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9132 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
9134 check = gtk_check_button_new_with_label ("Activity mode");
9135 g_signal_connect (check, "clicked",
9136 G_CALLBACK (toggle_activity_mode), pdata);
9137 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
9138 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9141 button = gtk_button_new_with_label ("close");
9142 g_signal_connect_swapped (button, "clicked",
9143 G_CALLBACK (gtk_widget_destroy),
9145 gtk_widget_set_can_default (button, TRUE);
9146 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
9147 button, TRUE, TRUE, 0);
9148 gtk_widget_grab_default (button);
9151 if (!gtk_widget_get_visible (pdata->window))
9152 gtk_widget_show_all (pdata->window);
9154 gtk_widget_destroy (pdata->window);
9166 GtkWidget *res_widget;
9170 find_widget (GtkWidget *widget, FindWidgetData *data)
9172 GtkAllocation new_allocation;
9176 new_allocation = widget->allocation;
9178 if (data->found || !gtk_widget_get_mapped (widget))
9181 /* Note that in the following code, we only count the
9182 * position as being inside a WINDOW widget if it is inside
9183 * widget->window; points that are outside of widget->window
9184 * but within the allocation are not counted. This is consistent
9185 * with the way we highlight drag targets.
9187 if (gtk_widget_get_has_window (widget))
9189 new_allocation.x = 0;
9190 new_allocation.y = 0;
9193 if (widget->parent && !data->first)
9195 GdkWindow *window = widget->window;
9196 while (window != widget->parent->window)
9198 gint tx, ty, twidth, theight;
9199 gdk_drawable_get_size (window, &twidth, &theight);
9201 if (new_allocation.x < 0)
9203 new_allocation.width += new_allocation.x;
9204 new_allocation.x = 0;
9206 if (new_allocation.y < 0)
9208 new_allocation.height += new_allocation.y;
9209 new_allocation.y = 0;
9211 if (new_allocation.x + new_allocation.width > twidth)
9212 new_allocation.width = twidth - new_allocation.x;
9213 if (new_allocation.y + new_allocation.height > theight)
9214 new_allocation.height = theight - new_allocation.y;
9216 gdk_window_get_position (window, &tx, &ty);
9217 new_allocation.x += tx;
9219 new_allocation.y += ty;
9222 window = gdk_window_get_parent (window);
9226 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
9227 (data->x < new_allocation.x + new_allocation.width) &&
9228 (data->y < new_allocation.y + new_allocation.height))
9230 /* First, check if the drag is in a valid drop site in
9231 * one of our children
9233 if (GTK_IS_CONTAINER (widget))
9235 FindWidgetData new_data = *data;
9237 new_data.x -= x_offset;
9238 new_data.y -= y_offset;
9239 new_data.found = FALSE;
9240 new_data.first = FALSE;
9242 gtk_container_forall (GTK_CONTAINER (widget),
9243 (GtkCallback)find_widget,
9246 data->found = new_data.found;
9248 data->res_widget = new_data.res_widget;
9251 /* If not, and this widget is registered as a drop site, check to
9252 * emit "drag_motion" to check if we are actually in
9258 data->res_widget = widget;
9264 find_widget_at_pointer (GdkDisplay *display)
9266 GtkWidget *widget = NULL;
9267 GdkWindow *pointer_window;
9269 FindWidgetData data;
9271 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
9275 gpointer widget_ptr;
9277 gdk_window_get_user_data (pointer_window, &widget_ptr);
9278 widget = widget_ptr;
9283 gdk_window_get_pointer (widget->window,
9291 find_widget (widget, &data);
9293 return data.res_widget;
9299 struct PropertiesData {
9307 destroy_properties (GtkWidget *widget,
9308 struct PropertiesData *data)
9312 *data->window = NULL;
9313 data->window = NULL;
9318 gdk_cursor_unref (data->cursor);
9319 data->cursor = NULL;
9324 g_signal_handler_disconnect (widget, data->handler);
9332 property_query_event (GtkWidget *widget,
9334 struct PropertiesData *data)
9336 GtkWidget *res_widget = NULL;
9338 if (!data->in_query)
9341 if (event->type == GDK_BUTTON_RELEASE)
9343 gtk_grab_remove (widget);
9344 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9347 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9350 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
9351 gtk_widget_get_screen (widget));
9352 create_prop_editor (G_OBJECT (res_widget), 0);
9355 data->in_query = FALSE;
9362 query_properties (GtkButton *button,
9363 struct PropertiesData *data)
9367 g_signal_connect (button, "event",
9368 G_CALLBACK (property_query_event), data);
9372 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9375 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9377 GDK_BUTTON_RELEASE_MASK,
9382 gtk_grab_add (GTK_WIDGET (button));
9384 data->in_query = TRUE;
9388 create_properties (GtkWidget *widget)
9390 static GtkWidget *window = NULL;
9394 struct PropertiesData *data;
9396 data = g_new (struct PropertiesData, 1);
9397 data->window = &window;
9398 data->in_query = FALSE;
9399 data->cursor = NULL;
9404 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9406 gtk_window_set_screen (GTK_WINDOW (window),
9407 gtk_widget_get_screen (widget));
9409 data->handler = g_signal_connect (window, "destroy",
9410 G_CALLBACK (destroy_properties),
9413 gtk_window_set_title (GTK_WINDOW (window), "test properties");
9414 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9416 vbox = gtk_vbox_new (FALSE, 1);
9417 gtk_container_add (GTK_CONTAINER (window), vbox);
9419 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9420 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9422 button = gtk_button_new_with_label ("Query properties");
9423 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9424 g_signal_connect (button, "clicked",
9425 G_CALLBACK (query_properties),
9429 if (!gtk_widget_get_visible (window))
9430 gtk_widget_show_all (window);
9432 gtk_widget_destroy (window);
9436 struct SnapshotData {
9437 GtkWidget *toplevel_button;
9441 gboolean is_toplevel;
9446 destroy_snapshot_data (GtkWidget *widget,
9447 struct SnapshotData *data)
9450 *data->window = NULL;
9454 gdk_cursor_unref (data->cursor);
9455 data->cursor = NULL;
9460 g_signal_handler_disconnect (widget, data->handler);
9468 snapshot_widget_event (GtkWidget *widget,
9470 struct SnapshotData *data)
9472 GtkWidget *res_widget = NULL;
9474 if (!data->in_query)
9477 if (event->type == GDK_BUTTON_RELEASE)
9479 gtk_grab_remove (widget);
9480 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9483 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9484 if (data->is_toplevel && res_widget)
9485 res_widget = gtk_widget_get_toplevel (res_widget);
9489 GtkWidget *window, *image;
9491 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9492 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9493 gtk_widget_realize (window);
9494 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
9496 /* this branch is needed to convert ARGB -> RGB */
9499 gdk_drawable_get_size (pixmap, &width, &height);
9500 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9501 gtk_widget_get_colormap (res_widget),
9505 image = gtk_image_new_from_pixbuf (pixbuf);
9506 g_object_unref (pixbuf);
9509 image = gtk_image_new_from_pixmap (pixmap, NULL);
9510 gtk_container_add (GTK_CONTAINER (window), image);
9511 g_object_unref (pixmap);
9512 gtk_widget_show_all (window);
9515 data->in_query = FALSE;
9522 snapshot_widget (GtkButton *button,
9523 struct SnapshotData *data)
9527 g_signal_connect (button, "event",
9528 G_CALLBACK (snapshot_widget_event), data);
9530 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
9533 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9536 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9538 GDK_BUTTON_RELEASE_MASK,
9543 gtk_grab_add (GTK_WIDGET (button));
9545 data->in_query = TRUE;
9549 create_snapshot (GtkWidget *widget)
9551 static GtkWidget *window = NULL;
9554 struct SnapshotData *data;
9556 data = g_new (struct SnapshotData, 1);
9557 data->window = &window;
9558 data->in_query = FALSE;
9559 data->cursor = NULL;
9564 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9566 gtk_window_set_screen (GTK_WINDOW (window),
9567 gtk_widget_get_screen (widget));
9569 data->handler = g_signal_connect (window, "destroy",
9570 G_CALLBACK (destroy_snapshot_data),
9573 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9574 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9576 vbox = gtk_vbox_new (FALSE, 1);
9577 gtk_container_add (GTK_CONTAINER (window), vbox);
9579 button = gtk_button_new_with_label ("Snapshot widget");
9580 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9581 g_signal_connect (button, "clicked",
9582 G_CALLBACK (snapshot_widget),
9585 button = gtk_button_new_with_label ("Snapshot toplevel");
9586 data->toplevel_button = button;
9587 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9588 g_signal_connect (button, "clicked",
9589 G_CALLBACK (snapshot_widget),
9593 if (!gtk_widget_get_visible (window))
9594 gtk_widget_show_all (window);
9596 gtk_widget_destroy (window);
9605 selection_test_received (GtkWidget *tree_view,
9606 GtkSelectionData *data)
9608 GtkTreeModel *model;
9609 GtkListStore *store;
9613 if (data->length < 0)
9615 g_print ("Selection retrieval failed\n");
9618 if (data->type != GDK_SELECTION_TYPE_ATOM)
9620 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9624 /* Clear out any current list items */
9626 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9627 store = GTK_LIST_STORE (model);
9628 gtk_list_store_clear (store);
9630 /* Add new items to list */
9632 atoms = (GdkAtom *)data->data;
9634 l = data->length / sizeof (GdkAtom);
9635 for (i = 0; i < l; i++)
9640 name = gdk_atom_name (atoms[i]);
9643 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9647 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9654 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9656 static GdkAtom targets_atom = GDK_NONE;
9658 if (targets_atom == GDK_NONE)
9659 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9661 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9666 create_selection_test (GtkWidget *widget)
9668 static GtkWidget *window = NULL;
9671 GtkWidget *scrolled_win;
9672 GtkListStore* store;
9673 GtkWidget *tree_view;
9674 GtkTreeViewColumn *column;
9675 GtkCellRenderer *renderer;
9680 window = gtk_dialog_new ();
9682 gtk_window_set_screen (GTK_WINDOW (window),
9683 gtk_widget_get_screen (widget));
9685 g_signal_connect (window, "destroy",
9686 G_CALLBACK (gtk_widget_destroyed),
9689 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9690 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9692 /* Create the list */
9694 vbox = gtk_vbox_new (FALSE, 5);
9695 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9696 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
9699 label = gtk_label_new ("Gets available targets for current selection");
9700 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9702 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9703 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9704 GTK_POLICY_AUTOMATIC,
9705 GTK_POLICY_AUTOMATIC);
9706 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9707 gtk_widget_set_size_request (scrolled_win, 100, 200);
9709 store = gtk_list_store_new (1, G_TYPE_STRING);
9710 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9711 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9713 renderer = gtk_cell_renderer_text_new ();
9714 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9716 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9718 g_signal_connect (tree_view, "selection_received",
9719 G_CALLBACK (selection_test_received), NULL);
9721 /* .. And create some buttons */
9722 button = gtk_button_new_with_label ("Get Targets");
9723 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9724 button, TRUE, TRUE, 0);
9726 g_signal_connect (button, "clicked",
9727 G_CALLBACK (selection_test_get_targets), tree_view);
9729 button = gtk_button_new_with_label ("Quit");
9730 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9731 button, TRUE, TRUE, 0);
9733 g_signal_connect_swapped (button, "clicked",
9734 G_CALLBACK (gtk_widget_destroy),
9738 if (!gtk_widget_get_visible (window))
9739 gtk_widget_show_all (window);
9741 gtk_widget_destroy (window);
9748 static int scroll_test_pos = 0.0;
9751 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9755 gint imin, imax, jmin, jmax;
9757 imin = (event->area.x) / 10;
9758 imax = (event->area.x + event->area.width + 9) / 10;
9760 jmin = ((int)adj->value + event->area.y) / 10;
9761 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9763 gdk_window_clear_area (widget->window,
9764 event->area.x, event->area.y,
9765 event->area.width, event->area.height);
9767 for (i=imin; i<imax; i++)
9768 for (j=jmin; j<jmax; j++)
9770 gdk_draw_rectangle (widget->window,
9771 widget->style->black_gc,
9773 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9779 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9782 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9783 -adj->page_increment / 2:
9784 adj->page_increment / 2);
9785 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9786 gtk_adjustment_set_value (adj, new_value);
9792 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9795 adj->page_increment = 0.9 * widget->allocation.height;
9796 adj->page_size = widget->allocation.height;
9798 g_signal_emit_by_name (adj, "changed");
9802 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9804 /* gint source_min = (int)adj->value - scroll_test_pos; */
9807 dy = scroll_test_pos - (int)adj->value;
9808 scroll_test_pos = adj->value;
9810 if (!gtk_widget_is_drawable (widget))
9812 gdk_window_scroll (widget->window, 0, dy);
9813 gdk_window_process_updates (widget->window, FALSE);
9818 create_scroll_test (GtkWidget *widget)
9820 static GtkWidget *window = NULL;
9822 GtkWidget *drawing_area;
9823 GtkWidget *scrollbar;
9826 GdkGeometry geometry;
9827 GdkWindowHints geometry_mask;
9831 window = gtk_dialog_new ();
9833 gtk_window_set_screen (GTK_WINDOW (window),
9834 gtk_widget_get_screen (widget));
9836 g_signal_connect (window, "destroy",
9837 G_CALLBACK (gtk_widget_destroyed),
9840 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9841 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9843 hbox = gtk_hbox_new (FALSE, 0);
9844 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
9846 gtk_widget_show (hbox);
9848 drawing_area = gtk_drawing_area_new ();
9849 gtk_widget_set_size_request (drawing_area, 200, 200);
9850 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9851 gtk_widget_show (drawing_area);
9853 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9855 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9856 scroll_test_pos = 0.0;
9858 scrollbar = gtk_vscrollbar_new (adj);
9859 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9860 gtk_widget_show (scrollbar);
9862 g_signal_connect (drawing_area, "expose_event",
9863 G_CALLBACK (scroll_test_expose), adj);
9864 g_signal_connect (drawing_area, "configure_event",
9865 G_CALLBACK (scroll_test_configure), adj);
9866 g_signal_connect (drawing_area, "scroll_event",
9867 G_CALLBACK (scroll_test_scroll), adj);
9869 g_signal_connect (adj, "value_changed",
9870 G_CALLBACK (scroll_test_adjustment_changed),
9873 /* .. And create some buttons */
9875 button = gtk_button_new_with_label ("Quit");
9876 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9877 button, TRUE, TRUE, 0);
9879 g_signal_connect_swapped (button, "clicked",
9880 G_CALLBACK (gtk_widget_destroy),
9882 gtk_widget_show (button);
9884 /* Set up gridded geometry */
9886 geometry_mask = GDK_HINT_MIN_SIZE |
9887 GDK_HINT_BASE_SIZE |
9888 GDK_HINT_RESIZE_INC;
9890 geometry.min_width = 20;
9891 geometry.min_height = 20;
9892 geometry.base_width = 0;
9893 geometry.base_height = 0;
9894 geometry.width_inc = 10;
9895 geometry.height_inc = 10;
9897 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9898 drawing_area, &geometry, geometry_mask);
9901 if (!gtk_widget_get_visible (window))
9902 gtk_widget_show (window);
9904 gtk_widget_destroy (window);
9911 static int timer = 0;
9914 timeout_test (GtkWidget *label)
9916 static int count = 0;
9917 static char buffer[32];
9919 sprintf (buffer, "count: %d", ++count);
9920 gtk_label_set_text (GTK_LABEL (label), buffer);
9926 start_timeout_test (GtkWidget *widget,
9931 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9936 stop_timeout_test (GtkWidget *widget,
9941 g_source_remove (timer);
9947 destroy_timeout_test (GtkWidget *widget,
9950 stop_timeout_test (NULL, NULL);
9956 create_timeout_test (GtkWidget *widget)
9958 static GtkWidget *window = NULL;
9964 window = gtk_dialog_new ();
9966 gtk_window_set_screen (GTK_WINDOW (window),
9967 gtk_widget_get_screen (widget));
9969 g_signal_connect (window, "destroy",
9970 G_CALLBACK (destroy_timeout_test),
9973 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9974 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9976 label = gtk_label_new ("count: 0");
9977 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9978 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
9979 label, TRUE, TRUE, 0);
9980 gtk_widget_show (label);
9982 button = gtk_button_new_with_label ("close");
9983 g_signal_connect_swapped (button, "clicked",
9984 G_CALLBACK (gtk_widget_destroy),
9986 gtk_widget_set_can_default (button, TRUE);
9987 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9988 button, TRUE, TRUE, 0);
9989 gtk_widget_grab_default (button);
9990 gtk_widget_show (button);
9992 button = gtk_button_new_with_label ("start");
9993 g_signal_connect (button, "clicked",
9994 G_CALLBACK(start_timeout_test),
9996 gtk_widget_set_can_default (button, TRUE);
9997 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9998 button, TRUE, TRUE, 0);
9999 gtk_widget_show (button);
10001 button = gtk_button_new_with_label ("stop");
10002 g_signal_connect (button, "clicked",
10003 G_CALLBACK (stop_timeout_test),
10005 gtk_widget_set_can_default (button, TRUE);
10006 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10007 button, TRUE, TRUE, 0);
10008 gtk_widget_show (button);
10011 if (!gtk_widget_get_visible (window))
10012 gtk_widget_show (window);
10014 gtk_widget_destroy (window);
10021 static int idle_id = 0;
10024 idle_test (GtkWidget *label)
10026 static int count = 0;
10027 static char buffer[32];
10029 sprintf (buffer, "count: %d", ++count);
10030 gtk_label_set_text (GTK_LABEL (label), buffer);
10036 start_idle_test (GtkWidget *widget,
10041 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
10046 stop_idle_test (GtkWidget *widget,
10051 g_source_remove (idle_id);
10057 destroy_idle_test (GtkWidget *widget,
10058 GtkWidget **window)
10060 stop_idle_test (NULL, NULL);
10066 toggle_idle_container (GObject *button,
10067 GtkContainer *container)
10069 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
10073 create_idle_test (GtkWidget *widget)
10075 static GtkWidget *window = NULL;
10078 GtkWidget *container;
10082 GtkWidget *button2;
10086 window = gtk_dialog_new ();
10088 gtk_window_set_screen (GTK_WINDOW (window),
10089 gtk_widget_get_screen (widget));
10091 g_signal_connect (window, "destroy",
10092 G_CALLBACK (destroy_idle_test),
10095 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
10096 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10098 label = gtk_label_new ("count: 0");
10099 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10100 gtk_widget_show (label);
10103 g_object_new (GTK_TYPE_HBOX,
10105 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
10106 * "GtkWidget::visible", TRUE,
10111 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
10112 container, TRUE, TRUE, 0);
10115 g_object_new (GTK_TYPE_FRAME,
10117 "label", "Label Container",
10119 "parent", GTK_DIALOG (window)->vbox,
10122 g_object_new (GTK_TYPE_VBOX,
10127 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
10128 "label", "Resize-Parent",
10129 "user_data", (void*)GTK_RESIZE_PARENT,
10133 "signal::clicked", toggle_idle_container, container,
10135 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
10136 "label", "Resize-Queue",
10137 "user_data", (void*)GTK_RESIZE_QUEUE,
10142 g_object_connect (button,
10143 "signal::clicked", toggle_idle_container, container,
10145 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
10146 "label", "Resize-Immediate",
10147 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
10149 g_object_connect (button2,
10150 "signal::clicked", toggle_idle_container, container,
10152 g_object_set (button2,
10158 button = gtk_button_new_with_label ("close");
10159 g_signal_connect_swapped (button, "clicked",
10160 G_CALLBACK (gtk_widget_destroy),
10162 gtk_widget_set_can_default (button, TRUE);
10163 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10164 button, TRUE, TRUE, 0);
10165 gtk_widget_grab_default (button);
10166 gtk_widget_show (button);
10168 button = gtk_button_new_with_label ("start");
10169 g_signal_connect (button, "clicked",
10170 G_CALLBACK (start_idle_test),
10172 gtk_widget_set_can_default (button, TRUE);
10173 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10174 button, TRUE, TRUE, 0);
10175 gtk_widget_show (button);
10177 button = gtk_button_new_with_label ("stop");
10178 g_signal_connect (button, "clicked",
10179 G_CALLBACK (stop_idle_test),
10181 gtk_widget_set_can_default (button, TRUE);
10182 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10183 button, TRUE, TRUE, 0);
10184 gtk_widget_show (button);
10187 if (!gtk_widget_get_visible (window))
10188 gtk_widget_show (window);
10190 gtk_widget_destroy (window);
10198 reload_all_rc_files (void)
10200 static GdkAtom atom_rcfiles = GDK_NONE;
10202 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
10206 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
10208 for(i = 0; i < 5; i++)
10209 send_event->client.data.l[i] = 0;
10210 send_event->client.data_format = 32;
10211 send_event->client.message_type = atom_rcfiles;
10212 gdk_event_send_clientmessage_toall (send_event);
10214 gdk_event_free (send_event);
10218 create_rc_file (GtkWidget *widget)
10220 static GtkWidget *window = NULL;
10228 window = gtk_dialog_new ();
10230 gtk_window_set_screen (GTK_WINDOW (window),
10231 gtk_widget_get_screen (widget));
10233 g_signal_connect (window, "destroy",
10234 G_CALLBACK (gtk_widget_destroyed),
10237 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
10238 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
10240 vbox = gtk_vbox_new (FALSE, 0);
10241 gtk_container_add (GTK_CONTAINER (frame), vbox);
10243 label = gtk_label_new ("This label should be red");
10244 gtk_widget_set_name (label, "testgtk-red-label");
10245 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10247 label = gtk_label_new ("This label should be green");
10248 gtk_widget_set_name (label, "testgtk-green-label");
10249 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10251 label = gtk_label_new ("This label should be blue");
10252 gtk_widget_set_name (label, "testgtk-blue-label");
10253 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10255 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
10256 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10258 button = gtk_button_new_with_label ("Reload");
10259 g_signal_connect (button, "clicked",
10260 G_CALLBACK (gtk_rc_reparse_all), NULL);
10261 gtk_widget_set_can_default (button, TRUE);
10262 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10263 button, TRUE, TRUE, 0);
10264 gtk_widget_grab_default (button);
10266 button = gtk_button_new_with_label ("Reload All");
10267 g_signal_connect (button, "clicked",
10268 G_CALLBACK (reload_all_rc_files), NULL);
10269 gtk_widget_set_can_default (button, TRUE);
10270 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10271 button, TRUE, TRUE, 0);
10273 button = gtk_button_new_with_label ("Close");
10274 g_signal_connect_swapped (button, "clicked",
10275 G_CALLBACK (gtk_widget_destroy),
10277 gtk_widget_set_can_default (button, TRUE);
10278 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10279 button, TRUE, TRUE, 0);
10282 if (!gtk_widget_get_visible (window))
10283 gtk_widget_show_all (window);
10285 gtk_widget_destroy (window);
10289 * Test of recursive mainloop
10293 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
10300 create_mainloop (GtkWidget *widget)
10302 static GtkWidget *window = NULL;
10308 window = gtk_dialog_new ();
10310 gtk_window_set_screen (GTK_WINDOW (window),
10311 gtk_widget_get_screen (widget));
10313 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
10315 g_signal_connect (window, "destroy",
10316 G_CALLBACK (mainloop_destroyed),
10319 label = gtk_label_new ("In recursive main loop...");
10320 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
10322 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
10324 gtk_widget_show (label);
10326 button = gtk_button_new_with_label ("Leave");
10327 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
10330 g_signal_connect_swapped (button, "clicked",
10331 G_CALLBACK (gtk_widget_destroy),
10334 gtk_widget_set_can_default (button, TRUE);
10335 gtk_widget_grab_default (button);
10337 gtk_widget_show (button);
10340 if (!gtk_widget_get_visible (window))
10342 gtk_widget_show (window);
10344 g_print ("create_mainloop: start\n");
10346 g_print ("create_mainloop: done\n");
10349 gtk_widget_destroy (window);
10353 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
10358 gint imin, imax, jmin, jmax;
10360 layout = GTK_LAYOUT (widget);
10362 if (event->window != layout->bin_window)
10365 imin = (event->area.x) / 10;
10366 imax = (event->area.x + event->area.width + 9) / 10;
10368 jmin = (event->area.y) / 10;
10369 jmax = (event->area.y + event->area.height + 9) / 10;
10371 for (i=imin; i<imax; i++)
10372 for (j=jmin; j<jmax; j++)
10374 gdk_draw_rectangle (layout->bin_window,
10375 widget->style->black_gc,
10383 void create_layout (GtkWidget *widget)
10385 static GtkWidget *window = NULL;
10387 GtkWidget *scrolledwindow;
10396 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10397 gtk_window_set_screen (GTK_WINDOW (window),
10398 gtk_widget_get_screen (widget));
10400 g_signal_connect (window, "destroy",
10401 G_CALLBACK (gtk_widget_destroyed),
10404 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10405 gtk_widget_set_size_request (window, 200, 200);
10407 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10408 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10410 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10411 GTK_CORNER_TOP_RIGHT);
10413 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10415 layout = gtk_layout_new (NULL, NULL);
10416 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
10418 /* We set step sizes here since GtkLayout does not set
10421 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
10422 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
10424 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
10425 g_signal_connect (layout, "expose_event",
10426 G_CALLBACK (layout_expose_handler), NULL);
10428 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
10430 for (i=0 ; i < 16 ; i++)
10431 for (j=0 ; j < 16 ; j++)
10433 sprintf(buf, "Button %d, %d", i, j);
10435 button = gtk_button_new_with_label (buf);
10437 button = gtk_label_new (buf);
10439 gtk_layout_put (GTK_LAYOUT (layout), button,
10443 for (i=16; i < 1280; i++)
10445 sprintf(buf, "Button %d, %d", i, 0);
10447 button = gtk_button_new_with_label (buf);
10449 button = gtk_label_new (buf);
10451 gtk_layout_put (GTK_LAYOUT (layout), button,
10456 if (!gtk_widget_get_visible (window))
10457 gtk_widget_show_all (window);
10459 gtk_widget_destroy (window);
10463 create_styles (GtkWidget *widget)
10465 static GtkWidget *window = NULL;
10470 static GdkColor red = { 0, 0xffff, 0, 0 };
10471 static GdkColor green = { 0, 0, 0xffff, 0 };
10472 static GdkColor blue = { 0, 0, 0, 0xffff };
10473 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10474 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10475 PangoFontDescription *font_desc;
10477 GtkRcStyle *rc_style;
10481 window = gtk_dialog_new ();
10482 gtk_window_set_screen (GTK_WINDOW (window),
10483 gtk_widget_get_screen (widget));
10485 g_signal_connect (window, "destroy",
10486 G_CALLBACK (gtk_widget_destroyed),
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 (GTK_DIALOG (window)->action_area),
10496 button, TRUE, TRUE, 0);
10497 gtk_widget_show (button);
10499 vbox = gtk_vbox_new (FALSE, 5);
10500 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10501 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
10503 label = gtk_label_new ("Font:");
10504 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10505 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10507 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10509 button = gtk_button_new_with_label ("Some Text");
10510 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
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 (button)->child, GTK_STATE_NORMAL, &red);
10519 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10521 label = gtk_label_new ("Background:");
10522 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10523 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10525 button = gtk_button_new_with_label ("Some Text");
10526 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10527 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10529 label = gtk_label_new ("Text:");
10530 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10531 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10533 entry = gtk_entry_new ();
10534 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10535 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10536 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10538 label = gtk_label_new ("Base:");
10539 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10540 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10542 entry = gtk_entry_new ();
10543 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10544 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10545 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10547 label = gtk_label_new ("Cursor:");
10548 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10549 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10551 entry = gtk_entry_new ();
10552 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10553 gtk_widget_modify_cursor (entry, &red, &red);
10554 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10556 label = gtk_label_new ("Multiple:");
10557 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10558 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10560 button = gtk_button_new_with_label ("Some Text");
10562 rc_style = gtk_rc_style_new ();
10564 rc_style->font_desc = pango_font_description_copy (font_desc);
10565 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10566 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10567 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10568 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10569 rc_style->bg[GTK_STATE_NORMAL] = blue;
10570 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10571 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10572 rc_style->fg[GTK_STATE_ACTIVE] = red;
10573 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10574 rc_style->xthickness = 5;
10575 rc_style->ythickness = 5;
10577 gtk_widget_modify_style (button, rc_style);
10578 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
10580 g_object_unref (rc_style);
10582 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10585 if (!gtk_widget_get_visible (window))
10586 gtk_widget_show_all (window);
10588 gtk_widget_destroy (window);
10592 * Main Window and Exit
10596 do_exit (GtkWidget *widget, GtkWidget *window)
10598 gtk_widget_destroy (window);
10604 void (*func) (GtkWidget *widget);
10605 gboolean do_not_benchmark;
10608 { "alpha window", create_alpha_window },
10609 { "big windows", create_big_windows },
10610 { "button box", create_button_box },
10611 { "buttons", create_buttons },
10612 { "check buttons", create_check_buttons },
10613 { "color selection", create_color_selection },
10614 { "composited window", create_composited_window },
10615 { "cursors", create_cursors },
10616 { "dialog", create_dialog },
10617 { "display & screen", create_display_screen, TRUE },
10618 { "entry", create_entry },
10619 { "event box", create_event_box },
10620 { "event watcher", create_event_watcher },
10621 { "expander", create_expander },
10622 { "flipping", create_flipping },
10623 { "focus", create_focus },
10624 { "font selection", create_font_selection },
10625 { "gridded geometry", create_gridded_geometry },
10626 { "handle box", create_handle_box },
10627 { "image from drawable", create_get_image },
10628 { "image", create_image },
10629 { "key lookup", create_key_lookup },
10630 { "labels", create_labels },
10631 { "layout", create_layout },
10632 { "menus", create_menus },
10633 { "message dialog", create_message_dialog },
10634 { "modal window", create_modal_window, TRUE },
10635 { "notebook", create_notebook },
10636 { "panes", create_panes },
10637 { "paned keyboard", create_paned_keyboard_navigation },
10638 { "pixmap", create_pixmap },
10639 { "progress bar", create_progress_bar },
10640 { "properties", create_properties },
10641 { "radio buttons", create_radio_buttons },
10642 { "range controls", create_range_controls },
10643 { "rc file", create_rc_file },
10644 { "reparent", create_reparent },
10645 { "resize grips", create_resize_grips },
10646 { "rotated label", create_rotated_label },
10647 { "rotated text", create_rotated_text },
10648 { "rulers", create_rulers },
10649 { "saved position", create_saved_position },
10650 { "scrolled windows", create_scrolled_windows },
10651 { "shapes", create_shapes },
10652 { "size groups", create_size_groups },
10653 { "snapshot", create_snapshot },
10654 { "spinbutton", create_spins },
10655 { "statusbar", create_statusbar },
10656 { "styles", create_styles },
10657 { "test idle", create_idle_test },
10658 { "test mainloop", create_mainloop, TRUE },
10659 { "test scrolling", create_scroll_test },
10660 { "test selection", create_selection_test },
10661 { "test timeout", create_timeout_test },
10662 { "toggle buttons", create_toggle_buttons },
10663 { "toolbar", create_toolbar },
10664 { "tooltips", create_tooltips },
10665 { "WM hints", create_wmhints },
10666 { "window sizing", create_window_sizing },
10667 { "window states", create_window_states }
10669 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10672 create_main_window (void)
10677 GtkWidget *scrolled_window;
10681 GtkWidget *separator;
10682 GdkGeometry geometry;
10685 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10686 gtk_widget_set_name (window, "main window");
10687 gtk_window_move (GTK_WINDOW (window), 50, 20);
10688 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10690 geometry.min_width = -1;
10691 geometry.min_height = -1;
10692 geometry.max_width = -1;
10693 geometry.max_height = G_MAXSHORT;
10694 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10696 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10698 g_signal_connect (window, "destroy",
10699 G_CALLBACK (gtk_main_quit),
10701 g_signal_connect (window, "delete-event",
10702 G_CALLBACK (gtk_false),
10705 box1 = gtk_vbox_new (FALSE, 0);
10706 gtk_container_add (GTK_CONTAINER (window), box1);
10708 if (gtk_micro_version > 0)
10713 gtk_micro_version);
10718 gtk_minor_version);
10720 label = gtk_label_new (buffer);
10721 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10722 gtk_widget_set_name (label, "testgtk-version-label");
10724 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10725 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10726 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10728 GTK_POLICY_AUTOMATIC);
10729 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10731 box2 = gtk_vbox_new (FALSE, 0);
10732 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10733 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10734 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10735 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10736 gtk_widget_show (box2);
10738 for (i = 0; i < nbuttons; i++)
10740 button = gtk_button_new_with_label (buttons[i].label);
10741 if (buttons[i].func)
10742 g_signal_connect (button,
10744 G_CALLBACK(buttons[i].func),
10747 gtk_widget_set_sensitive (button, FALSE);
10748 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10751 separator = gtk_hseparator_new ();
10752 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10754 box2 = gtk_vbox_new (FALSE, 10);
10755 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10756 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10758 button = gtk_button_new_with_mnemonic ("_Close");
10759 g_signal_connect (button, "clicked",
10760 G_CALLBACK (do_exit),
10762 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10763 gtk_widget_set_can_default (button, TRUE);
10764 gtk_widget_grab_default (button);
10766 gtk_widget_show_all (window);
10772 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10773 G_FILE_TEST_EXISTS))
10775 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
10776 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
10781 pad (const char *str, int to)
10783 static char buf[256];
10784 int len = strlen (str);
10787 for (i = 0; i < to; i++)
10792 memcpy (buf, str, len);
10798 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10800 fn (widget); /* on */
10801 while (g_main_context_iteration (NULL, FALSE));
10802 fn (widget); /* off */
10803 while (g_main_context_iteration (NULL, FALSE));
10807 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10813 static gboolean printed_headers = FALSE;
10815 if (!printed_headers) {
10816 g_print ("Test Iters First Other\n");
10817 g_print ("-------------------- ----- ---------- ----------\n");
10818 printed_headers = TRUE;
10821 g_get_current_time (&tv0);
10822 bench_iteration (widget, fn);
10823 g_get_current_time (&tv1);
10825 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10826 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10828 g_get_current_time (&tv0);
10829 for (n = 0; n < num - 1; n++)
10830 bench_iteration (widget, fn);
10831 g_get_current_time (&tv1);
10832 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10833 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10835 g_print ("%s %5d ", pad (name, 20), num);
10837 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10839 g_print ("%10.1f\n", dt_first);
10843 do_bench (char* what, int num)
10847 void (* fn) (GtkWidget *widget);
10849 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10851 if (g_ascii_strcasecmp (what, "ALL") == 0)
10853 for (i = 0; i < nbuttons; i++)
10855 if (!buttons[i].do_not_benchmark)
10856 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10863 for (i = 0; i < nbuttons; i++)
10865 if (strcmp (buttons[i].label, what) == 0)
10867 fn = buttons[i].func;
10873 g_print ("Can't bench: \"%s\" not found.\n", what);
10875 do_real_bench (widget, fn, buttons[i].label, num);
10882 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10887 main (int argc, char *argv[])
10889 GtkBindingSet *binding_set;
10891 gboolean done_benchmarks = FALSE;
10893 srand (time (NULL));
10897 /* Check to see if we are being run from the correct
10900 if (file_exists ("testgtkrc"))
10901 gtk_rc_add_default_file ("testgtkrc");
10902 else if (file_exists ("tests/testgtkrc"))
10903 gtk_rc_add_default_file ("tests/testgtkrc");
10905 g_warning ("Couldn't find file \"testgtkrc\".");
10907 g_set_application_name ("GTK+ Test Program");
10909 gtk_init (&argc, &argv);
10911 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10920 for (i = 1; i < argc; i++)
10922 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10929 nextarg = strchr (argv[i], '=');
10940 count = strchr (nextarg, ':');
10943 what = g_strndup (nextarg, count - nextarg);
10945 num = atoi (count);
10950 what = g_strdup (nextarg);
10952 do_bench (what, num ? num : 1);
10953 done_benchmarks = TRUE;
10958 if (done_benchmarks)
10963 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10964 gtk_binding_entry_add_signal (binding_set,
10965 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10968 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10970 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
10974 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
10975 " fg[NORMAL] = \"#ff0000\"\n"
10976 " font = \"Sans 18\"\n"
10978 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
10980 create_main_window ();
10986 while (g_main_context_pending (NULL))
10987 g_main_context_iteration (NULL, FALSE);
10990 while (g_main_context_pending (NULL))
10991 g_main_context_iteration (NULL, FALSE);