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_usize (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 tips_query_widget_entered (GtkTipsQuery *tips_query,
3364 const gchar *tip_text,
3365 const gchar *tip_private,
3368 if (GTK_TOGGLE_BUTTON (toggle)->active)
3370 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3371 /* don't let GtkTipsQuery reset its label */
3372 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3377 tips_query_widget_selected (GtkWidget *tips_query,
3379 const gchar *tip_text,
3380 const gchar *tip_private,
3381 GdkEventButton *event,
3385 g_print ("Help \"%s\" requested for <%s>\n",
3386 tip_private ? tip_private : "None",
3387 g_type_name (G_OBJECT_TYPE (widget)));
3392 create_tooltips (GtkWidget *widget)
3394 static GtkWidget *window = NULL;
3401 GtkWidget *tips_query;
3402 GtkWidget *separator;
3407 g_object_new (gtk_window_get_type (),
3408 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3409 "GtkContainer::border_width", 0,
3410 "GtkWindow::title", "Tooltips",
3411 "GtkWindow::allow_shrink", TRUE,
3412 "GtkWindow::allow_grow", FALSE,
3415 gtk_window_set_screen (GTK_WINDOW (window),
3416 gtk_widget_get_screen (widget));
3418 box1 = gtk_vbox_new (FALSE, 0);
3419 gtk_container_add (GTK_CONTAINER (window), box1);
3421 box2 = gtk_vbox_new (FALSE, 10);
3422 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3423 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3425 button = gtk_toggle_button_new_with_label ("button1");
3426 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3428 gtk_widget_set_tooltip_text (button, "This is button 1");
3430 button = gtk_toggle_button_new_with_label ("button2");
3431 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3433 gtk_widget_set_tooltip_text (button,
3434 "This is button 2. This is also a really long tooltip which probably "
3435 "won't fit on a single line and will therefore need to be wrapped. "
3436 "Hopefully the wrapping will work correctly.");
3438 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3439 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3441 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
3444 g_object_new (gtk_vbox_get_type (),
3445 "homogeneous", FALSE,
3451 tips_query = gtk_tips_query_new ();
3454 g_object_new (gtk_button_get_type (),
3459 g_object_connect (button,
3460 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3462 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3463 gtk_widget_set_tooltip_text (button "Start the Tooltips Inspector");
3465 g_object_set (g_object_connect (tips_query,
3466 "signal::widget_entered", tips_query_widget_entered, toggle,
3467 "signal::widget_selected", tips_query_widget_selected, NULL,
3474 frame = g_object_new (gtk_frame_get_type (),
3475 "label", "ToolTips Inspector",
3476 "label_xalign", (double) 0.5,
3482 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3484 separator = gtk_hseparator_new ();
3485 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3487 box2 = gtk_vbox_new (FALSE, 10);
3488 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3489 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3491 button = gtk_button_new_with_label ("close");
3492 g_signal_connect_swapped (button, "clicked",
3493 G_CALLBACK (gtk_widget_destroy),
3495 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3496 gtk_widget_set_can_default (button, TRUE);
3497 gtk_widget_grab_default (button);
3499 gtk_widget_set_tooltip_text (button, "Push this button to close window");
3502 if (!gtk_widget_get_visible (window))
3503 gtk_widget_show_all (window);
3505 gtk_widget_destroy (window);
3513 pack_image (GtkWidget *box,
3517 gtk_box_pack_start (GTK_BOX (box),
3518 gtk_label_new (text),
3521 gtk_box_pack_start (GTK_BOX (box),
3527 create_image (GtkWidget *widget)
3529 static GtkWidget *window = NULL;
3537 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3539 gtk_window_set_screen (GTK_WINDOW (window),
3540 gtk_widget_get_screen (widget));
3542 /* this is bogus for testing drawing when allocation < request,
3543 * don't copy into real code
3545 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
3547 g_signal_connect (window, "destroy",
3548 G_CALLBACK (gtk_widget_destroyed),
3551 vbox = gtk_vbox_new (FALSE, 5);
3553 gtk_container_add (GTK_CONTAINER (window), vbox);
3555 pack_image (vbox, "Stock Warning Dialog",
3556 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3557 GTK_ICON_SIZE_DIALOG));
3559 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
3560 gtk_widget_get_colormap (window),
3565 pack_image (vbox, "Pixmap",
3566 gtk_image_new_from_pixmap (pixmap, mask));
3569 if (!gtk_widget_get_visible (window))
3570 gtk_widget_show_all (window);
3572 gtk_widget_destroy (window);
3580 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3583 GtkWidget *menuitem;
3592 menu = gtk_menu_new ();
3593 gtk_menu_set_screen (GTK_MENU (menu), screen);
3599 menuitem = gtk_tearoff_menu_item_new ();
3600 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3601 gtk_widget_show (menuitem);
3604 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3605 GTK_ICON_SIZE_MENU);
3606 gtk_widget_show (image);
3607 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3608 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3609 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3610 gtk_widget_show (menuitem);
3612 for (i = 0, j = 1; i < length; i++, j++)
3614 sprintf (buf, "item %2d - %d", depth, j);
3616 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3617 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3619 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3620 gtk_widget_show (menuitem);
3622 gtk_widget_set_sensitive (menuitem, FALSE);
3625 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3629 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3630 create_menu (screen, depth - 1, 5, TRUE));
3637 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3640 GtkWidget *menuitem;
3646 menu = gtk_menu_new ();
3647 gtk_menu_set_screen (GTK_MENU (menu), screen);
3652 menuitem = gtk_tearoff_menu_item_new ();
3653 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3654 gtk_widget_show (menuitem);
3658 menuitem = gtk_menu_item_new_with_label ("items");
3659 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3661 submenu = gtk_menu_new ();
3662 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3663 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3664 gtk_widget_show (menuitem);
3667 /* now fill the items submenu */
3668 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3669 GTK_ICON_SIZE_MENU);
3670 gtk_widget_show (image);
3671 menuitem = gtk_image_menu_item_new_with_label ("Image");
3672 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3673 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3674 gtk_widget_show (menuitem);
3676 menuitem = gtk_menu_item_new_with_label ("x");
3677 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3678 gtk_widget_show (menuitem);
3680 menuitem = gtk_menu_item_new_with_label ("x");
3681 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3682 gtk_widget_show (menuitem);
3684 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3685 GTK_ICON_SIZE_MENU);
3686 gtk_widget_show (image);
3687 menuitem = gtk_image_menu_item_new_with_label ("Image");
3688 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3689 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3690 gtk_widget_show (menuitem);
3692 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3693 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3694 gtk_widget_show (menuitem);
3696 menuitem = gtk_menu_item_new_with_label ("x");
3697 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3698 gtk_widget_show (menuitem);
3700 menuitem = gtk_menu_item_new_with_label ("x");
3701 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3702 gtk_widget_show (menuitem);
3704 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3705 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3706 gtk_widget_show (menuitem);
3708 menuitem = gtk_check_menu_item_new_with_label ("Check");
3709 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3710 gtk_widget_show (menuitem);
3712 menuitem = gtk_menu_item_new_with_label ("x");
3713 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3714 gtk_widget_show (menuitem);
3716 menuitem = gtk_menu_item_new_with_label ("x");
3717 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3718 gtk_widget_show (menuitem);
3720 menuitem = gtk_check_menu_item_new_with_label ("Check");
3721 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3722 gtk_widget_show (menuitem);
3724 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3725 gtk_widget_show (menuitem);
3726 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3728 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3729 gtk_widget_show (menuitem);
3730 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3732 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3733 gtk_widget_show (menuitem);
3734 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3736 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3737 gtk_widget_show (menuitem);
3738 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3740 /* end of items submenu */
3742 menuitem = gtk_menu_item_new_with_label ("spanning");
3743 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3745 submenu = gtk_menu_new ();
3746 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3747 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3748 gtk_widget_show (menuitem);
3751 /* now fill the spanning submenu */
3752 menuitem = gtk_menu_item_new_with_label ("a");
3753 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3754 gtk_widget_show (menuitem);
3756 menuitem = gtk_menu_item_new_with_label ("b");
3757 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3758 gtk_widget_show (menuitem);
3760 menuitem = gtk_menu_item_new_with_label ("c");
3761 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3762 gtk_widget_show (menuitem);
3764 menuitem = gtk_menu_item_new_with_label ("d");
3765 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3766 gtk_widget_show (menuitem);
3768 menuitem = gtk_menu_item_new_with_label ("e");
3769 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3770 gtk_widget_show (menuitem);
3771 /* end of spanning submenu */
3773 menuitem = gtk_menu_item_new_with_label ("left");
3774 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3775 submenu = gtk_menu_new ();
3776 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3777 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3778 gtk_widget_show (menuitem);
3780 menuitem = gtk_menu_item_new_with_label ("Empty");
3781 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3782 submenu = gtk_menu_new ();
3783 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3784 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3785 gtk_widget_show (menuitem);
3787 menuitem = gtk_menu_item_new_with_label ("right");
3788 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3789 submenu = gtk_menu_new ();
3790 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3791 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3792 gtk_widget_show (menuitem);
3794 menuitem = gtk_menu_item_new_with_label ("Empty");
3795 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3796 gtk_widget_show (menuitem);
3800 for (; j < rows; j++)
3801 for (i = 0; i < cols; i++)
3803 sprintf (buf, "(%d %d)", i, j);
3804 menuitem = gtk_menu_item_new_with_label (buf);
3805 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3806 gtk_widget_show (menuitem);
3809 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3810 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3811 gtk_widget_show (menuitem);
3812 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3813 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3814 gtk_widget_show (menuitem);
3815 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3816 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3817 gtk_widget_show (menuitem);
3818 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3819 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3820 gtk_widget_show (menuitem);
3826 create_menus (GtkWidget *widget)
3828 static GtkWidget *window = NULL;
3832 GtkWidget *optionmenu;
3833 GtkWidget *separator;
3839 GtkWidget *menuitem;
3840 GtkAccelGroup *accel_group;
3842 GdkScreen *screen = gtk_widget_get_screen (widget);
3844 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3846 gtk_window_set_screen (GTK_WINDOW (window), screen);
3848 g_signal_connect (window, "destroy",
3849 G_CALLBACK (gtk_widget_destroyed),
3851 g_signal_connect (window, "delete-event",
3852 G_CALLBACK (gtk_true),
3855 accel_group = gtk_accel_group_new ();
3856 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3858 gtk_window_set_title (GTK_WINDOW (window), "menus");
3859 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3862 box1 = gtk_vbox_new (FALSE, 0);
3863 gtk_container_add (GTK_CONTAINER (window), box1);
3864 gtk_widget_show (box1);
3866 menubar = gtk_menu_bar_new ();
3867 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3868 gtk_widget_show (menubar);
3870 menu = create_menu (screen, 2, 50, TRUE);
3872 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3873 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3874 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3875 gtk_widget_show (menuitem);
3877 menu = create_table_menu (screen, 2, 50, TRUE);
3879 menuitem = gtk_menu_item_new_with_label ("table");
3880 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3881 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3882 gtk_widget_show (menuitem);
3884 menuitem = gtk_menu_item_new_with_label ("foo");
3885 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3886 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3887 gtk_widget_show (menuitem);
3889 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3890 GTK_ICON_SIZE_MENU);
3891 gtk_widget_show (image);
3892 menuitem = gtk_image_menu_item_new_with_label ("Help");
3893 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3894 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3895 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3896 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3897 gtk_widget_show (menuitem);
3899 menubar = gtk_menu_bar_new ();
3900 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3901 gtk_widget_show (menubar);
3903 menu = create_menu (screen, 2, 10, TRUE);
3905 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3906 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3907 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3908 gtk_widget_show (menuitem);
3910 box2 = gtk_vbox_new (FALSE, 10);
3911 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3912 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3913 gtk_widget_show (box2);
3915 menu = create_menu (screen, 1, 5, FALSE);
3916 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3918 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3919 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3920 gtk_widget_show (menuitem);
3922 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3923 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3924 gtk_widget_show (menuitem);
3925 gtk_widget_add_accelerator (menuitem,
3931 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3932 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3933 gtk_widget_show (menuitem);
3934 gtk_widget_add_accelerator (menuitem,
3939 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3940 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3941 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3942 gtk_widget_show (menuitem);
3943 gtk_widget_add_accelerator (menuitem,
3949 gtk_widget_add_accelerator (menuitem,
3956 optionmenu = gtk_combo_box_new_text ();
3957 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3958 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3959 gtk_widget_show (optionmenu);
3961 separator = gtk_hseparator_new ();
3962 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3963 gtk_widget_show (separator);
3965 box2 = gtk_vbox_new (FALSE, 10);
3966 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3967 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3968 gtk_widget_show (box2);
3970 button = gtk_button_new_with_label ("close");
3971 g_signal_connect_swapped (button, "clicked",
3972 G_CALLBACK (gtk_widget_destroy),
3974 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3975 gtk_widget_set_can_default (button, TRUE);
3976 gtk_widget_grab_default (button);
3977 gtk_widget_show (button);
3980 if (!gtk_widget_get_visible (window))
3981 gtk_widget_show (window);
3983 gtk_widget_destroy (window);
3986 /* GdkPixbuf RGBA C-Source image dump */
3988 static const guint8 apple[] =
3990 /* Pixbuf magic (0x47646b50) */
3992 /* length: header (24) + pixel_data (2304) */
3994 /* pixdata_type (0x1010002) */
3996 /* rowstride (96) */
4003 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4004 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4005 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4006 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4007 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4008 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4009 "\0\0\0\0\0\0\0\0\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"
4010 "\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"
4011 "\0\0\0\0\0\0\0\0\0\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"
4012 "[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"
4013 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4014 "\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"
4015 "\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"
4016 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4017 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
4018 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
4019 "\0\0\0\0\0\0\0\0\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"
4020 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
4021 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
4022 "\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["
4023 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
4024 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
4025 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
4026 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
4027 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
4028 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
4029 "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"
4030 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
4031 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
4032 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
4033 "\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"
4034 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
4035 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
4036 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
4037 "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"
4038 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
4039 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
4040 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
4041 "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"
4042 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
4043 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
4044 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4045 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4046 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4047 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4048 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4049 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4050 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4051 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4052 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4053 "\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>"
4054 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4055 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4056 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4057 "\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"
4058 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4059 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4060 "\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"
4061 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4062 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4063 "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"
4064 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4065 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4066 "\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"
4067 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4068 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4069 "\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"
4070 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4071 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4072 "\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"
4073 "\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"
4074 "\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"
4075 "\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"
4076 "\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"
4077 "\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"
4078 "\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"
4079 "\0\0\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"
4080 "\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"
4081 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4085 dump_accels (gpointer callback_data,
4086 guint callback_action,
4089 gtk_accel_map_save_fd (1 /* stdout */);
4093 accel_button_new (GtkAccelGroup *accel_group,
4098 GdkModifierType modifiers;
4102 gtk_accelerator_parse (accel, &keyval, &modifiers);
4105 button = gtk_button_new ();
4106 gtk_widget_add_accelerator (button, "activate", accel_group,
4107 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4109 label = gtk_accel_label_new (text);
4110 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4111 gtk_widget_show (label);
4113 gtk_container_add (GTK_CONTAINER (button), label);
4119 create_key_lookup (GtkWidget *widget)
4121 static GtkWidget *window = NULL;
4122 gpointer window_ptr;
4126 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4129 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4130 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4133 gtk_window_set_screen (GTK_WINDOW (window),
4134 gtk_widget_get_screen (widget));
4136 /* We have to expand it so the accel labels will draw their labels
4138 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4140 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4142 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4143 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4144 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4145 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4146 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4147 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4148 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4149 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4150 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4151 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4152 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4153 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4154 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4155 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4156 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4157 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4158 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4159 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4160 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4161 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4162 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4163 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4164 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4165 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4166 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4167 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4168 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4169 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4171 window_ptr = &window;
4172 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
4173 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4175 gtk_widget_show_all (window);
4178 gtk_widget_destroy (window);
4187 cmw_destroy_cb(GtkWidget *widget)
4189 /* This is needed to get out of gtk_main */
4196 cmw_color (GtkWidget *widget, GtkWidget *parent)
4200 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4202 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4204 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4208 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4210 /* And mark it as a transient dialog */
4211 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4213 g_signal_connect (csd, "destroy",
4214 G_CALLBACK (cmw_destroy_cb), NULL);
4216 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4217 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4218 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4219 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4221 /* wait until destroy calls gtk_main_quit */
4222 gtk_widget_show (csd);
4227 cmw_file (GtkWidget *widget, GtkWidget *parent)
4231 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
4232 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
4233 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
4234 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
4236 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4237 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
4239 g_signal_connect (fs, "destroy",
4240 G_CALLBACK (cmw_destroy_cb), NULL);
4241 g_signal_connect_swapped (fs, "response",
4242 G_CALLBACK (gtk_widget_destroy), fs);
4244 /* wait until destroy calls gtk_main_quit */
4245 gtk_widget_show (fs);
4251 create_modal_window (GtkWidget *widget)
4253 GtkWidget *window = NULL;
4254 GtkWidget *box1,*box2;
4256 GtkWidget *btnColor,*btnFile,*btnClose;
4258 /* Create modal window (Here you can use any window descendent )*/
4259 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4260 gtk_window_set_screen (GTK_WINDOW (window),
4261 gtk_widget_get_screen (widget));
4263 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4265 /* Set window as modal */
4266 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4268 /* Create widgets */
4269 box1 = gtk_vbox_new (FALSE,5);
4270 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4271 box2 = gtk_vbox_new (TRUE,5);
4272 btnColor = gtk_button_new_with_label ("Color");
4273 btnFile = gtk_button_new_with_label ("File Selection");
4274 btnClose = gtk_button_new_with_label ("Close");
4277 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4278 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4281 gtk_container_add (GTK_CONTAINER (window), box1);
4282 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4283 gtk_container_add (GTK_CONTAINER (frame1), box2);
4284 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4285 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4286 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4287 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4289 /* connect signals */
4290 g_signal_connect_swapped (btnClose, "clicked",
4291 G_CALLBACK (gtk_widget_destroy), window);
4293 g_signal_connect (window, "destroy",
4294 G_CALLBACK (cmw_destroy_cb), NULL);
4296 g_signal_connect (btnColor, "clicked",
4297 G_CALLBACK (cmw_color), window);
4298 g_signal_connect (btnFile, "clicked",
4299 G_CALLBACK (cmw_file), window);
4302 gtk_widget_show_all (window);
4304 /* wait until dialog get destroyed */
4313 make_message_dialog (GdkScreen *screen,
4315 GtkMessageType type,
4316 GtkButtonsType buttons,
4317 guint default_response)
4321 gtk_widget_destroy (*dialog);
4326 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4327 "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.)");
4329 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4331 g_signal_connect_swapped (*dialog,
4333 G_CALLBACK (gtk_widget_destroy),
4336 g_signal_connect (*dialog,
4338 G_CALLBACK (gtk_widget_destroyed),
4341 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4343 gtk_widget_show (*dialog);
4347 create_message_dialog (GtkWidget *widget)
4349 static GtkWidget *info = NULL;
4350 static GtkWidget *warning = NULL;
4351 static GtkWidget *error = NULL;
4352 static GtkWidget *question = NULL;
4353 GdkScreen *screen = gtk_widget_get_screen (widget);
4355 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4356 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
4357 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4358 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
4365 static GtkWidget *sw_parent = NULL;
4366 static GtkWidget *sw_float_parent;
4367 static guint sw_destroyed_handler = 0;
4370 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4372 gtk_widget_reparent (scrollwin, sw_parent);
4374 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4375 sw_float_parent = NULL;
4377 sw_destroyed_handler = 0;
4383 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4385 gtk_widget_destroy (sw_float_parent);
4387 sw_float_parent = NULL;
4389 sw_destroyed_handler = 0;
4393 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4397 gtk_widget_reparent (scrollwin, sw_parent);
4398 gtk_widget_destroy (sw_float_parent);
4400 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4401 sw_float_parent = NULL;
4403 sw_destroyed_handler = 0;
4407 sw_parent = scrollwin->parent;
4408 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4409 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4410 gtk_widget_get_screen (widget));
4412 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4414 gtk_widget_reparent (scrollwin, sw_float_parent);
4415 gtk_widget_show (sw_float_parent);
4417 sw_destroyed_handler =
4418 g_signal_connect (sw_parent, "destroy",
4419 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4420 g_signal_connect (sw_float_parent, "delete_event",
4421 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4426 create_scrolled_windows (GtkWidget *widget)
4428 static GtkWidget *window;
4429 GtkWidget *scrolled_window;
4437 window = gtk_dialog_new ();
4439 gtk_window_set_screen (GTK_WINDOW (window),
4440 gtk_widget_get_screen (widget));
4442 g_signal_connect (window, "destroy",
4443 G_CALLBACK (gtk_widget_destroyed),
4446 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4447 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4450 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4451 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4452 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4453 GTK_POLICY_AUTOMATIC,
4454 GTK_POLICY_AUTOMATIC);
4455 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
4456 scrolled_window, TRUE, TRUE, 0);
4457 gtk_widget_show (scrolled_window);
4459 table = gtk_table_new (20, 20, FALSE);
4460 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4461 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4462 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4463 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4464 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4465 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4466 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4467 gtk_widget_show (table);
4469 for (i = 0; i < 20; i++)
4470 for (j = 0; j < 20; j++)
4472 sprintf (buffer, "button (%d,%d)\n", i, j);
4473 button = gtk_toggle_button_new_with_label (buffer);
4474 gtk_table_attach_defaults (GTK_TABLE (table), button,
4476 gtk_widget_show (button);
4480 button = gtk_button_new_with_label ("Close");
4481 g_signal_connect_swapped (button, "clicked",
4482 G_CALLBACK (gtk_widget_destroy),
4484 gtk_widget_set_can_default (button, TRUE);
4485 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4486 button, TRUE, TRUE, 0);
4487 gtk_widget_grab_default (button);
4488 gtk_widget_show (button);
4490 button = gtk_button_new_with_label ("Reparent Out");
4491 g_signal_connect (button, "clicked",
4492 G_CALLBACK (scrolled_windows_remove),
4494 gtk_widget_set_can_default (button, TRUE);
4495 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4496 button, TRUE, TRUE, 0);
4497 gtk_widget_grab_default (button);
4498 gtk_widget_show (button);
4500 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4503 if (!gtk_widget_get_visible (window))
4504 gtk_widget_show (window);
4506 gtk_widget_destroy (window);
4514 entry_toggle_frame (GtkWidget *checkbutton,
4517 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4518 GTK_TOGGLE_BUTTON(checkbutton)->active);
4522 entry_toggle_sensitive (GtkWidget *checkbutton,
4525 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4529 entry_progress_timeout (gpointer data)
4531 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
4533 gtk_entry_progress_pulse (GTK_ENTRY (data));
4539 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
4542 if (fraction > 1.0001)
4545 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
4552 entry_remove_timeout (gpointer data)
4554 g_source_remove (GPOINTER_TO_UINT (data));
4558 entry_toggle_progress (GtkWidget *checkbutton,
4561 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
4563 guint timeout = gdk_threads_add_timeout (100,
4564 entry_progress_timeout,
4566 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
4567 GUINT_TO_POINTER (timeout),
4568 entry_remove_timeout);
4572 g_object_set_data (G_OBJECT (entry), "timeout-id",
4573 GUINT_TO_POINTER (0));
4575 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
4580 entry_toggle_pulse (GtkWidget *checkbutton,
4583 g_object_set_data (G_OBJECT (entry), "progress-pulse",
4584 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
4588 props_clicked (GtkWidget *button,
4591 GtkWidget *window = create_prop_editor (object, 0);
4593 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
4597 create_entry (GtkWidget *widget)
4599 static GtkWidget *window = NULL;
4603 GtkWidget *has_frame_check;
4604 GtkWidget *sensitive_check;
4605 GtkWidget *progress_check;
4608 GtkWidget *cb_entry;
4610 GtkWidget *separator;
4614 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4615 gtk_window_set_screen (GTK_WINDOW (window),
4616 gtk_widget_get_screen (widget));
4618 g_signal_connect (window, "destroy",
4619 G_CALLBACK (gtk_widget_destroyed),
4622 gtk_window_set_title (GTK_WINDOW (window), "entry");
4623 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4626 box1 = gtk_vbox_new (FALSE, 0);
4627 gtk_container_add (GTK_CONTAINER (window), box1);
4630 box2 = gtk_vbox_new (FALSE, 10);
4631 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4632 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4634 hbox = gtk_hbox_new (FALSE, 5);
4635 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4637 entry = gtk_entry_new ();
4638 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");
4639 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4640 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4642 button = gtk_button_new_with_mnemonic ("_Props");
4643 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4644 g_signal_connect (button, "clicked",
4645 G_CALLBACK (props_clicked),
4648 cb = GTK_COMBO_BOX (gtk_combo_box_entry_new_text ());
4649 gtk_combo_box_append_text (cb, "item0");
4650 gtk_combo_box_append_text (cb, "item0");
4651 gtk_combo_box_append_text (cb, "item1 item1");
4652 gtk_combo_box_append_text (cb, "item2 item2 item2");
4653 gtk_combo_box_append_text (cb, "item3 item3 item3 item3");
4654 gtk_combo_box_append_text (cb, "item4 item4 item4 item4 item4");
4655 gtk_combo_box_append_text (cb, "item5 item5 item5 item5 item5 item5");
4656 gtk_combo_box_append_text (cb, "item6 item6 item6 item6 item6");
4657 gtk_combo_box_append_text (cb, "item7 item7 item7 item7");
4658 gtk_combo_box_append_text (cb, "item8 item8 item8");
4659 gtk_combo_box_append_text (cb, "item9 item9");
4661 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4662 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4663 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4664 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4666 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4667 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4668 g_signal_connect (sensitive_check, "toggled",
4669 G_CALLBACK (entry_toggle_sensitive), entry);
4670 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4672 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4673 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4674 g_signal_connect (has_frame_check, "toggled",
4675 G_CALLBACK (entry_toggle_frame), entry);
4676 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4678 progress_check = gtk_check_button_new_with_label("Show Progress");
4679 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4680 g_signal_connect (progress_check, "toggled",
4681 G_CALLBACK (entry_toggle_progress), entry);
4683 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4684 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4685 g_signal_connect (progress_check, "toggled",
4686 G_CALLBACK (entry_toggle_pulse), entry);
4688 separator = gtk_hseparator_new ();
4689 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4691 box2 = gtk_vbox_new (FALSE, 10);
4692 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4693 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4695 button = gtk_button_new_with_label ("close");
4696 g_signal_connect_swapped (button, "clicked",
4697 G_CALLBACK (gtk_widget_destroy),
4699 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4700 gtk_widget_set_can_default (button, TRUE);
4701 gtk_widget_grab_default (button);
4704 if (!gtk_widget_get_visible (window))
4705 gtk_widget_show_all (window);
4707 gtk_widget_destroy (window);
4711 create_expander (GtkWidget *widget)
4714 GtkWidget *expander;
4716 static GtkWidget *window = NULL;
4720 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4721 gtk_window_set_screen (GTK_WINDOW (window),
4722 gtk_widget_get_screen (widget));
4724 g_signal_connect (window, "destroy",
4725 G_CALLBACK (gtk_widget_destroyed),
4728 gtk_window_set_title (GTK_WINDOW (window), "expander");
4729 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4731 box1 = gtk_vbox_new (FALSE, 0);
4732 gtk_container_add (GTK_CONTAINER (window), box1);
4734 expander = gtk_expander_new ("The Hidden");
4736 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4738 hidden = gtk_label_new ("Revealed!");
4740 gtk_container_add (GTK_CONTAINER (expander), hidden);
4743 if (!gtk_widget_get_visible (window))
4744 gtk_widget_show_all (window);
4746 gtk_widget_destroy (window);
4754 event_box_label_pressed (GtkWidget *widget,
4755 GdkEventButton *event,
4758 g_print ("clicked on event box\n");
4762 event_box_button_clicked (GtkWidget *widget,
4766 g_print ("pushed button\n");
4770 event_box_toggle_visible_window (GtkWidget *checkbutton,
4771 GtkEventBox *event_box)
4773 gtk_event_box_set_visible_window (event_box,
4774 GTK_TOGGLE_BUTTON(checkbutton)->active);
4778 event_box_toggle_above_child (GtkWidget *checkbutton,
4779 GtkEventBox *event_box)
4781 gtk_event_box_set_above_child (event_box,
4782 GTK_TOGGLE_BUTTON(checkbutton)->active);
4786 create_event_box (GtkWidget *widget)
4788 static GtkWidget *window = NULL;
4794 GtkWidget *separator;
4795 GtkWidget *event_box;
4797 GtkWidget *visible_window_check;
4798 GtkWidget *above_child_check;
4807 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4808 gtk_window_set_screen (GTK_WINDOW (window),
4809 gtk_widget_get_screen (widget));
4811 g_signal_connect (window, "destroy",
4812 G_CALLBACK (gtk_widget_destroyed),
4815 gtk_window_set_title (GTK_WINDOW (window), "event box");
4816 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4818 box1 = gtk_vbox_new (FALSE, 0);
4819 gtk_container_add (GTK_CONTAINER (window), box1);
4820 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4822 hbox = gtk_hbox_new (FALSE, 0);
4823 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4825 event_box = gtk_event_box_new ();
4826 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4828 vbox = gtk_vbox_new (FALSE, 0);
4829 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4830 g_signal_connect (event_box, "button_press_event",
4831 G_CALLBACK (event_box_label_pressed),
4834 label = gtk_label_new ("Click on this label");
4835 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4837 button = gtk_button_new_with_label ("button in eventbox");
4838 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4839 g_signal_connect (button, "clicked",
4840 G_CALLBACK (event_box_button_clicked),
4844 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4845 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4846 g_signal_connect (visible_window_check, "toggled",
4847 G_CALLBACK (event_box_toggle_visible_window), event_box);
4848 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4850 above_child_check = gtk_check_button_new_with_label("Above Child");
4851 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4852 g_signal_connect (above_child_check, "toggled",
4853 G_CALLBACK (event_box_toggle_above_child), event_box);
4854 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4856 separator = gtk_hseparator_new ();
4857 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4859 box2 = gtk_vbox_new (FALSE, 10);
4860 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4861 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4863 button = gtk_button_new_with_label ("close");
4864 g_signal_connect_swapped (button, "clicked",
4865 G_CALLBACK (gtk_widget_destroy),
4867 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4868 gtk_widget_set_can_default (button, TRUE);
4869 gtk_widget_grab_default (button);
4872 if (!gtk_widget_get_visible (window))
4873 gtk_widget_show_all (window);
4875 gtk_widget_destroy (window);
4883 #define SIZE_GROUP_INITIAL_SIZE 50
4886 size_group_hsize_changed (GtkSpinButton *spin_button,
4889 gtk_widget_set_size_request (GTK_BIN (button)->child,
4890 gtk_spin_button_get_value_as_int (spin_button),
4895 size_group_vsize_changed (GtkSpinButton *spin_button,
4898 gtk_widget_set_size_request (GTK_BIN (button)->child,
4900 gtk_spin_button_get_value_as_int (spin_button));
4904 create_size_group_window (GdkScreen *screen,
4905 GtkSizeGroup *master_size_group)
4909 GtkWidget *main_button;
4911 GtkWidget *spin_button;
4913 GtkSizeGroup *hgroup1;
4914 GtkSizeGroup *hgroup2;
4915 GtkSizeGroup *vgroup1;
4916 GtkSizeGroup *vgroup2;
4918 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4924 gtk_window_set_screen (GTK_WINDOW (window), screen);
4926 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4928 g_signal_connect (window, "response",
4929 G_CALLBACK (gtk_widget_destroy),
4932 table = gtk_table_new (2, 2, FALSE);
4933 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
4935 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4936 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4937 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4938 gtk_widget_set_size_request (table, 250, 250);
4940 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4941 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4942 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4943 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4945 main_button = gtk_button_new_with_label ("X");
4947 gtk_table_attach (GTK_TABLE (table), main_button,
4949 GTK_EXPAND, GTK_EXPAND,
4951 gtk_size_group_add_widget (master_size_group, main_button);
4952 gtk_size_group_add_widget (hgroup1, main_button);
4953 gtk_size_group_add_widget (vgroup1, main_button);
4954 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
4955 SIZE_GROUP_INITIAL_SIZE,
4956 SIZE_GROUP_INITIAL_SIZE);
4958 button = gtk_button_new ();
4959 gtk_table_attach (GTK_TABLE (table), button,
4961 GTK_EXPAND, GTK_EXPAND,
4963 gtk_size_group_add_widget (vgroup1, button);
4964 gtk_size_group_add_widget (vgroup2, button);
4966 button = gtk_button_new ();
4967 gtk_table_attach (GTK_TABLE (table), button,
4969 GTK_EXPAND, GTK_EXPAND,
4971 gtk_size_group_add_widget (hgroup1, button);
4972 gtk_size_group_add_widget (hgroup2, button);
4974 button = gtk_button_new ();
4975 gtk_table_attach (GTK_TABLE (table), button,
4977 GTK_EXPAND, GTK_EXPAND,
4979 gtk_size_group_add_widget (hgroup2, button);
4980 gtk_size_group_add_widget (vgroup2, button);
4982 g_object_unref (hgroup1);
4983 g_object_unref (hgroup2);
4984 g_object_unref (vgroup1);
4985 g_object_unref (vgroup2);
4987 hbox = gtk_hbox_new (FALSE, 5);
4988 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
4990 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4991 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4992 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4993 g_signal_connect (spin_button, "value_changed",
4994 G_CALLBACK (size_group_hsize_changed), main_button);
4996 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4997 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4998 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4999 g_signal_connect (spin_button, "value_changed",
5000 G_CALLBACK (size_group_vsize_changed), main_button);
5006 create_size_groups (GtkWidget *widget)
5008 static GtkWidget *window1 = NULL;
5009 static GtkWidget *window2 = NULL;
5010 static GtkSizeGroup *master_size_group;
5012 if (!master_size_group)
5013 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
5017 window1 = create_size_group_window (gtk_widget_get_screen (widget),
5020 g_signal_connect (window1, "destroy",
5021 G_CALLBACK (gtk_widget_destroyed),
5027 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5030 g_signal_connect (window2, "destroy",
5031 G_CALLBACK (gtk_widget_destroyed),
5035 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
5037 gtk_widget_destroy (window1);
5038 gtk_widget_destroy (window2);
5042 if (!gtk_widget_get_visible (window1))
5043 gtk_widget_show_all (window1);
5044 if (!gtk_widget_get_visible (window2))
5045 gtk_widget_show_all (window2);
5053 static GtkWidget *spinner1;
5056 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5058 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5062 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5064 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5068 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5070 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5071 gtk_spin_button_get_value_as_int (spin));
5075 get_value (GtkWidget *widget, gpointer data)
5079 GtkSpinButton *spin;
5081 spin = GTK_SPIN_BUTTON (spinner1);
5082 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5083 if (GPOINTER_TO_INT (data) == 1)
5084 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5086 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5087 gtk_label_set_text (label, buf);
5091 get_spin_value (GtkWidget *widget, gpointer data)
5095 GtkSpinButton *spin;
5097 spin = GTK_SPIN_BUTTON (widget);
5098 label = GTK_LABEL (data);
5100 buffer = g_strdup_printf ("%0.*f", spin->digits,
5101 gtk_spin_button_get_value (spin));
5102 gtk_label_set_text (label, buffer);
5108 spin_button_time_output_func (GtkSpinButton *spin_button)
5110 static gchar buf[6];
5114 hours = spin_button->adjustment->value / 60.0;
5115 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5116 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5117 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5118 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5123 spin_button_month_input_func (GtkSpinButton *spin_button,
5127 static gchar *month[12] = { "January", "February", "March", "April",
5128 "May", "June", "July", "August",
5129 "September", "October", "November", "December" };
5131 gboolean found = FALSE;
5133 for (i = 1; i <= 12; i++)
5135 tmp1 = g_ascii_strup (month[i - 1], -1);
5136 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5137 if (strstr (tmp1, tmp2) == tmp1)
5147 return GTK_INPUT_ERROR;
5149 *new_val = (gdouble) i;
5154 spin_button_month_output_func (GtkSpinButton *spin_button)
5157 static gchar *month[12] = { "January", "February", "March", "April",
5158 "May", "June", "July", "August", "September",
5159 "October", "November", "December" };
5161 for (i = 1; i <= 12; i++)
5162 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5164 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5165 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5171 spin_button_hex_input_func (GtkSpinButton *spin_button,
5178 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5179 res = strtol(buf, &err, 16);
5182 return GTK_INPUT_ERROR;
5188 spin_button_hex_output_func (GtkSpinButton *spin_button)
5190 static gchar buf[7];
5193 val = (gint) spin_button->adjustment->value;
5194 if (fabs (val) < 1e-5)
5195 sprintf (buf, "0x00");
5197 sprintf (buf, "0x%.2X", val);
5198 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5199 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5204 create_spins (GtkWidget *widget)
5206 static GtkWidget *window = NULL;
5209 GtkWidget *main_vbox;
5212 GtkWidget *spinner2;
5216 GtkWidget *val_label;
5221 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5222 gtk_window_set_screen (GTK_WINDOW (window),
5223 gtk_widget_get_screen (widget));
5225 g_signal_connect (window, "destroy",
5226 G_CALLBACK (gtk_widget_destroyed),
5229 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5231 main_vbox = gtk_vbox_new (FALSE, 5);
5232 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5233 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5235 frame = gtk_frame_new ("Not accelerated");
5236 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5238 vbox = gtk_vbox_new (FALSE, 0);
5239 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5240 gtk_container_add (GTK_CONTAINER (frame), vbox);
5242 /* Time, month, hex spinners */
5244 hbox = gtk_hbox_new (FALSE, 0);
5245 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5247 vbox2 = gtk_vbox_new (FALSE, 0);
5248 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5250 label = gtk_label_new ("Time :");
5251 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5252 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5254 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5255 spinner = gtk_spin_button_new (adj, 0, 0);
5256 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5257 g_signal_connect (spinner,
5259 G_CALLBACK (spin_button_time_output_func),
5261 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5262 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5263 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5265 vbox2 = gtk_vbox_new (FALSE, 0);
5266 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5268 label = gtk_label_new ("Month :");
5269 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5270 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5272 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5274 spinner = gtk_spin_button_new (adj, 0, 0);
5275 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5276 GTK_UPDATE_IF_VALID);
5277 g_signal_connect (spinner,
5279 G_CALLBACK (spin_button_month_input_func),
5281 g_signal_connect (spinner,
5283 G_CALLBACK (spin_button_month_output_func),
5285 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5286 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5287 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5289 vbox2 = gtk_vbox_new (FALSE, 0);
5290 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5292 label = gtk_label_new ("Hex :");
5293 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5294 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5296 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5297 spinner = gtk_spin_button_new (adj, 0, 0);
5298 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5299 g_signal_connect (spinner,
5301 G_CALLBACK (spin_button_hex_input_func),
5303 g_signal_connect (spinner,
5305 G_CALLBACK (spin_button_hex_output_func),
5307 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5308 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
5309 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5311 frame = gtk_frame_new ("Accelerated");
5312 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5314 vbox = gtk_vbox_new (FALSE, 0);
5315 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5316 gtk_container_add (GTK_CONTAINER (frame), vbox);
5318 hbox = gtk_hbox_new (FALSE, 0);
5319 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5321 vbox2 = gtk_vbox_new (FALSE, 0);
5322 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5324 label = gtk_label_new ("Value :");
5325 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5326 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5328 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
5330 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5331 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5332 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
5334 vbox2 = gtk_vbox_new (FALSE, 0);
5335 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5337 label = gtk_label_new ("Digits :");
5338 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5339 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5341 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
5342 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
5343 g_signal_connect (adj, "value_changed",
5344 G_CALLBACK (change_digits),
5346 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
5348 hbox = gtk_hbox_new (FALSE, 0);
5349 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
5351 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
5352 g_signal_connect (button, "clicked",
5353 G_CALLBACK (toggle_snap),
5355 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5356 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5358 button = gtk_check_button_new_with_label ("Numeric only input mode");
5359 g_signal_connect (button, "clicked",
5360 G_CALLBACK (toggle_numeric),
5362 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5363 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5365 val_label = gtk_label_new ("");
5367 hbox = gtk_hbox_new (FALSE, 0);
5368 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5370 button = gtk_button_new_with_label ("Value as Int");
5371 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5372 g_signal_connect (button, "clicked",
5373 G_CALLBACK (get_value),
5374 GINT_TO_POINTER (1));
5375 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5377 button = gtk_button_new_with_label ("Value as Float");
5378 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5379 g_signal_connect (button, "clicked",
5380 G_CALLBACK (get_value),
5381 GINT_TO_POINTER (2));
5382 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5384 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
5385 gtk_label_set_text (GTK_LABEL (val_label), "0");
5387 frame = gtk_frame_new ("Using Convenience Constructor");
5388 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5390 hbox = gtk_hbox_new (FALSE, 0);
5391 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5392 gtk_container_add (GTK_CONTAINER (frame), hbox);
5394 val_label = gtk_label_new ("0.0");
5396 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5397 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5398 g_signal_connect (spinner, "value_changed",
5399 G_CALLBACK (get_spin_value), val_label);
5400 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5401 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5403 hbox = gtk_hbox_new (FALSE, 0);
5404 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5406 button = gtk_button_new_with_label ("Close");
5407 g_signal_connect_swapped (button, "clicked",
5408 G_CALLBACK (gtk_widget_destroy),
5410 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5413 if (!gtk_widget_get_visible (window))
5414 gtk_widget_show_all (window);
5416 gtk_widget_destroy (window);
5425 cursor_expose_event (GtkWidget *widget,
5429 GtkDrawingArea *darea;
5430 GdkDrawable *drawable;
5437 g_return_val_if_fail (widget != NULL, TRUE);
5438 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5440 darea = GTK_DRAWING_AREA (widget);
5441 drawable = widget->window;
5442 white_gc = widget->style->white_gc;
5443 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5444 black_gc = widget->style->black_gc;
5445 max_width = widget->allocation.width;
5446 max_height = widget->allocation.height;
5448 gdk_draw_rectangle (drawable, white_gc,
5455 gdk_draw_rectangle (drawable, black_gc,
5462 gdk_draw_rectangle (drawable, gray_gc,
5473 set_cursor (GtkWidget *spinner,
5482 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5485 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5487 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
5488 vals = class->values;
5490 while (vals && vals->value != c)
5493 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5495 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5497 g_type_class_unref (class);
5499 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5500 gdk_window_set_cursor (widget->window, cursor);
5501 gdk_cursor_unref (cursor);
5505 cursor_event (GtkWidget *widget,
5507 GtkSpinButton *spinner)
5509 if ((event->type == GDK_BUTTON_PRESS) &&
5510 ((event->button.button == 1) ||
5511 (event->button.button == 3)))
5513 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5514 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5521 #ifdef GDK_WINDOWING_X11
5522 #include "x11/gdkx.h"
5525 change_cursor_theme (GtkWidget *widget,
5532 children = gtk_container_get_children (GTK_CONTAINER (data));
5534 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
5535 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
5537 g_list_free (children);
5539 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
5546 create_cursors (GtkWidget *widget)
5548 static GtkWidget *window = NULL;
5551 GtkWidget *main_vbox;
5564 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5565 gtk_window_set_screen (GTK_WINDOW (window),
5566 gtk_widget_get_screen (widget));
5568 g_signal_connect (window, "destroy",
5569 G_CALLBACK (gtk_widget_destroyed),
5572 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5574 main_vbox = gtk_vbox_new (FALSE, 5);
5575 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5576 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5579 g_object_new (gtk_vbox_get_type (),
5580 "GtkBox::homogeneous", FALSE,
5581 "GtkBox::spacing", 5,
5582 "GtkContainer::border_width", 10,
5583 "GtkWidget::parent", main_vbox,
5584 "GtkWidget::visible", TRUE,
5587 #ifdef GDK_WINDOWING_X11
5588 hbox = gtk_hbox_new (FALSE, 0);
5589 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5590 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5592 label = gtk_label_new ("Cursor Theme : ");
5593 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5594 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5596 entry = gtk_entry_new ();
5597 gtk_entry_set_text (GTK_ENTRY (entry), "default");
5598 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
5600 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
5601 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
5602 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5604 g_signal_connect (entry, "changed",
5605 G_CALLBACK (change_cursor_theme), hbox);
5606 g_signal_connect (size, "changed",
5607 G_CALLBACK (change_cursor_theme), hbox);
5610 hbox = gtk_hbox_new (FALSE, 0);
5611 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5612 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5614 label = gtk_label_new ("Cursor Value : ");
5615 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5616 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5618 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5622 spinner = gtk_spin_button_new (adj, 0, 0);
5623 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5626 g_object_new (gtk_frame_get_type (),
5627 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5628 "GtkFrame::label_xalign", 0.5,
5629 "GtkFrame::label", "Cursor Area",
5630 "GtkContainer::border_width", 10,
5631 "GtkWidget::parent", vbox,
5632 "GtkWidget::visible", TRUE,
5635 darea = gtk_drawing_area_new ();
5636 gtk_widget_set_size_request (darea, 80, 80);
5637 gtk_container_add (GTK_CONTAINER (frame), darea);
5638 g_signal_connect (darea,
5640 G_CALLBACK (cursor_expose_event),
5642 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5643 g_signal_connect (darea,
5644 "button_press_event",
5645 G_CALLBACK (cursor_event),
5647 gtk_widget_show (darea);
5649 g_signal_connect (spinner, "changed",
5650 G_CALLBACK (set_cursor),
5653 label = g_object_new (GTK_TYPE_LABEL,
5658 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5661 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5664 g_object_new (gtk_hseparator_get_type (),
5665 "GtkWidget::visible", TRUE,
5667 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5669 hbox = gtk_hbox_new (FALSE, 0);
5670 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5671 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5673 button = gtk_button_new_with_label ("Close");
5674 g_signal_connect_swapped (button, "clicked",
5675 G_CALLBACK (gtk_widget_destroy),
5677 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5679 gtk_widget_show_all (window);
5681 set_cursor (spinner, darea);
5684 gtk_widget_destroy (window);
5692 color_selection_ok (GtkWidget *w,
5693 GtkColorSelectionDialog *cs)
5695 GtkColorSelection *colorsel;
5698 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
5700 gtk_color_selection_get_color(colorsel,color);
5701 gtk_color_selection_set_color(colorsel,color);
5705 color_selection_changed (GtkWidget *w,
5706 GtkColorSelectionDialog *cs)
5708 GtkColorSelection *colorsel;
5711 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
5712 gtk_color_selection_get_color(colorsel,color);
5717 opacity_toggled_cb (GtkWidget *w,
5718 GtkColorSelectionDialog *cs)
5720 GtkColorSelection *colorsel;
5722 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5723 gtk_color_selection_set_has_opacity_control (colorsel,
5724 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5728 palette_toggled_cb (GtkWidget *w,
5729 GtkColorSelectionDialog *cs)
5731 GtkColorSelection *colorsel;
5733 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5734 gtk_color_selection_set_has_palette (colorsel,
5735 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5740 create_color_selection (GtkWidget *widget)
5742 static GtkWidget *window = NULL;
5751 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5752 gtk_window_set_screen (GTK_WINDOW (window),
5753 gtk_widget_get_screen (widget));
5755 g_signal_connect (window, "destroy",
5756 G_CALLBACK (gtk_widget_destroyed),
5759 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5760 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5762 hbox = gtk_hbox_new (FALSE, 8);
5763 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5764 gtk_container_add (GTK_CONTAINER (window), hbox);
5766 label = gtk_label_new ("Pick a color");
5767 gtk_container_add (GTK_CONTAINER (hbox), label);
5769 picker = gtk_color_button_new ();
5770 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5771 gtk_container_add (GTK_CONTAINER (hbox), picker);
5773 button = gtk_button_new_with_mnemonic ("_Props");
5774 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5775 g_signal_connect (button, "clicked",
5776 G_CALLBACK (props_clicked),
5780 if (!gtk_widget_get_visible (window))
5781 gtk_widget_show_all (window);
5783 gtk_widget_destroy (window);
5787 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5789 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5790 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5792 gtk_widget_set_default_direction (new_direction);
5796 orientable_toggle_orientation (GtkOrientable *orientable)
5798 GtkOrientation orientation;
5800 orientation = gtk_orientable_get_orientation (orientable);
5801 gtk_orientable_set_orientation (orientable,
5802 orientation == GTK_ORIENTATION_HORIZONTAL ?
5803 GTK_ORIENTATION_VERTICAL :
5804 GTK_ORIENTATION_HORIZONTAL);
5806 if (GTK_IS_CONTAINER (orientable))
5811 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5813 for (child = children; child; child = child->next)
5815 if (GTK_IS_ORIENTABLE (child->data))
5816 orientable_toggle_orientation (child->data);
5819 g_list_free (children);
5824 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5826 orientable_toggle_orientation (GTK_ORIENTABLE (GTK_DIALOG (gtk_widget_get_toplevel (widget))->vbox));
5830 set_direction_recurse (GtkWidget *widget,
5833 GtkTextDirection *dir = data;
5835 gtk_widget_set_direction (widget, *dir);
5836 if (GTK_IS_CONTAINER (widget))
5837 gtk_container_foreach (GTK_CONTAINER (widget),
5838 set_direction_recurse,
5843 create_forward_back (const char *title,
5844 GtkTextDirection text_dir)
5846 GtkWidget *frame = gtk_frame_new (title);
5847 GtkWidget *bbox = gtk_hbutton_box_new ();
5848 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5849 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5851 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5853 gtk_container_add (GTK_CONTAINER (frame), bbox);
5854 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5855 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5857 set_direction_recurse (frame, &text_dir);
5863 create_flipping (GtkWidget *widget)
5865 static GtkWidget *window = NULL;
5866 GtkWidget *check_button, *button;
5870 window = gtk_dialog_new ();
5872 gtk_window_set_screen (GTK_WINDOW (window),
5873 gtk_widget_get_screen (widget));
5875 g_signal_connect (window, "destroy",
5876 G_CALLBACK (gtk_widget_destroyed),
5879 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5881 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5882 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5883 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5884 check_button, TRUE, TRUE, 0);
5886 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5887 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5889 g_signal_connect (check_button, "toggled",
5890 G_CALLBACK (flipping_toggled_cb), NULL);
5892 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5893 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5894 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5895 check_button, TRUE, TRUE, 0);
5897 g_signal_connect (check_button, "toggled",
5898 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5900 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5901 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5904 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5905 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5908 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5909 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5912 button = gtk_button_new_with_label ("Close");
5913 g_signal_connect_swapped (button, "clicked",
5914 G_CALLBACK (gtk_widget_destroy), window);
5915 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5916 button, TRUE, TRUE, 0);
5919 if (!gtk_widget_get_visible (window))
5920 gtk_widget_show_all (window);
5922 gtk_widget_destroy (window);
5930 make_focus_table (GList **list)
5935 table = gtk_table_new (5, 5, FALSE);
5948 widget = gtk_entry_new ();
5950 widget = gtk_button_new_with_label ("Foo");
5952 *list = g_list_prepend (*list, widget);
5954 gtk_table_attach (GTK_TABLE (table),
5958 GTK_EXPAND | GTK_FILL,
5959 GTK_EXPAND | GTK_FILL,
5968 *list = g_list_reverse (*list);
5974 create_focus (GtkWidget *widget)
5976 static GtkWidget *window = NULL;
5984 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5990 gtk_window_set_screen (GTK_WINDOW (window),
5991 gtk_widget_get_screen (widget));
5993 g_signal_connect (window, "destroy",
5994 G_CALLBACK (gtk_widget_destroyed),
5997 g_signal_connect (window, "response",
5998 G_CALLBACK (gtk_widget_destroy),
6001 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
6003 frame = gtk_frame_new ("Weird tab focus chain");
6005 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6006 frame, TRUE, TRUE, 0);
6008 table = make_focus_table (&list);
6010 gtk_container_add (GTK_CONTAINER (frame), table);
6012 gtk_container_set_focus_chain (GTK_CONTAINER (table),
6017 frame = gtk_frame_new ("Default tab focus chain");
6019 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6020 frame, TRUE, TRUE, 0);
6023 table = make_focus_table (&list);
6027 gtk_container_add (GTK_CONTAINER (frame), table);
6030 if (!gtk_widget_get_visible (window))
6031 gtk_widget_show_all (window);
6033 gtk_widget_destroy (window);
6041 font_selection_ok (GtkWidget *w,
6042 GtkFontSelectionDialog *fs)
6044 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
6046 g_print ("%s\n", s);
6048 gtk_widget_destroy (GTK_WIDGET (fs));
6052 create_font_selection (GtkWidget *widget)
6054 static GtkWidget *window = NULL;
6062 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6063 gtk_window_set_screen (GTK_WINDOW (window),
6064 gtk_widget_get_screen (widget));
6066 g_signal_connect (window, "destroy",
6067 G_CALLBACK (gtk_widget_destroyed),
6070 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
6071 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6073 hbox = gtk_hbox_new (FALSE, 8);
6074 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6075 gtk_container_add (GTK_CONTAINER (window), hbox);
6077 label = gtk_label_new ("Pick a font");
6078 gtk_container_add (GTK_CONTAINER (hbox), label);
6080 picker = gtk_font_button_new ();
6081 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
6082 gtk_container_add (GTK_CONTAINER (hbox), picker);
6085 if (!gtk_widget_get_visible (window))
6086 gtk_widget_show_all (window);
6088 gtk_widget_destroy (window);
6095 static GtkWidget *dialog_window = NULL;
6098 label_toggle (GtkWidget *widget,
6103 *label = gtk_label_new ("Dialog Test");
6104 g_signal_connect (*label,
6106 G_CALLBACK (gtk_widget_destroyed),
6108 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
6109 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6110 *label, TRUE, TRUE, 0);
6111 gtk_widget_show (*label);
6114 gtk_widget_destroy (*label);
6117 #define RESPONSE_TOGGLE_SEPARATOR 1
6120 print_response (GtkWidget *dialog,
6124 g_print ("response signal received (%d)\n", response_id);
6126 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
6128 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
6129 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
6134 create_dialog (GtkWidget *widget)
6136 static GtkWidget *label;
6141 /* This is a terrible example; it's much simpler to create
6142 * dialogs than this. Don't use testgtk for example code,
6146 dialog_window = gtk_dialog_new ();
6147 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6148 gtk_widget_get_screen (widget));
6150 g_signal_connect (dialog_window,
6152 G_CALLBACK (print_response),
6155 g_signal_connect (dialog_window, "destroy",
6156 G_CALLBACK (gtk_widget_destroyed),
6159 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
6160 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6162 button = gtk_button_new_with_label ("OK");
6163 gtk_widget_set_can_default (button, TRUE);
6164 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6165 button, TRUE, TRUE, 0);
6166 gtk_widget_grab_default (button);
6167 gtk_widget_show (button);
6169 button = gtk_button_new_with_label ("Toggle");
6170 g_signal_connect (button, "clicked",
6171 G_CALLBACK (label_toggle),
6173 gtk_widget_set_can_default (button, TRUE);
6174 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6175 button, TRUE, TRUE, 0);
6176 gtk_widget_show (button);
6180 button = gtk_button_new_with_label ("Separator");
6182 gtk_widget_set_can_default (button, TRUE);
6184 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
6186 RESPONSE_TOGGLE_SEPARATOR);
6187 gtk_widget_show (button);
6190 if (!gtk_widget_get_visible (dialog_window))
6191 gtk_widget_show (dialog_window);
6193 gtk_widget_destroy (dialog_window);
6196 /* Display & Screen test
6203 GtkWidget *radio_dpy;
6204 GtkWidget *toplevel;
6205 GtkWidget *dialog_window;
6206 } ScreenDisplaySelection;
6209 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
6211 const gchar *display_name;
6212 GdkDisplay *display = gtk_widget_get_display (widget);
6214 GdkScreen *new_screen = NULL;
6215 GdkScreen *current_screen = gtk_widget_get_screen (widget);
6217 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
6219 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
6220 display = gdk_display_open (display_name);
6224 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
6225 GTK_DIALOG_DESTROY_WITH_PARENT,
6228 "The display :\n%s\ncannot be opened",
6230 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
6231 gtk_widget_show (dialog);
6232 g_signal_connect (dialog, "response",
6233 G_CALLBACK (gtk_widget_destroy),
6238 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
6241 gboolean found = FALSE;
6242 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
6245 gtk_tree_model_get (model, &iter, 0, &name, -1);
6246 found = !g_ascii_strcasecmp (display_name, name);
6253 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
6254 new_screen = gdk_display_get_default_screen (display);
6259 gint number_of_screens = gdk_display_get_n_screens (display);
6260 gint screen_num = gdk_screen_get_number (current_screen);
6261 if ((screen_num +1) < number_of_screens)
6262 new_screen = gdk_display_get_screen (display, screen_num + 1);
6264 new_screen = gdk_display_get_screen (display, 0);
6269 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
6270 gtk_widget_destroy (data->dialog_window);
6275 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
6277 gtk_widget_destroy (data);
6281 create_display_screen (GtkWidget *widget)
6283 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
6284 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
6286 ScreenDisplaySelection *scr_dpy_data;
6287 GdkScreen *screen = gtk_widget_get_screen (widget);
6288 GdkDisplay *display = gdk_screen_get_display (screen);
6290 window = g_object_new (gtk_window_get_type (),
6293 "type", GTK_WINDOW_TOPLEVEL,
6295 "Screen or Display selection",
6296 "border_width", 10, NULL);
6297 g_signal_connect (window, "destroy",
6298 G_CALLBACK (gtk_widget_destroy), NULL);
6300 vbox = gtk_vbox_new (FALSE, 3);
6301 gtk_container_add (GTK_CONTAINER (window), vbox);
6303 frame = gtk_frame_new ("Select screen or display");
6304 gtk_container_add (GTK_CONTAINER (vbox), frame);
6306 table = gtk_table_new (2, 2, TRUE);
6307 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
6308 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
6310 gtk_container_add (GTK_CONTAINER (frame), table);
6312 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
6313 if (gdk_display_get_n_screens(display) > 1)
6314 radio_scr = gtk_radio_button_new_with_label
6315 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
6318 radio_scr = gtk_radio_button_new_with_label
6319 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
6320 "only one screen on the current display");
6321 gtk_widget_set_sensitive (radio_scr, FALSE);
6323 combo_dpy = gtk_combo_box_new_text ();
6324 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
6325 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
6326 "<hostname>:<X Server Num>.<Screen Num>");
6328 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
6329 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
6330 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
6332 bbox = gtk_hbutton_box_new ();
6333 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
6334 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
6336 gtk_container_add (GTK_CONTAINER (vbox), bbox);
6338 gtk_container_add (GTK_CONTAINER (bbox), applyb);
6339 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
6341 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
6343 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
6344 scr_dpy_data->radio_dpy = radio_dpy;
6345 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
6346 scr_dpy_data->dialog_window = window;
6348 g_signal_connect (cancelb, "clicked",
6349 G_CALLBACK (screen_display_destroy_diag), window);
6350 g_signal_connect (applyb, "clicked",
6351 G_CALLBACK (screen_display_check), scr_dpy_data);
6352 gtk_widget_show_all (window);
6357 static gboolean event_watcher_enter_id = 0;
6358 static gboolean event_watcher_leave_id = 0;
6361 event_watcher (GSignalInvocationHint *ihint,
6362 guint n_param_values,
6363 const GValue *param_values,
6366 g_print ("Watch: \"%s\" emitted for %s\n",
6367 g_signal_name (ihint->signal_id),
6368 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
6374 event_watcher_down (void)
6376 if (event_watcher_enter_id)
6380 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6381 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
6382 event_watcher_enter_id = 0;
6383 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6384 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
6385 event_watcher_leave_id = 0;
6390 event_watcher_toggle (void)
6392 if (event_watcher_enter_id)
6393 event_watcher_down ();
6398 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6399 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6400 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6401 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6406 create_event_watcher (GtkWidget *widget)
6412 dialog_window = gtk_dialog_new ();
6413 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6414 gtk_widget_get_screen (widget));
6416 g_signal_connect (dialog_window, "destroy",
6417 G_CALLBACK (gtk_widget_destroyed),
6419 g_signal_connect (dialog_window, "destroy",
6420 G_CALLBACK (event_watcher_down),
6423 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6424 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6425 gtk_widget_set_size_request (dialog_window, 200, 110);
6427 button = gtk_toggle_button_new_with_label ("Activate Watch");
6428 g_signal_connect (button, "clicked",
6429 G_CALLBACK (event_watcher_toggle),
6431 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6432 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6433 button, TRUE, TRUE, 0);
6434 gtk_widget_show (button);
6436 button = gtk_button_new_with_label ("Close");
6437 g_signal_connect_swapped (button, "clicked",
6438 G_CALLBACK (gtk_widget_destroy),
6440 gtk_widget_set_can_default (button, TRUE);
6441 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6442 button, TRUE, TRUE, 0);
6443 gtk_widget_grab_default (button);
6444 gtk_widget_show (button);
6447 if (!gtk_widget_get_visible (dialog_window))
6448 gtk_widget_show (dialog_window);
6450 gtk_widget_destroy (dialog_window);
6458 reformat_value (GtkScale *scale,
6461 return g_strdup_printf ("-->%0.*g<--",
6462 gtk_scale_get_digits (scale), value);
6466 create_range_controls (GtkWidget *widget)
6468 static GtkWidget *window = NULL;
6472 GtkWidget *scrollbar;
6474 GtkWidget *separator;
6475 GtkObject *adjustment;
6480 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6482 gtk_window_set_screen (GTK_WINDOW (window),
6483 gtk_widget_get_screen (widget));
6485 g_signal_connect (window, "destroy",
6486 G_CALLBACK (gtk_widget_destroyed),
6489 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6490 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6493 box1 = gtk_vbox_new (FALSE, 0);
6494 gtk_container_add (GTK_CONTAINER (window), box1);
6495 gtk_widget_show (box1);
6498 box2 = gtk_vbox_new (FALSE, 10);
6499 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6500 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6501 gtk_widget_show (box2);
6504 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6506 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6507 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6508 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6509 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6510 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6511 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6512 gtk_widget_show (scale);
6514 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6515 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6516 GTK_UPDATE_CONTINUOUS);
6517 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6518 gtk_widget_show (scrollbar);
6520 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6521 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6522 g_signal_connect (scale,
6524 G_CALLBACK (reformat_value),
6526 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6527 gtk_widget_show (scale);
6529 hbox = gtk_hbox_new (FALSE, 0);
6531 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6532 gtk_widget_set_size_request (scale, -1, 200);
6533 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6534 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6535 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6536 gtk_widget_show (scale);
6538 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6539 gtk_widget_set_size_request (scale, -1, 200);
6540 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6541 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6542 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6543 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6544 gtk_widget_show (scale);
6546 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6547 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6548 g_signal_connect (scale,
6550 G_CALLBACK (reformat_value),
6552 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6553 gtk_widget_show (scale);
6556 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6557 gtk_widget_show (hbox);
6559 separator = gtk_hseparator_new ();
6560 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6561 gtk_widget_show (separator);
6564 box2 = gtk_vbox_new (FALSE, 10);
6565 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6566 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6567 gtk_widget_show (box2);
6570 button = gtk_button_new_with_label ("close");
6571 g_signal_connect_swapped (button, "clicked",
6572 G_CALLBACK (gtk_widget_destroy),
6574 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6575 gtk_widget_set_can_default (button, TRUE);
6576 gtk_widget_grab_default (button);
6577 gtk_widget_show (button);
6580 if (!gtk_widget_get_visible (window))
6581 gtk_widget_show (window);
6583 gtk_widget_destroy (window);
6591 create_rulers (GtkWidget *widget)
6593 static GtkWidget *window = NULL;
6599 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6601 gtk_window_set_screen (GTK_WINDOW (window),
6602 gtk_widget_get_screen (widget));
6604 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
6606 g_signal_connect (window, "destroy",
6607 G_CALLBACK (gtk_widget_destroyed),
6610 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6611 gtk_widget_set_size_request (window, 300, 300);
6612 gtk_widget_set_events (window,
6613 GDK_POINTER_MOTION_MASK
6614 | GDK_POINTER_MOTION_HINT_MASK);
6615 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6617 table = gtk_table_new (2, 2, FALSE);
6618 gtk_container_add (GTK_CONTAINER (window), table);
6619 gtk_widget_show (table);
6621 ruler = gtk_hruler_new ();
6622 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6623 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6625 g_signal_connect_swapped (window,
6626 "motion_notify_event",
6627 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6630 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6631 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6632 gtk_widget_show (ruler);
6635 ruler = gtk_vruler_new ();
6636 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6638 g_signal_connect_swapped (window,
6639 "motion_notify_event",
6640 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6643 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6644 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6645 gtk_widget_show (ruler);
6648 if (!gtk_widget_get_visible (window))
6649 gtk_widget_show (window);
6651 gtk_widget_destroy (window);
6655 text_toggle_editable (GtkWidget *checkbutton,
6658 gtk_text_set_editable(GTK_TEXT(text),
6659 GTK_TOGGLE_BUTTON(checkbutton)->active);
6663 text_toggle_word_wrap (GtkWidget *checkbutton,
6666 gtk_text_set_word_wrap(GTK_TEXT(text),
6667 GTK_TOGGLE_BUTTON(checkbutton)->active);
6674 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6675 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6676 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6677 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6678 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6679 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6680 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6681 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6684 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6690 GdkPixbuf *book_open;
6691 GdkPixbuf *book_closed;
6692 GtkWidget *sample_notebook;
6695 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6697 GtkWidget *page_widget;
6700 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6702 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6703 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6705 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6706 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6710 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
6712 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6713 gint old_page_num = gtk_notebook_get_current_page (notebook);
6715 if (page_num == old_page_num)
6718 set_page_image (notebook, page_num, book_open);
6720 if (old_page_num != -1)
6721 set_page_image (notebook, old_page_num, book_closed);
6725 tab_fill (GtkToggleButton *button, GtkWidget *child)
6728 GtkPackType pack_type;
6730 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6731 &expand, NULL, &pack_type);
6732 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6733 expand, button->active, pack_type);
6737 tab_expand (GtkToggleButton *button, GtkWidget *child)
6740 GtkPackType pack_type;
6742 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6743 NULL, &fill, &pack_type);
6744 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6745 button->active, fill, pack_type);
6749 tab_pack (GtkToggleButton *button, GtkWidget *child)
6755 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6756 &expand, &fill, NULL);
6757 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6758 expand, fill, button->active);
6762 create_pages (GtkNotebook *notebook, gint start, gint end)
6764 GtkWidget *child = NULL;
6769 GtkWidget *label_box;
6770 GtkWidget *menu_box;
6774 char accel_buffer[32];
6776 for (i = start; i <= end; i++)
6778 sprintf (buffer, "Page %d", i);
6779 sprintf (accel_buffer, "Page _%d", i);
6781 child = gtk_frame_new (buffer);
6782 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6784 vbox = gtk_vbox_new (TRUE,0);
6785 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6786 gtk_container_add (GTK_CONTAINER (child), vbox);
6788 hbox = gtk_hbox_new (TRUE,0);
6789 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6791 button = gtk_check_button_new_with_label ("Fill Tab");
6792 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6793 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6794 g_signal_connect (button, "toggled",
6795 G_CALLBACK (tab_fill), child);
6797 button = gtk_check_button_new_with_label ("Expand Tab");
6798 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6799 g_signal_connect (button, "toggled",
6800 G_CALLBACK (tab_expand), child);
6802 button = gtk_check_button_new_with_label ("Pack end");
6803 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6804 g_signal_connect (button, "toggled",
6805 G_CALLBACK (tab_pack), child);
6807 button = gtk_button_new_with_label ("Hide Page");
6808 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6809 g_signal_connect_swapped (button, "clicked",
6810 G_CALLBACK (gtk_widget_hide),
6813 gtk_widget_show_all (child);
6815 label_box = gtk_hbox_new (FALSE, 0);
6816 pixwid = gtk_image_new_from_pixbuf (book_closed);
6817 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6819 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6820 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6821 label = gtk_label_new_with_mnemonic (accel_buffer);
6822 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6823 gtk_widget_show_all (label_box);
6826 menu_box = gtk_hbox_new (FALSE, 0);
6827 pixwid = gtk_image_new_from_pixbuf (book_closed);
6828 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6830 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6831 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6832 label = gtk_label_new (buffer);
6833 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6834 gtk_widget_show_all (menu_box);
6836 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6841 rotate_notebook (GtkButton *button,
6842 GtkNotebook *notebook)
6844 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
6848 show_all_pages (GtkButton *button,
6849 GtkNotebook *notebook)
6851 gtk_container_foreach (GTK_CONTAINER (notebook),
6852 (GtkCallback) gtk_widget_show, NULL);
6856 notebook_type_changed (GtkWidget *optionmenu,
6859 GtkNotebook *notebook;
6869 notebook = GTK_NOTEBOOK (data);
6871 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6876 /* standard notebook */
6877 gtk_notebook_set_show_tabs (notebook, TRUE);
6878 gtk_notebook_set_show_border (notebook, TRUE);
6879 gtk_notebook_set_scrollable (notebook, FALSE);
6883 /* notabs notebook */
6884 gtk_notebook_set_show_tabs (notebook, FALSE);
6885 gtk_notebook_set_show_border (notebook, TRUE);
6890 gtk_notebook_set_show_tabs (notebook, FALSE);
6891 gtk_notebook_set_show_border (notebook, FALSE);
6896 gtk_notebook_set_show_tabs (notebook, TRUE);
6897 gtk_notebook_set_show_border (notebook, TRUE);
6898 gtk_notebook_set_scrollable (notebook, TRUE);
6899 if (g_list_length (notebook->children) == 5)
6900 create_pages (notebook, 6, 15);
6906 if (g_list_length (notebook->children) == 15)
6907 for (i = 0; i < 10; i++)
6908 gtk_notebook_remove_page (notebook, 5);
6912 notebook_popup (GtkToggleButton *button,
6913 GtkNotebook *notebook)
6916 gtk_notebook_popup_enable (notebook);
6918 gtk_notebook_popup_disable (notebook);
6922 notebook_homogeneous (GtkToggleButton *button,
6923 GtkNotebook *notebook)
6925 g_object_set (notebook, "homogeneous", button->active, NULL);
6929 create_notebook (GtkWidget *widget)
6931 static GtkWidget *window = NULL;
6935 GtkWidget *separator;
6938 GdkPixbuf *book_open_xpm;
6939 GdkPixbuf *book_closed_xpm;
6941 static gchar *items[] =
6951 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6952 gtk_window_set_screen (GTK_WINDOW (window),
6953 gtk_widget_get_screen (widget));
6955 g_signal_connect (window, "destroy",
6956 G_CALLBACK (gtk_widget_destroyed),
6959 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6960 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6962 box1 = gtk_vbox_new (FALSE, 0);
6963 gtk_container_add (GTK_CONTAINER (window), box1);
6965 sample_notebook = gtk_notebook_new ();
6966 g_signal_connect (sample_notebook, "switch_page",
6967 G_CALLBACK (page_switch), NULL);
6968 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6969 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6970 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6972 gtk_widget_realize (sample_notebook);
6975 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
6978 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
6980 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6982 separator = gtk_hseparator_new ();
6983 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6985 box2 = gtk_hbox_new (FALSE, 5);
6986 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6987 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6989 button = gtk_check_button_new_with_label ("popup menu");
6990 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6991 g_signal_connect (button, "clicked",
6992 G_CALLBACK (notebook_popup),
6995 button = gtk_check_button_new_with_label ("homogeneous tabs");
6996 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6997 g_signal_connect (button, "clicked",
6998 G_CALLBACK (notebook_homogeneous),
7001 box2 = gtk_hbox_new (FALSE, 5);
7002 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7003 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7005 label = gtk_label_new ("Notebook Style :");
7006 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
7008 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
7009 notebook_type_changed,
7011 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
7013 button = gtk_button_new_with_label ("Show all Pages");
7014 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
7015 g_signal_connect (button, "clicked",
7016 G_CALLBACK (show_all_pages), sample_notebook);
7018 box2 = gtk_hbox_new (TRUE, 10);
7019 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7020 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7022 button = gtk_button_new_with_label ("prev");
7023 g_signal_connect_swapped (button, "clicked",
7024 G_CALLBACK (gtk_notebook_prev_page),
7026 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7028 button = gtk_button_new_with_label ("next");
7029 g_signal_connect_swapped (button, "clicked",
7030 G_CALLBACK (gtk_notebook_next_page),
7032 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7034 button = gtk_button_new_with_label ("rotate");
7035 g_signal_connect (button, "clicked",
7036 G_CALLBACK (rotate_notebook), sample_notebook);
7037 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7039 separator = gtk_hseparator_new ();
7040 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
7042 button = gtk_button_new_with_label ("close");
7043 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
7044 g_signal_connect_swapped (button, "clicked",
7045 G_CALLBACK (gtk_widget_destroy),
7047 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
7048 gtk_widget_set_can_default (button, TRUE);
7049 gtk_widget_grab_default (button);
7052 if (!gtk_widget_get_visible (window))
7053 gtk_widget_show_all (window);
7055 gtk_widget_destroy (window);
7063 toggle_resize (GtkWidget *widget, GtkWidget *child)
7065 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7066 GValue value = { 0, };
7067 g_value_init (&value, G_TYPE_BOOLEAN);
7068 gtk_container_child_get_property (container, child, "resize", &value);
7069 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7070 gtk_container_child_set_property (container, child, "resize", &value);
7074 toggle_shrink (GtkWidget *widget, GtkWidget *child)
7076 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7077 GValue value = { 0, };
7078 g_value_init (&value, G_TYPE_BOOLEAN);
7079 gtk_container_child_get_property (container, child, "shrink", &value);
7080 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7081 gtk_container_child_set_property (container, child, "shrink", &value);
7085 paned_props_clicked (GtkWidget *button,
7088 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
7090 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
7094 create_pane_options (GtkPaned *paned,
7095 const gchar *frame_label,
7096 const gchar *label1,
7097 const gchar *label2)
7103 GtkWidget *check_button;
7105 frame = gtk_frame_new (frame_label);
7106 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
7108 table = gtk_table_new (4, 2, 4);
7109 gtk_container_add (GTK_CONTAINER (frame), table);
7111 label = gtk_label_new (label1);
7112 gtk_table_attach_defaults (GTK_TABLE (table), label,
7115 check_button = gtk_check_button_new_with_label ("Resize");
7116 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7118 g_signal_connect (check_button, "toggled",
7119 G_CALLBACK (toggle_resize),
7122 check_button = gtk_check_button_new_with_label ("Shrink");
7123 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7125 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7127 g_signal_connect (check_button, "toggled",
7128 G_CALLBACK (toggle_shrink),
7131 label = gtk_label_new (label2);
7132 gtk_table_attach_defaults (GTK_TABLE (table), label,
7135 check_button = gtk_check_button_new_with_label ("Resize");
7136 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7138 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7140 g_signal_connect (check_button, "toggled",
7141 G_CALLBACK (toggle_resize),
7144 check_button = gtk_check_button_new_with_label ("Shrink");
7145 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7147 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7149 g_signal_connect (check_button, "toggled",
7150 G_CALLBACK (toggle_shrink),
7153 button = gtk_button_new_with_mnemonic ("_Properties");
7154 gtk_table_attach_defaults (GTK_TABLE (table), button,
7156 g_signal_connect (button, "clicked",
7157 G_CALLBACK (paned_props_clicked),
7164 create_panes (GtkWidget *widget)
7166 static GtkWidget *window = NULL;
7175 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7177 gtk_window_set_screen (GTK_WINDOW (window),
7178 gtk_widget_get_screen (widget));
7180 g_signal_connect (window, "destroy",
7181 G_CALLBACK (gtk_widget_destroyed),
7184 gtk_window_set_title (GTK_WINDOW (window), "Panes");
7185 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7187 vbox = gtk_vbox_new (FALSE, 0);
7188 gtk_container_add (GTK_CONTAINER (window), vbox);
7190 vpaned = gtk_vpaned_new ();
7191 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
7192 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
7194 hpaned = gtk_hpaned_new ();
7195 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
7197 frame = gtk_frame_new (NULL);
7198 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7199 gtk_widget_set_size_request (frame, 60, 60);
7200 gtk_paned_add1 (GTK_PANED (hpaned), frame);
7202 button = gtk_button_new_with_label ("Hi there");
7203 gtk_container_add (GTK_CONTAINER(frame), button);
7205 frame = gtk_frame_new (NULL);
7206 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7207 gtk_widget_set_size_request (frame, 80, 60);
7208 gtk_paned_add2 (GTK_PANED (hpaned), frame);
7210 frame = gtk_frame_new (NULL);
7211 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7212 gtk_widget_set_size_request (frame, 60, 80);
7213 gtk_paned_add2 (GTK_PANED (vpaned), frame);
7215 /* Now create toggle buttons to control sizing */
7217 gtk_box_pack_start (GTK_BOX (vbox),
7218 create_pane_options (GTK_PANED (hpaned),
7224 gtk_box_pack_start (GTK_BOX (vbox),
7225 create_pane_options (GTK_PANED (vpaned),
7231 gtk_widget_show_all (vbox);
7234 if (!gtk_widget_get_visible (window))
7235 gtk_widget_show (window);
7237 gtk_widget_destroy (window);
7241 * Paned keyboard navigation
7245 paned_keyboard_window1 (GtkWidget *widget)
7268 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7269 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
7270 gtk_window_set_screen (GTK_WINDOW (window1),
7271 gtk_widget_get_screen (widget));
7273 hpaned1 = gtk_hpaned_new ();
7274 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
7276 frame1 = gtk_frame_new (NULL);
7277 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
7278 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
7280 vbox1 = gtk_vbox_new (FALSE, 0);
7281 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
7283 button7 = gtk_button_new_with_label ("button7");
7284 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
7286 button8 = gtk_button_new_with_label ("button8");
7287 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
7289 button9 = gtk_button_new_with_label ("button9");
7290 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
7292 vpaned1 = gtk_vpaned_new ();
7293 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
7295 frame2 = gtk_frame_new (NULL);
7296 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
7297 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
7299 frame5 = gtk_frame_new (NULL);
7300 gtk_container_add (GTK_CONTAINER (frame2), frame5);
7302 hbox1 = gtk_hbox_new (FALSE, 0);
7303 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
7305 button5 = gtk_button_new_with_label ("button5");
7306 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
7308 button6 = gtk_button_new_with_label ("button6");
7309 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
7311 frame3 = gtk_frame_new (NULL);
7312 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
7313 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
7315 frame4 = gtk_frame_new ("Buttons");
7316 gtk_container_add (GTK_CONTAINER (frame3), frame4);
7317 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
7319 table1 = gtk_table_new (2, 2, FALSE);
7320 gtk_container_add (GTK_CONTAINER (frame4), table1);
7321 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
7323 button1 = gtk_button_new_with_label ("button1");
7324 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
7325 (GtkAttachOptions) (GTK_FILL),
7326 (GtkAttachOptions) (0), 0, 0);
7328 button2 = gtk_button_new_with_label ("button2");
7329 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
7330 (GtkAttachOptions) (GTK_FILL),
7331 (GtkAttachOptions) (0), 0, 0);
7333 button3 = gtk_button_new_with_label ("button3");
7334 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
7335 (GtkAttachOptions) (GTK_FILL),
7336 (GtkAttachOptions) (0), 0, 0);
7338 button4 = gtk_button_new_with_label ("button4");
7339 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
7340 (GtkAttachOptions) (GTK_FILL),
7341 (GtkAttachOptions) (0), 0, 0);
7347 paned_keyboard_window2 (GtkWidget *widget)
7352 GtkWidget *button13;
7356 GtkWidget *button12;
7358 GtkWidget *button11;
7359 GtkWidget *button10;
7361 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7362 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
7364 gtk_window_set_screen (GTK_WINDOW (window2),
7365 gtk_widget_get_screen (widget));
7367 hpaned2 = gtk_hpaned_new ();
7368 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
7370 frame6 = gtk_frame_new (NULL);
7371 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
7372 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
7374 button13 = gtk_button_new_with_label ("button13");
7375 gtk_container_add (GTK_CONTAINER (frame6), button13);
7377 hbox2 = gtk_hbox_new (FALSE, 0);
7378 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
7380 vpaned2 = gtk_vpaned_new ();
7381 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
7383 frame7 = gtk_frame_new (NULL);
7384 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
7385 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
7387 button12 = gtk_button_new_with_label ("button12");
7388 gtk_container_add (GTK_CONTAINER (frame7), button12);
7390 frame8 = gtk_frame_new (NULL);
7391 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
7392 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
7394 button11 = gtk_button_new_with_label ("button11");
7395 gtk_container_add (GTK_CONTAINER (frame8), button11);
7397 button10 = gtk_button_new_with_label ("button10");
7398 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
7404 paned_keyboard_window3 (GtkWidget *widget)
7411 GtkWidget *button14;
7414 GtkWidget *button15;
7417 GtkWidget *button16;
7419 GtkWidget *button17;
7421 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7422 g_object_set_data (G_OBJECT (window3), "window3", window3);
7423 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
7425 gtk_window_set_screen (GTK_WINDOW (window3),
7426 gtk_widget_get_screen (widget));
7429 vbox2 = gtk_vbox_new (FALSE, 0);
7430 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7432 label1 = gtk_label_new ("Three panes nested inside each other");
7433 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7435 hpaned3 = gtk_hpaned_new ();
7436 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7438 frame9 = gtk_frame_new (NULL);
7439 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7440 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7442 button14 = gtk_button_new_with_label ("button14");
7443 gtk_container_add (GTK_CONTAINER (frame9), button14);
7445 hpaned4 = gtk_hpaned_new ();
7446 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7448 frame10 = gtk_frame_new (NULL);
7449 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7450 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7452 button15 = gtk_button_new_with_label ("button15");
7453 gtk_container_add (GTK_CONTAINER (frame10), button15);
7455 hpaned5 = gtk_hpaned_new ();
7456 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7458 frame11 = gtk_frame_new (NULL);
7459 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7460 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7462 button16 = gtk_button_new_with_label ("button16");
7463 gtk_container_add (GTK_CONTAINER (frame11), button16);
7465 frame12 = gtk_frame_new (NULL);
7466 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7467 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7469 button17 = gtk_button_new_with_label ("button17");
7470 gtk_container_add (GTK_CONTAINER (frame12), button17);
7476 paned_keyboard_window4 (GtkWidget *widget)
7483 GtkWidget *button19;
7484 GtkWidget *button18;
7487 GtkWidget *button21;
7488 GtkWidget *button20;
7490 GtkWidget *button23;
7491 GtkWidget *button22;
7493 GtkWidget *button25;
7494 GtkWidget *button24;
7496 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7497 g_object_set_data (G_OBJECT (window4), "window4", window4);
7498 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7500 gtk_window_set_screen (GTK_WINDOW (window4),
7501 gtk_widget_get_screen (widget));
7503 vbox3 = gtk_vbox_new (FALSE, 0);
7504 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7506 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7507 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7508 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7510 hpaned6 = gtk_hpaned_new ();
7511 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7513 vpaned3 = gtk_vpaned_new ();
7514 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7516 button19 = gtk_button_new_with_label ("button19");
7517 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7519 button18 = gtk_button_new_with_label ("button18");
7520 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7522 hbox3 = gtk_hbox_new (FALSE, 0);
7523 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7525 vpaned4 = gtk_vpaned_new ();
7526 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7528 button21 = gtk_button_new_with_label ("button21");
7529 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7531 button20 = gtk_button_new_with_label ("button20");
7532 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7534 vpaned5 = gtk_vpaned_new ();
7535 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7537 button23 = gtk_button_new_with_label ("button23");
7538 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7540 button22 = gtk_button_new_with_label ("button22");
7541 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7543 vpaned6 = gtk_vpaned_new ();
7544 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7546 button25 = gtk_button_new_with_label ("button25");
7547 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7549 button24 = gtk_button_new_with_label ("button24");
7550 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7556 create_paned_keyboard_navigation (GtkWidget *widget)
7558 static GtkWidget *window1 = NULL;
7559 static GtkWidget *window2 = NULL;
7560 static GtkWidget *window3 = NULL;
7561 static GtkWidget *window4 = NULL;
7564 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7566 gtk_widget_destroy (window1);
7567 gtk_widget_destroy (window2);
7568 gtk_widget_destroy (window3);
7569 gtk_widget_destroy (window4);
7574 window1 = paned_keyboard_window1 (widget);
7575 g_signal_connect (window1, "destroy",
7576 G_CALLBACK (gtk_widget_destroyed),
7582 window2 = paned_keyboard_window2 (widget);
7583 g_signal_connect (window2, "destroy",
7584 G_CALLBACK (gtk_widget_destroyed),
7590 window3 = paned_keyboard_window3 (widget);
7591 g_signal_connect (window3, "destroy",
7592 G_CALLBACK (gtk_widget_destroyed),
7598 window4 = paned_keyboard_window4 (widget);
7599 g_signal_connect (window4, "destroy",
7600 G_CALLBACK (gtk_widget_destroyed),
7604 if (gtk_widget_get_visible (window1))
7605 gtk_widget_destroy (GTK_WIDGET (window1));
7607 gtk_widget_show_all (GTK_WIDGET (window1));
7609 if (gtk_widget_get_visible (window2))
7610 gtk_widget_destroy (GTK_WIDGET (window2));
7612 gtk_widget_show_all (GTK_WIDGET (window2));
7614 if (gtk_widget_get_visible (window3))
7615 gtk_widget_destroy (GTK_WIDGET (window3));
7617 gtk_widget_show_all (GTK_WIDGET (window3));
7619 if (gtk_widget_get_visible (window4))
7620 gtk_widget_destroy (GTK_WIDGET (window4));
7622 gtk_widget_show_all (GTK_WIDGET (window4));
7630 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7633 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7637 /* ignore double and triple click */
7638 if (event->type != GDK_BUTTON_PRESS)
7641 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7642 p->x = (int) event->x;
7643 p->y = (int) event->y;
7645 gtk_grab_add (widget);
7646 gdk_pointer_grab (widget->window, TRUE,
7647 GDK_BUTTON_RELEASE_MASK |
7648 GDK_BUTTON_MOTION_MASK |
7649 GDK_POINTER_MOTION_HINT_MASK,
7654 shape_released (GtkWidget *widget)
7656 gtk_grab_remove (widget);
7657 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7662 shape_motion (GtkWidget *widget,
7663 GdkEventMotion *event)
7667 GdkModifierType mask;
7669 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7672 * Can't use event->x / event->y here
7673 * because I need absolute coordinates.
7675 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7676 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
7680 shape_create_icon (GdkScreen *screen,
7691 CursorOffset* icon_pos;
7693 GdkBitmap *gdk_pixmap_mask;
7694 GdkPixmap *gdk_pixmap;
7697 style = gtk_widget_get_default_style ();
7698 gc = style->black_gc;
7701 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7703 window = gtk_window_new (window_type);
7704 gtk_window_set_screen (GTK_WINDOW (window), screen);
7706 fixed = gtk_fixed_new ();
7707 gtk_widget_set_size_request (fixed, 100, 100);
7708 gtk_container_add (GTK_CONTAINER (window), fixed);
7709 gtk_widget_show (fixed);
7711 gtk_widget_set_events (window,
7712 gtk_widget_get_events (window) |
7713 GDK_BUTTON_MOTION_MASK |
7714 GDK_POINTER_MOTION_HINT_MASK |
7715 GDK_BUTTON_PRESS_MASK);
7717 gtk_widget_realize (window);
7718 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
7719 &style->bg[GTK_STATE_NORMAL],
7722 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
7723 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
7724 gtk_widget_show (pixmap);
7726 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
7728 g_object_unref (gdk_pixmap_mask);
7729 g_object_unref (gdk_pixmap);
7731 g_signal_connect (window, "button_press_event",
7732 G_CALLBACK (shape_pressed), NULL);
7733 g_signal_connect (window, "button_release_event",
7734 G_CALLBACK (shape_released), NULL);
7735 g_signal_connect (window, "motion_notify_event",
7736 G_CALLBACK (shape_motion), NULL);
7738 icon_pos = g_new (CursorOffset, 1);
7739 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7741 gtk_widget_set_uposition (window, x, y);
7742 gtk_widget_show (window);
7748 create_shapes (GtkWidget *widget)
7750 /* Variables used by the Drag/Drop and Shape Window demos */
7751 static GtkWidget *modeller = NULL;
7752 static GtkWidget *sheets = NULL;
7753 static GtkWidget *rings = NULL;
7754 static GtkWidget *with_region = NULL;
7755 GdkScreen *screen = gtk_widget_get_screen (widget);
7757 if (!(file_exists ("Modeller.xpm") &&
7758 file_exists ("FilesQueue.xpm") &&
7759 file_exists ("3DRings.xpm")))
7765 modeller = shape_create_icon (screen, "Modeller.xpm",
7766 440, 140, 0,0, GTK_WINDOW_POPUP);
7768 g_signal_connect (modeller, "destroy",
7769 G_CALLBACK (gtk_widget_destroyed),
7773 gtk_widget_destroy (modeller);
7777 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7778 580, 170, 0,0, GTK_WINDOW_POPUP);
7780 g_signal_connect (sheets, "destroy",
7781 G_CALLBACK (gtk_widget_destroyed),
7786 gtk_widget_destroy (sheets);
7790 rings = shape_create_icon (screen, "3DRings.xpm",
7791 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7793 g_signal_connect (rings, "destroy",
7794 G_CALLBACK (gtk_widget_destroyed),
7798 gtk_widget_destroy (rings);
7805 with_region = shape_create_icon (screen, "3DRings.xpm",
7806 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7808 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7810 g_signal_connect (with_region, "destroy",
7811 G_CALLBACK (gtk_widget_destroyed),
7814 /* reset shape from mask to a region */
7817 region = gdk_region_new ();
7829 gdk_region_union_with_rect (region, &rect);
7837 gdk_window_shape_combine_region (with_region->window,
7842 gtk_widget_destroy (with_region);
7850 create_wmhints (GtkWidget *widget)
7852 static GtkWidget *window = NULL;
7854 GtkWidget *separator;
7863 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7865 gtk_window_set_screen (GTK_WINDOW (window),
7866 gtk_widget_get_screen (widget));
7868 g_signal_connect (window, "destroy",
7869 G_CALLBACK (gtk_widget_destroyed),
7872 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7873 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7875 gtk_widget_realize (window);
7877 circles = gdk_bitmap_create_from_data (window->window,
7878 (gchar *) circles_bits,
7881 gdk_window_set_icon (window->window, NULL,
7884 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
7886 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7887 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7889 box1 = gtk_vbox_new (FALSE, 0);
7890 gtk_container_add (GTK_CONTAINER (window), box1);
7891 gtk_widget_show (box1);
7893 label = gtk_label_new ("Try iconizing me!");
7894 gtk_widget_set_size_request (label, 150, 50);
7895 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7896 gtk_widget_show (label);
7899 separator = gtk_hseparator_new ();
7900 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7901 gtk_widget_show (separator);
7904 box2 = gtk_vbox_new (FALSE, 10);
7905 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7906 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7907 gtk_widget_show (box2);
7910 button = gtk_button_new_with_label ("close");
7912 g_signal_connect_swapped (button, "clicked",
7913 G_CALLBACK (gtk_widget_destroy),
7916 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7917 gtk_widget_set_can_default (button, TRUE);
7918 gtk_widget_grab_default (button);
7919 gtk_widget_show (button);
7922 if (!gtk_widget_get_visible (window))
7923 gtk_widget_show (window);
7925 gtk_widget_destroy (window);
7930 * Window state tracking
7934 window_state_callback (GtkWidget *widget,
7935 GdkEventWindowState *event,
7938 GtkWidget *label = data;
7941 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
7942 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7943 "withdrawn" : "not withdrawn", ", ",
7944 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7945 "iconified" : "not iconified", ", ",
7946 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7947 "sticky" : "not sticky", ", ",
7948 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7949 "maximized" : "not maximized", ", ",
7950 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7951 "fullscreen" : "not fullscreen",
7952 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7953 "above" : "not above", ", ",
7954 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7955 "below" : "not below", ", ",
7958 gtk_label_set_text (GTK_LABEL (label), msg);
7966 tracking_label (GtkWidget *window)
7972 hbox = gtk_hbox_new (FALSE, 5);
7974 g_signal_connect_object (hbox,
7976 G_CALLBACK (gtk_widget_destroy),
7980 label = gtk_label_new ("<no window state events received>");
7981 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7982 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7984 g_signal_connect (window,
7985 "window_state_event",
7986 G_CALLBACK (window_state_callback),
7989 button = gtk_button_new_with_label ("Deiconify");
7990 g_signal_connect_object (button,
7992 G_CALLBACK (gtk_window_deiconify),
7995 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7997 button = gtk_button_new_with_label ("Iconify");
7998 g_signal_connect_object (button,
8000 G_CALLBACK (gtk_window_iconify),
8003 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8005 button = gtk_button_new_with_label ("Fullscreen");
8006 g_signal_connect_object (button,
8008 G_CALLBACK (gtk_window_fullscreen),
8011 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8013 button = gtk_button_new_with_label ("Unfullscreen");
8014 g_signal_connect_object (button,
8016 G_CALLBACK (gtk_window_unfullscreen),
8019 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8021 button = gtk_button_new_with_label ("Present");
8022 g_signal_connect_object (button,
8024 G_CALLBACK (gtk_window_present),
8027 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8029 button = gtk_button_new_with_label ("Show");
8030 g_signal_connect_object (button,
8032 G_CALLBACK (gtk_widget_show),
8035 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8037 gtk_widget_show_all (hbox);
8043 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
8045 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8047 gtk_window_set_keep_above (GTK_WINDOW (data),
8048 gtk_toggle_button_get_active (togglebutton));
8050 if (gtk_toggle_button_get_active (togglebutton))
8051 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8055 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
8057 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8059 gtk_window_set_keep_below (GTK_WINDOW (data),
8060 gtk_toggle_button_get_active (togglebutton));
8062 if (gtk_toggle_button_get_active (togglebutton))
8063 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8068 get_state_controls (GtkWidget *window)
8072 GtkWidget *button_above;
8073 GtkWidget *button_below;
8075 vbox = gtk_vbox_new (FALSE, 0);
8077 button = gtk_button_new_with_label ("Stick");
8078 g_signal_connect_object (button,
8080 G_CALLBACK (gtk_window_stick),
8083 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8085 button = gtk_button_new_with_label ("Unstick");
8086 g_signal_connect_object (button,
8088 G_CALLBACK (gtk_window_unstick),
8091 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8093 button = gtk_button_new_with_label ("Maximize");
8094 g_signal_connect_object (button,
8096 G_CALLBACK (gtk_window_maximize),
8099 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8101 button = gtk_button_new_with_label ("Unmaximize");
8102 g_signal_connect_object (button,
8104 G_CALLBACK (gtk_window_unmaximize),
8107 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8109 button = gtk_button_new_with_label ("Iconify");
8110 g_signal_connect_object (button,
8112 G_CALLBACK (gtk_window_iconify),
8115 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8117 button = gtk_button_new_with_label ("Fullscreen");
8118 g_signal_connect_object (button,
8120 G_CALLBACK (gtk_window_fullscreen),
8123 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8125 button = gtk_button_new_with_label ("Unfullscreen");
8126 g_signal_connect_object (button,
8128 G_CALLBACK (gtk_window_unfullscreen),
8131 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8133 button_above = gtk_toggle_button_new_with_label ("Keep above");
8134 g_signal_connect (button_above,
8136 G_CALLBACK (keep_window_above),
8138 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
8140 button_below = gtk_toggle_button_new_with_label ("Keep below");
8141 g_signal_connect (button_below,
8143 G_CALLBACK (keep_window_below),
8145 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
8147 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
8148 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
8150 button = gtk_button_new_with_label ("Hide (withdraw)");
8151 g_signal_connect_object (button,
8153 G_CALLBACK (gtk_widget_hide),
8156 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8158 gtk_widget_show_all (vbox);
8164 create_window_states (GtkWidget *widget)
8166 static GtkWidget *window = NULL;
8169 GtkWidget *iconified;
8171 GtkWidget *controls;
8175 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8176 gtk_window_set_screen (GTK_WINDOW (window),
8177 gtk_widget_get_screen (widget));
8179 g_signal_connect (window, "destroy",
8180 G_CALLBACK (gtk_widget_destroyed),
8183 gtk_window_set_title (GTK_WINDOW (window), "Window states");
8185 box1 = gtk_vbox_new (FALSE, 0);
8186 gtk_container_add (GTK_CONTAINER (window), box1);
8188 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8190 gtk_window_set_screen (GTK_WINDOW (iconified),
8191 gtk_widget_get_screen (widget));
8193 g_signal_connect_object (iconified, "destroy",
8194 G_CALLBACK (gtk_widget_destroy),
8197 gtk_window_iconify (GTK_WINDOW (iconified));
8198 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
8199 controls = get_state_controls (iconified);
8200 gtk_container_add (GTK_CONTAINER (iconified), controls);
8202 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8204 gtk_window_set_screen (GTK_WINDOW (normal),
8205 gtk_widget_get_screen (widget));
8207 g_signal_connect_object (normal, "destroy",
8208 G_CALLBACK (gtk_widget_destroy),
8212 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
8213 controls = get_state_controls (normal);
8214 gtk_container_add (GTK_CONTAINER (normal), controls);
8216 label = tracking_label (iconified);
8217 gtk_container_add (GTK_CONTAINER (box1), label);
8219 label = tracking_label (normal);
8220 gtk_container_add (GTK_CONTAINER (box1), label);
8222 gtk_widget_show_all (iconified);
8223 gtk_widget_show_all (normal);
8224 gtk_widget_show_all (box1);
8227 if (!gtk_widget_get_visible (window))
8228 gtk_widget_show (window);
8230 gtk_widget_destroy (window);
8238 configure_event_callback (GtkWidget *widget,
8239 GdkEventConfigure *event,
8242 GtkWidget *label = data;
8246 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
8248 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
8250 event->x, event->y, event->width, event->height,
8253 gtk_label_set_text (GTK_LABEL (label), msg);
8261 get_ints (GtkWidget *window,
8268 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
8269 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
8271 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
8272 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
8276 set_size_callback (GtkWidget *widget,
8281 get_ints (data, &w, &h);
8283 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
8287 unset_default_size_callback (GtkWidget *widget,
8290 gtk_window_set_default_size (g_object_get_data (data, "target"),
8295 set_default_size_callback (GtkWidget *widget,
8300 get_ints (data, &w, &h);
8302 gtk_window_set_default_size (g_object_get_data (data, "target"),
8307 unset_size_request_callback (GtkWidget *widget,
8310 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8315 set_size_request_callback (GtkWidget *widget,
8320 get_ints (data, &w, &h);
8322 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8327 set_location_callback (GtkWidget *widget,
8332 get_ints (data, &x, &y);
8334 gtk_window_move (g_object_get_data (data, "target"), x, y);
8338 move_to_position_callback (GtkWidget *widget,
8344 window = g_object_get_data (data, "target");
8346 gtk_window_get_position (window, &x, &y);
8348 gtk_window_move (window, x, y);
8352 set_geometry_callback (GtkWidget *entry,
8358 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
8360 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
8362 if (!gtk_window_parse_geometry (target, text))
8363 g_print ("Bad geometry string '%s'\n", text);
8369 allow_shrink_callback (GtkWidget *widget,
8372 g_object_set (g_object_get_data (data, "target"),
8374 GTK_TOGGLE_BUTTON (widget)->active,
8379 allow_grow_callback (GtkWidget *widget,
8382 g_object_set (g_object_get_data (data, "target"),
8384 GTK_TOGGLE_BUTTON (widget)->active,
8389 gravity_selected (GtkWidget *widget,
8392 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
8393 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
8397 pos_selected (GtkWidget *widget,
8400 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
8401 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
8405 move_gravity_window_to_current_position (GtkWidget *widget,
8411 window = GTK_WINDOW (data);
8413 gtk_window_get_position (window, &x, &y);
8415 gtk_window_move (window, x, y);
8419 get_screen_corner (GtkWindow *window,
8424 GdkScreen * screen = gtk_window_get_screen (window);
8426 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
8428 switch (gtk_window_get_gravity (window))
8430 case GDK_GRAVITY_SOUTH_EAST:
8431 *x = gdk_screen_get_width (screen) - w;
8432 *y = gdk_screen_get_height (screen) - h;
8435 case GDK_GRAVITY_NORTH_EAST:
8436 *x = gdk_screen_get_width (screen) - w;
8440 case GDK_GRAVITY_SOUTH_WEST:
8442 *y = gdk_screen_get_height (screen) - h;
8445 case GDK_GRAVITY_NORTH_WEST:
8450 case GDK_GRAVITY_SOUTH:
8451 *x = (gdk_screen_get_width (screen) - w) / 2;
8452 *y = gdk_screen_get_height (screen) - h;
8455 case GDK_GRAVITY_NORTH:
8456 *x = (gdk_screen_get_width (screen) - w) / 2;
8460 case GDK_GRAVITY_WEST:
8462 *y = (gdk_screen_get_height (screen) - h) / 2;
8465 case GDK_GRAVITY_EAST:
8466 *x = gdk_screen_get_width (screen) - w;
8467 *y = (gdk_screen_get_height (screen) - h) / 2;
8470 case GDK_GRAVITY_CENTER:
8471 *x = (gdk_screen_get_width (screen) - w) / 2;
8472 *y = (gdk_screen_get_height (screen) - h) / 2;
8475 case GDK_GRAVITY_STATIC:
8476 /* pick some random numbers */
8482 g_assert_not_reached ();
8488 move_gravity_window_to_starting_position (GtkWidget *widget,
8494 window = GTK_WINDOW (data);
8496 get_screen_corner (window,
8499 gtk_window_move (window, x, y);
8503 make_gravity_window (GtkWidget *destroy_with,
8512 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8514 gtk_window_set_screen (GTK_WINDOW (window),
8515 gtk_widget_get_screen (destroy_with));
8517 vbox = gtk_vbox_new (FALSE, 0);
8518 gtk_widget_show (vbox);
8520 gtk_container_add (GTK_CONTAINER (window), vbox);
8521 gtk_window_set_title (GTK_WINDOW (window), title);
8522 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8524 g_signal_connect_object (destroy_with,
8526 G_CALLBACK (gtk_widget_destroy),
8531 button = gtk_button_new_with_mnemonic ("_Move to current position");
8533 g_signal_connect (button, "clicked",
8534 G_CALLBACK (move_gravity_window_to_current_position),
8537 gtk_container_add (GTK_CONTAINER (vbox), button);
8538 gtk_widget_show (button);
8540 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8542 g_signal_connect (button, "clicked",
8543 G_CALLBACK (move_gravity_window_to_starting_position),
8546 gtk_container_add (GTK_CONTAINER (vbox), button);
8547 gtk_widget_show (button);
8549 /* Pretend this is the result of --geometry.
8550 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8551 * and in that case you probably should just use gtk_window_parse_geometry().
8552 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8553 * you are parsing --geometry or equivalent.
8555 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8559 gtk_window_set_default_size (GTK_WINDOW (window),
8562 get_screen_corner (GTK_WINDOW (window), &x, &y);
8564 gtk_window_move (GTK_WINDOW (window),
8571 do_gravity_test (GtkWidget *widget,
8574 GtkWidget *destroy_with = data;
8577 /* We put a window at each gravity point on the screen. */
8578 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8580 gtk_widget_show (window);
8582 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8584 gtk_widget_show (window);
8586 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8588 gtk_widget_show (window);
8590 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8592 gtk_widget_show (window);
8594 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8596 gtk_widget_show (window);
8598 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8600 gtk_widget_show (window);
8603 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8605 gtk_widget_show (window);
8608 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8610 gtk_widget_show (window);
8612 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8614 gtk_widget_show (window);
8616 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8618 gtk_widget_show (window);
8622 window_controls (GtkWidget *window)
8624 GtkWidget *control_window;
8634 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8636 gtk_window_set_screen (GTK_WINDOW (control_window),
8637 gtk_widget_get_screen (window));
8639 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8641 g_object_set_data (G_OBJECT (control_window),
8645 g_signal_connect_object (control_window,
8647 G_CALLBACK (gtk_widget_destroy),
8651 vbox = gtk_vbox_new (FALSE, 5);
8653 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8655 label = gtk_label_new ("<no configure events>");
8656 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8658 g_signal_connect (window,
8660 G_CALLBACK (configure_event_callback),
8663 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8665 spin = gtk_spin_button_new (adj, 0, 0);
8667 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8669 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8671 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8673 spin = gtk_spin_button_new (adj, 0, 0);
8675 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8677 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8679 entry = gtk_entry_new ();
8680 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8682 g_signal_connect (entry, "changed",
8683 G_CALLBACK (set_geometry_callback),
8686 button = gtk_button_new_with_label ("Show gravity test windows");
8687 g_signal_connect_swapped (button,
8689 G_CALLBACK (do_gravity_test),
8691 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8693 button = gtk_button_new_with_label ("Reshow with initial size");
8694 g_signal_connect_object (button,
8696 G_CALLBACK (gtk_window_reshow_with_initial_size),
8699 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8701 button = gtk_button_new_with_label ("Queue resize");
8702 g_signal_connect_object (button,
8704 G_CALLBACK (gtk_widget_queue_resize),
8707 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8709 button = gtk_button_new_with_label ("Resize");
8710 g_signal_connect (button,
8712 G_CALLBACK (set_size_callback),
8714 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8716 button = gtk_button_new_with_label ("Set default size");
8717 g_signal_connect (button,
8719 G_CALLBACK (set_default_size_callback),
8721 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8723 button = gtk_button_new_with_label ("Unset default size");
8724 g_signal_connect (button,
8726 G_CALLBACK (unset_default_size_callback),
8728 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8730 button = gtk_button_new_with_label ("Set size request");
8731 g_signal_connect (button,
8733 G_CALLBACK (set_size_request_callback),
8735 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8737 button = gtk_button_new_with_label ("Unset size request");
8738 g_signal_connect (button,
8740 G_CALLBACK (unset_size_request_callback),
8742 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8744 button = gtk_button_new_with_label ("Move");
8745 g_signal_connect (button,
8747 G_CALLBACK (set_location_callback),
8749 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8751 button = gtk_button_new_with_label ("Move to current position");
8752 g_signal_connect (button,
8754 G_CALLBACK (move_to_position_callback),
8756 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8758 button = gtk_check_button_new_with_label ("Allow shrink");
8759 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8760 g_signal_connect (button,
8762 G_CALLBACK (allow_shrink_callback),
8764 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8766 button = gtk_check_button_new_with_label ("Allow grow");
8767 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8768 g_signal_connect (button,
8770 G_CALLBACK (allow_grow_callback),
8772 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8774 button = gtk_button_new_with_mnemonic ("_Show");
8775 g_signal_connect_object (button,
8777 G_CALLBACK (gtk_widget_show),
8780 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8782 button = gtk_button_new_with_mnemonic ("_Hide");
8783 g_signal_connect_object (button,
8785 G_CALLBACK (gtk_widget_hide),
8788 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8790 om = gtk_combo_box_new_text ();
8794 static gchar *names[] = {
8795 "GDK_GRAVITY_NORTH_WEST",
8796 "GDK_GRAVITY_NORTH",
8797 "GDK_GRAVITY_NORTH_EAST",
8799 "GDK_GRAVITY_CENTER",
8801 "GDK_GRAVITY_SOUTH_WEST",
8802 "GDK_GRAVITY_SOUTH",
8803 "GDK_GRAVITY_SOUTH_EAST",
8804 "GDK_GRAVITY_STATIC",
8808 g_assert (names[i]);
8809 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8814 g_signal_connect (om,
8816 G_CALLBACK (gravity_selected),
8819 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8822 om = gtk_combo_box_new_text ();
8826 static gchar *names[] = {
8828 "GTK_WIN_POS_CENTER",
8829 "GTK_WIN_POS_MOUSE",
8830 "GTK_WIN_POS_CENTER_ALWAYS",
8831 "GTK_WIN_POS_CENTER_ON_PARENT",
8835 g_assert (names[i]);
8836 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8841 g_signal_connect (om,
8843 G_CALLBACK (pos_selected),
8846 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8848 gtk_widget_show_all (vbox);
8850 return control_window;
8854 create_window_sizing (GtkWidget *widget)
8856 static GtkWidget *window = NULL;
8857 static GtkWidget *target_window = NULL;
8863 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8864 gtk_window_set_screen (GTK_WINDOW (target_window),
8865 gtk_widget_get_screen (widget));
8866 label = gtk_label_new (NULL);
8867 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");
8868 gtk_container_add (GTK_CONTAINER (target_window), label);
8869 gtk_widget_show (label);
8871 g_signal_connect (target_window, "destroy",
8872 G_CALLBACK (gtk_widget_destroyed),
8875 window = window_controls (target_window);
8877 g_signal_connect (window, "destroy",
8878 G_CALLBACK (gtk_widget_destroyed),
8881 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8884 /* don't show target window by default, we want to allow testing
8885 * of behavior on first show.
8888 if (!gtk_widget_get_visible (window))
8889 gtk_widget_show (window);
8891 gtk_widget_destroy (window);
8898 typedef struct _ProgressData {
8901 GtkWidget *block_spin;
8902 GtkWidget *x_align_spin;
8903 GtkWidget *y_align_spin;
8904 GtkWidget *step_spin;
8905 GtkWidget *act_blocks_spin;
8916 progress_timeout (gpointer data)
8918 ProgressData *pdata = data;
8921 if (pdata->activity)
8923 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8927 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8931 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8937 destroy_progress (GtkWidget *widget,
8938 ProgressData **pdata)
8940 g_source_remove ((*pdata)->timer);
8941 (*pdata)->timer = 0;
8942 (*pdata)->window = NULL;
8948 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8950 ProgressData *pdata;
8953 pdata = (ProgressData *) data;
8955 if (!gtk_widget_get_mapped (widget))
8958 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8960 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
8961 (GtkProgressBarOrientation) i);
8965 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8967 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
8968 GTK_TOGGLE_BUTTON (widget)->active);
8969 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
8973 progressbar_toggle_ellipsize (GtkWidget *widget,
8976 ProgressData *pdata = data;
8977 if (gtk_widget_is_drawable (widget))
8979 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8980 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8985 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
8989 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
8990 sprintf (buf, "???");
8992 sprintf (buf, "%.0f%%", 100 *
8993 gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)));
8994 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
8998 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
9000 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
9001 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
9002 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
9006 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
9008 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
9012 entry_changed (GtkWidget *widget, ProgressData *pdata)
9014 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
9015 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
9019 create_progress_bar (GtkWidget *widget)
9031 static ProgressData *pdata = NULL;
9033 static gchar *items1[] =
9041 static char *ellipsize_items[] = {
9042 "None", // PANGO_ELLIPSIZE_NONE,
9043 "Start", // PANGO_ELLIPSIZE_START,
9044 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
9045 "End", // PANGO_ELLIPSIZE_END
9049 pdata = g_new0 (ProgressData, 1);
9053 pdata->window = gtk_dialog_new ();
9055 gtk_window_set_screen (GTK_WINDOW (pdata->window),
9056 gtk_widget_get_screen (widget));
9058 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
9060 g_signal_connect (pdata->window, "destroy",
9061 G_CALLBACK (destroy_progress),
9066 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
9067 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
9069 vbox = gtk_vbox_new (FALSE, 5);
9070 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9071 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
9072 vbox, FALSE, TRUE, 0);
9074 frame = gtk_frame_new ("Progress");
9075 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9077 vbox2 = gtk_vbox_new (FALSE, 5);
9078 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9080 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9081 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9083 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
9084 g_signal_connect (adj, "value_changed",
9085 G_CALLBACK (progress_value_changed), pdata);
9087 pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
9089 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
9091 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
9092 "%v from [%l,%u] (=%p%%)");
9093 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
9094 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
9096 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9097 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9099 hbox = gtk_hbox_new (FALSE, 5);
9100 gtk_container_add (GTK_CONTAINER (align), hbox);
9101 label = gtk_label_new ("Label updated by user :");
9102 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9103 pdata->label = gtk_label_new ("");
9104 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
9106 frame = gtk_frame_new ("Options");
9107 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9109 vbox2 = gtk_vbox_new (FALSE, 5);
9110 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9112 tab = gtk_table_new (7, 2, FALSE);
9113 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
9115 label = gtk_label_new ("Orientation :");
9116 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
9117 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9119 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9121 pdata->omenu1 = build_option_menu (items1, 4, 0,
9122 progressbar_toggle_orientation,
9124 hbox = gtk_hbox_new (FALSE, 0);
9125 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
9126 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9128 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
9130 check = gtk_check_button_new_with_label ("Show text");
9131 g_signal_connect (check, "clicked",
9132 G_CALLBACK (toggle_show_text),
9134 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
9135 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9138 hbox = gtk_hbox_new (FALSE, 0);
9139 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
9140 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9143 label = gtk_label_new ("Format : ");
9144 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9146 pdata->entry = gtk_entry_new ();
9147 g_signal_connect (pdata->entry, "changed",
9148 G_CALLBACK (entry_changed),
9150 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
9151 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
9152 gtk_widget_set_size_request (pdata->entry, 100, -1);
9153 gtk_widget_set_sensitive (pdata->entry, FALSE);
9155 label = gtk_label_new ("Text align :");
9156 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
9157 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9159 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9161 hbox = gtk_hbox_new (FALSE, 0);
9162 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
9163 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9166 label = gtk_label_new ("x :");
9167 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
9169 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
9170 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
9171 g_signal_connect (adj, "value_changed",
9172 G_CALLBACK (adjust_align), pdata);
9173 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
9174 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
9176 label = gtk_label_new ("y :");
9177 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
9179 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
9180 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
9181 g_signal_connect (adj, "value_changed",
9182 G_CALLBACK (adjust_align), pdata);
9183 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
9184 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
9186 label = gtk_label_new ("Ellipsize text :");
9187 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
9188 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9190 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9191 pdata->elmenu = build_option_menu (ellipsize_items,
9192 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
9193 2, // PANGO_ELLIPSIZE_MIDDLE
9194 progressbar_toggle_ellipsize,
9196 hbox = gtk_hbox_new (FALSE, 0);
9197 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
9198 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9200 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
9202 check = gtk_check_button_new_with_label ("Activity mode");
9203 g_signal_connect (check, "clicked",
9204 G_CALLBACK (toggle_activity_mode), pdata);
9205 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
9206 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9209 button = gtk_button_new_with_label ("close");
9210 g_signal_connect_swapped (button, "clicked",
9211 G_CALLBACK (gtk_widget_destroy),
9213 gtk_widget_set_can_default (button, TRUE);
9214 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
9215 button, TRUE, TRUE, 0);
9216 gtk_widget_grab_default (button);
9219 if (!gtk_widget_get_visible (pdata->window))
9220 gtk_widget_show_all (pdata->window);
9222 gtk_widget_destroy (pdata->window);
9234 GtkWidget *res_widget;
9238 find_widget (GtkWidget *widget, FindWidgetData *data)
9240 GtkAllocation new_allocation;
9244 new_allocation = widget->allocation;
9246 if (data->found || !gtk_widget_get_mapped (widget))
9249 /* Note that in the following code, we only count the
9250 * position as being inside a WINDOW widget if it is inside
9251 * widget->window; points that are outside of widget->window
9252 * but within the allocation are not counted. This is consistent
9253 * with the way we highlight drag targets.
9255 if (gtk_widget_get_has_window (widget))
9257 new_allocation.x = 0;
9258 new_allocation.y = 0;
9261 if (widget->parent && !data->first)
9263 GdkWindow *window = widget->window;
9264 while (window != widget->parent->window)
9266 gint tx, ty, twidth, theight;
9267 gdk_drawable_get_size (window, &twidth, &theight);
9269 if (new_allocation.x < 0)
9271 new_allocation.width += new_allocation.x;
9272 new_allocation.x = 0;
9274 if (new_allocation.y < 0)
9276 new_allocation.height += new_allocation.y;
9277 new_allocation.y = 0;
9279 if (new_allocation.x + new_allocation.width > twidth)
9280 new_allocation.width = twidth - new_allocation.x;
9281 if (new_allocation.y + new_allocation.height > theight)
9282 new_allocation.height = theight - new_allocation.y;
9284 gdk_window_get_position (window, &tx, &ty);
9285 new_allocation.x += tx;
9287 new_allocation.y += ty;
9290 window = gdk_window_get_parent (window);
9294 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
9295 (data->x < new_allocation.x + new_allocation.width) &&
9296 (data->y < new_allocation.y + new_allocation.height))
9298 /* First, check if the drag is in a valid drop site in
9299 * one of our children
9301 if (GTK_IS_CONTAINER (widget))
9303 FindWidgetData new_data = *data;
9305 new_data.x -= x_offset;
9306 new_data.y -= y_offset;
9307 new_data.found = FALSE;
9308 new_data.first = FALSE;
9310 gtk_container_forall (GTK_CONTAINER (widget),
9311 (GtkCallback)find_widget,
9314 data->found = new_data.found;
9316 data->res_widget = new_data.res_widget;
9319 /* If not, and this widget is registered as a drop site, check to
9320 * emit "drag_motion" to check if we are actually in
9326 data->res_widget = widget;
9332 find_widget_at_pointer (GdkDisplay *display)
9334 GtkWidget *widget = NULL;
9335 GdkWindow *pointer_window;
9337 FindWidgetData data;
9339 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
9343 gpointer widget_ptr;
9345 gdk_window_get_user_data (pointer_window, &widget_ptr);
9346 widget = widget_ptr;
9351 gdk_window_get_pointer (widget->window,
9359 find_widget (widget, &data);
9361 return data.res_widget;
9367 struct PropertiesData {
9375 destroy_properties (GtkWidget *widget,
9376 struct PropertiesData *data)
9380 *data->window = NULL;
9381 data->window = NULL;
9386 gdk_cursor_unref (data->cursor);
9387 data->cursor = NULL;
9392 g_signal_handler_disconnect (widget, data->handler);
9400 property_query_event (GtkWidget *widget,
9402 struct PropertiesData *data)
9404 GtkWidget *res_widget = NULL;
9406 if (!data->in_query)
9409 if (event->type == GDK_BUTTON_RELEASE)
9411 gtk_grab_remove (widget);
9412 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9415 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9418 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
9419 gtk_widget_get_screen (widget));
9420 create_prop_editor (G_OBJECT (res_widget), 0);
9423 data->in_query = FALSE;
9430 query_properties (GtkButton *button,
9431 struct PropertiesData *data)
9435 g_signal_connect (button, "event",
9436 G_CALLBACK (property_query_event), data);
9440 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9443 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9445 GDK_BUTTON_RELEASE_MASK,
9450 gtk_grab_add (GTK_WIDGET (button));
9452 data->in_query = TRUE;
9456 create_properties (GtkWidget *widget)
9458 static GtkWidget *window = NULL;
9462 struct PropertiesData *data;
9464 data = g_new (struct PropertiesData, 1);
9465 data->window = &window;
9466 data->in_query = FALSE;
9467 data->cursor = NULL;
9472 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9474 gtk_window_set_screen (GTK_WINDOW (window),
9475 gtk_widget_get_screen (widget));
9477 data->handler = g_signal_connect (window, "destroy",
9478 G_CALLBACK (destroy_properties),
9481 gtk_window_set_title (GTK_WINDOW (window), "test properties");
9482 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9484 vbox = gtk_vbox_new (FALSE, 1);
9485 gtk_container_add (GTK_CONTAINER (window), vbox);
9487 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9488 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9490 button = gtk_button_new_with_label ("Query properties");
9491 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9492 g_signal_connect (button, "clicked",
9493 G_CALLBACK (query_properties),
9497 if (!gtk_widget_get_visible (window))
9498 gtk_widget_show_all (window);
9500 gtk_widget_destroy (window);
9504 struct SnapshotData {
9505 GtkWidget *toplevel_button;
9509 gboolean is_toplevel;
9514 destroy_snapshot_data (GtkWidget *widget,
9515 struct SnapshotData *data)
9518 *data->window = NULL;
9522 gdk_cursor_unref (data->cursor);
9523 data->cursor = NULL;
9528 g_signal_handler_disconnect (widget, data->handler);
9536 snapshot_widget_event (GtkWidget *widget,
9538 struct SnapshotData *data)
9540 GtkWidget *res_widget = NULL;
9542 if (!data->in_query)
9545 if (event->type == GDK_BUTTON_RELEASE)
9547 gtk_grab_remove (widget);
9548 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9551 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9552 if (data->is_toplevel && res_widget)
9553 res_widget = gtk_widget_get_toplevel (res_widget);
9557 GtkWidget *window, *image;
9559 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9560 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9561 gtk_widget_realize (window);
9562 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
9564 /* this branch is needed to convert ARGB -> RGB */
9567 gdk_drawable_get_size (pixmap, &width, &height);
9568 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9569 gtk_widget_get_colormap (res_widget),
9573 image = gtk_image_new_from_pixbuf (pixbuf);
9574 g_object_unref (pixbuf);
9577 image = gtk_image_new_from_pixmap (pixmap, NULL);
9578 gtk_container_add (GTK_CONTAINER (window), image);
9579 g_object_unref (pixmap);
9580 gtk_widget_show_all (window);
9583 data->in_query = FALSE;
9590 snapshot_widget (GtkButton *button,
9591 struct SnapshotData *data)
9595 g_signal_connect (button, "event",
9596 G_CALLBACK (snapshot_widget_event), data);
9598 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
9601 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9604 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9606 GDK_BUTTON_RELEASE_MASK,
9611 gtk_grab_add (GTK_WIDGET (button));
9613 data->in_query = TRUE;
9617 create_snapshot (GtkWidget *widget)
9619 static GtkWidget *window = NULL;
9622 struct SnapshotData *data;
9624 data = g_new (struct SnapshotData, 1);
9625 data->window = &window;
9626 data->in_query = FALSE;
9627 data->cursor = NULL;
9632 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9634 gtk_window_set_screen (GTK_WINDOW (window),
9635 gtk_widget_get_screen (widget));
9637 data->handler = g_signal_connect (window, "destroy",
9638 G_CALLBACK (destroy_snapshot_data),
9641 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9642 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9644 vbox = gtk_vbox_new (FALSE, 1);
9645 gtk_container_add (GTK_CONTAINER (window), vbox);
9647 button = gtk_button_new_with_label ("Snapshot widget");
9648 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9649 g_signal_connect (button, "clicked",
9650 G_CALLBACK (snapshot_widget),
9653 button = gtk_button_new_with_label ("Snapshot toplevel");
9654 data->toplevel_button = button;
9655 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9656 g_signal_connect (button, "clicked",
9657 G_CALLBACK (snapshot_widget),
9661 if (!gtk_widget_get_visible (window))
9662 gtk_widget_show_all (window);
9664 gtk_widget_destroy (window);
9673 selection_test_received (GtkWidget *tree_view,
9674 GtkSelectionData *data)
9676 GtkTreeModel *model;
9677 GtkListStore *store;
9681 if (data->length < 0)
9683 g_print ("Selection retrieval failed\n");
9686 if (data->type != GDK_SELECTION_TYPE_ATOM)
9688 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9692 /* Clear out any current list items */
9694 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9695 store = GTK_LIST_STORE (model);
9696 gtk_list_store_clear (store);
9698 /* Add new items to list */
9700 atoms = (GdkAtom *)data->data;
9702 l = data->length / sizeof (GdkAtom);
9703 for (i = 0; i < l; i++)
9708 name = gdk_atom_name (atoms[i]);
9711 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9715 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9722 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9724 static GdkAtom targets_atom = GDK_NONE;
9726 if (targets_atom == GDK_NONE)
9727 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9729 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9734 create_selection_test (GtkWidget *widget)
9736 static GtkWidget *window = NULL;
9739 GtkWidget *scrolled_win;
9740 GtkListStore* store;
9741 GtkWidget *tree_view;
9742 GtkTreeViewColumn *column;
9743 GtkCellRenderer *renderer;
9748 window = gtk_dialog_new ();
9750 gtk_window_set_screen (GTK_WINDOW (window),
9751 gtk_widget_get_screen (widget));
9753 g_signal_connect (window, "destroy",
9754 G_CALLBACK (gtk_widget_destroyed),
9757 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9758 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9760 /* Create the list */
9762 vbox = gtk_vbox_new (FALSE, 5);
9763 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9764 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
9767 label = gtk_label_new ("Gets available targets for current selection");
9768 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9770 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9771 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9772 GTK_POLICY_AUTOMATIC,
9773 GTK_POLICY_AUTOMATIC);
9774 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9775 gtk_widget_set_size_request (scrolled_win, 100, 200);
9777 store = gtk_list_store_new (1, G_TYPE_STRING);
9778 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9779 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9781 renderer = gtk_cell_renderer_text_new ();
9782 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9784 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9786 g_signal_connect (tree_view, "selection_received",
9787 G_CALLBACK (selection_test_received), NULL);
9789 /* .. And create some buttons */
9790 button = gtk_button_new_with_label ("Get Targets");
9791 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9792 button, TRUE, TRUE, 0);
9794 g_signal_connect (button, "clicked",
9795 G_CALLBACK (selection_test_get_targets), tree_view);
9797 button = gtk_button_new_with_label ("Quit");
9798 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9799 button, TRUE, TRUE, 0);
9801 g_signal_connect_swapped (button, "clicked",
9802 G_CALLBACK (gtk_widget_destroy),
9806 if (!gtk_widget_get_visible (window))
9807 gtk_widget_show_all (window);
9809 gtk_widget_destroy (window);
9816 static int scroll_test_pos = 0.0;
9819 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9823 gint imin, imax, jmin, jmax;
9825 imin = (event->area.x) / 10;
9826 imax = (event->area.x + event->area.width + 9) / 10;
9828 jmin = ((int)adj->value + event->area.y) / 10;
9829 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9831 gdk_window_clear_area (widget->window,
9832 event->area.x, event->area.y,
9833 event->area.width, event->area.height);
9835 for (i=imin; i<imax; i++)
9836 for (j=jmin; j<jmax; j++)
9838 gdk_draw_rectangle (widget->window,
9839 widget->style->black_gc,
9841 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9847 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9850 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9851 -adj->page_increment / 2:
9852 adj->page_increment / 2);
9853 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9854 gtk_adjustment_set_value (adj, new_value);
9860 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9863 adj->page_increment = 0.9 * widget->allocation.height;
9864 adj->page_size = widget->allocation.height;
9866 g_signal_emit_by_name (adj, "changed");
9870 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9872 /* gint source_min = (int)adj->value - scroll_test_pos; */
9875 dy = scroll_test_pos - (int)adj->value;
9876 scroll_test_pos = adj->value;
9878 if (!gtk_widget_is_drawable (widget))
9880 gdk_window_scroll (widget->window, 0, dy);
9881 gdk_window_process_updates (widget->window, FALSE);
9886 create_scroll_test (GtkWidget *widget)
9888 static GtkWidget *window = NULL;
9890 GtkWidget *drawing_area;
9891 GtkWidget *scrollbar;
9894 GdkGeometry geometry;
9895 GdkWindowHints geometry_mask;
9899 window = gtk_dialog_new ();
9901 gtk_window_set_screen (GTK_WINDOW (window),
9902 gtk_widget_get_screen (widget));
9904 g_signal_connect (window, "destroy",
9905 G_CALLBACK (gtk_widget_destroyed),
9908 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9909 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9911 hbox = gtk_hbox_new (FALSE, 0);
9912 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
9914 gtk_widget_show (hbox);
9916 drawing_area = gtk_drawing_area_new ();
9917 gtk_widget_set_size_request (drawing_area, 200, 200);
9918 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9919 gtk_widget_show (drawing_area);
9921 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9923 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9924 scroll_test_pos = 0.0;
9926 scrollbar = gtk_vscrollbar_new (adj);
9927 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9928 gtk_widget_show (scrollbar);
9930 g_signal_connect (drawing_area, "expose_event",
9931 G_CALLBACK (scroll_test_expose), adj);
9932 g_signal_connect (drawing_area, "configure_event",
9933 G_CALLBACK (scroll_test_configure), adj);
9934 g_signal_connect (drawing_area, "scroll_event",
9935 G_CALLBACK (scroll_test_scroll), adj);
9937 g_signal_connect (adj, "value_changed",
9938 G_CALLBACK (scroll_test_adjustment_changed),
9941 /* .. And create some buttons */
9943 button = gtk_button_new_with_label ("Quit");
9944 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9945 button, TRUE, TRUE, 0);
9947 g_signal_connect_swapped (button, "clicked",
9948 G_CALLBACK (gtk_widget_destroy),
9950 gtk_widget_show (button);
9952 /* Set up gridded geometry */
9954 geometry_mask = GDK_HINT_MIN_SIZE |
9955 GDK_HINT_BASE_SIZE |
9956 GDK_HINT_RESIZE_INC;
9958 geometry.min_width = 20;
9959 geometry.min_height = 20;
9960 geometry.base_width = 0;
9961 geometry.base_height = 0;
9962 geometry.width_inc = 10;
9963 geometry.height_inc = 10;
9965 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9966 drawing_area, &geometry, geometry_mask);
9969 if (!gtk_widget_get_visible (window))
9970 gtk_widget_show (window);
9972 gtk_widget_destroy (window);
9979 static int timer = 0;
9982 timeout_test (GtkWidget *label)
9984 static int count = 0;
9985 static char buffer[32];
9987 sprintf (buffer, "count: %d", ++count);
9988 gtk_label_set_text (GTK_LABEL (label), buffer);
9994 start_timeout_test (GtkWidget *widget,
9999 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
10004 stop_timeout_test (GtkWidget *widget,
10009 g_source_remove (timer);
10015 destroy_timeout_test (GtkWidget *widget,
10016 GtkWidget **window)
10018 stop_timeout_test (NULL, NULL);
10024 create_timeout_test (GtkWidget *widget)
10026 static GtkWidget *window = NULL;
10032 window = gtk_dialog_new ();
10034 gtk_window_set_screen (GTK_WINDOW (window),
10035 gtk_widget_get_screen (widget));
10037 g_signal_connect (window, "destroy",
10038 G_CALLBACK (destroy_timeout_test),
10041 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
10042 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10044 label = gtk_label_new ("count: 0");
10045 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10046 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
10047 label, TRUE, TRUE, 0);
10048 gtk_widget_show (label);
10050 button = gtk_button_new_with_label ("close");
10051 g_signal_connect_swapped (button, "clicked",
10052 G_CALLBACK (gtk_widget_destroy),
10054 gtk_widget_set_can_default (button, TRUE);
10055 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10056 button, TRUE, TRUE, 0);
10057 gtk_widget_grab_default (button);
10058 gtk_widget_show (button);
10060 button = gtk_button_new_with_label ("start");
10061 g_signal_connect (button, "clicked",
10062 G_CALLBACK(start_timeout_test),
10064 gtk_widget_set_can_default (button, TRUE);
10065 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10066 button, TRUE, TRUE, 0);
10067 gtk_widget_show (button);
10069 button = gtk_button_new_with_label ("stop");
10070 g_signal_connect (button, "clicked",
10071 G_CALLBACK (stop_timeout_test),
10073 gtk_widget_set_can_default (button, TRUE);
10074 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10075 button, TRUE, TRUE, 0);
10076 gtk_widget_show (button);
10079 if (!gtk_widget_get_visible (window))
10080 gtk_widget_show (window);
10082 gtk_widget_destroy (window);
10089 static int idle_id = 0;
10092 idle_test (GtkWidget *label)
10094 static int count = 0;
10095 static char buffer[32];
10097 sprintf (buffer, "count: %d", ++count);
10098 gtk_label_set_text (GTK_LABEL (label), buffer);
10104 start_idle_test (GtkWidget *widget,
10109 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
10114 stop_idle_test (GtkWidget *widget,
10119 g_source_remove (idle_id);
10125 destroy_idle_test (GtkWidget *widget,
10126 GtkWidget **window)
10128 stop_idle_test (NULL, NULL);
10134 toggle_idle_container (GObject *button,
10135 GtkContainer *container)
10137 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
10141 create_idle_test (GtkWidget *widget)
10143 static GtkWidget *window = NULL;
10146 GtkWidget *container;
10150 GtkWidget *button2;
10154 window = gtk_dialog_new ();
10156 gtk_window_set_screen (GTK_WINDOW (window),
10157 gtk_widget_get_screen (widget));
10159 g_signal_connect (window, "destroy",
10160 G_CALLBACK (destroy_idle_test),
10163 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
10164 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10166 label = gtk_label_new ("count: 0");
10167 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10168 gtk_widget_show (label);
10171 g_object_new (GTK_TYPE_HBOX,
10173 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
10174 * "GtkWidget::visible", TRUE,
10179 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
10180 container, TRUE, TRUE, 0);
10183 g_object_new (GTK_TYPE_FRAME,
10185 "label", "Label Container",
10187 "parent", GTK_DIALOG (window)->vbox,
10190 g_object_new (GTK_TYPE_VBOX,
10195 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
10196 "label", "Resize-Parent",
10197 "user_data", (void*)GTK_RESIZE_PARENT,
10201 "signal::clicked", toggle_idle_container, container,
10203 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
10204 "label", "Resize-Queue",
10205 "user_data", (void*)GTK_RESIZE_QUEUE,
10210 g_object_connect (button,
10211 "signal::clicked", toggle_idle_container, container,
10213 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
10214 "label", "Resize-Immediate",
10215 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
10217 g_object_connect (button2,
10218 "signal::clicked", toggle_idle_container, container,
10220 g_object_set (button2,
10226 button = gtk_button_new_with_label ("close");
10227 g_signal_connect_swapped (button, "clicked",
10228 G_CALLBACK (gtk_widget_destroy),
10230 gtk_widget_set_can_default (button, TRUE);
10231 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10232 button, TRUE, TRUE, 0);
10233 gtk_widget_grab_default (button);
10234 gtk_widget_show (button);
10236 button = gtk_button_new_with_label ("start");
10237 g_signal_connect (button, "clicked",
10238 G_CALLBACK (start_idle_test),
10240 gtk_widget_set_can_default (button, TRUE);
10241 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10242 button, TRUE, TRUE, 0);
10243 gtk_widget_show (button);
10245 button = gtk_button_new_with_label ("stop");
10246 g_signal_connect (button, "clicked",
10247 G_CALLBACK (stop_idle_test),
10249 gtk_widget_set_can_default (button, TRUE);
10250 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10251 button, TRUE, TRUE, 0);
10252 gtk_widget_show (button);
10255 if (!gtk_widget_get_visible (window))
10256 gtk_widget_show (window);
10258 gtk_widget_destroy (window);
10266 reload_all_rc_files (void)
10268 static GdkAtom atom_rcfiles = GDK_NONE;
10270 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
10274 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
10276 for(i = 0; i < 5; i++)
10277 send_event->client.data.l[i] = 0;
10278 send_event->client.data_format = 32;
10279 send_event->client.message_type = atom_rcfiles;
10280 gdk_event_send_clientmessage_toall (send_event);
10282 gdk_event_free (send_event);
10286 create_rc_file (GtkWidget *widget)
10288 static GtkWidget *window = NULL;
10296 window = gtk_dialog_new ();
10298 gtk_window_set_screen (GTK_WINDOW (window),
10299 gtk_widget_get_screen (widget));
10301 g_signal_connect (window, "destroy",
10302 G_CALLBACK (gtk_widget_destroyed),
10305 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
10306 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
10308 vbox = gtk_vbox_new (FALSE, 0);
10309 gtk_container_add (GTK_CONTAINER (frame), vbox);
10311 label = gtk_label_new ("This label should be red");
10312 gtk_widget_set_name (label, "testgtk-red-label");
10313 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10315 label = gtk_label_new ("This label should be green");
10316 gtk_widget_set_name (label, "testgtk-green-label");
10317 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10319 label = gtk_label_new ("This label should be blue");
10320 gtk_widget_set_name (label, "testgtk-blue-label");
10321 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10323 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
10324 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10326 button = gtk_button_new_with_label ("Reload");
10327 g_signal_connect (button, "clicked",
10328 G_CALLBACK (gtk_rc_reparse_all), NULL);
10329 gtk_widget_set_can_default (button, TRUE);
10330 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10331 button, TRUE, TRUE, 0);
10332 gtk_widget_grab_default (button);
10334 button = gtk_button_new_with_label ("Reload All");
10335 g_signal_connect (button, "clicked",
10336 G_CALLBACK (reload_all_rc_files), NULL);
10337 gtk_widget_set_can_default (button, TRUE);
10338 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10339 button, TRUE, TRUE, 0);
10341 button = gtk_button_new_with_label ("Close");
10342 g_signal_connect_swapped (button, "clicked",
10343 G_CALLBACK (gtk_widget_destroy),
10345 gtk_widget_set_can_default (button, TRUE);
10346 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10347 button, TRUE, TRUE, 0);
10350 if (!gtk_widget_get_visible (window))
10351 gtk_widget_show_all (window);
10353 gtk_widget_destroy (window);
10357 * Test of recursive mainloop
10361 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
10368 create_mainloop (GtkWidget *widget)
10370 static GtkWidget *window = NULL;
10376 window = gtk_dialog_new ();
10378 gtk_window_set_screen (GTK_WINDOW (window),
10379 gtk_widget_get_screen (widget));
10381 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
10383 g_signal_connect (window, "destroy",
10384 G_CALLBACK (mainloop_destroyed),
10387 label = gtk_label_new ("In recursive main loop...");
10388 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
10390 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
10392 gtk_widget_show (label);
10394 button = gtk_button_new_with_label ("Leave");
10395 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
10398 g_signal_connect_swapped (button, "clicked",
10399 G_CALLBACK (gtk_widget_destroy),
10402 gtk_widget_set_can_default (button, TRUE);
10403 gtk_widget_grab_default (button);
10405 gtk_widget_show (button);
10408 if (!gtk_widget_get_visible (window))
10410 gtk_widget_show (window);
10412 g_print ("create_mainloop: start\n");
10414 g_print ("create_mainloop: done\n");
10417 gtk_widget_destroy (window);
10421 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
10426 gint imin, imax, jmin, jmax;
10428 layout = GTK_LAYOUT (widget);
10430 if (event->window != layout->bin_window)
10433 imin = (event->area.x) / 10;
10434 imax = (event->area.x + event->area.width + 9) / 10;
10436 jmin = (event->area.y) / 10;
10437 jmax = (event->area.y + event->area.height + 9) / 10;
10439 for (i=imin; i<imax; i++)
10440 for (j=jmin; j<jmax; j++)
10442 gdk_draw_rectangle (layout->bin_window,
10443 widget->style->black_gc,
10451 void create_layout (GtkWidget *widget)
10453 static GtkWidget *window = NULL;
10455 GtkWidget *scrolledwindow;
10464 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10465 gtk_window_set_screen (GTK_WINDOW (window),
10466 gtk_widget_get_screen (widget));
10468 g_signal_connect (window, "destroy",
10469 G_CALLBACK (gtk_widget_destroyed),
10472 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10473 gtk_widget_set_size_request (window, 200, 200);
10475 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10476 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10478 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10479 GTK_CORNER_TOP_RIGHT);
10481 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10483 layout = gtk_layout_new (NULL, NULL);
10484 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
10486 /* We set step sizes here since GtkLayout does not set
10489 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
10490 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
10492 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
10493 g_signal_connect (layout, "expose_event",
10494 G_CALLBACK (layout_expose_handler), NULL);
10496 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
10498 for (i=0 ; i < 16 ; i++)
10499 for (j=0 ; j < 16 ; j++)
10501 sprintf(buf, "Button %d, %d", i, j);
10503 button = gtk_button_new_with_label (buf);
10505 button = gtk_label_new (buf);
10507 gtk_layout_put (GTK_LAYOUT (layout), button,
10511 for (i=16; i < 1280; i++)
10513 sprintf(buf, "Button %d, %d", i, 0);
10515 button = gtk_button_new_with_label (buf);
10517 button = gtk_label_new (buf);
10519 gtk_layout_put (GTK_LAYOUT (layout), button,
10524 if (!gtk_widget_get_visible (window))
10525 gtk_widget_show_all (window);
10527 gtk_widget_destroy (window);
10531 create_styles (GtkWidget *widget)
10533 static GtkWidget *window = NULL;
10538 static GdkColor red = { 0, 0xffff, 0, 0 };
10539 static GdkColor green = { 0, 0, 0xffff, 0 };
10540 static GdkColor blue = { 0, 0, 0, 0xffff };
10541 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10542 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10543 PangoFontDescription *font_desc;
10545 GtkRcStyle *rc_style;
10549 window = gtk_dialog_new ();
10550 gtk_window_set_screen (GTK_WINDOW (window),
10551 gtk_widget_get_screen (widget));
10553 g_signal_connect (window, "destroy",
10554 G_CALLBACK (gtk_widget_destroyed),
10558 button = gtk_button_new_with_label ("Close");
10559 g_signal_connect_swapped (button, "clicked",
10560 G_CALLBACK (gtk_widget_destroy),
10562 gtk_widget_set_can_default (button, TRUE);
10563 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10564 button, TRUE, TRUE, 0);
10565 gtk_widget_show (button);
10567 vbox = gtk_vbox_new (FALSE, 5);
10568 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10569 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
10571 label = gtk_label_new ("Font:");
10572 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10573 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10575 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10577 button = gtk_button_new_with_label ("Some Text");
10578 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
10579 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10581 label = gtk_label_new ("Foreground:");
10582 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10583 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10585 button = gtk_button_new_with_label ("Some Text");
10586 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
10587 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10589 label = gtk_label_new ("Background:");
10590 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10591 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10593 button = gtk_button_new_with_label ("Some Text");
10594 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10595 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10597 label = gtk_label_new ("Text:");
10598 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10599 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10601 entry = gtk_entry_new ();
10602 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10603 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10604 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10606 label = gtk_label_new ("Base:");
10607 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10608 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10610 entry = gtk_entry_new ();
10611 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10612 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10613 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10615 label = gtk_label_new ("Cursor:");
10616 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10617 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10619 entry = gtk_entry_new ();
10620 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10621 gtk_widget_modify_cursor (entry, &red, &red);
10622 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10624 label = gtk_label_new ("Multiple:");
10625 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10626 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10628 button = gtk_button_new_with_label ("Some Text");
10630 rc_style = gtk_rc_style_new ();
10632 rc_style->font_desc = pango_font_description_copy (font_desc);
10633 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10634 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10635 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10636 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10637 rc_style->bg[GTK_STATE_NORMAL] = blue;
10638 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10639 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10640 rc_style->fg[GTK_STATE_ACTIVE] = red;
10641 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10642 rc_style->xthickness = 5;
10643 rc_style->ythickness = 5;
10645 gtk_widget_modify_style (button, rc_style);
10646 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
10648 g_object_unref (rc_style);
10650 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10653 if (!gtk_widget_get_visible (window))
10654 gtk_widget_show_all (window);
10656 gtk_widget_destroy (window);
10660 * Main Window and Exit
10664 do_exit (GtkWidget *widget, GtkWidget *window)
10666 gtk_widget_destroy (window);
10672 void (*func) (GtkWidget *widget);
10673 gboolean do_not_benchmark;
10676 { "alpha window", create_alpha_window },
10677 { "big windows", create_big_windows },
10678 { "button box", create_button_box },
10679 { "buttons", create_buttons },
10680 { "check buttons", create_check_buttons },
10681 { "color selection", create_color_selection },
10682 { "composited window", create_composited_window },
10683 { "cursors", create_cursors },
10684 { "dialog", create_dialog },
10685 { "display & screen", create_display_screen, TRUE },
10686 { "entry", create_entry },
10687 { "event box", create_event_box },
10688 { "event watcher", create_event_watcher },
10689 { "expander", create_expander },
10690 { "flipping", create_flipping },
10691 { "focus", create_focus },
10692 { "font selection", create_font_selection },
10693 { "gridded geometry", create_gridded_geometry },
10694 { "handle box", create_handle_box },
10695 { "image from drawable", create_get_image },
10696 { "image", create_image },
10697 { "key lookup", create_key_lookup },
10698 { "labels", create_labels },
10699 { "layout", create_layout },
10700 { "menus", create_menus },
10701 { "message dialog", create_message_dialog },
10702 { "modal window", create_modal_window, TRUE },
10703 { "notebook", create_notebook },
10704 { "panes", create_panes },
10705 { "paned keyboard", create_paned_keyboard_navigation },
10706 { "pixmap", create_pixmap },
10707 { "progress bar", create_progress_bar },
10708 { "properties", create_properties },
10709 { "radio buttons", create_radio_buttons },
10710 { "range controls", create_range_controls },
10711 { "rc file", create_rc_file },
10712 { "reparent", create_reparent },
10713 { "resize grips", create_resize_grips },
10714 { "rotated label", create_rotated_label },
10715 { "rotated text", create_rotated_text },
10716 { "rulers", create_rulers },
10717 { "saved position", create_saved_position },
10718 { "scrolled windows", create_scrolled_windows },
10719 { "shapes", create_shapes },
10720 { "size groups", create_size_groups },
10721 { "snapshot", create_snapshot },
10722 { "spinbutton", create_spins },
10723 { "statusbar", create_statusbar },
10724 { "styles", create_styles },
10725 { "test idle", create_idle_test },
10726 { "test mainloop", create_mainloop, TRUE },
10727 { "test scrolling", create_scroll_test },
10728 { "test selection", create_selection_test },
10729 { "test timeout", create_timeout_test },
10730 { "toggle buttons", create_toggle_buttons },
10731 { "toolbar", create_toolbar },
10732 { "tooltips", create_tooltips },
10733 { "WM hints", create_wmhints },
10734 { "window sizing", create_window_sizing },
10735 { "window states", create_window_states }
10737 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10740 create_main_window (void)
10745 GtkWidget *scrolled_window;
10749 GtkWidget *separator;
10750 GdkGeometry geometry;
10753 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10754 gtk_widget_set_name (window, "main window");
10755 gtk_widget_set_uposition (window, 50, 20);
10756 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10758 geometry.min_width = -1;
10759 geometry.min_height = -1;
10760 geometry.max_width = -1;
10761 geometry.max_height = G_MAXSHORT;
10762 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10764 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10766 g_signal_connect (window, "destroy",
10767 G_CALLBACK (gtk_main_quit),
10769 g_signal_connect (window, "delete-event",
10770 G_CALLBACK (gtk_false),
10773 box1 = gtk_vbox_new (FALSE, 0);
10774 gtk_container_add (GTK_CONTAINER (window), box1);
10776 if (gtk_micro_version > 0)
10781 gtk_micro_version);
10786 gtk_minor_version);
10788 label = gtk_label_new (buffer);
10789 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10790 gtk_widget_set_name (label, "testgtk-version-label");
10792 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10793 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10794 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10796 GTK_POLICY_AUTOMATIC);
10797 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10799 box2 = gtk_vbox_new (FALSE, 0);
10800 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10801 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10802 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10803 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10804 gtk_widget_show (box2);
10806 for (i = 0; i < nbuttons; i++)
10808 button = gtk_button_new_with_label (buttons[i].label);
10809 if (buttons[i].func)
10810 g_signal_connect (button,
10812 G_CALLBACK(buttons[i].func),
10815 gtk_widget_set_sensitive (button, FALSE);
10816 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10819 separator = gtk_hseparator_new ();
10820 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10822 box2 = gtk_vbox_new (FALSE, 10);
10823 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10824 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10826 button = gtk_button_new_with_mnemonic ("_Close");
10827 g_signal_connect (button, "clicked",
10828 G_CALLBACK (do_exit),
10830 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10831 gtk_widget_set_can_default (button, TRUE);
10832 gtk_widget_grab_default (button);
10834 gtk_widget_show_all (window);
10840 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10841 G_FILE_TEST_EXISTS))
10843 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
10844 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
10849 pad (const char *str, int to)
10851 static char buf[256];
10852 int len = strlen (str);
10855 for (i = 0; i < to; i++)
10860 memcpy (buf, str, len);
10866 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10868 fn (widget); /* on */
10869 while (g_main_context_iteration (NULL, FALSE));
10870 fn (widget); /* off */
10871 while (g_main_context_iteration (NULL, FALSE));
10875 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10881 static gboolean printed_headers = FALSE;
10883 if (!printed_headers) {
10884 g_print ("Test Iters First Other\n");
10885 g_print ("-------------------- ----- ---------- ----------\n");
10886 printed_headers = TRUE;
10889 g_get_current_time (&tv0);
10890 bench_iteration (widget, fn);
10891 g_get_current_time (&tv1);
10893 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10894 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10896 g_get_current_time (&tv0);
10897 for (n = 0; n < num - 1; n++)
10898 bench_iteration (widget, fn);
10899 g_get_current_time (&tv1);
10900 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10901 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10903 g_print ("%s %5d ", pad (name, 20), num);
10905 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10907 g_print ("%10.1f\n", dt_first);
10911 do_bench (char* what, int num)
10915 void (* fn) (GtkWidget *widget);
10917 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10919 if (g_ascii_strcasecmp (what, "ALL") == 0)
10921 for (i = 0; i < nbuttons; i++)
10923 if (!buttons[i].do_not_benchmark)
10924 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10931 for (i = 0; i < nbuttons; i++)
10933 if (strcmp (buttons[i].label, what) == 0)
10935 fn = buttons[i].func;
10941 g_print ("Can't bench: \"%s\" not found.\n", what);
10943 do_real_bench (widget, fn, buttons[i].label, num);
10950 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10955 main (int argc, char *argv[])
10957 GtkBindingSet *binding_set;
10959 gboolean done_benchmarks = FALSE;
10961 srand (time (NULL));
10965 /* Check to see if we are being run from the correct
10968 if (file_exists ("testgtkrc"))
10969 gtk_rc_add_default_file ("testgtkrc");
10970 else if (file_exists ("tests/testgtkrc"))
10971 gtk_rc_add_default_file ("tests/testgtkrc");
10973 g_warning ("Couldn't find file \"testgtkrc\".");
10975 g_set_application_name ("GTK+ Test Program");
10977 gtk_init (&argc, &argv);
10979 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10988 for (i = 1; i < argc; i++)
10990 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10997 nextarg = strchr (argv[i], '=');
11008 count = strchr (nextarg, ':');
11011 what = g_strndup (nextarg, count - nextarg);
11013 num = atoi (count);
11018 what = g_strdup (nextarg);
11020 do_bench (what, num ? num : 1);
11021 done_benchmarks = TRUE;
11026 if (done_benchmarks)
11031 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
11032 gtk_binding_entry_add_signal (binding_set,
11033 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
11036 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
11038 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
11042 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
11043 " fg[NORMAL] = \"#ff0000\"\n"
11044 " font = \"Sans 18\"\n"
11046 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
11048 create_main_window ();
11054 while (g_main_context_pending (NULL))
11055 g_main_context_iteration (NULL, FALSE);
11058 while (g_main_context_pending (NULL))
11059 g_main_context_iteration (NULL, FALSE);