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_selection_new("This is a modal file selection dialog");
4233 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4236 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4238 /* And mark it as a transient dialog */
4239 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4241 g_signal_connect (fs, "destroy",
4242 G_CALLBACK (cmw_destroy_cb), NULL);
4244 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4245 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4246 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4247 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4249 /* wait until destroy calls gtk_main_quit */
4250 gtk_widget_show (fs);
4257 create_modal_window (GtkWidget *widget)
4259 GtkWidget *window = NULL;
4260 GtkWidget *box1,*box2;
4262 GtkWidget *btnColor,*btnFile,*btnClose;
4264 /* Create modal window (Here you can use any window descendent )*/
4265 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4266 gtk_window_set_screen (GTK_WINDOW (window),
4267 gtk_widget_get_screen (widget));
4269 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4271 /* Set window as modal */
4272 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4274 /* Create widgets */
4275 box1 = gtk_vbox_new (FALSE,5);
4276 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4277 box2 = gtk_vbox_new (TRUE,5);
4278 btnColor = gtk_button_new_with_label ("Color");
4279 btnFile = gtk_button_new_with_label ("File Selection");
4280 btnClose = gtk_button_new_with_label ("Close");
4283 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4284 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4287 gtk_container_add (GTK_CONTAINER (window), box1);
4288 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4289 gtk_container_add (GTK_CONTAINER (frame1), box2);
4290 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4291 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4292 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4293 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4295 /* connect signals */
4296 g_signal_connect_swapped (btnClose, "clicked",
4297 G_CALLBACK (gtk_widget_destroy), window);
4299 g_signal_connect (window, "destroy",
4300 G_CALLBACK (cmw_destroy_cb), NULL);
4302 g_signal_connect (btnColor, "clicked",
4303 G_CALLBACK (cmw_color), window);
4304 g_signal_connect (btnFile, "clicked",
4305 G_CALLBACK (cmw_file), window);
4308 gtk_widget_show_all (window);
4310 /* wait until dialog get destroyed */
4319 make_message_dialog (GdkScreen *screen,
4321 GtkMessageType type,
4322 GtkButtonsType buttons,
4323 guint default_response)
4327 gtk_widget_destroy (*dialog);
4332 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4333 "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.)");
4335 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4337 g_signal_connect_swapped (*dialog,
4339 G_CALLBACK (gtk_widget_destroy),
4342 g_signal_connect (*dialog,
4344 G_CALLBACK (gtk_widget_destroyed),
4347 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4349 gtk_widget_show (*dialog);
4353 create_message_dialog (GtkWidget *widget)
4355 static GtkWidget *info = NULL;
4356 static GtkWidget *warning = NULL;
4357 static GtkWidget *error = NULL;
4358 static GtkWidget *question = NULL;
4359 GdkScreen *screen = gtk_widget_get_screen (widget);
4361 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4362 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
4363 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4364 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
4371 static GtkWidget *sw_parent = NULL;
4372 static GtkWidget *sw_float_parent;
4373 static guint sw_destroyed_handler = 0;
4376 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4378 gtk_widget_reparent (scrollwin, sw_parent);
4380 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4381 sw_float_parent = NULL;
4383 sw_destroyed_handler = 0;
4389 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4391 gtk_widget_destroy (sw_float_parent);
4393 sw_float_parent = NULL;
4395 sw_destroyed_handler = 0;
4399 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4403 gtk_widget_reparent (scrollwin, sw_parent);
4404 gtk_widget_destroy (sw_float_parent);
4406 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4407 sw_float_parent = NULL;
4409 sw_destroyed_handler = 0;
4413 sw_parent = scrollwin->parent;
4414 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4415 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4416 gtk_widget_get_screen (widget));
4418 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4420 gtk_widget_reparent (scrollwin, sw_float_parent);
4421 gtk_widget_show (sw_float_parent);
4423 sw_destroyed_handler =
4424 g_signal_connect (sw_parent, "destroy",
4425 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4426 g_signal_connect (sw_float_parent, "delete_event",
4427 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4432 create_scrolled_windows (GtkWidget *widget)
4434 static GtkWidget *window;
4435 GtkWidget *scrolled_window;
4443 window = gtk_dialog_new ();
4445 gtk_window_set_screen (GTK_WINDOW (window),
4446 gtk_widget_get_screen (widget));
4448 g_signal_connect (window, "destroy",
4449 G_CALLBACK (gtk_widget_destroyed),
4452 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4453 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4456 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4457 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4458 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4459 GTK_POLICY_AUTOMATIC,
4460 GTK_POLICY_AUTOMATIC);
4461 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
4462 scrolled_window, TRUE, TRUE, 0);
4463 gtk_widget_show (scrolled_window);
4465 table = gtk_table_new (20, 20, FALSE);
4466 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4467 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4468 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4469 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4470 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4471 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4472 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4473 gtk_widget_show (table);
4475 for (i = 0; i < 20; i++)
4476 for (j = 0; j < 20; j++)
4478 sprintf (buffer, "button (%d,%d)\n", i, j);
4479 button = gtk_toggle_button_new_with_label (buffer);
4480 gtk_table_attach_defaults (GTK_TABLE (table), button,
4482 gtk_widget_show (button);
4486 button = gtk_button_new_with_label ("Close");
4487 g_signal_connect_swapped (button, "clicked",
4488 G_CALLBACK (gtk_widget_destroy),
4490 gtk_widget_set_can_default (button, TRUE);
4491 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4492 button, TRUE, TRUE, 0);
4493 gtk_widget_grab_default (button);
4494 gtk_widget_show (button);
4496 button = gtk_button_new_with_label ("Reparent Out");
4497 g_signal_connect (button, "clicked",
4498 G_CALLBACK (scrolled_windows_remove),
4500 gtk_widget_set_can_default (button, TRUE);
4501 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4502 button, TRUE, TRUE, 0);
4503 gtk_widget_grab_default (button);
4504 gtk_widget_show (button);
4506 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4509 if (!gtk_widget_get_visible (window))
4510 gtk_widget_show (window);
4512 gtk_widget_destroy (window);
4520 entry_toggle_frame (GtkWidget *checkbutton,
4523 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4524 GTK_TOGGLE_BUTTON(checkbutton)->active);
4528 entry_toggle_sensitive (GtkWidget *checkbutton,
4531 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4535 entry_progress_timeout (gpointer data)
4537 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
4539 gtk_entry_progress_pulse (GTK_ENTRY (data));
4545 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
4548 if (fraction > 1.0001)
4551 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
4558 entry_remove_timeout (gpointer data)
4560 g_source_remove (GPOINTER_TO_UINT (data));
4564 entry_toggle_progress (GtkWidget *checkbutton,
4567 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
4569 guint timeout = gdk_threads_add_timeout (100,
4570 entry_progress_timeout,
4572 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
4573 GUINT_TO_POINTER (timeout),
4574 entry_remove_timeout);
4578 g_object_set_data (G_OBJECT (entry), "timeout-id",
4579 GUINT_TO_POINTER (0));
4581 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
4586 entry_toggle_pulse (GtkWidget *checkbutton,
4589 g_object_set_data (G_OBJECT (entry), "progress-pulse",
4590 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
4594 props_clicked (GtkWidget *button,
4597 GtkWidget *window = create_prop_editor (object, 0);
4599 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
4603 create_entry (GtkWidget *widget)
4605 static GtkWidget *window = NULL;
4609 GtkWidget *has_frame_check;
4610 GtkWidget *sensitive_check;
4611 GtkWidget *progress_check;
4614 GtkWidget *cb_entry;
4616 GtkWidget *separator;
4620 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4621 gtk_window_set_screen (GTK_WINDOW (window),
4622 gtk_widget_get_screen (widget));
4624 g_signal_connect (window, "destroy",
4625 G_CALLBACK (gtk_widget_destroyed),
4628 gtk_window_set_title (GTK_WINDOW (window), "entry");
4629 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4632 box1 = gtk_vbox_new (FALSE, 0);
4633 gtk_container_add (GTK_CONTAINER (window), box1);
4636 box2 = gtk_vbox_new (FALSE, 10);
4637 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4638 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4640 hbox = gtk_hbox_new (FALSE, 5);
4641 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4643 entry = gtk_entry_new ();
4644 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");
4645 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4646 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4648 button = gtk_button_new_with_mnemonic ("_Props");
4649 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4650 g_signal_connect (button, "clicked",
4651 G_CALLBACK (props_clicked),
4654 cb = GTK_COMBO_BOX (gtk_combo_box_entry_new_text ());
4655 gtk_combo_box_append_text (cb, "item0");
4656 gtk_combo_box_append_text (cb, "item0");
4657 gtk_combo_box_append_text (cb, "item1 item1");
4658 gtk_combo_box_append_text (cb, "item2 item2 item2");
4659 gtk_combo_box_append_text (cb, "item3 item3 item3 item3");
4660 gtk_combo_box_append_text (cb, "item4 item4 item4 item4 item4");
4661 gtk_combo_box_append_text (cb, "item5 item5 item5 item5 item5 item5");
4662 gtk_combo_box_append_text (cb, "item6 item6 item6 item6 item6");
4663 gtk_combo_box_append_text (cb, "item7 item7 item7 item7");
4664 gtk_combo_box_append_text (cb, "item8 item8 item8");
4665 gtk_combo_box_append_text (cb, "item9 item9");
4667 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4668 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4669 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4670 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4672 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4673 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4674 g_signal_connect (sensitive_check, "toggled",
4675 G_CALLBACK (entry_toggle_sensitive), entry);
4676 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4678 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4679 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4680 g_signal_connect (has_frame_check, "toggled",
4681 G_CALLBACK (entry_toggle_frame), entry);
4682 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4684 progress_check = gtk_check_button_new_with_label("Show Progress");
4685 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4686 g_signal_connect (progress_check, "toggled",
4687 G_CALLBACK (entry_toggle_progress), entry);
4689 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4690 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4691 g_signal_connect (progress_check, "toggled",
4692 G_CALLBACK (entry_toggle_pulse), entry);
4694 separator = gtk_hseparator_new ();
4695 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4697 box2 = gtk_vbox_new (FALSE, 10);
4698 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4699 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4701 button = gtk_button_new_with_label ("close");
4702 g_signal_connect_swapped (button, "clicked",
4703 G_CALLBACK (gtk_widget_destroy),
4705 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4706 gtk_widget_set_can_default (button, TRUE);
4707 gtk_widget_grab_default (button);
4710 if (!gtk_widget_get_visible (window))
4711 gtk_widget_show_all (window);
4713 gtk_widget_destroy (window);
4717 create_expander (GtkWidget *widget)
4720 GtkWidget *expander;
4722 static GtkWidget *window = NULL;
4726 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4727 gtk_window_set_screen (GTK_WINDOW (window),
4728 gtk_widget_get_screen (widget));
4730 g_signal_connect (window, "destroy",
4731 G_CALLBACK (gtk_widget_destroyed),
4734 gtk_window_set_title (GTK_WINDOW (window), "expander");
4735 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4737 box1 = gtk_vbox_new (FALSE, 0);
4738 gtk_container_add (GTK_CONTAINER (window), box1);
4740 expander = gtk_expander_new ("The Hidden");
4742 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4744 hidden = gtk_label_new ("Revealed!");
4746 gtk_container_add (GTK_CONTAINER (expander), hidden);
4749 if (!gtk_widget_get_visible (window))
4750 gtk_widget_show_all (window);
4752 gtk_widget_destroy (window);
4760 event_box_label_pressed (GtkWidget *widget,
4761 GdkEventButton *event,
4764 g_print ("clicked on event box\n");
4768 event_box_button_clicked (GtkWidget *widget,
4772 g_print ("pushed button\n");
4776 event_box_toggle_visible_window (GtkWidget *checkbutton,
4777 GtkEventBox *event_box)
4779 gtk_event_box_set_visible_window (event_box,
4780 GTK_TOGGLE_BUTTON(checkbutton)->active);
4784 event_box_toggle_above_child (GtkWidget *checkbutton,
4785 GtkEventBox *event_box)
4787 gtk_event_box_set_above_child (event_box,
4788 GTK_TOGGLE_BUTTON(checkbutton)->active);
4792 create_event_box (GtkWidget *widget)
4794 static GtkWidget *window = NULL;
4800 GtkWidget *separator;
4801 GtkWidget *event_box;
4803 GtkWidget *visible_window_check;
4804 GtkWidget *above_child_check;
4813 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4814 gtk_window_set_screen (GTK_WINDOW (window),
4815 gtk_widget_get_screen (widget));
4817 g_signal_connect (window, "destroy",
4818 G_CALLBACK (gtk_widget_destroyed),
4821 gtk_window_set_title (GTK_WINDOW (window), "event box");
4822 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4824 box1 = gtk_vbox_new (FALSE, 0);
4825 gtk_container_add (GTK_CONTAINER (window), box1);
4826 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4828 hbox = gtk_hbox_new (FALSE, 0);
4829 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4831 event_box = gtk_event_box_new ();
4832 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4834 vbox = gtk_vbox_new (FALSE, 0);
4835 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4836 g_signal_connect (event_box, "button_press_event",
4837 G_CALLBACK (event_box_label_pressed),
4840 label = gtk_label_new ("Click on this label");
4841 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4843 button = gtk_button_new_with_label ("button in eventbox");
4844 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4845 g_signal_connect (button, "clicked",
4846 G_CALLBACK (event_box_button_clicked),
4850 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4851 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4852 g_signal_connect (visible_window_check, "toggled",
4853 G_CALLBACK (event_box_toggle_visible_window), event_box);
4854 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4856 above_child_check = gtk_check_button_new_with_label("Above Child");
4857 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4858 g_signal_connect (above_child_check, "toggled",
4859 G_CALLBACK (event_box_toggle_above_child), event_box);
4860 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4862 separator = gtk_hseparator_new ();
4863 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4865 box2 = gtk_vbox_new (FALSE, 10);
4866 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4867 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4869 button = gtk_button_new_with_label ("close");
4870 g_signal_connect_swapped (button, "clicked",
4871 G_CALLBACK (gtk_widget_destroy),
4873 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4874 gtk_widget_set_can_default (button, TRUE);
4875 gtk_widget_grab_default (button);
4878 if (!gtk_widget_get_visible (window))
4879 gtk_widget_show_all (window);
4881 gtk_widget_destroy (window);
4889 #define SIZE_GROUP_INITIAL_SIZE 50
4892 size_group_hsize_changed (GtkSpinButton *spin_button,
4895 gtk_widget_set_size_request (GTK_BIN (button)->child,
4896 gtk_spin_button_get_value_as_int (spin_button),
4901 size_group_vsize_changed (GtkSpinButton *spin_button,
4904 gtk_widget_set_size_request (GTK_BIN (button)->child,
4906 gtk_spin_button_get_value_as_int (spin_button));
4910 create_size_group_window (GdkScreen *screen,
4911 GtkSizeGroup *master_size_group)
4915 GtkWidget *main_button;
4917 GtkWidget *spin_button;
4919 GtkSizeGroup *hgroup1;
4920 GtkSizeGroup *hgroup2;
4921 GtkSizeGroup *vgroup1;
4922 GtkSizeGroup *vgroup2;
4924 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4930 gtk_window_set_screen (GTK_WINDOW (window), screen);
4932 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4934 g_signal_connect (window, "response",
4935 G_CALLBACK (gtk_widget_destroy),
4938 table = gtk_table_new (2, 2, FALSE);
4939 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
4941 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4942 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4943 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4944 gtk_widget_set_size_request (table, 250, 250);
4946 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4947 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4948 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4949 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4951 main_button = gtk_button_new_with_label ("X");
4953 gtk_table_attach (GTK_TABLE (table), main_button,
4955 GTK_EXPAND, GTK_EXPAND,
4957 gtk_size_group_add_widget (master_size_group, main_button);
4958 gtk_size_group_add_widget (hgroup1, main_button);
4959 gtk_size_group_add_widget (vgroup1, main_button);
4960 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
4961 SIZE_GROUP_INITIAL_SIZE,
4962 SIZE_GROUP_INITIAL_SIZE);
4964 button = gtk_button_new ();
4965 gtk_table_attach (GTK_TABLE (table), button,
4967 GTK_EXPAND, GTK_EXPAND,
4969 gtk_size_group_add_widget (vgroup1, button);
4970 gtk_size_group_add_widget (vgroup2, button);
4972 button = gtk_button_new ();
4973 gtk_table_attach (GTK_TABLE (table), button,
4975 GTK_EXPAND, GTK_EXPAND,
4977 gtk_size_group_add_widget (hgroup1, button);
4978 gtk_size_group_add_widget (hgroup2, button);
4980 button = gtk_button_new ();
4981 gtk_table_attach (GTK_TABLE (table), button,
4983 GTK_EXPAND, GTK_EXPAND,
4985 gtk_size_group_add_widget (hgroup2, button);
4986 gtk_size_group_add_widget (vgroup2, button);
4988 g_object_unref (hgroup1);
4989 g_object_unref (hgroup2);
4990 g_object_unref (vgroup1);
4991 g_object_unref (vgroup2);
4993 hbox = gtk_hbox_new (FALSE, 5);
4994 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
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_hsize_changed), main_button);
5002 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
5003 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
5004 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
5005 g_signal_connect (spin_button, "value_changed",
5006 G_CALLBACK (size_group_vsize_changed), main_button);
5012 create_size_groups (GtkWidget *widget)
5014 static GtkWidget *window1 = NULL;
5015 static GtkWidget *window2 = NULL;
5016 static GtkSizeGroup *master_size_group;
5018 if (!master_size_group)
5019 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
5023 window1 = create_size_group_window (gtk_widget_get_screen (widget),
5026 g_signal_connect (window1, "destroy",
5027 G_CALLBACK (gtk_widget_destroyed),
5033 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5036 g_signal_connect (window2, "destroy",
5037 G_CALLBACK (gtk_widget_destroyed),
5041 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
5043 gtk_widget_destroy (window1);
5044 gtk_widget_destroy (window2);
5048 if (!gtk_widget_get_visible (window1))
5049 gtk_widget_show_all (window1);
5050 if (!gtk_widget_get_visible (window2))
5051 gtk_widget_show_all (window2);
5059 static GtkWidget *spinner1;
5062 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5064 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5068 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5070 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5074 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5076 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5077 gtk_spin_button_get_value_as_int (spin));
5081 get_value (GtkWidget *widget, gpointer data)
5085 GtkSpinButton *spin;
5087 spin = GTK_SPIN_BUTTON (spinner1);
5088 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5089 if (GPOINTER_TO_INT (data) == 1)
5090 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5092 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5093 gtk_label_set_text (label, buf);
5097 get_spin_value (GtkWidget *widget, gpointer data)
5101 GtkSpinButton *spin;
5103 spin = GTK_SPIN_BUTTON (widget);
5104 label = GTK_LABEL (data);
5106 buffer = g_strdup_printf ("%0.*f", spin->digits,
5107 gtk_spin_button_get_value (spin));
5108 gtk_label_set_text (label, buffer);
5114 spin_button_time_output_func (GtkSpinButton *spin_button)
5116 static gchar buf[6];
5120 hours = spin_button->adjustment->value / 60.0;
5121 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5122 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5123 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5124 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5129 spin_button_month_input_func (GtkSpinButton *spin_button,
5133 static gchar *month[12] = { "January", "February", "March", "April",
5134 "May", "June", "July", "August",
5135 "September", "October", "November", "December" };
5137 gboolean found = FALSE;
5139 for (i = 1; i <= 12; i++)
5141 tmp1 = g_ascii_strup (month[i - 1], -1);
5142 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5143 if (strstr (tmp1, tmp2) == tmp1)
5153 return GTK_INPUT_ERROR;
5155 *new_val = (gdouble) i;
5160 spin_button_month_output_func (GtkSpinButton *spin_button)
5163 static gchar *month[12] = { "January", "February", "March", "April",
5164 "May", "June", "July", "August", "September",
5165 "October", "November", "December" };
5167 for (i = 1; i <= 12; i++)
5168 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5170 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5171 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5177 spin_button_hex_input_func (GtkSpinButton *spin_button,
5184 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5185 res = strtol(buf, &err, 16);
5188 return GTK_INPUT_ERROR;
5194 spin_button_hex_output_func (GtkSpinButton *spin_button)
5196 static gchar buf[7];
5199 val = (gint) spin_button->adjustment->value;
5200 if (fabs (val) < 1e-5)
5201 sprintf (buf, "0x00");
5203 sprintf (buf, "0x%.2X", val);
5204 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5205 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5210 create_spins (GtkWidget *widget)
5212 static GtkWidget *window = NULL;
5215 GtkWidget *main_vbox;
5218 GtkWidget *spinner2;
5222 GtkWidget *val_label;
5227 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5228 gtk_window_set_screen (GTK_WINDOW (window),
5229 gtk_widget_get_screen (widget));
5231 g_signal_connect (window, "destroy",
5232 G_CALLBACK (gtk_widget_destroyed),
5235 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5237 main_vbox = gtk_vbox_new (FALSE, 5);
5238 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5239 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5241 frame = gtk_frame_new ("Not accelerated");
5242 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5244 vbox = gtk_vbox_new (FALSE, 0);
5245 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5246 gtk_container_add (GTK_CONTAINER (frame), vbox);
5248 /* Time, month, hex spinners */
5250 hbox = gtk_hbox_new (FALSE, 0);
5251 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5253 vbox2 = gtk_vbox_new (FALSE, 0);
5254 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5256 label = gtk_label_new ("Time :");
5257 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5258 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5260 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5261 spinner = gtk_spin_button_new (adj, 0, 0);
5262 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5263 g_signal_connect (spinner,
5265 G_CALLBACK (spin_button_time_output_func),
5267 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5268 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5269 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5271 vbox2 = gtk_vbox_new (FALSE, 0);
5272 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5274 label = gtk_label_new ("Month :");
5275 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5276 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5278 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5280 spinner = gtk_spin_button_new (adj, 0, 0);
5281 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5282 GTK_UPDATE_IF_VALID);
5283 g_signal_connect (spinner,
5285 G_CALLBACK (spin_button_month_input_func),
5287 g_signal_connect (spinner,
5289 G_CALLBACK (spin_button_month_output_func),
5291 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5292 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5293 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5295 vbox2 = gtk_vbox_new (FALSE, 0);
5296 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5298 label = gtk_label_new ("Hex :");
5299 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5300 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5302 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5303 spinner = gtk_spin_button_new (adj, 0, 0);
5304 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5305 g_signal_connect (spinner,
5307 G_CALLBACK (spin_button_hex_input_func),
5309 g_signal_connect (spinner,
5311 G_CALLBACK (spin_button_hex_output_func),
5313 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5314 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
5315 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5317 frame = gtk_frame_new ("Accelerated");
5318 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5320 vbox = gtk_vbox_new (FALSE, 0);
5321 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5322 gtk_container_add (GTK_CONTAINER (frame), vbox);
5324 hbox = gtk_hbox_new (FALSE, 0);
5325 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5327 vbox2 = gtk_vbox_new (FALSE, 0);
5328 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5330 label = gtk_label_new ("Value :");
5331 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5332 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5334 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
5336 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5337 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5338 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
5340 vbox2 = gtk_vbox_new (FALSE, 0);
5341 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5343 label = gtk_label_new ("Digits :");
5344 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5345 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5347 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
5348 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
5349 g_signal_connect (adj, "value_changed",
5350 G_CALLBACK (change_digits),
5352 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
5354 hbox = gtk_hbox_new (FALSE, 0);
5355 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
5357 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
5358 g_signal_connect (button, "clicked",
5359 G_CALLBACK (toggle_snap),
5361 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5362 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5364 button = gtk_check_button_new_with_label ("Numeric only input mode");
5365 g_signal_connect (button, "clicked",
5366 G_CALLBACK (toggle_numeric),
5368 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5369 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5371 val_label = gtk_label_new ("");
5373 hbox = gtk_hbox_new (FALSE, 0);
5374 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5376 button = gtk_button_new_with_label ("Value as Int");
5377 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5378 g_signal_connect (button, "clicked",
5379 G_CALLBACK (get_value),
5380 GINT_TO_POINTER (1));
5381 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5383 button = gtk_button_new_with_label ("Value as Float");
5384 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5385 g_signal_connect (button, "clicked",
5386 G_CALLBACK (get_value),
5387 GINT_TO_POINTER (2));
5388 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5390 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
5391 gtk_label_set_text (GTK_LABEL (val_label), "0");
5393 frame = gtk_frame_new ("Using Convenience Constructor");
5394 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5396 hbox = gtk_hbox_new (FALSE, 0);
5397 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5398 gtk_container_add (GTK_CONTAINER (frame), hbox);
5400 val_label = gtk_label_new ("0.0");
5402 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5403 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5404 g_signal_connect (spinner, "value_changed",
5405 G_CALLBACK (get_spin_value), val_label);
5406 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5407 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5409 hbox = gtk_hbox_new (FALSE, 0);
5410 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5412 button = gtk_button_new_with_label ("Close");
5413 g_signal_connect_swapped (button, "clicked",
5414 G_CALLBACK (gtk_widget_destroy),
5416 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5419 if (!gtk_widget_get_visible (window))
5420 gtk_widget_show_all (window);
5422 gtk_widget_destroy (window);
5431 cursor_expose_event (GtkWidget *widget,
5435 GtkDrawingArea *darea;
5436 GdkDrawable *drawable;
5443 g_return_val_if_fail (widget != NULL, TRUE);
5444 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5446 darea = GTK_DRAWING_AREA (widget);
5447 drawable = widget->window;
5448 white_gc = widget->style->white_gc;
5449 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5450 black_gc = widget->style->black_gc;
5451 max_width = widget->allocation.width;
5452 max_height = widget->allocation.height;
5454 gdk_draw_rectangle (drawable, white_gc,
5461 gdk_draw_rectangle (drawable, black_gc,
5468 gdk_draw_rectangle (drawable, gray_gc,
5479 set_cursor (GtkWidget *spinner,
5488 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5491 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5493 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
5494 vals = class->values;
5496 while (vals && vals->value != c)
5499 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5501 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5503 g_type_class_unref (class);
5505 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5506 gdk_window_set_cursor (widget->window, cursor);
5507 gdk_cursor_unref (cursor);
5511 cursor_event (GtkWidget *widget,
5513 GtkSpinButton *spinner)
5515 if ((event->type == GDK_BUTTON_PRESS) &&
5516 ((event->button.button == 1) ||
5517 (event->button.button == 3)))
5519 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5520 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5527 #ifdef GDK_WINDOWING_X11
5528 #include "x11/gdkx.h"
5531 change_cursor_theme (GtkWidget *widget,
5538 children = gtk_container_get_children (GTK_CONTAINER (data));
5540 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
5541 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
5543 g_list_free (children);
5545 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
5552 create_cursors (GtkWidget *widget)
5554 static GtkWidget *window = NULL;
5557 GtkWidget *main_vbox;
5570 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5571 gtk_window_set_screen (GTK_WINDOW (window),
5572 gtk_widget_get_screen (widget));
5574 g_signal_connect (window, "destroy",
5575 G_CALLBACK (gtk_widget_destroyed),
5578 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5580 main_vbox = gtk_vbox_new (FALSE, 5);
5581 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5582 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5585 g_object_new (gtk_vbox_get_type (),
5586 "GtkBox::homogeneous", FALSE,
5587 "GtkBox::spacing", 5,
5588 "GtkContainer::border_width", 10,
5589 "GtkWidget::parent", main_vbox,
5590 "GtkWidget::visible", TRUE,
5593 #ifdef GDK_WINDOWING_X11
5594 hbox = gtk_hbox_new (FALSE, 0);
5595 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5596 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5598 label = gtk_label_new ("Cursor Theme : ");
5599 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5600 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5602 entry = gtk_entry_new ();
5603 gtk_entry_set_text (GTK_ENTRY (entry), "default");
5604 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
5606 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
5607 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
5608 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5610 g_signal_connect (entry, "changed",
5611 G_CALLBACK (change_cursor_theme), hbox);
5612 g_signal_connect (size, "changed",
5613 G_CALLBACK (change_cursor_theme), hbox);
5616 hbox = gtk_hbox_new (FALSE, 0);
5617 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5618 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5620 label = gtk_label_new ("Cursor Value : ");
5621 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5622 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5624 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5628 spinner = gtk_spin_button_new (adj, 0, 0);
5629 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5632 g_object_new (gtk_frame_get_type (),
5633 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5634 "GtkFrame::label_xalign", 0.5,
5635 "GtkFrame::label", "Cursor Area",
5636 "GtkContainer::border_width", 10,
5637 "GtkWidget::parent", vbox,
5638 "GtkWidget::visible", TRUE,
5641 darea = gtk_drawing_area_new ();
5642 gtk_widget_set_size_request (darea, 80, 80);
5643 gtk_container_add (GTK_CONTAINER (frame), darea);
5644 g_signal_connect (darea,
5646 G_CALLBACK (cursor_expose_event),
5648 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5649 g_signal_connect (darea,
5650 "button_press_event",
5651 G_CALLBACK (cursor_event),
5653 gtk_widget_show (darea);
5655 g_signal_connect (spinner, "changed",
5656 G_CALLBACK (set_cursor),
5659 label = g_object_new (GTK_TYPE_LABEL,
5664 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5667 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5670 g_object_new (gtk_hseparator_get_type (),
5671 "GtkWidget::visible", TRUE,
5673 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5675 hbox = gtk_hbox_new (FALSE, 0);
5676 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5677 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5679 button = gtk_button_new_with_label ("Close");
5680 g_signal_connect_swapped (button, "clicked",
5681 G_CALLBACK (gtk_widget_destroy),
5683 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5685 gtk_widget_show_all (window);
5687 set_cursor (spinner, darea);
5690 gtk_widget_destroy (window);
5698 color_selection_ok (GtkWidget *w,
5699 GtkColorSelectionDialog *cs)
5701 GtkColorSelection *colorsel;
5704 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
5706 gtk_color_selection_get_color(colorsel,color);
5707 gtk_color_selection_set_color(colorsel,color);
5711 color_selection_changed (GtkWidget *w,
5712 GtkColorSelectionDialog *cs)
5714 GtkColorSelection *colorsel;
5717 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
5718 gtk_color_selection_get_color(colorsel,color);
5723 opacity_toggled_cb (GtkWidget *w,
5724 GtkColorSelectionDialog *cs)
5726 GtkColorSelection *colorsel;
5728 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5729 gtk_color_selection_set_has_opacity_control (colorsel,
5730 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5734 palette_toggled_cb (GtkWidget *w,
5735 GtkColorSelectionDialog *cs)
5737 GtkColorSelection *colorsel;
5739 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5740 gtk_color_selection_set_has_palette (colorsel,
5741 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5746 create_color_selection (GtkWidget *widget)
5748 static GtkWidget *window = NULL;
5757 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5758 gtk_window_set_screen (GTK_WINDOW (window),
5759 gtk_widget_get_screen (widget));
5761 g_signal_connect (window, "destroy",
5762 G_CALLBACK (gtk_widget_destroyed),
5765 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5766 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5768 hbox = gtk_hbox_new (FALSE, 8);
5769 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5770 gtk_container_add (GTK_CONTAINER (window), hbox);
5772 label = gtk_label_new ("Pick a color");
5773 gtk_container_add (GTK_CONTAINER (hbox), label);
5775 picker = gtk_color_button_new ();
5776 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5777 gtk_container_add (GTK_CONTAINER (hbox), picker);
5779 button = gtk_button_new_with_mnemonic ("_Props");
5780 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5781 g_signal_connect (button, "clicked",
5782 G_CALLBACK (props_clicked),
5786 if (!gtk_widget_get_visible (window))
5787 gtk_widget_show_all (window);
5789 gtk_widget_destroy (window);
5793 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5795 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5796 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5798 gtk_widget_set_default_direction (new_direction);
5802 orientable_toggle_orientation (GtkOrientable *orientable)
5804 GtkOrientation orientation;
5806 orientation = gtk_orientable_get_orientation (orientable);
5807 gtk_orientable_set_orientation (orientable,
5808 orientation == GTK_ORIENTATION_HORIZONTAL ?
5809 GTK_ORIENTATION_VERTICAL :
5810 GTK_ORIENTATION_HORIZONTAL);
5812 if (GTK_IS_CONTAINER (orientable))
5817 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5819 for (child = children; child; child = child->next)
5821 if (GTK_IS_ORIENTABLE (child->data))
5822 orientable_toggle_orientation (child->data);
5825 g_list_free (children);
5830 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5832 orientable_toggle_orientation (GTK_ORIENTABLE (GTK_DIALOG (gtk_widget_get_toplevel (widget))->vbox));
5836 set_direction_recurse (GtkWidget *widget,
5839 GtkTextDirection *dir = data;
5841 gtk_widget_set_direction (widget, *dir);
5842 if (GTK_IS_CONTAINER (widget))
5843 gtk_container_foreach (GTK_CONTAINER (widget),
5844 set_direction_recurse,
5849 create_forward_back (const char *title,
5850 GtkTextDirection text_dir)
5852 GtkWidget *frame = gtk_frame_new (title);
5853 GtkWidget *bbox = gtk_hbutton_box_new ();
5854 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5855 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5857 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5859 gtk_container_add (GTK_CONTAINER (frame), bbox);
5860 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5861 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5863 set_direction_recurse (frame, &text_dir);
5869 create_flipping (GtkWidget *widget)
5871 static GtkWidget *window = NULL;
5872 GtkWidget *check_button, *button;
5876 window = gtk_dialog_new ();
5878 gtk_window_set_screen (GTK_WINDOW (window),
5879 gtk_widget_get_screen (widget));
5881 g_signal_connect (window, "destroy",
5882 G_CALLBACK (gtk_widget_destroyed),
5885 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5887 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5888 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5889 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5890 check_button, TRUE, TRUE, 0);
5892 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5893 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5895 g_signal_connect (check_button, "toggled",
5896 G_CALLBACK (flipping_toggled_cb), NULL);
5898 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5899 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5900 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5901 check_button, TRUE, TRUE, 0);
5903 g_signal_connect (check_button, "toggled",
5904 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5906 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5907 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5910 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5911 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5914 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5915 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5918 button = gtk_button_new_with_label ("Close");
5919 g_signal_connect_swapped (button, "clicked",
5920 G_CALLBACK (gtk_widget_destroy), window);
5921 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5922 button, TRUE, TRUE, 0);
5925 if (!gtk_widget_get_visible (window))
5926 gtk_widget_show_all (window);
5928 gtk_widget_destroy (window);
5936 make_focus_table (GList **list)
5941 table = gtk_table_new (5, 5, FALSE);
5954 widget = gtk_entry_new ();
5956 widget = gtk_button_new_with_label ("Foo");
5958 *list = g_list_prepend (*list, widget);
5960 gtk_table_attach (GTK_TABLE (table),
5964 GTK_EXPAND | GTK_FILL,
5965 GTK_EXPAND | GTK_FILL,
5974 *list = g_list_reverse (*list);
5980 create_focus (GtkWidget *widget)
5982 static GtkWidget *window = NULL;
5990 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5996 gtk_window_set_screen (GTK_WINDOW (window),
5997 gtk_widget_get_screen (widget));
5999 g_signal_connect (window, "destroy",
6000 G_CALLBACK (gtk_widget_destroyed),
6003 g_signal_connect (window, "response",
6004 G_CALLBACK (gtk_widget_destroy),
6007 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
6009 frame = gtk_frame_new ("Weird tab focus chain");
6011 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6012 frame, TRUE, TRUE, 0);
6014 table = make_focus_table (&list);
6016 gtk_container_add (GTK_CONTAINER (frame), table);
6018 gtk_container_set_focus_chain (GTK_CONTAINER (table),
6023 frame = gtk_frame_new ("Default tab focus chain");
6025 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6026 frame, TRUE, TRUE, 0);
6029 table = make_focus_table (&list);
6033 gtk_container_add (GTK_CONTAINER (frame), table);
6036 if (!gtk_widget_get_visible (window))
6037 gtk_widget_show_all (window);
6039 gtk_widget_destroy (window);
6047 font_selection_ok (GtkWidget *w,
6048 GtkFontSelectionDialog *fs)
6050 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
6052 g_print ("%s\n", s);
6054 gtk_widget_destroy (GTK_WIDGET (fs));
6058 create_font_selection (GtkWidget *widget)
6060 static GtkWidget *window = NULL;
6068 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6069 gtk_window_set_screen (GTK_WINDOW (window),
6070 gtk_widget_get_screen (widget));
6072 g_signal_connect (window, "destroy",
6073 G_CALLBACK (gtk_widget_destroyed),
6076 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
6077 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6079 hbox = gtk_hbox_new (FALSE, 8);
6080 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6081 gtk_container_add (GTK_CONTAINER (window), hbox);
6083 label = gtk_label_new ("Pick a font");
6084 gtk_container_add (GTK_CONTAINER (hbox), label);
6086 picker = gtk_font_button_new ();
6087 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
6088 gtk_container_add (GTK_CONTAINER (hbox), picker);
6091 if (!gtk_widget_get_visible (window))
6092 gtk_widget_show_all (window);
6094 gtk_widget_destroy (window);
6101 static GtkWidget *dialog_window = NULL;
6104 label_toggle (GtkWidget *widget,
6109 *label = gtk_label_new ("Dialog Test");
6110 g_signal_connect (*label,
6112 G_CALLBACK (gtk_widget_destroyed),
6114 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
6115 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6116 *label, TRUE, TRUE, 0);
6117 gtk_widget_show (*label);
6120 gtk_widget_destroy (*label);
6123 #define RESPONSE_TOGGLE_SEPARATOR 1
6126 print_response (GtkWidget *dialog,
6130 g_print ("response signal received (%d)\n", response_id);
6132 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
6134 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
6135 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
6140 create_dialog (GtkWidget *widget)
6142 static GtkWidget *label;
6147 /* This is a terrible example; it's much simpler to create
6148 * dialogs than this. Don't use testgtk for example code,
6152 dialog_window = gtk_dialog_new ();
6153 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6154 gtk_widget_get_screen (widget));
6156 g_signal_connect (dialog_window,
6158 G_CALLBACK (print_response),
6161 g_signal_connect (dialog_window, "destroy",
6162 G_CALLBACK (gtk_widget_destroyed),
6165 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
6166 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6168 button = gtk_button_new_with_label ("OK");
6169 gtk_widget_set_can_default (button, TRUE);
6170 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6171 button, TRUE, TRUE, 0);
6172 gtk_widget_grab_default (button);
6173 gtk_widget_show (button);
6175 button = gtk_button_new_with_label ("Toggle");
6176 g_signal_connect (button, "clicked",
6177 G_CALLBACK (label_toggle),
6179 gtk_widget_set_can_default (button, TRUE);
6180 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6181 button, TRUE, TRUE, 0);
6182 gtk_widget_show (button);
6186 button = gtk_button_new_with_label ("Separator");
6188 gtk_widget_set_can_default (button, TRUE);
6190 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
6192 RESPONSE_TOGGLE_SEPARATOR);
6193 gtk_widget_show (button);
6196 if (!gtk_widget_get_visible (dialog_window))
6197 gtk_widget_show (dialog_window);
6199 gtk_widget_destroy (dialog_window);
6202 /* Display & Screen test
6208 GtkWidget *radio_dpy;
6209 GtkWidget *toplevel;
6210 GtkWidget *dialog_window;
6211 GList *valid_display_list;
6212 } ScreenDisplaySelection;
6215 display_name_cmp (gconstpointer a,
6218 return g_ascii_strcasecmp (a,b);
6222 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
6225 GdkDisplay *display = gtk_widget_get_display (widget);
6227 GdkScreen *new_screen = NULL;
6228 GdkScreen *current_screen = gtk_widget_get_screen (widget);
6230 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
6232 display_name = g_strdup (gtk_entry_get_text (data->entry));
6233 display = gdk_display_open (display_name);
6237 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
6238 GTK_DIALOG_DESTROY_WITH_PARENT,
6241 "The display :\n%s\ncannot be opened",
6243 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
6244 gtk_widget_show (dialog);
6245 g_signal_connect (dialog, "response",
6246 G_CALLBACK (gtk_widget_destroy),
6251 if (!g_list_find_custom (data->valid_display_list,
6254 data->valid_display_list = g_list_append (data->valid_display_list,
6257 new_screen = gdk_display_get_default_screen (display);
6262 gint number_of_screens = gdk_display_get_n_screens (display);
6263 gint screen_num = gdk_screen_get_number (current_screen);
6264 if ((screen_num +1) < number_of_screens)
6265 new_screen = gdk_display_get_screen (display, screen_num + 1);
6267 new_screen = gdk_display_get_screen (display, 0);
6272 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
6273 gtk_widget_destroy (data->dialog_window);
6278 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
6280 gtk_widget_destroy (data);
6284 create_display_screen (GtkWidget *widget)
6286 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
6287 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
6289 ScreenDisplaySelection *scr_dpy_data;
6290 GdkScreen *screen = gtk_widget_get_screen (widget);
6291 static GList *valid_display_list = NULL;
6293 GdkDisplay *display = gdk_screen_get_display (screen);
6295 window = g_object_new (gtk_window_get_type (),
6298 "type", GTK_WINDOW_TOPLEVEL,
6300 "Screen or Display selection",
6301 "border_width", 10, NULL);
6302 g_signal_connect (window, "destroy",
6303 G_CALLBACK (gtk_widget_destroy), NULL);
6305 vbox = gtk_vbox_new (FALSE, 3);
6306 gtk_container_add (GTK_CONTAINER (window), vbox);
6308 frame = gtk_frame_new ("Select screen or display");
6309 gtk_container_add (GTK_CONTAINER (vbox), frame);
6311 table = gtk_table_new (2, 2, TRUE);
6312 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
6313 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
6315 gtk_container_add (GTK_CONTAINER (frame), table);
6317 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
6318 if (gdk_display_get_n_screens(display) > 1)
6319 radio_scr = gtk_radio_button_new_with_label
6320 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
6323 radio_scr = gtk_radio_button_new_with_label
6324 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
6325 "only one screen on the current display");
6326 gtk_widget_set_sensitive (radio_scr, FALSE);
6328 combo_dpy = gtk_combo_new ();
6329 if (!valid_display_list)
6330 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
6332 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
6334 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
6335 "<hostname>:<X Server Num>.<Screen Num>");
6337 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
6338 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
6339 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
6341 bbox = gtk_hbutton_box_new ();
6342 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
6343 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
6345 gtk_container_add (GTK_CONTAINER (vbox), bbox);
6347 gtk_container_add (GTK_CONTAINER (bbox), applyb);
6348 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
6350 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
6352 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
6353 scr_dpy_data->radio_dpy = radio_dpy;
6354 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
6355 scr_dpy_data->dialog_window = window;
6356 scr_dpy_data->valid_display_list = valid_display_list;
6358 g_signal_connect (cancelb, "clicked",
6359 G_CALLBACK (screen_display_destroy_diag), window);
6360 g_signal_connect (applyb, "clicked",
6361 G_CALLBACK (screen_display_check), scr_dpy_data);
6362 gtk_widget_show_all (window);
6367 static gboolean event_watcher_enter_id = 0;
6368 static gboolean event_watcher_leave_id = 0;
6371 event_watcher (GSignalInvocationHint *ihint,
6372 guint n_param_values,
6373 const GValue *param_values,
6376 g_print ("Watch: \"%s\" emitted for %s\n",
6377 g_signal_name (ihint->signal_id),
6378 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
6384 event_watcher_down (void)
6386 if (event_watcher_enter_id)
6390 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6391 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
6392 event_watcher_enter_id = 0;
6393 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6394 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
6395 event_watcher_leave_id = 0;
6400 event_watcher_toggle (void)
6402 if (event_watcher_enter_id)
6403 event_watcher_down ();
6408 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6409 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6410 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6411 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6416 create_event_watcher (GtkWidget *widget)
6422 dialog_window = gtk_dialog_new ();
6423 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6424 gtk_widget_get_screen (widget));
6426 g_signal_connect (dialog_window, "destroy",
6427 G_CALLBACK (gtk_widget_destroyed),
6429 g_signal_connect (dialog_window, "destroy",
6430 G_CALLBACK (event_watcher_down),
6433 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6434 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6435 gtk_widget_set_size_request (dialog_window, 200, 110);
6437 button = gtk_toggle_button_new_with_label ("Activate Watch");
6438 g_signal_connect (button, "clicked",
6439 G_CALLBACK (event_watcher_toggle),
6441 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6442 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6443 button, TRUE, TRUE, 0);
6444 gtk_widget_show (button);
6446 button = gtk_button_new_with_label ("Close");
6447 g_signal_connect_swapped (button, "clicked",
6448 G_CALLBACK (gtk_widget_destroy),
6450 gtk_widget_set_can_default (button, TRUE);
6451 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6452 button, TRUE, TRUE, 0);
6453 gtk_widget_grab_default (button);
6454 gtk_widget_show (button);
6457 if (!gtk_widget_get_visible (dialog_window))
6458 gtk_widget_show (dialog_window);
6460 gtk_widget_destroy (dialog_window);
6468 reformat_value (GtkScale *scale,
6471 return g_strdup_printf ("-->%0.*g<--",
6472 gtk_scale_get_digits (scale), value);
6476 create_range_controls (GtkWidget *widget)
6478 static GtkWidget *window = NULL;
6482 GtkWidget *scrollbar;
6484 GtkWidget *separator;
6485 GtkObject *adjustment;
6490 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6492 gtk_window_set_screen (GTK_WINDOW (window),
6493 gtk_widget_get_screen (widget));
6495 g_signal_connect (window, "destroy",
6496 G_CALLBACK (gtk_widget_destroyed),
6499 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6500 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6503 box1 = gtk_vbox_new (FALSE, 0);
6504 gtk_container_add (GTK_CONTAINER (window), box1);
6505 gtk_widget_show (box1);
6508 box2 = gtk_vbox_new (FALSE, 10);
6509 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6510 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6511 gtk_widget_show (box2);
6514 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6516 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6517 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6518 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6519 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6520 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6521 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6522 gtk_widget_show (scale);
6524 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6525 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6526 GTK_UPDATE_CONTINUOUS);
6527 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6528 gtk_widget_show (scrollbar);
6530 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6531 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6532 g_signal_connect (scale,
6534 G_CALLBACK (reformat_value),
6536 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6537 gtk_widget_show (scale);
6539 hbox = gtk_hbox_new (FALSE, 0);
6541 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6542 gtk_widget_set_size_request (scale, -1, 200);
6543 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6544 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6545 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6546 gtk_widget_show (scale);
6548 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6549 gtk_widget_set_size_request (scale, -1, 200);
6550 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6551 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6552 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6553 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6554 gtk_widget_show (scale);
6556 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6557 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6558 g_signal_connect (scale,
6560 G_CALLBACK (reformat_value),
6562 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6563 gtk_widget_show (scale);
6566 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6567 gtk_widget_show (hbox);
6569 separator = gtk_hseparator_new ();
6570 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6571 gtk_widget_show (separator);
6574 box2 = gtk_vbox_new (FALSE, 10);
6575 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6576 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6577 gtk_widget_show (box2);
6580 button = gtk_button_new_with_label ("close");
6581 g_signal_connect_swapped (button, "clicked",
6582 G_CALLBACK (gtk_widget_destroy),
6584 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6585 gtk_widget_set_can_default (button, TRUE);
6586 gtk_widget_grab_default (button);
6587 gtk_widget_show (button);
6590 if (!gtk_widget_get_visible (window))
6591 gtk_widget_show (window);
6593 gtk_widget_destroy (window);
6601 create_rulers (GtkWidget *widget)
6603 static GtkWidget *window = NULL;
6609 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6611 gtk_window_set_screen (GTK_WINDOW (window),
6612 gtk_widget_get_screen (widget));
6614 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
6616 g_signal_connect (window, "destroy",
6617 G_CALLBACK (gtk_widget_destroyed),
6620 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6621 gtk_widget_set_size_request (window, 300, 300);
6622 gtk_widget_set_events (window,
6623 GDK_POINTER_MOTION_MASK
6624 | GDK_POINTER_MOTION_HINT_MASK);
6625 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6627 table = gtk_table_new (2, 2, FALSE);
6628 gtk_container_add (GTK_CONTAINER (window), table);
6629 gtk_widget_show (table);
6631 ruler = gtk_hruler_new ();
6632 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6633 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6635 g_signal_connect_swapped (window,
6636 "motion_notify_event",
6637 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6640 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6641 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6642 gtk_widget_show (ruler);
6645 ruler = gtk_vruler_new ();
6646 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6648 g_signal_connect_swapped (window,
6649 "motion_notify_event",
6650 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6653 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6654 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6655 gtk_widget_show (ruler);
6658 if (!gtk_widget_get_visible (window))
6659 gtk_widget_show (window);
6661 gtk_widget_destroy (window);
6665 text_toggle_editable (GtkWidget *checkbutton,
6668 gtk_text_set_editable(GTK_TEXT(text),
6669 GTK_TOGGLE_BUTTON(checkbutton)->active);
6673 text_toggle_word_wrap (GtkWidget *checkbutton,
6676 gtk_text_set_word_wrap(GTK_TEXT(text),
6677 GTK_TOGGLE_BUTTON(checkbutton)->active);
6684 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6685 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6686 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6687 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6688 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6689 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6690 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6691 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6694 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6700 GdkPixbuf *book_open;
6701 GdkPixbuf *book_closed;
6702 GtkWidget *sample_notebook;
6705 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6707 GtkWidget *page_widget;
6710 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6712 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6713 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6715 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6716 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6720 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
6722 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6723 gint old_page_num = gtk_notebook_get_current_page (notebook);
6725 if (page_num == old_page_num)
6728 set_page_image (notebook, page_num, book_open);
6730 if (old_page_num != -1)
6731 set_page_image (notebook, old_page_num, book_closed);
6735 tab_fill (GtkToggleButton *button, GtkWidget *child)
6738 GtkPackType pack_type;
6740 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6741 &expand, NULL, &pack_type);
6742 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6743 expand, button->active, pack_type);
6747 tab_expand (GtkToggleButton *button, GtkWidget *child)
6750 GtkPackType pack_type;
6752 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6753 NULL, &fill, &pack_type);
6754 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6755 button->active, fill, pack_type);
6759 tab_pack (GtkToggleButton *button, GtkWidget *child)
6765 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6766 &expand, &fill, NULL);
6767 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6768 expand, fill, button->active);
6772 create_pages (GtkNotebook *notebook, gint start, gint end)
6774 GtkWidget *child = NULL;
6779 GtkWidget *label_box;
6780 GtkWidget *menu_box;
6784 char accel_buffer[32];
6786 for (i = start; i <= end; i++)
6788 sprintf (buffer, "Page %d", i);
6789 sprintf (accel_buffer, "Page _%d", i);
6791 child = gtk_frame_new (buffer);
6792 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6794 vbox = gtk_vbox_new (TRUE,0);
6795 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6796 gtk_container_add (GTK_CONTAINER (child), vbox);
6798 hbox = gtk_hbox_new (TRUE,0);
6799 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6801 button = gtk_check_button_new_with_label ("Fill Tab");
6802 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6803 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6804 g_signal_connect (button, "toggled",
6805 G_CALLBACK (tab_fill), child);
6807 button = gtk_check_button_new_with_label ("Expand Tab");
6808 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6809 g_signal_connect (button, "toggled",
6810 G_CALLBACK (tab_expand), child);
6812 button = gtk_check_button_new_with_label ("Pack end");
6813 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6814 g_signal_connect (button, "toggled",
6815 G_CALLBACK (tab_pack), child);
6817 button = gtk_button_new_with_label ("Hide Page");
6818 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6819 g_signal_connect_swapped (button, "clicked",
6820 G_CALLBACK (gtk_widget_hide),
6823 gtk_widget_show_all (child);
6825 label_box = gtk_hbox_new (FALSE, 0);
6826 pixwid = gtk_image_new_from_pixbuf (book_closed);
6827 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6829 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6830 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6831 label = gtk_label_new_with_mnemonic (accel_buffer);
6832 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6833 gtk_widget_show_all (label_box);
6836 menu_box = gtk_hbox_new (FALSE, 0);
6837 pixwid = gtk_image_new_from_pixbuf (book_closed);
6838 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6840 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6841 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6842 label = gtk_label_new (buffer);
6843 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6844 gtk_widget_show_all (menu_box);
6846 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6851 rotate_notebook (GtkButton *button,
6852 GtkNotebook *notebook)
6854 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
6858 show_all_pages (GtkButton *button,
6859 GtkNotebook *notebook)
6861 gtk_container_foreach (GTK_CONTAINER (notebook),
6862 (GtkCallback) gtk_widget_show, NULL);
6866 notebook_type_changed (GtkWidget *optionmenu,
6869 GtkNotebook *notebook;
6879 notebook = GTK_NOTEBOOK (data);
6881 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6886 /* standard notebook */
6887 gtk_notebook_set_show_tabs (notebook, TRUE);
6888 gtk_notebook_set_show_border (notebook, TRUE);
6889 gtk_notebook_set_scrollable (notebook, FALSE);
6893 /* notabs notebook */
6894 gtk_notebook_set_show_tabs (notebook, FALSE);
6895 gtk_notebook_set_show_border (notebook, TRUE);
6900 gtk_notebook_set_show_tabs (notebook, FALSE);
6901 gtk_notebook_set_show_border (notebook, FALSE);
6906 gtk_notebook_set_show_tabs (notebook, TRUE);
6907 gtk_notebook_set_show_border (notebook, TRUE);
6908 gtk_notebook_set_scrollable (notebook, TRUE);
6909 if (g_list_length (notebook->children) == 5)
6910 create_pages (notebook, 6, 15);
6916 if (g_list_length (notebook->children) == 15)
6917 for (i = 0; i < 10; i++)
6918 gtk_notebook_remove_page (notebook, 5);
6922 notebook_popup (GtkToggleButton *button,
6923 GtkNotebook *notebook)
6926 gtk_notebook_popup_enable (notebook);
6928 gtk_notebook_popup_disable (notebook);
6932 notebook_homogeneous (GtkToggleButton *button,
6933 GtkNotebook *notebook)
6935 g_object_set (notebook, "homogeneous", button->active, NULL);
6939 create_notebook (GtkWidget *widget)
6941 static GtkWidget *window = NULL;
6945 GtkWidget *separator;
6948 GdkPixbuf *book_open_xpm;
6949 GdkPixbuf *book_closed_xpm;
6951 static gchar *items[] =
6961 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6962 gtk_window_set_screen (GTK_WINDOW (window),
6963 gtk_widget_get_screen (widget));
6965 g_signal_connect (window, "destroy",
6966 G_CALLBACK (gtk_widget_destroyed),
6969 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6970 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6972 box1 = gtk_vbox_new (FALSE, 0);
6973 gtk_container_add (GTK_CONTAINER (window), box1);
6975 sample_notebook = gtk_notebook_new ();
6976 g_signal_connect (sample_notebook, "switch_page",
6977 G_CALLBACK (page_switch), NULL);
6978 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6979 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6980 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6982 gtk_widget_realize (sample_notebook);
6985 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
6988 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
6990 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6992 separator = gtk_hseparator_new ();
6993 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6995 box2 = gtk_hbox_new (FALSE, 5);
6996 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6997 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6999 button = gtk_check_button_new_with_label ("popup menu");
7000 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
7001 g_signal_connect (button, "clicked",
7002 G_CALLBACK (notebook_popup),
7005 button = gtk_check_button_new_with_label ("homogeneous tabs");
7006 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
7007 g_signal_connect (button, "clicked",
7008 G_CALLBACK (notebook_homogeneous),
7011 box2 = gtk_hbox_new (FALSE, 5);
7012 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7013 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7015 label = gtk_label_new ("Notebook Style :");
7016 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
7018 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
7019 notebook_type_changed,
7021 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
7023 button = gtk_button_new_with_label ("Show all Pages");
7024 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
7025 g_signal_connect (button, "clicked",
7026 G_CALLBACK (show_all_pages), sample_notebook);
7028 box2 = gtk_hbox_new (TRUE, 10);
7029 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7030 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7032 button = gtk_button_new_with_label ("prev");
7033 g_signal_connect_swapped (button, "clicked",
7034 G_CALLBACK (gtk_notebook_prev_page),
7036 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7038 button = gtk_button_new_with_label ("next");
7039 g_signal_connect_swapped (button, "clicked",
7040 G_CALLBACK (gtk_notebook_next_page),
7042 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7044 button = gtk_button_new_with_label ("rotate");
7045 g_signal_connect (button, "clicked",
7046 G_CALLBACK (rotate_notebook), sample_notebook);
7047 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7049 separator = gtk_hseparator_new ();
7050 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
7052 button = gtk_button_new_with_label ("close");
7053 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
7054 g_signal_connect_swapped (button, "clicked",
7055 G_CALLBACK (gtk_widget_destroy),
7057 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
7058 gtk_widget_set_can_default (button, TRUE);
7059 gtk_widget_grab_default (button);
7062 if (!gtk_widget_get_visible (window))
7063 gtk_widget_show_all (window);
7065 gtk_widget_destroy (window);
7073 toggle_resize (GtkWidget *widget, GtkWidget *child)
7075 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7076 GValue value = { 0, };
7077 g_value_init (&value, G_TYPE_BOOLEAN);
7078 gtk_container_child_get_property (container, child, "resize", &value);
7079 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7080 gtk_container_child_set_property (container, child, "resize", &value);
7084 toggle_shrink (GtkWidget *widget, GtkWidget *child)
7086 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7087 GValue value = { 0, };
7088 g_value_init (&value, G_TYPE_BOOLEAN);
7089 gtk_container_child_get_property (container, child, "shrink", &value);
7090 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7091 gtk_container_child_set_property (container, child, "shrink", &value);
7095 paned_props_clicked (GtkWidget *button,
7098 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
7100 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
7104 create_pane_options (GtkPaned *paned,
7105 const gchar *frame_label,
7106 const gchar *label1,
7107 const gchar *label2)
7113 GtkWidget *check_button;
7115 frame = gtk_frame_new (frame_label);
7116 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
7118 table = gtk_table_new (4, 2, 4);
7119 gtk_container_add (GTK_CONTAINER (frame), table);
7121 label = gtk_label_new (label1);
7122 gtk_table_attach_defaults (GTK_TABLE (table), label,
7125 check_button = gtk_check_button_new_with_label ("Resize");
7126 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7128 g_signal_connect (check_button, "toggled",
7129 G_CALLBACK (toggle_resize),
7132 check_button = gtk_check_button_new_with_label ("Shrink");
7133 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7135 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7137 g_signal_connect (check_button, "toggled",
7138 G_CALLBACK (toggle_shrink),
7141 label = gtk_label_new (label2);
7142 gtk_table_attach_defaults (GTK_TABLE (table), label,
7145 check_button = gtk_check_button_new_with_label ("Resize");
7146 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7148 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7150 g_signal_connect (check_button, "toggled",
7151 G_CALLBACK (toggle_resize),
7154 check_button = gtk_check_button_new_with_label ("Shrink");
7155 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7157 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7159 g_signal_connect (check_button, "toggled",
7160 G_CALLBACK (toggle_shrink),
7163 button = gtk_button_new_with_mnemonic ("_Properties");
7164 gtk_table_attach_defaults (GTK_TABLE (table), button,
7166 g_signal_connect (button, "clicked",
7167 G_CALLBACK (paned_props_clicked),
7174 create_panes (GtkWidget *widget)
7176 static GtkWidget *window = NULL;
7185 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7187 gtk_window_set_screen (GTK_WINDOW (window),
7188 gtk_widget_get_screen (widget));
7190 g_signal_connect (window, "destroy",
7191 G_CALLBACK (gtk_widget_destroyed),
7194 gtk_window_set_title (GTK_WINDOW (window), "Panes");
7195 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7197 vbox = gtk_vbox_new (FALSE, 0);
7198 gtk_container_add (GTK_CONTAINER (window), vbox);
7200 vpaned = gtk_vpaned_new ();
7201 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
7202 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
7204 hpaned = gtk_hpaned_new ();
7205 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
7207 frame = gtk_frame_new (NULL);
7208 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7209 gtk_widget_set_size_request (frame, 60, 60);
7210 gtk_paned_add1 (GTK_PANED (hpaned), frame);
7212 button = gtk_button_new_with_label ("Hi there");
7213 gtk_container_add (GTK_CONTAINER(frame), button);
7215 frame = gtk_frame_new (NULL);
7216 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7217 gtk_widget_set_size_request (frame, 80, 60);
7218 gtk_paned_add2 (GTK_PANED (hpaned), frame);
7220 frame = gtk_frame_new (NULL);
7221 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7222 gtk_widget_set_size_request (frame, 60, 80);
7223 gtk_paned_add2 (GTK_PANED (vpaned), frame);
7225 /* Now create toggle buttons to control sizing */
7227 gtk_box_pack_start (GTK_BOX (vbox),
7228 create_pane_options (GTK_PANED (hpaned),
7234 gtk_box_pack_start (GTK_BOX (vbox),
7235 create_pane_options (GTK_PANED (vpaned),
7241 gtk_widget_show_all (vbox);
7244 if (!gtk_widget_get_visible (window))
7245 gtk_widget_show (window);
7247 gtk_widget_destroy (window);
7251 * Paned keyboard navigation
7255 paned_keyboard_window1 (GtkWidget *widget)
7278 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7279 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
7280 gtk_window_set_screen (GTK_WINDOW (window1),
7281 gtk_widget_get_screen (widget));
7283 hpaned1 = gtk_hpaned_new ();
7284 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
7286 frame1 = gtk_frame_new (NULL);
7287 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
7288 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
7290 vbox1 = gtk_vbox_new (FALSE, 0);
7291 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
7293 button7 = gtk_button_new_with_label ("button7");
7294 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
7296 button8 = gtk_button_new_with_label ("button8");
7297 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
7299 button9 = gtk_button_new_with_label ("button9");
7300 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
7302 vpaned1 = gtk_vpaned_new ();
7303 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
7305 frame2 = gtk_frame_new (NULL);
7306 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
7307 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
7309 frame5 = gtk_frame_new (NULL);
7310 gtk_container_add (GTK_CONTAINER (frame2), frame5);
7312 hbox1 = gtk_hbox_new (FALSE, 0);
7313 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
7315 button5 = gtk_button_new_with_label ("button5");
7316 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
7318 button6 = gtk_button_new_with_label ("button6");
7319 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
7321 frame3 = gtk_frame_new (NULL);
7322 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
7323 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
7325 frame4 = gtk_frame_new ("Buttons");
7326 gtk_container_add (GTK_CONTAINER (frame3), frame4);
7327 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
7329 table1 = gtk_table_new (2, 2, FALSE);
7330 gtk_container_add (GTK_CONTAINER (frame4), table1);
7331 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
7333 button1 = gtk_button_new_with_label ("button1");
7334 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
7335 (GtkAttachOptions) (GTK_FILL),
7336 (GtkAttachOptions) (0), 0, 0);
7338 button2 = gtk_button_new_with_label ("button2");
7339 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
7340 (GtkAttachOptions) (GTK_FILL),
7341 (GtkAttachOptions) (0), 0, 0);
7343 button3 = gtk_button_new_with_label ("button3");
7344 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
7345 (GtkAttachOptions) (GTK_FILL),
7346 (GtkAttachOptions) (0), 0, 0);
7348 button4 = gtk_button_new_with_label ("button4");
7349 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
7350 (GtkAttachOptions) (GTK_FILL),
7351 (GtkAttachOptions) (0), 0, 0);
7357 paned_keyboard_window2 (GtkWidget *widget)
7362 GtkWidget *button13;
7366 GtkWidget *button12;
7368 GtkWidget *button11;
7369 GtkWidget *button10;
7371 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7372 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
7374 gtk_window_set_screen (GTK_WINDOW (window2),
7375 gtk_widget_get_screen (widget));
7377 hpaned2 = gtk_hpaned_new ();
7378 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
7380 frame6 = gtk_frame_new (NULL);
7381 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
7382 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
7384 button13 = gtk_button_new_with_label ("button13");
7385 gtk_container_add (GTK_CONTAINER (frame6), button13);
7387 hbox2 = gtk_hbox_new (FALSE, 0);
7388 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
7390 vpaned2 = gtk_vpaned_new ();
7391 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
7393 frame7 = gtk_frame_new (NULL);
7394 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
7395 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
7397 button12 = gtk_button_new_with_label ("button12");
7398 gtk_container_add (GTK_CONTAINER (frame7), button12);
7400 frame8 = gtk_frame_new (NULL);
7401 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
7402 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
7404 button11 = gtk_button_new_with_label ("button11");
7405 gtk_container_add (GTK_CONTAINER (frame8), button11);
7407 button10 = gtk_button_new_with_label ("button10");
7408 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
7414 paned_keyboard_window3 (GtkWidget *widget)
7421 GtkWidget *button14;
7424 GtkWidget *button15;
7427 GtkWidget *button16;
7429 GtkWidget *button17;
7431 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7432 g_object_set_data (G_OBJECT (window3), "window3", window3);
7433 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
7435 gtk_window_set_screen (GTK_WINDOW (window3),
7436 gtk_widget_get_screen (widget));
7439 vbox2 = gtk_vbox_new (FALSE, 0);
7440 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7442 label1 = gtk_label_new ("Three panes nested inside each other");
7443 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7445 hpaned3 = gtk_hpaned_new ();
7446 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7448 frame9 = gtk_frame_new (NULL);
7449 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7450 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7452 button14 = gtk_button_new_with_label ("button14");
7453 gtk_container_add (GTK_CONTAINER (frame9), button14);
7455 hpaned4 = gtk_hpaned_new ();
7456 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7458 frame10 = gtk_frame_new (NULL);
7459 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7460 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7462 button15 = gtk_button_new_with_label ("button15");
7463 gtk_container_add (GTK_CONTAINER (frame10), button15);
7465 hpaned5 = gtk_hpaned_new ();
7466 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7468 frame11 = gtk_frame_new (NULL);
7469 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7470 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7472 button16 = gtk_button_new_with_label ("button16");
7473 gtk_container_add (GTK_CONTAINER (frame11), button16);
7475 frame12 = gtk_frame_new (NULL);
7476 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7477 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7479 button17 = gtk_button_new_with_label ("button17");
7480 gtk_container_add (GTK_CONTAINER (frame12), button17);
7486 paned_keyboard_window4 (GtkWidget *widget)
7493 GtkWidget *button19;
7494 GtkWidget *button18;
7497 GtkWidget *button21;
7498 GtkWidget *button20;
7500 GtkWidget *button23;
7501 GtkWidget *button22;
7503 GtkWidget *button25;
7504 GtkWidget *button24;
7506 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7507 g_object_set_data (G_OBJECT (window4), "window4", window4);
7508 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7510 gtk_window_set_screen (GTK_WINDOW (window4),
7511 gtk_widget_get_screen (widget));
7513 vbox3 = gtk_vbox_new (FALSE, 0);
7514 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7516 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7517 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7518 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7520 hpaned6 = gtk_hpaned_new ();
7521 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7523 vpaned3 = gtk_vpaned_new ();
7524 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7526 button19 = gtk_button_new_with_label ("button19");
7527 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7529 button18 = gtk_button_new_with_label ("button18");
7530 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7532 hbox3 = gtk_hbox_new (FALSE, 0);
7533 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7535 vpaned4 = gtk_vpaned_new ();
7536 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7538 button21 = gtk_button_new_with_label ("button21");
7539 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7541 button20 = gtk_button_new_with_label ("button20");
7542 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7544 vpaned5 = gtk_vpaned_new ();
7545 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7547 button23 = gtk_button_new_with_label ("button23");
7548 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7550 button22 = gtk_button_new_with_label ("button22");
7551 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7553 vpaned6 = gtk_vpaned_new ();
7554 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7556 button25 = gtk_button_new_with_label ("button25");
7557 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7559 button24 = gtk_button_new_with_label ("button24");
7560 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7566 create_paned_keyboard_navigation (GtkWidget *widget)
7568 static GtkWidget *window1 = NULL;
7569 static GtkWidget *window2 = NULL;
7570 static GtkWidget *window3 = NULL;
7571 static GtkWidget *window4 = NULL;
7574 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7576 gtk_widget_destroy (window1);
7577 gtk_widget_destroy (window2);
7578 gtk_widget_destroy (window3);
7579 gtk_widget_destroy (window4);
7584 window1 = paned_keyboard_window1 (widget);
7585 g_signal_connect (window1, "destroy",
7586 G_CALLBACK (gtk_widget_destroyed),
7592 window2 = paned_keyboard_window2 (widget);
7593 g_signal_connect (window2, "destroy",
7594 G_CALLBACK (gtk_widget_destroyed),
7600 window3 = paned_keyboard_window3 (widget);
7601 g_signal_connect (window3, "destroy",
7602 G_CALLBACK (gtk_widget_destroyed),
7608 window4 = paned_keyboard_window4 (widget);
7609 g_signal_connect (window4, "destroy",
7610 G_CALLBACK (gtk_widget_destroyed),
7614 if (gtk_widget_get_visible (window1))
7615 gtk_widget_destroy (GTK_WIDGET (window1));
7617 gtk_widget_show_all (GTK_WIDGET (window1));
7619 if (gtk_widget_get_visible (window2))
7620 gtk_widget_destroy (GTK_WIDGET (window2));
7622 gtk_widget_show_all (GTK_WIDGET (window2));
7624 if (gtk_widget_get_visible (window3))
7625 gtk_widget_destroy (GTK_WIDGET (window3));
7627 gtk_widget_show_all (GTK_WIDGET (window3));
7629 if (gtk_widget_get_visible (window4))
7630 gtk_widget_destroy (GTK_WIDGET (window4));
7632 gtk_widget_show_all (GTK_WIDGET (window4));
7640 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7643 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7647 /* ignore double and triple click */
7648 if (event->type != GDK_BUTTON_PRESS)
7651 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7652 p->x = (int) event->x;
7653 p->y = (int) event->y;
7655 gtk_grab_add (widget);
7656 gdk_pointer_grab (widget->window, TRUE,
7657 GDK_BUTTON_RELEASE_MASK |
7658 GDK_BUTTON_MOTION_MASK |
7659 GDK_POINTER_MOTION_HINT_MASK,
7664 shape_released (GtkWidget *widget)
7666 gtk_grab_remove (widget);
7667 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7672 shape_motion (GtkWidget *widget,
7673 GdkEventMotion *event)
7677 GdkModifierType mask;
7679 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7682 * Can't use event->x / event->y here
7683 * because I need absolute coordinates.
7685 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7686 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
7690 shape_create_icon (GdkScreen *screen,
7701 CursorOffset* icon_pos;
7703 GdkBitmap *gdk_pixmap_mask;
7704 GdkPixmap *gdk_pixmap;
7707 style = gtk_widget_get_default_style ();
7708 gc = style->black_gc;
7711 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7713 window = gtk_window_new (window_type);
7714 gtk_window_set_screen (GTK_WINDOW (window), screen);
7716 fixed = gtk_fixed_new ();
7717 gtk_widget_set_size_request (fixed, 100, 100);
7718 gtk_container_add (GTK_CONTAINER (window), fixed);
7719 gtk_widget_show (fixed);
7721 gtk_widget_set_events (window,
7722 gtk_widget_get_events (window) |
7723 GDK_BUTTON_MOTION_MASK |
7724 GDK_POINTER_MOTION_HINT_MASK |
7725 GDK_BUTTON_PRESS_MASK);
7727 gtk_widget_realize (window);
7728 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
7729 &style->bg[GTK_STATE_NORMAL],
7732 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
7733 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
7734 gtk_widget_show (pixmap);
7736 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
7738 g_object_unref (gdk_pixmap_mask);
7739 g_object_unref (gdk_pixmap);
7741 g_signal_connect (window, "button_press_event",
7742 G_CALLBACK (shape_pressed), NULL);
7743 g_signal_connect (window, "button_release_event",
7744 G_CALLBACK (shape_released), NULL);
7745 g_signal_connect (window, "motion_notify_event",
7746 G_CALLBACK (shape_motion), NULL);
7748 icon_pos = g_new (CursorOffset, 1);
7749 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7751 gtk_widget_set_uposition (window, x, y);
7752 gtk_widget_show (window);
7758 create_shapes (GtkWidget *widget)
7760 /* Variables used by the Drag/Drop and Shape Window demos */
7761 static GtkWidget *modeller = NULL;
7762 static GtkWidget *sheets = NULL;
7763 static GtkWidget *rings = NULL;
7764 static GtkWidget *with_region = NULL;
7765 GdkScreen *screen = gtk_widget_get_screen (widget);
7767 if (!(file_exists ("Modeller.xpm") &&
7768 file_exists ("FilesQueue.xpm") &&
7769 file_exists ("3DRings.xpm")))
7775 modeller = shape_create_icon (screen, "Modeller.xpm",
7776 440, 140, 0,0, GTK_WINDOW_POPUP);
7778 g_signal_connect (modeller, "destroy",
7779 G_CALLBACK (gtk_widget_destroyed),
7783 gtk_widget_destroy (modeller);
7787 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7788 580, 170, 0,0, GTK_WINDOW_POPUP);
7790 g_signal_connect (sheets, "destroy",
7791 G_CALLBACK (gtk_widget_destroyed),
7796 gtk_widget_destroy (sheets);
7800 rings = shape_create_icon (screen, "3DRings.xpm",
7801 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7803 g_signal_connect (rings, "destroy",
7804 G_CALLBACK (gtk_widget_destroyed),
7808 gtk_widget_destroy (rings);
7815 with_region = shape_create_icon (screen, "3DRings.xpm",
7816 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7818 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7820 g_signal_connect (with_region, "destroy",
7821 G_CALLBACK (gtk_widget_destroyed),
7824 /* reset shape from mask to a region */
7827 region = gdk_region_new ();
7839 gdk_region_union_with_rect (region, &rect);
7847 gdk_window_shape_combine_region (with_region->window,
7852 gtk_widget_destroy (with_region);
7860 create_wmhints (GtkWidget *widget)
7862 static GtkWidget *window = NULL;
7864 GtkWidget *separator;
7873 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7875 gtk_window_set_screen (GTK_WINDOW (window),
7876 gtk_widget_get_screen (widget));
7878 g_signal_connect (window, "destroy",
7879 G_CALLBACK (gtk_widget_destroyed),
7882 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7883 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7885 gtk_widget_realize (window);
7887 circles = gdk_bitmap_create_from_data (window->window,
7888 (gchar *) circles_bits,
7891 gdk_window_set_icon (window->window, NULL,
7894 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
7896 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7897 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7899 box1 = gtk_vbox_new (FALSE, 0);
7900 gtk_container_add (GTK_CONTAINER (window), box1);
7901 gtk_widget_show (box1);
7903 label = gtk_label_new ("Try iconizing me!");
7904 gtk_widget_set_size_request (label, 150, 50);
7905 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7906 gtk_widget_show (label);
7909 separator = gtk_hseparator_new ();
7910 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7911 gtk_widget_show (separator);
7914 box2 = gtk_vbox_new (FALSE, 10);
7915 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7916 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7917 gtk_widget_show (box2);
7920 button = gtk_button_new_with_label ("close");
7922 g_signal_connect_swapped (button, "clicked",
7923 G_CALLBACK (gtk_widget_destroy),
7926 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7927 gtk_widget_set_can_default (button, TRUE);
7928 gtk_widget_grab_default (button);
7929 gtk_widget_show (button);
7932 if (!gtk_widget_get_visible (window))
7933 gtk_widget_show (window);
7935 gtk_widget_destroy (window);
7940 * Window state tracking
7944 window_state_callback (GtkWidget *widget,
7945 GdkEventWindowState *event,
7948 GtkWidget *label = data;
7951 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
7952 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7953 "withdrawn" : "not withdrawn", ", ",
7954 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7955 "iconified" : "not iconified", ", ",
7956 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7957 "sticky" : "not sticky", ", ",
7958 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7959 "maximized" : "not maximized", ", ",
7960 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7961 "fullscreen" : "not fullscreen",
7962 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7963 "above" : "not above", ", ",
7964 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7965 "below" : "not below", ", ",
7968 gtk_label_set_text (GTK_LABEL (label), msg);
7976 tracking_label (GtkWidget *window)
7982 hbox = gtk_hbox_new (FALSE, 5);
7984 g_signal_connect_object (hbox,
7986 G_CALLBACK (gtk_widget_destroy),
7990 label = gtk_label_new ("<no window state events received>");
7991 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7992 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7994 g_signal_connect (window,
7995 "window_state_event",
7996 G_CALLBACK (window_state_callback),
7999 button = gtk_button_new_with_label ("Deiconify");
8000 g_signal_connect_object (button,
8002 G_CALLBACK (gtk_window_deiconify),
8005 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8007 button = gtk_button_new_with_label ("Iconify");
8008 g_signal_connect_object (button,
8010 G_CALLBACK (gtk_window_iconify),
8013 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8015 button = gtk_button_new_with_label ("Fullscreen");
8016 g_signal_connect_object (button,
8018 G_CALLBACK (gtk_window_fullscreen),
8021 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8023 button = gtk_button_new_with_label ("Unfullscreen");
8024 g_signal_connect_object (button,
8026 G_CALLBACK (gtk_window_unfullscreen),
8029 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8031 button = gtk_button_new_with_label ("Present");
8032 g_signal_connect_object (button,
8034 G_CALLBACK (gtk_window_present),
8037 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8039 button = gtk_button_new_with_label ("Show");
8040 g_signal_connect_object (button,
8042 G_CALLBACK (gtk_widget_show),
8045 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8047 gtk_widget_show_all (hbox);
8053 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
8055 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8057 gtk_window_set_keep_above (GTK_WINDOW (data),
8058 gtk_toggle_button_get_active (togglebutton));
8060 if (gtk_toggle_button_get_active (togglebutton))
8061 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8065 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
8067 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8069 gtk_window_set_keep_below (GTK_WINDOW (data),
8070 gtk_toggle_button_get_active (togglebutton));
8072 if (gtk_toggle_button_get_active (togglebutton))
8073 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8078 get_state_controls (GtkWidget *window)
8082 GtkWidget *button_above;
8083 GtkWidget *button_below;
8085 vbox = gtk_vbox_new (FALSE, 0);
8087 button = gtk_button_new_with_label ("Stick");
8088 g_signal_connect_object (button,
8090 G_CALLBACK (gtk_window_stick),
8093 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8095 button = gtk_button_new_with_label ("Unstick");
8096 g_signal_connect_object (button,
8098 G_CALLBACK (gtk_window_unstick),
8101 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8103 button = gtk_button_new_with_label ("Maximize");
8104 g_signal_connect_object (button,
8106 G_CALLBACK (gtk_window_maximize),
8109 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8111 button = gtk_button_new_with_label ("Unmaximize");
8112 g_signal_connect_object (button,
8114 G_CALLBACK (gtk_window_unmaximize),
8117 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8119 button = gtk_button_new_with_label ("Iconify");
8120 g_signal_connect_object (button,
8122 G_CALLBACK (gtk_window_iconify),
8125 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8127 button = gtk_button_new_with_label ("Fullscreen");
8128 g_signal_connect_object (button,
8130 G_CALLBACK (gtk_window_fullscreen),
8133 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8135 button = gtk_button_new_with_label ("Unfullscreen");
8136 g_signal_connect_object (button,
8138 G_CALLBACK (gtk_window_unfullscreen),
8141 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8143 button_above = gtk_toggle_button_new_with_label ("Keep above");
8144 g_signal_connect (button_above,
8146 G_CALLBACK (keep_window_above),
8148 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
8150 button_below = gtk_toggle_button_new_with_label ("Keep below");
8151 g_signal_connect (button_below,
8153 G_CALLBACK (keep_window_below),
8155 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
8157 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
8158 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
8160 button = gtk_button_new_with_label ("Hide (withdraw)");
8161 g_signal_connect_object (button,
8163 G_CALLBACK (gtk_widget_hide),
8166 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8168 gtk_widget_show_all (vbox);
8174 create_window_states (GtkWidget *widget)
8176 static GtkWidget *window = NULL;
8179 GtkWidget *iconified;
8181 GtkWidget *controls;
8185 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8186 gtk_window_set_screen (GTK_WINDOW (window),
8187 gtk_widget_get_screen (widget));
8189 g_signal_connect (window, "destroy",
8190 G_CALLBACK (gtk_widget_destroyed),
8193 gtk_window_set_title (GTK_WINDOW (window), "Window states");
8195 box1 = gtk_vbox_new (FALSE, 0);
8196 gtk_container_add (GTK_CONTAINER (window), box1);
8198 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8200 gtk_window_set_screen (GTK_WINDOW (iconified),
8201 gtk_widget_get_screen (widget));
8203 g_signal_connect_object (iconified, "destroy",
8204 G_CALLBACK (gtk_widget_destroy),
8207 gtk_window_iconify (GTK_WINDOW (iconified));
8208 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
8209 controls = get_state_controls (iconified);
8210 gtk_container_add (GTK_CONTAINER (iconified), controls);
8212 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8214 gtk_window_set_screen (GTK_WINDOW (normal),
8215 gtk_widget_get_screen (widget));
8217 g_signal_connect_object (normal, "destroy",
8218 G_CALLBACK (gtk_widget_destroy),
8222 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
8223 controls = get_state_controls (normal);
8224 gtk_container_add (GTK_CONTAINER (normal), controls);
8226 label = tracking_label (iconified);
8227 gtk_container_add (GTK_CONTAINER (box1), label);
8229 label = tracking_label (normal);
8230 gtk_container_add (GTK_CONTAINER (box1), label);
8232 gtk_widget_show_all (iconified);
8233 gtk_widget_show_all (normal);
8234 gtk_widget_show_all (box1);
8237 if (!gtk_widget_get_visible (window))
8238 gtk_widget_show (window);
8240 gtk_widget_destroy (window);
8248 configure_event_callback (GtkWidget *widget,
8249 GdkEventConfigure *event,
8252 GtkWidget *label = data;
8256 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
8258 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
8260 event->x, event->y, event->width, event->height,
8263 gtk_label_set_text (GTK_LABEL (label), msg);
8271 get_ints (GtkWidget *window,
8278 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
8279 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
8281 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
8282 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
8286 set_size_callback (GtkWidget *widget,
8291 get_ints (data, &w, &h);
8293 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
8297 unset_default_size_callback (GtkWidget *widget,
8300 gtk_window_set_default_size (g_object_get_data (data, "target"),
8305 set_default_size_callback (GtkWidget *widget,
8310 get_ints (data, &w, &h);
8312 gtk_window_set_default_size (g_object_get_data (data, "target"),
8317 unset_size_request_callback (GtkWidget *widget,
8320 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8325 set_size_request_callback (GtkWidget *widget,
8330 get_ints (data, &w, &h);
8332 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8337 set_location_callback (GtkWidget *widget,
8342 get_ints (data, &x, &y);
8344 gtk_window_move (g_object_get_data (data, "target"), x, y);
8348 move_to_position_callback (GtkWidget *widget,
8354 window = g_object_get_data (data, "target");
8356 gtk_window_get_position (window, &x, &y);
8358 gtk_window_move (window, x, y);
8362 set_geometry_callback (GtkWidget *entry,
8368 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
8370 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
8372 if (!gtk_window_parse_geometry (target, text))
8373 g_print ("Bad geometry string '%s'\n", text);
8379 allow_shrink_callback (GtkWidget *widget,
8382 g_object_set (g_object_get_data (data, "target"),
8384 GTK_TOGGLE_BUTTON (widget)->active,
8389 allow_grow_callback (GtkWidget *widget,
8392 g_object_set (g_object_get_data (data, "target"),
8394 GTK_TOGGLE_BUTTON (widget)->active,
8399 gravity_selected (GtkWidget *widget,
8402 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
8403 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
8407 pos_selected (GtkWidget *widget,
8410 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
8411 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
8415 move_gravity_window_to_current_position (GtkWidget *widget,
8421 window = GTK_WINDOW (data);
8423 gtk_window_get_position (window, &x, &y);
8425 gtk_window_move (window, x, y);
8429 get_screen_corner (GtkWindow *window,
8434 GdkScreen * screen = gtk_window_get_screen (window);
8436 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
8438 switch (gtk_window_get_gravity (window))
8440 case GDK_GRAVITY_SOUTH_EAST:
8441 *x = gdk_screen_get_width (screen) - w;
8442 *y = gdk_screen_get_height (screen) - h;
8445 case GDK_GRAVITY_NORTH_EAST:
8446 *x = gdk_screen_get_width (screen) - w;
8450 case GDK_GRAVITY_SOUTH_WEST:
8452 *y = gdk_screen_get_height (screen) - h;
8455 case GDK_GRAVITY_NORTH_WEST:
8460 case GDK_GRAVITY_SOUTH:
8461 *x = (gdk_screen_get_width (screen) - w) / 2;
8462 *y = gdk_screen_get_height (screen) - h;
8465 case GDK_GRAVITY_NORTH:
8466 *x = (gdk_screen_get_width (screen) - w) / 2;
8470 case GDK_GRAVITY_WEST:
8472 *y = (gdk_screen_get_height (screen) - h) / 2;
8475 case GDK_GRAVITY_EAST:
8476 *x = gdk_screen_get_width (screen) - w;
8477 *y = (gdk_screen_get_height (screen) - h) / 2;
8480 case GDK_GRAVITY_CENTER:
8481 *x = (gdk_screen_get_width (screen) - w) / 2;
8482 *y = (gdk_screen_get_height (screen) - h) / 2;
8485 case GDK_GRAVITY_STATIC:
8486 /* pick some random numbers */
8492 g_assert_not_reached ();
8498 move_gravity_window_to_starting_position (GtkWidget *widget,
8504 window = GTK_WINDOW (data);
8506 get_screen_corner (window,
8509 gtk_window_move (window, x, y);
8513 make_gravity_window (GtkWidget *destroy_with,
8522 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8524 gtk_window_set_screen (GTK_WINDOW (window),
8525 gtk_widget_get_screen (destroy_with));
8527 vbox = gtk_vbox_new (FALSE, 0);
8528 gtk_widget_show (vbox);
8530 gtk_container_add (GTK_CONTAINER (window), vbox);
8531 gtk_window_set_title (GTK_WINDOW (window), title);
8532 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8534 g_signal_connect_object (destroy_with,
8536 G_CALLBACK (gtk_widget_destroy),
8541 button = gtk_button_new_with_mnemonic ("_Move to current position");
8543 g_signal_connect (button, "clicked",
8544 G_CALLBACK (move_gravity_window_to_current_position),
8547 gtk_container_add (GTK_CONTAINER (vbox), button);
8548 gtk_widget_show (button);
8550 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8552 g_signal_connect (button, "clicked",
8553 G_CALLBACK (move_gravity_window_to_starting_position),
8556 gtk_container_add (GTK_CONTAINER (vbox), button);
8557 gtk_widget_show (button);
8559 /* Pretend this is the result of --geometry.
8560 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8561 * and in that case you probably should just use gtk_window_parse_geometry().
8562 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8563 * you are parsing --geometry or equivalent.
8565 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8569 gtk_window_set_default_size (GTK_WINDOW (window),
8572 get_screen_corner (GTK_WINDOW (window), &x, &y);
8574 gtk_window_move (GTK_WINDOW (window),
8581 do_gravity_test (GtkWidget *widget,
8584 GtkWidget *destroy_with = data;
8587 /* We put a window at each gravity point on the screen. */
8588 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8590 gtk_widget_show (window);
8592 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8594 gtk_widget_show (window);
8596 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8598 gtk_widget_show (window);
8600 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8602 gtk_widget_show (window);
8604 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8606 gtk_widget_show (window);
8608 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8610 gtk_widget_show (window);
8613 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8615 gtk_widget_show (window);
8618 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8620 gtk_widget_show (window);
8622 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8624 gtk_widget_show (window);
8626 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8628 gtk_widget_show (window);
8632 window_controls (GtkWidget *window)
8634 GtkWidget *control_window;
8644 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8646 gtk_window_set_screen (GTK_WINDOW (control_window),
8647 gtk_widget_get_screen (window));
8649 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8651 g_object_set_data (G_OBJECT (control_window),
8655 g_signal_connect_object (control_window,
8657 G_CALLBACK (gtk_widget_destroy),
8661 vbox = gtk_vbox_new (FALSE, 5);
8663 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8665 label = gtk_label_new ("<no configure events>");
8666 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8668 g_signal_connect (window,
8670 G_CALLBACK (configure_event_callback),
8673 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8675 spin = gtk_spin_button_new (adj, 0, 0);
8677 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8679 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8681 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8683 spin = gtk_spin_button_new (adj, 0, 0);
8685 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8687 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8689 entry = gtk_entry_new ();
8690 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8692 g_signal_connect (entry, "changed",
8693 G_CALLBACK (set_geometry_callback),
8696 button = gtk_button_new_with_label ("Show gravity test windows");
8697 g_signal_connect_swapped (button,
8699 G_CALLBACK (do_gravity_test),
8701 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8703 button = gtk_button_new_with_label ("Reshow with initial size");
8704 g_signal_connect_object (button,
8706 G_CALLBACK (gtk_window_reshow_with_initial_size),
8709 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8711 button = gtk_button_new_with_label ("Queue resize");
8712 g_signal_connect_object (button,
8714 G_CALLBACK (gtk_widget_queue_resize),
8717 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8719 button = gtk_button_new_with_label ("Resize");
8720 g_signal_connect (button,
8722 G_CALLBACK (set_size_callback),
8724 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8726 button = gtk_button_new_with_label ("Set default size");
8727 g_signal_connect (button,
8729 G_CALLBACK (set_default_size_callback),
8731 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8733 button = gtk_button_new_with_label ("Unset default size");
8734 g_signal_connect (button,
8736 G_CALLBACK (unset_default_size_callback),
8738 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8740 button = gtk_button_new_with_label ("Set size request");
8741 g_signal_connect (button,
8743 G_CALLBACK (set_size_request_callback),
8745 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8747 button = gtk_button_new_with_label ("Unset size request");
8748 g_signal_connect (button,
8750 G_CALLBACK (unset_size_request_callback),
8752 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8754 button = gtk_button_new_with_label ("Move");
8755 g_signal_connect (button,
8757 G_CALLBACK (set_location_callback),
8759 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8761 button = gtk_button_new_with_label ("Move to current position");
8762 g_signal_connect (button,
8764 G_CALLBACK (move_to_position_callback),
8766 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8768 button = gtk_check_button_new_with_label ("Allow shrink");
8769 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8770 g_signal_connect (button,
8772 G_CALLBACK (allow_shrink_callback),
8774 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8776 button = gtk_check_button_new_with_label ("Allow grow");
8777 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8778 g_signal_connect (button,
8780 G_CALLBACK (allow_grow_callback),
8782 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8784 button = gtk_button_new_with_mnemonic ("_Show");
8785 g_signal_connect_object (button,
8787 G_CALLBACK (gtk_widget_show),
8790 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8792 button = gtk_button_new_with_mnemonic ("_Hide");
8793 g_signal_connect_object (button,
8795 G_CALLBACK (gtk_widget_hide),
8798 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8800 om = gtk_combo_box_new_text ();
8804 static gchar *names[] = {
8805 "GDK_GRAVITY_NORTH_WEST",
8806 "GDK_GRAVITY_NORTH",
8807 "GDK_GRAVITY_NORTH_EAST",
8809 "GDK_GRAVITY_CENTER",
8811 "GDK_GRAVITY_SOUTH_WEST",
8812 "GDK_GRAVITY_SOUTH",
8813 "GDK_GRAVITY_SOUTH_EAST",
8814 "GDK_GRAVITY_STATIC",
8818 g_assert (names[i]);
8819 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8824 g_signal_connect (om,
8826 G_CALLBACK (gravity_selected),
8829 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8832 om = gtk_combo_box_new_text ();
8836 static gchar *names[] = {
8838 "GTK_WIN_POS_CENTER",
8839 "GTK_WIN_POS_MOUSE",
8840 "GTK_WIN_POS_CENTER_ALWAYS",
8841 "GTK_WIN_POS_CENTER_ON_PARENT",
8845 g_assert (names[i]);
8846 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8851 g_signal_connect (om,
8853 G_CALLBACK (pos_selected),
8856 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8858 gtk_widget_show_all (vbox);
8860 return control_window;
8864 create_window_sizing (GtkWidget *widget)
8866 static GtkWidget *window = NULL;
8867 static GtkWidget *target_window = NULL;
8873 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8874 gtk_window_set_screen (GTK_WINDOW (target_window),
8875 gtk_widget_get_screen (widget));
8876 label = gtk_label_new (NULL);
8877 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");
8878 gtk_container_add (GTK_CONTAINER (target_window), label);
8879 gtk_widget_show (label);
8881 g_signal_connect (target_window, "destroy",
8882 G_CALLBACK (gtk_widget_destroyed),
8885 window = window_controls (target_window);
8887 g_signal_connect (window, "destroy",
8888 G_CALLBACK (gtk_widget_destroyed),
8891 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8894 /* don't show target window by default, we want to allow testing
8895 * of behavior on first show.
8898 if (!gtk_widget_get_visible (window))
8899 gtk_widget_show (window);
8901 gtk_widget_destroy (window);
8908 typedef struct _ProgressData {
8911 GtkWidget *block_spin;
8912 GtkWidget *x_align_spin;
8913 GtkWidget *y_align_spin;
8914 GtkWidget *step_spin;
8915 GtkWidget *act_blocks_spin;
8926 progress_timeout (gpointer data)
8928 ProgressData *pdata = data;
8931 if (pdata->activity)
8933 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8937 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8941 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8947 destroy_progress (GtkWidget *widget,
8948 ProgressData **pdata)
8950 g_source_remove ((*pdata)->timer);
8951 (*pdata)->timer = 0;
8952 (*pdata)->window = NULL;
8958 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8960 ProgressData *pdata;
8963 pdata = (ProgressData *) data;
8965 if (!gtk_widget_get_mapped (widget))
8968 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8970 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
8971 (GtkProgressBarOrientation) i);
8975 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8977 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
8978 GTK_TOGGLE_BUTTON (widget)->active);
8979 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
8983 progressbar_toggle_ellipsize (GtkWidget *widget,
8986 ProgressData *pdata = data;
8987 if (gtk_widget_is_drawable (widget))
8989 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8990 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8995 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
8999 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
9000 sprintf (buf, "???");
9002 sprintf (buf, "%.0f%%", 100 *
9003 gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)));
9004 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
9008 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
9010 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
9011 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
9012 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
9016 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
9018 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
9022 entry_changed (GtkWidget *widget, ProgressData *pdata)
9024 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
9025 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
9029 create_progress_bar (GtkWidget *widget)
9041 static ProgressData *pdata = NULL;
9043 static gchar *items1[] =
9051 static char *ellipsize_items[] = {
9052 "None", // PANGO_ELLIPSIZE_NONE,
9053 "Start", // PANGO_ELLIPSIZE_START,
9054 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
9055 "End", // PANGO_ELLIPSIZE_END
9059 pdata = g_new0 (ProgressData, 1);
9063 pdata->window = gtk_dialog_new ();
9065 gtk_window_set_screen (GTK_WINDOW (pdata->window),
9066 gtk_widget_get_screen (widget));
9068 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
9070 g_signal_connect (pdata->window, "destroy",
9071 G_CALLBACK (destroy_progress),
9076 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
9077 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
9079 vbox = gtk_vbox_new (FALSE, 5);
9080 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9081 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
9082 vbox, FALSE, TRUE, 0);
9084 frame = gtk_frame_new ("Progress");
9085 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9087 vbox2 = gtk_vbox_new (FALSE, 5);
9088 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9090 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9091 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9093 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
9094 g_signal_connect (adj, "value_changed",
9095 G_CALLBACK (progress_value_changed), pdata);
9097 pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
9099 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
9101 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
9102 "%v from [%l,%u] (=%p%%)");
9103 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
9104 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
9106 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9107 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9109 hbox = gtk_hbox_new (FALSE, 5);
9110 gtk_container_add (GTK_CONTAINER (align), hbox);
9111 label = gtk_label_new ("Label updated by user :");
9112 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9113 pdata->label = gtk_label_new ("");
9114 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
9116 frame = gtk_frame_new ("Options");
9117 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9119 vbox2 = gtk_vbox_new (FALSE, 5);
9120 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9122 tab = gtk_table_new (7, 2, FALSE);
9123 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
9125 label = gtk_label_new ("Orientation :");
9126 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
9127 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9129 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9131 pdata->omenu1 = build_option_menu (items1, 4, 0,
9132 progressbar_toggle_orientation,
9134 hbox = gtk_hbox_new (FALSE, 0);
9135 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
9136 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9138 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
9140 check = gtk_check_button_new_with_label ("Show text");
9141 g_signal_connect (check, "clicked",
9142 G_CALLBACK (toggle_show_text),
9144 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
9145 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9148 hbox = gtk_hbox_new (FALSE, 0);
9149 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
9150 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9153 label = gtk_label_new ("Format : ");
9154 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9156 pdata->entry = gtk_entry_new ();
9157 g_signal_connect (pdata->entry, "changed",
9158 G_CALLBACK (entry_changed),
9160 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
9161 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
9162 gtk_widget_set_size_request (pdata->entry, 100, -1);
9163 gtk_widget_set_sensitive (pdata->entry, FALSE);
9165 label = gtk_label_new ("Text align :");
9166 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
9167 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9169 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9171 hbox = gtk_hbox_new (FALSE, 0);
9172 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
9173 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9176 label = gtk_label_new ("x :");
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->x_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->x_align_spin, FALSE, TRUE, 0);
9184 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
9186 label = gtk_label_new ("y :");
9187 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
9189 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
9190 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
9191 g_signal_connect (adj, "value_changed",
9192 G_CALLBACK (adjust_align), pdata);
9193 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
9194 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
9196 label = gtk_label_new ("Ellipsize text :");
9197 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
9198 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9200 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9201 pdata->elmenu = build_option_menu (ellipsize_items,
9202 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
9203 2, // PANGO_ELLIPSIZE_MIDDLE
9204 progressbar_toggle_ellipsize,
9206 hbox = gtk_hbox_new (FALSE, 0);
9207 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
9208 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9210 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
9212 check = gtk_check_button_new_with_label ("Activity mode");
9213 g_signal_connect (check, "clicked",
9214 G_CALLBACK (toggle_activity_mode), pdata);
9215 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
9216 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9219 button = gtk_button_new_with_label ("close");
9220 g_signal_connect_swapped (button, "clicked",
9221 G_CALLBACK (gtk_widget_destroy),
9223 gtk_widget_set_can_default (button, TRUE);
9224 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
9225 button, TRUE, TRUE, 0);
9226 gtk_widget_grab_default (button);
9229 if (!gtk_widget_get_visible (pdata->window))
9230 gtk_widget_show_all (pdata->window);
9232 gtk_widget_destroy (pdata->window);
9244 GtkWidget *res_widget;
9248 find_widget (GtkWidget *widget, FindWidgetData *data)
9250 GtkAllocation new_allocation;
9254 new_allocation = widget->allocation;
9256 if (data->found || !gtk_widget_get_mapped (widget))
9259 /* Note that in the following code, we only count the
9260 * position as being inside a WINDOW widget if it is inside
9261 * widget->window; points that are outside of widget->window
9262 * but within the allocation are not counted. This is consistent
9263 * with the way we highlight drag targets.
9265 if (gtk_widget_get_has_window (widget))
9267 new_allocation.x = 0;
9268 new_allocation.y = 0;
9271 if (widget->parent && !data->first)
9273 GdkWindow *window = widget->window;
9274 while (window != widget->parent->window)
9276 gint tx, ty, twidth, theight;
9277 gdk_drawable_get_size (window, &twidth, &theight);
9279 if (new_allocation.x < 0)
9281 new_allocation.width += new_allocation.x;
9282 new_allocation.x = 0;
9284 if (new_allocation.y < 0)
9286 new_allocation.height += new_allocation.y;
9287 new_allocation.y = 0;
9289 if (new_allocation.x + new_allocation.width > twidth)
9290 new_allocation.width = twidth - new_allocation.x;
9291 if (new_allocation.y + new_allocation.height > theight)
9292 new_allocation.height = theight - new_allocation.y;
9294 gdk_window_get_position (window, &tx, &ty);
9295 new_allocation.x += tx;
9297 new_allocation.y += ty;
9300 window = gdk_window_get_parent (window);
9304 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
9305 (data->x < new_allocation.x + new_allocation.width) &&
9306 (data->y < new_allocation.y + new_allocation.height))
9308 /* First, check if the drag is in a valid drop site in
9309 * one of our children
9311 if (GTK_IS_CONTAINER (widget))
9313 FindWidgetData new_data = *data;
9315 new_data.x -= x_offset;
9316 new_data.y -= y_offset;
9317 new_data.found = FALSE;
9318 new_data.first = FALSE;
9320 gtk_container_forall (GTK_CONTAINER (widget),
9321 (GtkCallback)find_widget,
9324 data->found = new_data.found;
9326 data->res_widget = new_data.res_widget;
9329 /* If not, and this widget is registered as a drop site, check to
9330 * emit "drag_motion" to check if we are actually in
9336 data->res_widget = widget;
9342 find_widget_at_pointer (GdkDisplay *display)
9344 GtkWidget *widget = NULL;
9345 GdkWindow *pointer_window;
9347 FindWidgetData data;
9349 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
9353 gpointer widget_ptr;
9355 gdk_window_get_user_data (pointer_window, &widget_ptr);
9356 widget = widget_ptr;
9361 gdk_window_get_pointer (widget->window,
9369 find_widget (widget, &data);
9371 return data.res_widget;
9377 struct PropertiesData {
9385 destroy_properties (GtkWidget *widget,
9386 struct PropertiesData *data)
9390 *data->window = NULL;
9391 data->window = NULL;
9396 gdk_cursor_unref (data->cursor);
9397 data->cursor = NULL;
9402 g_signal_handler_disconnect (widget, data->handler);
9410 property_query_event (GtkWidget *widget,
9412 struct PropertiesData *data)
9414 GtkWidget *res_widget = NULL;
9416 if (!data->in_query)
9419 if (event->type == GDK_BUTTON_RELEASE)
9421 gtk_grab_remove (widget);
9422 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9425 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9428 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
9429 gtk_widget_get_screen (widget));
9430 create_prop_editor (G_OBJECT (res_widget), 0);
9433 data->in_query = FALSE;
9440 query_properties (GtkButton *button,
9441 struct PropertiesData *data)
9445 g_signal_connect (button, "event",
9446 G_CALLBACK (property_query_event), data);
9450 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9453 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9455 GDK_BUTTON_RELEASE_MASK,
9460 gtk_grab_add (GTK_WIDGET (button));
9462 data->in_query = TRUE;
9466 create_properties (GtkWidget *widget)
9468 static GtkWidget *window = NULL;
9472 struct PropertiesData *data;
9474 data = g_new (struct PropertiesData, 1);
9475 data->window = &window;
9476 data->in_query = FALSE;
9477 data->cursor = NULL;
9482 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9484 gtk_window_set_screen (GTK_WINDOW (window),
9485 gtk_widget_get_screen (widget));
9487 data->handler = g_signal_connect (window, "destroy",
9488 G_CALLBACK (destroy_properties),
9491 gtk_window_set_title (GTK_WINDOW (window), "test properties");
9492 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9494 vbox = gtk_vbox_new (FALSE, 1);
9495 gtk_container_add (GTK_CONTAINER (window), vbox);
9497 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9498 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9500 button = gtk_button_new_with_label ("Query properties");
9501 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9502 g_signal_connect (button, "clicked",
9503 G_CALLBACK (query_properties),
9507 if (!gtk_widget_get_visible (window))
9508 gtk_widget_show_all (window);
9510 gtk_widget_destroy (window);
9514 struct SnapshotData {
9515 GtkWidget *toplevel_button;
9519 gboolean is_toplevel;
9524 destroy_snapshot_data (GtkWidget *widget,
9525 struct SnapshotData *data)
9528 *data->window = NULL;
9532 gdk_cursor_unref (data->cursor);
9533 data->cursor = NULL;
9538 g_signal_handler_disconnect (widget, data->handler);
9546 snapshot_widget_event (GtkWidget *widget,
9548 struct SnapshotData *data)
9550 GtkWidget *res_widget = NULL;
9552 if (!data->in_query)
9555 if (event->type == GDK_BUTTON_RELEASE)
9557 gtk_grab_remove (widget);
9558 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9561 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9562 if (data->is_toplevel && res_widget)
9563 res_widget = gtk_widget_get_toplevel (res_widget);
9567 GtkWidget *window, *image;
9569 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9570 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9571 gtk_widget_realize (window);
9572 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
9574 /* this branch is needed to convert ARGB -> RGB */
9577 gdk_drawable_get_size (pixmap, &width, &height);
9578 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9579 gtk_widget_get_colormap (res_widget),
9583 image = gtk_image_new_from_pixbuf (pixbuf);
9584 g_object_unref (pixbuf);
9587 image = gtk_image_new_from_pixmap (pixmap, NULL);
9588 gtk_container_add (GTK_CONTAINER (window), image);
9589 g_object_unref (pixmap);
9590 gtk_widget_show_all (window);
9593 data->in_query = FALSE;
9600 snapshot_widget (GtkButton *button,
9601 struct SnapshotData *data)
9605 g_signal_connect (button, "event",
9606 G_CALLBACK (snapshot_widget_event), data);
9608 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
9611 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9614 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9616 GDK_BUTTON_RELEASE_MASK,
9621 gtk_grab_add (GTK_WIDGET (button));
9623 data->in_query = TRUE;
9627 create_snapshot (GtkWidget *widget)
9629 static GtkWidget *window = NULL;
9632 struct SnapshotData *data;
9634 data = g_new (struct SnapshotData, 1);
9635 data->window = &window;
9636 data->in_query = FALSE;
9637 data->cursor = NULL;
9642 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9644 gtk_window_set_screen (GTK_WINDOW (window),
9645 gtk_widget_get_screen (widget));
9647 data->handler = g_signal_connect (window, "destroy",
9648 G_CALLBACK (destroy_snapshot_data),
9651 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9652 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9654 vbox = gtk_vbox_new (FALSE, 1);
9655 gtk_container_add (GTK_CONTAINER (window), vbox);
9657 button = gtk_button_new_with_label ("Snapshot widget");
9658 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9659 g_signal_connect (button, "clicked",
9660 G_CALLBACK (snapshot_widget),
9663 button = gtk_button_new_with_label ("Snapshot toplevel");
9664 data->toplevel_button = button;
9665 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9666 g_signal_connect (button, "clicked",
9667 G_CALLBACK (snapshot_widget),
9671 if (!gtk_widget_get_visible (window))
9672 gtk_widget_show_all (window);
9674 gtk_widget_destroy (window);
9683 selection_test_received (GtkWidget *tree_view,
9684 GtkSelectionData *data)
9686 GtkTreeModel *model;
9687 GtkListStore *store;
9691 if (data->length < 0)
9693 g_print ("Selection retrieval failed\n");
9696 if (data->type != GDK_SELECTION_TYPE_ATOM)
9698 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9702 /* Clear out any current list items */
9704 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9705 store = GTK_LIST_STORE (model);
9706 gtk_list_store_clear (store);
9708 /* Add new items to list */
9710 atoms = (GdkAtom *)data->data;
9712 l = data->length / sizeof (GdkAtom);
9713 for (i = 0; i < l; i++)
9718 name = gdk_atom_name (atoms[i]);
9721 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9725 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9732 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9734 static GdkAtom targets_atom = GDK_NONE;
9736 if (targets_atom == GDK_NONE)
9737 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9739 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9744 create_selection_test (GtkWidget *widget)
9746 static GtkWidget *window = NULL;
9749 GtkWidget *scrolled_win;
9750 GtkListStore* store;
9751 GtkWidget *tree_view;
9752 GtkTreeViewColumn *column;
9753 GtkCellRenderer *renderer;
9758 window = gtk_dialog_new ();
9760 gtk_window_set_screen (GTK_WINDOW (window),
9761 gtk_widget_get_screen (widget));
9763 g_signal_connect (window, "destroy",
9764 G_CALLBACK (gtk_widget_destroyed),
9767 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9768 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9770 /* Create the list */
9772 vbox = gtk_vbox_new (FALSE, 5);
9773 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9774 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
9777 label = gtk_label_new ("Gets available targets for current selection");
9778 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9780 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9781 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9782 GTK_POLICY_AUTOMATIC,
9783 GTK_POLICY_AUTOMATIC);
9784 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9785 gtk_widget_set_size_request (scrolled_win, 100, 200);
9787 store = gtk_list_store_new (1, G_TYPE_STRING);
9788 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9789 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9791 renderer = gtk_cell_renderer_text_new ();
9792 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9794 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9796 g_signal_connect (tree_view, "selection_received",
9797 G_CALLBACK (selection_test_received), NULL);
9799 /* .. And create some buttons */
9800 button = gtk_button_new_with_label ("Get Targets");
9801 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9802 button, TRUE, TRUE, 0);
9804 g_signal_connect (button, "clicked",
9805 G_CALLBACK (selection_test_get_targets), tree_view);
9807 button = gtk_button_new_with_label ("Quit");
9808 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9809 button, TRUE, TRUE, 0);
9811 g_signal_connect_swapped (button, "clicked",
9812 G_CALLBACK (gtk_widget_destroy),
9816 if (!gtk_widget_get_visible (window))
9817 gtk_widget_show_all (window);
9819 gtk_widget_destroy (window);
9826 static int scroll_test_pos = 0.0;
9829 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9833 gint imin, imax, jmin, jmax;
9835 imin = (event->area.x) / 10;
9836 imax = (event->area.x + event->area.width + 9) / 10;
9838 jmin = ((int)adj->value + event->area.y) / 10;
9839 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9841 gdk_window_clear_area (widget->window,
9842 event->area.x, event->area.y,
9843 event->area.width, event->area.height);
9845 for (i=imin; i<imax; i++)
9846 for (j=jmin; j<jmax; j++)
9848 gdk_draw_rectangle (widget->window,
9849 widget->style->black_gc,
9851 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9857 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9860 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9861 -adj->page_increment / 2:
9862 adj->page_increment / 2);
9863 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9864 gtk_adjustment_set_value (adj, new_value);
9870 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9873 adj->page_increment = 0.9 * widget->allocation.height;
9874 adj->page_size = widget->allocation.height;
9876 g_signal_emit_by_name (adj, "changed");
9880 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9882 /* gint source_min = (int)adj->value - scroll_test_pos; */
9885 dy = scroll_test_pos - (int)adj->value;
9886 scroll_test_pos = adj->value;
9888 if (!gtk_widget_is_drawable (widget))
9890 gdk_window_scroll (widget->window, 0, dy);
9891 gdk_window_process_updates (widget->window, FALSE);
9896 create_scroll_test (GtkWidget *widget)
9898 static GtkWidget *window = NULL;
9900 GtkWidget *drawing_area;
9901 GtkWidget *scrollbar;
9904 GdkGeometry geometry;
9905 GdkWindowHints geometry_mask;
9909 window = gtk_dialog_new ();
9911 gtk_window_set_screen (GTK_WINDOW (window),
9912 gtk_widget_get_screen (widget));
9914 g_signal_connect (window, "destroy",
9915 G_CALLBACK (gtk_widget_destroyed),
9918 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9919 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9921 hbox = gtk_hbox_new (FALSE, 0);
9922 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
9924 gtk_widget_show (hbox);
9926 drawing_area = gtk_drawing_area_new ();
9927 gtk_widget_set_size_request (drawing_area, 200, 200);
9928 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9929 gtk_widget_show (drawing_area);
9931 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9933 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9934 scroll_test_pos = 0.0;
9936 scrollbar = gtk_vscrollbar_new (adj);
9937 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9938 gtk_widget_show (scrollbar);
9940 g_signal_connect (drawing_area, "expose_event",
9941 G_CALLBACK (scroll_test_expose), adj);
9942 g_signal_connect (drawing_area, "configure_event",
9943 G_CALLBACK (scroll_test_configure), adj);
9944 g_signal_connect (drawing_area, "scroll_event",
9945 G_CALLBACK (scroll_test_scroll), adj);
9947 g_signal_connect (adj, "value_changed",
9948 G_CALLBACK (scroll_test_adjustment_changed),
9951 /* .. And create some buttons */
9953 button = gtk_button_new_with_label ("Quit");
9954 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9955 button, TRUE, TRUE, 0);
9957 g_signal_connect_swapped (button, "clicked",
9958 G_CALLBACK (gtk_widget_destroy),
9960 gtk_widget_show (button);
9962 /* Set up gridded geometry */
9964 geometry_mask = GDK_HINT_MIN_SIZE |
9965 GDK_HINT_BASE_SIZE |
9966 GDK_HINT_RESIZE_INC;
9968 geometry.min_width = 20;
9969 geometry.min_height = 20;
9970 geometry.base_width = 0;
9971 geometry.base_height = 0;
9972 geometry.width_inc = 10;
9973 geometry.height_inc = 10;
9975 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9976 drawing_area, &geometry, geometry_mask);
9979 if (!gtk_widget_get_visible (window))
9980 gtk_widget_show (window);
9982 gtk_widget_destroy (window);
9989 static int timer = 0;
9992 timeout_test (GtkWidget *label)
9994 static int count = 0;
9995 static char buffer[32];
9997 sprintf (buffer, "count: %d", ++count);
9998 gtk_label_set_text (GTK_LABEL (label), buffer);
10004 start_timeout_test (GtkWidget *widget,
10009 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
10014 stop_timeout_test (GtkWidget *widget,
10019 g_source_remove (timer);
10025 destroy_timeout_test (GtkWidget *widget,
10026 GtkWidget **window)
10028 stop_timeout_test (NULL, NULL);
10034 create_timeout_test (GtkWidget *widget)
10036 static GtkWidget *window = NULL;
10042 window = gtk_dialog_new ();
10044 gtk_window_set_screen (GTK_WINDOW (window),
10045 gtk_widget_get_screen (widget));
10047 g_signal_connect (window, "destroy",
10048 G_CALLBACK (destroy_timeout_test),
10051 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
10052 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10054 label = gtk_label_new ("count: 0");
10055 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10056 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
10057 label, TRUE, TRUE, 0);
10058 gtk_widget_show (label);
10060 button = gtk_button_new_with_label ("close");
10061 g_signal_connect_swapped (button, "clicked",
10062 G_CALLBACK (gtk_widget_destroy),
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_grab_default (button);
10068 gtk_widget_show (button);
10070 button = gtk_button_new_with_label ("start");
10071 g_signal_connect (button, "clicked",
10072 G_CALLBACK(start_timeout_test),
10074 gtk_widget_set_can_default (button, TRUE);
10075 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10076 button, TRUE, TRUE, 0);
10077 gtk_widget_show (button);
10079 button = gtk_button_new_with_label ("stop");
10080 g_signal_connect (button, "clicked",
10081 G_CALLBACK (stop_timeout_test),
10083 gtk_widget_set_can_default (button, TRUE);
10084 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10085 button, TRUE, TRUE, 0);
10086 gtk_widget_show (button);
10089 if (!gtk_widget_get_visible (window))
10090 gtk_widget_show (window);
10092 gtk_widget_destroy (window);
10099 static int idle_id = 0;
10102 idle_test (GtkWidget *label)
10104 static int count = 0;
10105 static char buffer[32];
10107 sprintf (buffer, "count: %d", ++count);
10108 gtk_label_set_text (GTK_LABEL (label), buffer);
10114 start_idle_test (GtkWidget *widget,
10119 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
10124 stop_idle_test (GtkWidget *widget,
10129 g_source_remove (idle_id);
10135 destroy_idle_test (GtkWidget *widget,
10136 GtkWidget **window)
10138 stop_idle_test (NULL, NULL);
10144 toggle_idle_container (GObject *button,
10145 GtkContainer *container)
10147 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
10151 create_idle_test (GtkWidget *widget)
10153 static GtkWidget *window = NULL;
10156 GtkWidget *container;
10160 GtkWidget *button2;
10164 window = gtk_dialog_new ();
10166 gtk_window_set_screen (GTK_WINDOW (window),
10167 gtk_widget_get_screen (widget));
10169 g_signal_connect (window, "destroy",
10170 G_CALLBACK (destroy_idle_test),
10173 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
10174 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10176 label = gtk_label_new ("count: 0");
10177 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10178 gtk_widget_show (label);
10181 g_object_new (GTK_TYPE_HBOX,
10183 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
10184 * "GtkWidget::visible", TRUE,
10189 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
10190 container, TRUE, TRUE, 0);
10193 g_object_new (GTK_TYPE_FRAME,
10195 "label", "Label Container",
10197 "parent", GTK_DIALOG (window)->vbox,
10200 g_object_new (GTK_TYPE_VBOX,
10205 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
10206 "label", "Resize-Parent",
10207 "user_data", (void*)GTK_RESIZE_PARENT,
10211 "signal::clicked", toggle_idle_container, container,
10213 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
10214 "label", "Resize-Queue",
10215 "user_data", (void*)GTK_RESIZE_QUEUE,
10220 g_object_connect (button,
10221 "signal::clicked", toggle_idle_container, container,
10223 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
10224 "label", "Resize-Immediate",
10225 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
10227 g_object_connect (button2,
10228 "signal::clicked", toggle_idle_container, container,
10230 g_object_set (button2,
10236 button = gtk_button_new_with_label ("close");
10237 g_signal_connect_swapped (button, "clicked",
10238 G_CALLBACK (gtk_widget_destroy),
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_grab_default (button);
10244 gtk_widget_show (button);
10246 button = gtk_button_new_with_label ("start");
10247 g_signal_connect (button, "clicked",
10248 G_CALLBACK (start_idle_test),
10250 gtk_widget_set_can_default (button, TRUE);
10251 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10252 button, TRUE, TRUE, 0);
10253 gtk_widget_show (button);
10255 button = gtk_button_new_with_label ("stop");
10256 g_signal_connect (button, "clicked",
10257 G_CALLBACK (stop_idle_test),
10259 gtk_widget_set_can_default (button, TRUE);
10260 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10261 button, TRUE, TRUE, 0);
10262 gtk_widget_show (button);
10265 if (!gtk_widget_get_visible (window))
10266 gtk_widget_show (window);
10268 gtk_widget_destroy (window);
10276 reload_all_rc_files (void)
10278 static GdkAtom atom_rcfiles = GDK_NONE;
10280 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
10284 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
10286 for(i = 0; i < 5; i++)
10287 send_event->client.data.l[i] = 0;
10288 send_event->client.data_format = 32;
10289 send_event->client.message_type = atom_rcfiles;
10290 gdk_event_send_clientmessage_toall (send_event);
10292 gdk_event_free (send_event);
10296 create_rc_file (GtkWidget *widget)
10298 static GtkWidget *window = NULL;
10306 window = gtk_dialog_new ();
10308 gtk_window_set_screen (GTK_WINDOW (window),
10309 gtk_widget_get_screen (widget));
10311 g_signal_connect (window, "destroy",
10312 G_CALLBACK (gtk_widget_destroyed),
10315 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
10316 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
10318 vbox = gtk_vbox_new (FALSE, 0);
10319 gtk_container_add (GTK_CONTAINER (frame), vbox);
10321 label = gtk_label_new ("This label should be red");
10322 gtk_widget_set_name (label, "testgtk-red-label");
10323 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10325 label = gtk_label_new ("This label should be green");
10326 gtk_widget_set_name (label, "testgtk-green-label");
10327 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10329 label = gtk_label_new ("This label should be blue");
10330 gtk_widget_set_name (label, "testgtk-blue-label");
10331 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10333 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
10334 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10336 button = gtk_button_new_with_label ("Reload");
10337 g_signal_connect (button, "clicked",
10338 G_CALLBACK (gtk_rc_reparse_all), NULL);
10339 gtk_widget_set_can_default (button, TRUE);
10340 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10341 button, TRUE, TRUE, 0);
10342 gtk_widget_grab_default (button);
10344 button = gtk_button_new_with_label ("Reload All");
10345 g_signal_connect (button, "clicked",
10346 G_CALLBACK (reload_all_rc_files), NULL);
10347 gtk_widget_set_can_default (button, TRUE);
10348 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10349 button, TRUE, TRUE, 0);
10351 button = gtk_button_new_with_label ("Close");
10352 g_signal_connect_swapped (button, "clicked",
10353 G_CALLBACK (gtk_widget_destroy),
10355 gtk_widget_set_can_default (button, TRUE);
10356 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10357 button, TRUE, TRUE, 0);
10360 if (!gtk_widget_get_visible (window))
10361 gtk_widget_show_all (window);
10363 gtk_widget_destroy (window);
10367 * Test of recursive mainloop
10371 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
10378 create_mainloop (GtkWidget *widget)
10380 static GtkWidget *window = NULL;
10386 window = gtk_dialog_new ();
10388 gtk_window_set_screen (GTK_WINDOW (window),
10389 gtk_widget_get_screen (widget));
10391 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
10393 g_signal_connect (window, "destroy",
10394 G_CALLBACK (mainloop_destroyed),
10397 label = gtk_label_new ("In recursive main loop...");
10398 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
10400 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
10402 gtk_widget_show (label);
10404 button = gtk_button_new_with_label ("Leave");
10405 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
10408 g_signal_connect_swapped (button, "clicked",
10409 G_CALLBACK (gtk_widget_destroy),
10412 gtk_widget_set_can_default (button, TRUE);
10413 gtk_widget_grab_default (button);
10415 gtk_widget_show (button);
10418 if (!gtk_widget_get_visible (window))
10420 gtk_widget_show (window);
10422 g_print ("create_mainloop: start\n");
10424 g_print ("create_mainloop: done\n");
10427 gtk_widget_destroy (window);
10431 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
10436 gint imin, imax, jmin, jmax;
10438 layout = GTK_LAYOUT (widget);
10440 if (event->window != layout->bin_window)
10443 imin = (event->area.x) / 10;
10444 imax = (event->area.x + event->area.width + 9) / 10;
10446 jmin = (event->area.y) / 10;
10447 jmax = (event->area.y + event->area.height + 9) / 10;
10449 for (i=imin; i<imax; i++)
10450 for (j=jmin; j<jmax; j++)
10452 gdk_draw_rectangle (layout->bin_window,
10453 widget->style->black_gc,
10461 void create_layout (GtkWidget *widget)
10463 static GtkWidget *window = NULL;
10465 GtkWidget *scrolledwindow;
10474 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10475 gtk_window_set_screen (GTK_WINDOW (window),
10476 gtk_widget_get_screen (widget));
10478 g_signal_connect (window, "destroy",
10479 G_CALLBACK (gtk_widget_destroyed),
10482 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10483 gtk_widget_set_size_request (window, 200, 200);
10485 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10486 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10488 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10489 GTK_CORNER_TOP_RIGHT);
10491 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10493 layout = gtk_layout_new (NULL, NULL);
10494 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
10496 /* We set step sizes here since GtkLayout does not set
10499 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
10500 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
10502 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
10503 g_signal_connect (layout, "expose_event",
10504 G_CALLBACK (layout_expose_handler), NULL);
10506 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
10508 for (i=0 ; i < 16 ; i++)
10509 for (j=0 ; j < 16 ; j++)
10511 sprintf(buf, "Button %d, %d", i, j);
10513 button = gtk_button_new_with_label (buf);
10515 button = gtk_label_new (buf);
10517 gtk_layout_put (GTK_LAYOUT (layout), button,
10521 for (i=16; i < 1280; i++)
10523 sprintf(buf, "Button %d, %d", i, 0);
10525 button = gtk_button_new_with_label (buf);
10527 button = gtk_label_new (buf);
10529 gtk_layout_put (GTK_LAYOUT (layout), button,
10534 if (!gtk_widget_get_visible (window))
10535 gtk_widget_show_all (window);
10537 gtk_widget_destroy (window);
10541 create_styles (GtkWidget *widget)
10543 static GtkWidget *window = NULL;
10548 static GdkColor red = { 0, 0xffff, 0, 0 };
10549 static GdkColor green = { 0, 0, 0xffff, 0 };
10550 static GdkColor blue = { 0, 0, 0, 0xffff };
10551 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10552 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10553 PangoFontDescription *font_desc;
10555 GtkRcStyle *rc_style;
10559 window = gtk_dialog_new ();
10560 gtk_window_set_screen (GTK_WINDOW (window),
10561 gtk_widget_get_screen (widget));
10563 g_signal_connect (window, "destroy",
10564 G_CALLBACK (gtk_widget_destroyed),
10568 button = gtk_button_new_with_label ("Close");
10569 g_signal_connect_swapped (button, "clicked",
10570 G_CALLBACK (gtk_widget_destroy),
10572 gtk_widget_set_can_default (button, TRUE);
10573 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10574 button, TRUE, TRUE, 0);
10575 gtk_widget_show (button);
10577 vbox = gtk_vbox_new (FALSE, 5);
10578 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10579 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
10581 label = gtk_label_new ("Font:");
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 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10587 button = gtk_button_new_with_label ("Some Text");
10588 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
10589 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10591 label = gtk_label_new ("Foreground:");
10592 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10593 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10595 button = gtk_button_new_with_label ("Some Text");
10596 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
10597 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10599 label = gtk_label_new ("Background:");
10600 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10601 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10603 button = gtk_button_new_with_label ("Some Text");
10604 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10605 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10607 label = gtk_label_new ("Text:");
10608 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10609 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10611 entry = gtk_entry_new ();
10612 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10613 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10614 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10616 label = gtk_label_new ("Base:");
10617 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10618 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10620 entry = gtk_entry_new ();
10621 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10622 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10623 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10625 label = gtk_label_new ("Cursor:");
10626 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10627 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10629 entry = gtk_entry_new ();
10630 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10631 gtk_widget_modify_cursor (entry, &red, &red);
10632 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10634 label = gtk_label_new ("Multiple:");
10635 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10636 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10638 button = gtk_button_new_with_label ("Some Text");
10640 rc_style = gtk_rc_style_new ();
10642 rc_style->font_desc = pango_font_description_copy (font_desc);
10643 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10644 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10645 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10646 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10647 rc_style->bg[GTK_STATE_NORMAL] = blue;
10648 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10649 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10650 rc_style->fg[GTK_STATE_ACTIVE] = red;
10651 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10652 rc_style->xthickness = 5;
10653 rc_style->ythickness = 5;
10655 gtk_widget_modify_style (button, rc_style);
10656 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
10658 g_object_unref (rc_style);
10660 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10663 if (!gtk_widget_get_visible (window))
10664 gtk_widget_show_all (window);
10666 gtk_widget_destroy (window);
10670 * Main Window and Exit
10674 do_exit (GtkWidget *widget, GtkWidget *window)
10676 gtk_widget_destroy (window);
10682 void (*func) (GtkWidget *widget);
10683 gboolean do_not_benchmark;
10686 { "alpha window", create_alpha_window },
10687 { "big windows", create_big_windows },
10688 { "button box", create_button_box },
10689 { "buttons", create_buttons },
10690 { "check buttons", create_check_buttons },
10691 { "color selection", create_color_selection },
10692 { "composited window", create_composited_window },
10693 { "cursors", create_cursors },
10694 { "dialog", create_dialog },
10695 { "display & screen", create_display_screen, TRUE },
10696 { "entry", create_entry },
10697 { "event box", create_event_box },
10698 { "event watcher", create_event_watcher },
10699 { "expander", create_expander },
10700 { "flipping", create_flipping },
10701 { "focus", create_focus },
10702 { "font selection", create_font_selection },
10703 { "gridded geometry", create_gridded_geometry },
10704 { "handle box", create_handle_box },
10705 { "image from drawable", create_get_image },
10706 { "image", create_image },
10707 { "key lookup", create_key_lookup },
10708 { "labels", create_labels },
10709 { "layout", create_layout },
10710 { "menus", create_menus },
10711 { "message dialog", create_message_dialog },
10712 { "modal window", create_modal_window, TRUE },
10713 { "notebook", create_notebook },
10714 { "panes", create_panes },
10715 { "paned keyboard", create_paned_keyboard_navigation },
10716 { "pixmap", create_pixmap },
10717 { "progress bar", create_progress_bar },
10718 { "properties", create_properties },
10719 { "radio buttons", create_radio_buttons },
10720 { "range controls", create_range_controls },
10721 { "rc file", create_rc_file },
10722 { "reparent", create_reparent },
10723 { "resize grips", create_resize_grips },
10724 { "rotated label", create_rotated_label },
10725 { "rotated text", create_rotated_text },
10726 { "rulers", create_rulers },
10727 { "saved position", create_saved_position },
10728 { "scrolled windows", create_scrolled_windows },
10729 { "shapes", create_shapes },
10730 { "size groups", create_size_groups },
10731 { "snapshot", create_snapshot },
10732 { "spinbutton", create_spins },
10733 { "statusbar", create_statusbar },
10734 { "styles", create_styles },
10735 { "test idle", create_idle_test },
10736 { "test mainloop", create_mainloop, TRUE },
10737 { "test scrolling", create_scroll_test },
10738 { "test selection", create_selection_test },
10739 { "test timeout", create_timeout_test },
10740 { "toggle buttons", create_toggle_buttons },
10741 { "toolbar", create_toolbar },
10742 { "tooltips", create_tooltips },
10743 { "WM hints", create_wmhints },
10744 { "window sizing", create_window_sizing },
10745 { "window states", create_window_states }
10747 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10750 create_main_window (void)
10755 GtkWidget *scrolled_window;
10759 GtkWidget *separator;
10760 GdkGeometry geometry;
10763 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10764 gtk_widget_set_name (window, "main window");
10765 gtk_widget_set_uposition (window, 50, 20);
10766 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10768 geometry.min_width = -1;
10769 geometry.min_height = -1;
10770 geometry.max_width = -1;
10771 geometry.max_height = G_MAXSHORT;
10772 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10774 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10776 g_signal_connect (window, "destroy",
10777 G_CALLBACK (gtk_main_quit),
10779 g_signal_connect (window, "delete-event",
10780 G_CALLBACK (gtk_false),
10783 box1 = gtk_vbox_new (FALSE, 0);
10784 gtk_container_add (GTK_CONTAINER (window), box1);
10786 if (gtk_micro_version > 0)
10791 gtk_micro_version);
10796 gtk_minor_version);
10798 label = gtk_label_new (buffer);
10799 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10800 gtk_widget_set_name (label, "testgtk-version-label");
10802 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10803 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10804 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10806 GTK_POLICY_AUTOMATIC);
10807 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10809 box2 = gtk_vbox_new (FALSE, 0);
10810 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10811 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10812 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10813 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10814 gtk_widget_show (box2);
10816 for (i = 0; i < nbuttons; i++)
10818 button = gtk_button_new_with_label (buttons[i].label);
10819 if (buttons[i].func)
10820 g_signal_connect (button,
10822 G_CALLBACK(buttons[i].func),
10825 gtk_widget_set_sensitive (button, FALSE);
10826 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10829 separator = gtk_hseparator_new ();
10830 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10832 box2 = gtk_vbox_new (FALSE, 10);
10833 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10834 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10836 button = gtk_button_new_with_mnemonic ("_Close");
10837 g_signal_connect (button, "clicked",
10838 G_CALLBACK (do_exit),
10840 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10841 gtk_widget_set_can_default (button, TRUE);
10842 gtk_widget_grab_default (button);
10844 gtk_widget_show_all (window);
10850 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10851 G_FILE_TEST_EXISTS))
10853 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
10854 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
10859 pad (const char *str, int to)
10861 static char buf[256];
10862 int len = strlen (str);
10865 for (i = 0; i < to; i++)
10870 memcpy (buf, str, len);
10876 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10878 fn (widget); /* on */
10879 while (g_main_context_iteration (NULL, FALSE));
10880 fn (widget); /* off */
10881 while (g_main_context_iteration (NULL, FALSE));
10885 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10891 static gboolean printed_headers = FALSE;
10893 if (!printed_headers) {
10894 g_print ("Test Iters First Other\n");
10895 g_print ("-------------------- ----- ---------- ----------\n");
10896 printed_headers = TRUE;
10899 g_get_current_time (&tv0);
10900 bench_iteration (widget, fn);
10901 g_get_current_time (&tv1);
10903 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10904 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10906 g_get_current_time (&tv0);
10907 for (n = 0; n < num - 1; n++)
10908 bench_iteration (widget, fn);
10909 g_get_current_time (&tv1);
10910 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10911 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10913 g_print ("%s %5d ", pad (name, 20), num);
10915 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10917 g_print ("%10.1f\n", dt_first);
10921 do_bench (char* what, int num)
10925 void (* fn) (GtkWidget *widget);
10927 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10929 if (g_ascii_strcasecmp (what, "ALL") == 0)
10931 for (i = 0; i < nbuttons; i++)
10933 if (!buttons[i].do_not_benchmark)
10934 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10941 for (i = 0; i < nbuttons; i++)
10943 if (strcmp (buttons[i].label, what) == 0)
10945 fn = buttons[i].func;
10951 g_print ("Can't bench: \"%s\" not found.\n", what);
10953 do_real_bench (widget, fn, buttons[i].label, num);
10960 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10965 main (int argc, char *argv[])
10967 GtkBindingSet *binding_set;
10969 gboolean done_benchmarks = FALSE;
10971 srand (time (NULL));
10975 /* Check to see if we are being run from the correct
10978 if (file_exists ("testgtkrc"))
10979 gtk_rc_add_default_file ("testgtkrc");
10980 else if (file_exists ("tests/testgtkrc"))
10981 gtk_rc_add_default_file ("tests/testgtkrc");
10983 g_warning ("Couldn't find file \"testgtkrc\".");
10985 g_set_application_name ("GTK+ Test Program");
10987 gtk_init (&argc, &argv);
10989 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10998 for (i = 1; i < argc; i++)
11000 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
11007 nextarg = strchr (argv[i], '=');
11018 count = strchr (nextarg, ':');
11021 what = g_strndup (nextarg, count - nextarg);
11023 num = atoi (count);
11028 what = g_strdup (nextarg);
11030 do_bench (what, num ? num : 1);
11031 done_benchmarks = TRUE;
11036 if (done_benchmarks)
11041 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
11042 gtk_binding_entry_add_signal (binding_set,
11043 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
11046 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
11048 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
11052 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
11053 " fg[NORMAL] = \"#ff0000\"\n"
11054 " font = \"Sans 18\"\n"
11056 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
11058 create_main_window ();
11064 while (g_main_context_pending (NULL))
11065 g_main_context_iteration (NULL, FALSE);
11068 while (g_main_context_pending (NULL))
11069 g_main_context_iteration (NULL, FALSE);