1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
27 #undef GTK_DISABLE_DEPRECATED
43 #define GTK_ENABLE_BROKEN
46 #include "gdk/gdkkeysyms.h"
49 #define sleep(n) _sleep(n)
52 #include "prop-editor.h"
54 #include "circles.xbm"
58 file_exists (const char *filename)
62 return stat (filename, &statbuf) == 0;
66 shape_create_icon (GdkScreen *screen,
75 build_option_menu (gchar *items[],
78 void (*func) (GtkWidget *widget, gpointer data),
81 /* macro, structure and variables used by tree window demos */
82 #define DEFAULT_NUMBER_OF_ITEM 3
83 #define DEFAULT_RECURSION_LEVEL 3
86 GSList* selection_mode_group;
87 GtkWidget* single_button;
88 GtkWidget* browse_button;
89 GtkWidget* multiple_button;
90 GtkWidget* draw_line_button;
91 GtkWidget* view_line_button;
92 GtkWidget* no_root_item_button;
93 GtkWidget* nb_item_spinner;
94 GtkWidget* recursion_spinner;
95 } sTreeSampleSelection;
97 typedef struct sTreeButtons {
99 GtkWidget* add_button;
100 GtkWidget* remove_button;
101 GtkWidget* subtree_button;
103 /* end of tree section */
106 build_option_menu (gchar *items[],
109 void (*func)(GtkWidget *widget, gpointer data),
115 omenu = gtk_combo_box_new_text ();
116 g_signal_connect (omenu, "changed",
117 G_CALLBACK (func), data);
119 for (i = 0; i < num_items; i++)
120 gtk_combo_box_append_text (GTK_COMBO_BOX (omenu), items[i]);
122 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
128 * Windows with an alpha channel
133 on_alpha_window_expose (GtkWidget *widget,
134 GdkEventExpose *expose)
137 cairo_pattern_t *pattern;
140 cr = gdk_cairo_create (widget->window);
142 radius = MIN (widget->allocation.width, widget->allocation.height) / 2;
143 pattern = cairo_pattern_create_radial (widget->allocation.width / 2,
144 widget->allocation.height / 2,
146 widget->allocation.width / 2,
147 widget->allocation.height / 2,
150 if (gdk_screen_get_rgba_colormap (gtk_widget_get_screen (widget)) &&
151 gtk_widget_is_composited (widget))
152 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
154 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
156 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
159 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
160 1.0, 0.75, 0.0, 1.0); /* solid orange */
161 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
162 1.0, 0.75, 0.0, 0.0); /* transparent orange */
164 cairo_set_source (cr, pattern);
165 cairo_pattern_destroy (pattern);
167 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
176 build_alpha_widgets (void)
179 GtkWidget *radio_button;
184 table = gtk_table_new (1, 1, FALSE);
186 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
187 gtk_table_attach (GTK_TABLE (table),
190 GTK_EXPAND | GTK_FILL, 0,
193 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
194 gtk_table_attach (GTK_TABLE (table),
197 GTK_EXPAND | GTK_FILL, 0,
200 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
201 gtk_table_attach (GTK_TABLE (table),
204 GTK_EXPAND | GTK_FILL, 0,
207 gtk_table_attach (GTK_TABLE (table),
208 gtk_check_button_new_with_label ("Sedentary"),
210 GTK_EXPAND | GTK_FILL, 0,
212 gtk_table_attach (GTK_TABLE (table),
213 gtk_check_button_new_with_label ("Nocturnal"),
215 GTK_EXPAND | GTK_FILL, 0,
217 gtk_table_attach (GTK_TABLE (table),
218 gtk_check_button_new_with_label ("Compulsive"),
220 GTK_EXPAND | GTK_FILL, 0,
223 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
224 gtk_table_attach (GTK_TABLE (table),
227 GTK_EXPAND | GTK_FILL, 0,
230 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
231 gtk_table_attach (GTK_TABLE (table),
234 GTK_EXPAND | GTK_FILL, 0,
237 hbox = gtk_hbox_new (FALSE, 0);
238 label = gtk_label_new (NULL);
239 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
240 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
241 entry = gtk_entry_new ();
242 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
243 gtk_table_attach (GTK_TABLE (table),
246 GTK_EXPAND | GTK_FILL, 0,
253 on_alpha_drawing_expose (GtkWidget *widget,
254 GdkEventExpose *expose)
256 int x = widget->allocation.x;
257 int y = widget->allocation.y;
258 int width = widget->allocation.width;
259 int height = widget->allocation.height;
265 buffer = g_malloc (64 * 64 * 4);
267 gdk_draw_rectangle (widget->window, widget->style->black_gc, FALSE,
269 width - 1, height - 1);
272 for (i = 0; i < 64; i++) {
273 for (j = 0; j < 64; j++) {
277 *(p++) = MIN (255, ((32 - i) * (32 - i) + (32 - j) * (32 - j)) / 8);
282 gdk_draw_rgb_32_image (widget->window, widget->style->black_gc,
283 x + 18, y + (height - 64) /2,
284 64, 64, GDK_RGB_DITHER_NORMAL, buffer, 64 * 4);
286 pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, TRUE,
287 8, 64, 64, 4 * 64, NULL, NULL);
289 gdk_draw_pixbuf (widget->window, widget->style->black_gc, pixbuf,
290 0, 0, x + width - 18 - 64, y + (height - 64) /2,
291 64, 64, GDK_RGB_DITHER_NORMAL, 0, 0);
293 g_object_unref (pixbuf);
301 build_alpha_drawing ()
305 hbox = gtk_hbox_new (FALSE, 0);
306 gtk_widget_set_size_request (hbox, 100, 100);
308 g_signal_connect (hbox, "expose-event",
309 G_CALLBACK (on_alpha_drawing_expose), NULL);
315 on_alpha_screen_changed (GtkWidget *widget,
316 GdkScreen *old_screen,
319 GdkScreen *screen = gtk_widget_get_screen (widget);
320 GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
324 colormap = gdk_screen_get_rgb_colormap (screen);
325 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
329 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
332 gtk_widget_set_colormap (widget, colormap);
336 on_composited_changed (GtkWidget *window,
339 gboolean is_composited = gtk_widget_is_composited (window);
342 gtk_label_set_text (label, "Composited");
344 gtk_label_set_text (label, "Not composited");
348 create_alpha_window (GtkWidget *widget)
350 static GtkWidget *window;
357 window = gtk_dialog_new_with_buttons ("Alpha Window",
358 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
362 gtk_widget_set_app_paintable (window, TRUE);
363 g_signal_connect (window, "expose-event",
364 G_CALLBACK (on_alpha_window_expose), NULL);
366 vbox = gtk_vbox_new (FALSE, 8);
367 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
368 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
371 label = gtk_label_new (NULL);
372 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
373 on_alpha_screen_changed (window, NULL, label);
374 g_signal_connect (window, "screen-changed",
375 G_CALLBACK (on_alpha_screen_changed), label);
377 label = gtk_label_new (NULL);
378 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
379 on_composited_changed (window, GTK_LABEL (label));
380 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
382 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
383 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_drawing (), TRUE, TRUE, 0);
385 g_signal_connect (window, "destroy",
386 G_CALLBACK (gtk_widget_destroyed),
389 g_signal_connect (window, "response",
390 G_CALLBACK (gtk_widget_destroy),
394 if (!gtk_widget_get_visible (window))
395 gtk_widget_show_all (window);
397 gtk_widget_destroy (window);
401 * Composited non-toplevel window
404 /* The expose event handler for the event box.
406 * This function simply draws a transparency onto a widget on the area
407 * for which it receives expose events. This is intended to give the
408 * event box a "transparent" background.
410 * In order for this to work properly, the widget must have an RGBA
411 * colourmap. The widget should also be set as app-paintable since it
412 * doesn't make sense for GTK to draw a background if we are drawing it
413 * (and because GTK might actually replace our transparency with its
414 * default background colour).
417 transparent_expose (GtkWidget *widget,
418 GdkEventExpose *event)
422 cr = gdk_cairo_create (widget->window);
423 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
424 gdk_cairo_region (cr, event->region);
431 /* The expose event handler for the window.
433 * This function performs the actual compositing of the event box onto
434 * the already-existing background of the window at 50% normal opacity.
436 * In this case we do not want app-paintable to be set on the widget
437 * since we want it to draw its own (red) background. Because of this,
438 * however, we must ensure that we use g_signal_register_after so that
439 * this handler is called after the red has been drawn. If it was
440 * called before then GTK would just blindly paint over our work.
443 window_expose_event (GtkWidget *widget,
444 GdkEventExpose *event)
450 /* get our child (in this case, the event box) */
451 child = gtk_bin_get_child (GTK_BIN (widget));
453 /* create a cairo context to draw to the window */
454 cr = gdk_cairo_create (widget->window);
456 /* the source data is the (composited) event box */
457 gdk_cairo_set_source_pixmap (cr, child->window,
459 child->allocation.y);
461 /* draw no more than our expose event intersects our child */
462 region = gdk_region_rectangle (&child->allocation);
463 gdk_region_intersect (region, event->region);
464 gdk_cairo_region (cr, region);
467 /* composite, with a 50% opacity */
468 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
469 cairo_paint_with_alpha (cr, 0.5);
478 create_composited_window (GtkWidget *widget)
480 static GtkWidget *window;
484 GtkWidget *event, *button;
489 /* make the widgets */
490 button = gtk_button_new_with_label ("A Button");
491 event = gtk_event_box_new ();
492 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
494 g_signal_connect (window, "destroy",
495 G_CALLBACK (gtk_widget_destroyed),
498 /* put a red background on the window */
499 gdk_color_parse ("red", &red);
500 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
502 /* set the colourmap for the event box.
503 * must be done before the event box is realised.
505 screen = gtk_widget_get_screen (event);
506 rgba = gdk_screen_get_rgba_colormap (screen);
507 gtk_widget_set_colormap (event, rgba);
509 /* set our event box to have a fully-transparent background
510 * drawn on it. currently there is no way to simply tell gtk
511 * that "transparency" is the background colour for a widget.
513 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
514 g_signal_connect (event, "expose-event",
515 G_CALLBACK (transparent_expose), NULL);
517 /* put them inside one another */
518 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
519 gtk_container_add (GTK_CONTAINER (window), event);
520 gtk_container_add (GTK_CONTAINER (event), button);
522 /* realise and show everything */
523 gtk_widget_realize (button);
525 /* set the event box GdkWindow to be composited.
526 * obviously must be performed after event box is realised.
528 gdk_window_set_composited (event->window, TRUE);
530 /* set up the compositing handler.
531 * note that we do _after so that the normal (red) background is drawn
532 * by gtk before our compositing occurs.
534 g_signal_connect_after (window, "expose-event",
535 G_CALLBACK (window_expose_event), NULL);
538 if (!gtk_widget_get_visible (window))
539 gtk_widget_show_all (window);
541 gtk_widget_destroy (window);
545 * Big windows and guffaw scrolling
549 pattern_expose (GtkWidget *widget,
550 GdkEventExpose *event,
554 GdkWindow *window = event->window;
556 color = g_object_get_data (G_OBJECT (window), "pattern-color");
559 GdkGC *tmp_gc = gdk_gc_new (window);
560 gdk_gc_set_rgb_fg_color (tmp_gc, color);
562 gdk_draw_rectangle (window, tmp_gc, TRUE,
563 event->area.x, event->area.y,
564 event->area.width, event->area.height);
566 g_object_unref (tmp_gc);
573 pattern_set_bg (GtkWidget *widget,
577 static const GdkColor colors[] = {
578 { 0, 0x4444, 0x4444, 0xffff },
579 { 0, 0x8888, 0x8888, 0xffff },
580 { 0, 0xaaaa, 0xaaaa, 0xffff }
583 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
584 gdk_window_set_user_data (child, widget);
588 create_pattern (GtkWidget *widget,
599 while (2 * h <= height)
604 while (2 * w <= width)
606 if ((i + j) % 2 == 0)
611 GdkWindowAttr attributes;
613 attributes.window_type = GDK_WINDOW_CHILD;
616 attributes.width = w;
617 attributes.height = h;
618 attributes.wclass = GDK_INPUT_OUTPUT;
619 attributes.event_mask = GDK_EXPOSURE_MASK;
620 attributes.visual = gtk_widget_get_visual (widget);
621 attributes.colormap = gtk_widget_get_colormap (widget);
623 child = gdk_window_new (parent, &attributes,
624 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
626 pattern_set_bg (widget, child, level);
629 create_pattern (widget, child, level + 1, w, h);
631 gdk_window_show (child);
641 #define PATTERN_SIZE (1 << 18)
644 pattern_hadj_changed (GtkAdjustment *adj,
647 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
648 gint new_value = adj->value;
650 if (gtk_widget_get_realized (darea))
652 gdk_window_scroll (darea->window, *old_value - new_value, 0);
653 *old_value = new_value;
658 pattern_vadj_changed (GtkAdjustment *adj,
661 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
662 gint new_value = adj->value;
664 if (gtk_widget_get_realized (darea))
666 gdk_window_scroll (darea->window, 0, *old_value - new_value);
667 *old_value = new_value;
672 pattern_realize (GtkWidget *widget,
675 pattern_set_bg (widget, widget->window, 0);
676 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
680 create_big_windows (GtkWidget *widget)
682 static GtkWidget *window = NULL;
683 GtkWidget *darea, *table, *scrollbar;
687 static gint current_x;
688 static gint current_y;
695 window = gtk_dialog_new_with_buttons ("Big Windows",
701 gtk_window_set_screen (GTK_WINDOW (window),
702 gtk_widget_get_screen (widget));
704 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
706 g_signal_connect (window, "destroy",
707 G_CALLBACK (gtk_widget_destroyed),
710 g_signal_connect (window, "response",
711 G_CALLBACK (gtk_widget_destroy),
714 table = gtk_table_new (2, 2, FALSE);
715 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
716 table, TRUE, TRUE, 0);
718 darea = gtk_drawing_area_new ();
720 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
721 g_signal_connect (hadj, "value_changed",
722 G_CALLBACK (pattern_hadj_changed), darea);
723 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
725 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
726 g_signal_connect (vadj, "value_changed",
727 G_CALLBACK (pattern_vadj_changed), darea);
728 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
730 g_signal_connect (darea, "realize",
731 G_CALLBACK (pattern_realize),
733 g_signal_connect (darea, "expose_event",
734 G_CALLBACK (pattern_expose),
737 eventbox = gtk_event_box_new ();
738 gtk_table_attach (GTK_TABLE (table), eventbox,
740 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
743 gtk_container_add (GTK_CONTAINER (eventbox), darea);
745 scrollbar = gtk_hscrollbar_new (hadj);
746 gtk_table_attach (GTK_TABLE (table), scrollbar,
748 GTK_FILL | GTK_EXPAND, GTK_FILL,
751 scrollbar = gtk_vscrollbar_new (vadj);
752 gtk_table_attach (GTK_TABLE (table), scrollbar,
754 GTK_FILL, GTK_EXPAND | GTK_FILL,
759 if (!gtk_widget_get_visible (window))
760 gtk_widget_show_all (window);
762 gtk_widget_hide (window);
770 button_window (GtkWidget *widget,
773 if (!gtk_widget_get_visible (button))
774 gtk_widget_show (button);
776 gtk_widget_hide (button);
780 create_buttons (GtkWidget *widget)
782 static GtkWidget *window = NULL;
786 GtkWidget *button[10];
787 GtkWidget *separator;
791 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
792 gtk_window_set_screen (GTK_WINDOW (window),
793 gtk_widget_get_screen (widget));
795 g_signal_connect (window, "destroy",
796 G_CALLBACK (gtk_widget_destroyed),
799 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
800 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
802 box1 = gtk_vbox_new (FALSE, 0);
803 gtk_container_add (GTK_CONTAINER (window), box1);
805 table = gtk_table_new (3, 3, FALSE);
806 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
807 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
808 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
809 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
811 button[0] = gtk_button_new_with_label ("button1");
812 button[1] = gtk_button_new_with_mnemonic ("_button2");
813 button[2] = gtk_button_new_with_mnemonic ("_button3");
814 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
815 button[4] = gtk_button_new_with_label ("button5");
816 button[5] = gtk_button_new_with_label ("button6");
817 button[6] = gtk_button_new_with_label ("button7");
818 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
819 button[8] = gtk_button_new_with_label ("button9");
821 g_signal_connect (button[0], "clicked",
822 G_CALLBACK (button_window),
825 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
826 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
828 g_signal_connect (button[1], "clicked",
829 G_CALLBACK (button_window),
832 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
833 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
835 g_signal_connect (button[2], "clicked",
836 G_CALLBACK (button_window),
838 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
839 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
841 g_signal_connect (button[3], "clicked",
842 G_CALLBACK (button_window),
844 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
845 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
847 g_signal_connect (button[4], "clicked",
848 G_CALLBACK (button_window),
850 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
851 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
853 g_signal_connect (button[5], "clicked",
854 G_CALLBACK (button_window),
856 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
857 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
859 g_signal_connect (button[6], "clicked",
860 G_CALLBACK (button_window),
862 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
863 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
865 g_signal_connect (button[7], "clicked",
866 G_CALLBACK (button_window),
868 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
869 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
871 g_signal_connect (button[8], "clicked",
872 G_CALLBACK (button_window),
874 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
875 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
877 separator = gtk_hseparator_new ();
878 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
880 box2 = gtk_vbox_new (FALSE, 10);
881 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
882 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
884 button[9] = gtk_button_new_with_label ("close");
885 g_signal_connect_swapped (button[9], "clicked",
886 G_CALLBACK (gtk_widget_destroy),
888 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
889 gtk_widget_set_can_default (button[9], TRUE);
890 gtk_widget_grab_default (button[9]);
893 if (!gtk_widget_get_visible (window))
894 gtk_widget_show_all (window);
896 gtk_widget_destroy (window);
904 create_toggle_buttons (GtkWidget *widget)
906 static GtkWidget *window = NULL;
910 GtkWidget *separator;
914 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
915 gtk_window_set_screen (GTK_WINDOW (window),
916 gtk_widget_get_screen (widget));
918 g_signal_connect (window, "destroy",
919 G_CALLBACK (gtk_widget_destroyed),
922 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
923 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
925 box1 = gtk_vbox_new (FALSE, 0);
926 gtk_container_add (GTK_CONTAINER (window), box1);
928 box2 = gtk_vbox_new (FALSE, 10);
929 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
930 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
932 button = gtk_toggle_button_new_with_label ("button1");
933 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
935 button = gtk_toggle_button_new_with_label ("button2");
936 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
938 button = gtk_toggle_button_new_with_label ("button3");
939 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
941 button = gtk_toggle_button_new_with_label ("inconsistent");
942 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
943 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
945 separator = gtk_hseparator_new ();
946 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
948 box2 = gtk_vbox_new (FALSE, 10);
949 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
950 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
952 button = gtk_button_new_with_label ("close");
953 g_signal_connect_swapped (button, "clicked",
954 G_CALLBACK (gtk_widget_destroy),
956 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
957 gtk_widget_set_can_default (button, TRUE);
958 gtk_widget_grab_default (button);
961 if (!gtk_widget_get_visible (window))
962 gtk_widget_show_all (window);
964 gtk_widget_destroy (window);
968 create_widget_grid (GType widget_type)
971 GtkWidget *group_widget = NULL;
974 table = gtk_table_new (FALSE, 3, 3);
976 for (i = 0; i < 5; i++)
978 for (j = 0; j < 5; j++)
983 if (i == 0 && j == 0)
989 tmp = g_strdup_printf ("%d", j);
990 widget = gtk_label_new (tmp);
995 tmp = g_strdup_printf ("%c", 'A' + i - 1);
996 widget = gtk_label_new (tmp);
1001 widget = g_object_new (widget_type, NULL);
1003 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
1006 group_widget = widget;
1008 g_object_set (widget, "group", group_widget, NULL);
1013 gtk_table_attach (GTK_TABLE (table), widget,
1028 create_check_buttons (GtkWidget *widget)
1030 static GtkWidget *window = NULL;
1034 GtkWidget *separator;
1039 window = gtk_dialog_new_with_buttons ("Check Buttons",
1045 gtk_window_set_screen (GTK_WINDOW (window),
1046 gtk_widget_get_screen (widget));
1048 g_signal_connect (window, "destroy",
1049 G_CALLBACK (gtk_widget_destroyed),
1051 g_signal_connect (window, "response",
1052 G_CALLBACK (gtk_widget_destroy),
1055 box1 = GTK_DIALOG (window)->vbox;
1057 box2 = gtk_vbox_new (FALSE, 10);
1058 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1059 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1061 button = gtk_check_button_new_with_mnemonic ("_button1");
1062 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1064 button = gtk_check_button_new_with_label ("button2");
1065 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1067 button = gtk_check_button_new_with_label ("button3");
1068 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1070 button = gtk_check_button_new_with_label ("inconsistent");
1071 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1072 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1074 separator = gtk_hseparator_new ();
1075 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1077 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
1078 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1079 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1082 if (!gtk_widget_get_visible (window))
1083 gtk_widget_show_all (window);
1085 gtk_widget_destroy (window);
1093 create_radio_buttons (GtkWidget *widget)
1095 static GtkWidget *window = NULL;
1099 GtkWidget *separator;
1104 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1110 gtk_window_set_screen (GTK_WINDOW (window),
1111 gtk_widget_get_screen (widget));
1113 g_signal_connect (window, "destroy",
1114 G_CALLBACK (gtk_widget_destroyed),
1116 g_signal_connect (window, "response",
1117 G_CALLBACK (gtk_widget_destroy),
1120 box1 = GTK_DIALOG (window)->vbox;
1122 box2 = gtk_vbox_new (FALSE, 10);
1123 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1124 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1126 button = gtk_radio_button_new_with_label (NULL, "button1");
1127 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1129 button = gtk_radio_button_new_with_label (
1130 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1132 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1133 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1135 button = gtk_radio_button_new_with_label (
1136 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1138 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1140 button = gtk_radio_button_new_with_label (
1141 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1143 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1144 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1146 separator = gtk_hseparator_new ();
1147 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1149 box2 = gtk_vbox_new (FALSE, 10);
1150 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1151 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1153 button = gtk_radio_button_new_with_label (NULL, "button4");
1154 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1155 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1157 button = gtk_radio_button_new_with_label (
1158 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1160 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1161 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1162 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1164 button = gtk_radio_button_new_with_label (
1165 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1167 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1168 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1170 separator = gtk_hseparator_new ();
1171 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1173 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1174 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1175 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1178 if (!gtk_widget_get_visible (window))
1179 gtk_widget_show_all (window);
1181 gtk_widget_destroy (window);
1189 create_bbox (gint horizontal,
1200 frame = gtk_frame_new (title);
1203 bbox = gtk_hbutton_box_new ();
1205 bbox = gtk_vbutton_box_new ();
1207 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1208 gtk_container_add (GTK_CONTAINER (frame), bbox);
1210 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1211 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1213 "child-min-width", child_w,
1214 "child-min-height", child_h,
1217 button = gtk_button_new_with_label ("OK");
1218 gtk_container_add (GTK_CONTAINER (bbox), button);
1220 button = gtk_button_new_with_label ("Cancel");
1221 gtk_container_add (GTK_CONTAINER (bbox), button);
1223 button = gtk_button_new_with_label ("Help");
1224 gtk_container_add (GTK_CONTAINER (bbox), button);
1230 create_button_box (GtkWidget *widget)
1232 static GtkWidget* window = NULL;
1233 GtkWidget *main_vbox;
1236 GtkWidget *frame_horz;
1237 GtkWidget *frame_vert;
1241 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1242 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1243 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1245 g_signal_connect (window, "destroy",
1246 G_CALLBACK (gtk_widget_destroyed),
1249 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1251 main_vbox = gtk_vbox_new (FALSE, 0);
1252 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1254 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1255 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1257 vbox = gtk_vbox_new (FALSE, 0);
1258 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1259 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1261 gtk_box_pack_start (GTK_BOX (vbox),
1262 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1265 gtk_box_pack_start (GTK_BOX (vbox),
1266 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1269 gtk_box_pack_start (GTK_BOX (vbox),
1270 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1273 gtk_box_pack_start (GTK_BOX (vbox),
1274 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1277 gtk_box_pack_start (GTK_BOX (vbox),
1278 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1281 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1282 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1284 hbox = gtk_hbox_new (FALSE, 0);
1285 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1286 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1288 gtk_box_pack_start (GTK_BOX (hbox),
1289 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1292 gtk_box_pack_start (GTK_BOX (hbox),
1293 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1296 gtk_box_pack_start (GTK_BOX (hbox),
1297 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1300 gtk_box_pack_start (GTK_BOX (hbox),
1301 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1304 gtk_box_pack_start (GTK_BOX (hbox),
1305 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1309 if (!gtk_widget_get_visible (window))
1310 gtk_widget_show_all (window);
1312 gtk_widget_destroy (window);
1320 new_pixmap (char *filename,
1322 GdkColor *background)
1328 if (strcmp (filename, "test.xpm") == 0 ||
1329 !file_exists (filename))
1331 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask,
1336 pixmap = gdk_pixmap_create_from_xpm (window, &mask,
1340 wpixmap = gtk_image_new_from_pixmap (pixmap, mask);
1347 set_toolbar_small_stock (GtkWidget *widget,
1350 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1354 set_toolbar_large_stock (GtkWidget *widget,
1357 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1361 set_toolbar_horizontal (GtkWidget *widget,
1364 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1368 set_toolbar_vertical (GtkWidget *widget,
1371 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1375 set_toolbar_icons (GtkWidget *widget,
1378 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1382 set_toolbar_text (GtkWidget *widget,
1385 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1389 set_toolbar_both (GtkWidget *widget,
1392 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1396 set_toolbar_both_horiz (GtkWidget *widget,
1399 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1403 set_toolbar_enable (GtkWidget *widget,
1406 GtkSettings *settings = gtk_widget_get_settings (widget);
1407 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1411 set_toolbar_disable (GtkWidget *widget,
1414 GtkSettings *settings = gtk_widget_get_settings (widget);
1415 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1418 static GtkActionEntry create_toolbar_items[] = {
1419 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1420 G_CALLBACK (set_toolbar_small_stock) },
1421 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1422 G_CALLBACK (set_toolbar_large_stock) },
1423 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1424 G_CALLBACK (set_toolbar_horizontal) },
1425 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1426 G_CALLBACK (set_toolbar_vertical) },
1428 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1429 G_CALLBACK (set_toolbar_icons) },
1430 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1431 G_CALLBACK (set_toolbar_text) },
1432 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1433 G_CALLBACK (set_toolbar_both) },
1434 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1435 G_CALLBACK (set_toolbar_both_horiz) },
1437 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1441 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1442 G_CALLBACK (set_toolbar_enable) },
1443 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1444 G_CALLBACK (set_toolbar_disable) },
1446 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1448 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1451 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1453 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1458 create_toolbar (GtkWidget *widget)
1460 static GtkWidget *window = NULL;
1467 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1468 gtk_window_set_screen (GTK_WINDOW (window),
1469 gtk_widget_get_screen (widget));
1471 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1473 g_signal_connect (window, "destroy",
1474 G_CALLBACK (gtk_widget_destroyed),
1477 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1478 gtk_widget_realize (window);
1480 toolbar = gtk_toolbar_new ();
1481 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1483 GtkToolItem *toolitem;
1485 if (create_toolbar_items[i].tooltip == NULL)
1486 toolitem = gtk_separator_tool_item_new ();
1487 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1491 toolitem = gtk_tool_item_new ();
1492 entry = gtk_entry_new ();
1493 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1495 else if (create_toolbar_items[i].stock_id)
1496 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1501 icon = new_pixmap ("test.xpm", window->window,
1502 &window->style->bg[GTK_STATE_NORMAL]);
1503 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1505 if (create_toolbar_items[i].callback)
1506 g_signal_connect (toolitem, "clicked",
1507 create_toolbar_items[i].callback, toolbar);
1508 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1509 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1512 gtk_container_add (GTK_CONTAINER (window), toolbar);
1514 gtk_widget_set_size_request (toolbar, 200, -1);
1517 if (!gtk_widget_get_visible (window))
1518 gtk_widget_show_all (window);
1520 gtk_widget_destroy (window);
1523 static GtkActionEntry make_toolbar_items[] = {
1524 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1525 G_CALLBACK (set_toolbar_horizontal) },
1526 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1527 G_CALLBACK (set_toolbar_vertical) },
1529 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1530 G_CALLBACK (set_toolbar_icons) },
1531 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1532 G_CALLBACK (set_toolbar_text) },
1533 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1534 G_CALLBACK (set_toolbar_both) },
1536 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1538 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1541 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1542 G_CALLBACK (set_toolbar_enable) },
1543 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1544 G_CALLBACK (set_toolbar_disable) },
1546 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1548 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1553 make_toolbar (GtkWidget *window)
1558 if (!gtk_widget_get_realized (window))
1559 gtk_widget_realize (window);
1561 toolbar = gtk_toolbar_new ();
1562 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1565 GtkToolItem *toolitem;
1567 if (make_toolbar_items[i].label == NULL)
1569 toolitem = gtk_separator_tool_item_new ();
1572 icon = new_pixmap ("test.xpm", window->window,
1573 &window->style->bg[GTK_STATE_NORMAL]);
1574 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1575 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1576 if (make_toolbar_items[i].callback != NULL)
1577 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1578 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1588 static guint statusbar_counter = 1;
1591 statusbar_push (GtkWidget *button,
1592 GtkStatusbar *statusbar)
1596 sprintf (text, "something %d", statusbar_counter++);
1598 gtk_statusbar_push (statusbar, 1, text);
1602 statusbar_push_long (GtkWidget *button,
1603 GtkStatusbar *statusbar)
1607 sprintf (text, "Just because a system has menu choices written with English words, phrases or sentences, that is no guarantee, that it is comprehensible. Individual words may not be familiar to some users (for example, \"repaginate\"), and two menu items may appear to satisfy the users's needs, whereas only one does (for example, \"put away\" or \"eject\").");
1609 gtk_statusbar_push (statusbar, 1, text);
1613 statusbar_pop (GtkWidget *button,
1614 GtkStatusbar *statusbar)
1616 gtk_statusbar_pop (statusbar, 1);
1620 statusbar_steal (GtkWidget *button,
1621 GtkStatusbar *statusbar)
1623 gtk_statusbar_remove (statusbar, 1, 4);
1627 statusbar_popped (GtkStatusbar *statusbar,
1631 if (!statusbar->messages)
1632 statusbar_counter = 1;
1636 statusbar_contexts (GtkStatusbar *statusbar)
1640 string = "any context";
1641 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1643 gtk_statusbar_get_context_id (statusbar, string));
1645 string = "idle messages";
1646 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1648 gtk_statusbar_get_context_id (statusbar, string));
1650 string = "some text";
1651 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1653 gtk_statusbar_get_context_id (statusbar, string));
1655 string = "hit the mouse";
1656 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1658 gtk_statusbar_get_context_id (statusbar, string));
1660 string = "hit the mouse2";
1661 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1663 gtk_statusbar_get_context_id (statusbar, string));
1667 create_statusbar (GtkWidget *widget)
1669 static GtkWidget *window = NULL;
1673 GtkWidget *separator;
1674 GtkWidget *statusbar;
1678 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1679 gtk_window_set_screen (GTK_WINDOW (window),
1680 gtk_widget_get_screen (widget));
1682 g_signal_connect (window, "destroy",
1683 G_CALLBACK (gtk_widget_destroyed),
1686 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1687 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1689 box1 = gtk_vbox_new (FALSE, 0);
1690 gtk_container_add (GTK_CONTAINER (window), box1);
1692 box2 = gtk_vbox_new (FALSE, 10);
1693 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1694 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1696 statusbar = gtk_statusbar_new ();
1697 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1698 g_signal_connect (statusbar,
1700 G_CALLBACK (statusbar_popped),
1703 button = g_object_new (gtk_button_get_type (),
1704 "label", "push something",
1708 g_object_connect (button,
1709 "signal::clicked", statusbar_push, statusbar,
1712 button = g_object_connect (g_object_new (gtk_button_get_type (),
1717 "signal_after::clicked", statusbar_pop, statusbar,
1720 button = g_object_connect (g_object_new (gtk_button_get_type (),
1721 "label", "steal #4",
1725 "signal_after::clicked", statusbar_steal, statusbar,
1728 button = g_object_connect (g_object_new (gtk_button_get_type (),
1729 "label", "test contexts",
1733 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1736 button = g_object_connect (g_object_new (gtk_button_get_type (),
1737 "label", "push something long",
1741 "signal_after::clicked", statusbar_push_long, statusbar,
1744 separator = gtk_hseparator_new ();
1745 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1747 box2 = gtk_vbox_new (FALSE, 10);
1748 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1749 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1751 button = gtk_button_new_with_label ("close");
1752 g_signal_connect_swapped (button, "clicked",
1753 G_CALLBACK (gtk_widget_destroy),
1755 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1756 gtk_widget_set_can_default (button, TRUE);
1757 gtk_widget_grab_default (button);
1760 if (!gtk_widget_get_visible (window))
1761 gtk_widget_show_all (window);
1763 gtk_widget_destroy (window);
1769 #define GRID_SIZE 20
1770 #define DEFAULT_GEOMETRY "10x10"
1773 gridded_geometry_expose (GtkWidget *widget,
1774 GdkEventExpose *event)
1778 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
1779 0, 0, widget->allocation.width, widget->allocation.height);
1781 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
1782 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
1784 if ((i + j) % 2 == 0)
1785 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
1786 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1793 gridded_geometry_subresponse (GtkDialog *dialog,
1795 gchar *geometry_string)
1797 if (response_id == GTK_RESPONSE_NONE)
1799 gtk_widget_destroy (GTK_WIDGET (dialog));
1803 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1805 g_print ("Can't parse geometry string %s\n", geometry_string);
1806 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1812 gridded_geometry_response (GtkDialog *dialog,
1816 if (response_id == GTK_RESPONSE_NONE)
1818 gtk_widget_destroy (GTK_WIDGET (dialog));
1822 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1823 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1825 GtkWidget *drawing_area;
1827 GdkGeometry geometry;
1829 window = gtk_dialog_new_with_buttons (title,
1832 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1835 gtk_window_set_screen (GTK_WINDOW (window),
1836 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1838 g_signal_connect (window, "response",
1839 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1841 box = gtk_vbox_new (FALSE, 0);
1842 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), box, TRUE, TRUE, 0);
1844 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1846 drawing_area = gtk_drawing_area_new ();
1847 g_signal_connect (drawing_area, "expose_event",
1848 G_CALLBACK (gridded_geometry_expose), NULL);
1849 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1851 /* Gross hack to work around bug 68668... if we set the size request
1852 * large enough, then the current
1854 * request_of_window - request_of_geometry_widget
1856 * method of getting the base size works more or less works.
1858 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1860 geometry.base_width = 0;
1861 geometry.base_height = 0;
1862 geometry.min_width = 2 * GRID_SIZE;
1863 geometry.min_height = 2 * GRID_SIZE;
1864 geometry.width_inc = GRID_SIZE;
1865 geometry.height_inc = GRID_SIZE;
1867 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1869 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1871 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1873 g_print ("Can't parse geometry string %s\n", geometry_string);
1874 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1877 gtk_widget_show_all (window);
1882 create_gridded_geometry (GtkWidget *widget)
1884 static GtkWidget *window = NULL;
1885 gpointer window_ptr;
1891 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1894 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1897 gtk_window_set_screen (GTK_WINDOW (window),
1898 gtk_widget_get_screen (widget));
1900 label = gtk_label_new ("Geometry string:");
1901 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0);
1903 entry = gtk_entry_new ();
1904 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1905 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), entry, FALSE, FALSE, 0);
1907 g_signal_connect (window, "response",
1908 G_CALLBACK (gridded_geometry_response), entry);
1909 window_ptr = &window;
1910 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
1912 gtk_widget_show_all (window);
1915 gtk_widget_destroy (window);
1923 handle_box_child_signal (GtkHandleBox *hb,
1925 const gchar *action)
1927 printf ("%s: child <%s> %sed\n",
1928 g_type_name (G_OBJECT_TYPE (hb)),
1929 g_type_name (G_OBJECT_TYPE (child)),
1934 create_handle_box (GtkWidget *widget)
1936 static GtkWidget* window = NULL;
1937 GtkWidget *handle_box;
1938 GtkWidget *handle_box2;
1943 GtkWidget *separator;
1947 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1949 gtk_window_set_screen (GTK_WINDOW (window),
1950 gtk_widget_get_screen (widget));
1951 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1952 gtk_window_set_title (GTK_WINDOW (window),
1954 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1956 g_signal_connect (window, "destroy",
1957 G_CALLBACK (gtk_widget_destroyed),
1960 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1962 vbox = gtk_vbox_new (FALSE, 0);
1963 gtk_container_add (GTK_CONTAINER (window), vbox);
1964 gtk_widget_show (vbox);
1966 label = gtk_label_new ("Above");
1967 gtk_container_add (GTK_CONTAINER (vbox), label);
1968 gtk_widget_show (label);
1970 separator = gtk_hseparator_new ();
1971 gtk_container_add (GTK_CONTAINER (vbox), separator);
1972 gtk_widget_show (separator);
1974 hbox = gtk_hbox_new (FALSE, 10);
1975 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1976 gtk_widget_show (hbox);
1978 separator = gtk_hseparator_new ();
1979 gtk_container_add (GTK_CONTAINER (vbox), separator);
1980 gtk_widget_show (separator);
1982 label = gtk_label_new ("Below");
1983 gtk_container_add (GTK_CONTAINER (vbox), label);
1984 gtk_widget_show (label);
1986 handle_box = gtk_handle_box_new ();
1987 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1988 g_signal_connect (handle_box,
1990 G_CALLBACK (handle_box_child_signal),
1992 g_signal_connect (handle_box,
1994 G_CALLBACK (handle_box_child_signal),
1996 gtk_widget_show (handle_box);
1998 toolbar = make_toolbar (window);
2000 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2001 gtk_widget_show (toolbar);
2003 handle_box = gtk_handle_box_new ();
2004 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2005 g_signal_connect (handle_box,
2007 G_CALLBACK (handle_box_child_signal),
2009 g_signal_connect (handle_box,
2011 G_CALLBACK (handle_box_child_signal),
2013 gtk_widget_show (handle_box);
2015 handle_box2 = gtk_handle_box_new ();
2016 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2017 g_signal_connect (handle_box2,
2019 G_CALLBACK (handle_box_child_signal),
2021 g_signal_connect (handle_box2,
2023 G_CALLBACK (handle_box_child_signal),
2025 gtk_widget_show (handle_box2);
2027 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
2028 label = gtk_label_new ("Fooo!");
2029 gtk_container_add (GTK_CONTAINER (hbox), label);
2030 gtk_widget_show (label);
2031 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
2034 if (!gtk_widget_get_visible (window))
2035 gtk_widget_show (window);
2037 gtk_widget_destroy (window);
2041 * Test for getting an image from a drawable
2052 take_snapshot (GtkWidget *button,
2055 struct GetImageData *gid = data;
2056 GdkRectangle visible;
2058 int height_fraction;
2061 GdkColor color = { 0, 30000, 0, 0 };
2062 GdkRectangle target;
2065 /* Do some begin_paint_rect on some random rects, draw some
2066 * distinctive stuff into those rects, then take the snapshot.
2067 * figure out whether any rects were overlapped and report to
2071 visible = gid->sw->allocation;
2073 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2074 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2076 width_fraction = visible.width / 4;
2077 height_fraction = visible.height / 4;
2079 gc = gdk_gc_new (gid->src->window);
2080 black_gc = gid->src->style->black_gc;
2082 gdk_gc_set_rgb_fg_color (gc, &color);
2085 target.x = visible.x + width_fraction;
2086 target.y = visible.y + height_fraction * 3;
2087 target.width = width_fraction;
2088 target.height = height_fraction / 2;
2090 gdk_window_begin_paint_rect (gid->src->window,
2093 gdk_draw_rectangle (gid->src->window,
2097 target.width, target.height);
2099 gdk_draw_rectangle (gid->src->window,
2102 target.x + 10, target.y + 10,
2103 target.width - 20, target.height - 20);
2105 target.x = visible.x + width_fraction;
2106 target.y = visible.y + height_fraction;
2107 target.width = width_fraction;
2108 target.height = height_fraction;
2110 gdk_window_begin_paint_rect (gid->src->window,
2113 gdk_draw_rectangle (gid->src->window,
2117 target.width, target.height);
2119 gdk_draw_rectangle (gid->src->window,
2122 target.x + 10, target.y + 10,
2123 target.width - 20, target.height - 20);
2125 target.x = visible.x + width_fraction * 3;
2126 target.y = visible.y + height_fraction;
2127 target.width = width_fraction / 2;
2128 target.height = height_fraction;
2130 gdk_window_begin_paint_rect (gid->src->window,
2133 gdk_draw_rectangle (gid->src->window,
2137 target.width, target.height);
2139 gdk_draw_rectangle (gid->src->window,
2142 target.x + 10, target.y + 10,
2143 target.width - 20, target.height - 20);
2145 target.x = visible.x + width_fraction * 2;
2146 target.y = visible.y + height_fraction * 2;
2147 target.width = width_fraction / 4;
2148 target.height = height_fraction / 4;
2150 gdk_window_begin_paint_rect (gid->src->window,
2153 gdk_draw_rectangle (gid->src->window,
2157 target.width, target.height);
2159 gdk_draw_rectangle (gid->src->window,
2162 target.x + 10, target.y + 10,
2163 target.width - 20, target.height - 20);
2165 target.x += target.width / 2;
2166 target.y += target.width / 2;
2168 gdk_window_begin_paint_rect (gid->src->window,
2171 gdk_draw_rectangle (gid->src->window,
2175 target.width, target.height);
2177 gdk_draw_rectangle (gid->src->window,
2180 target.x + 10, target.y + 10,
2181 target.width - 20, target.height - 20);
2183 /* Screen shot area */
2185 target.x = visible.x + width_fraction * 1.5;
2186 target.y = visible.y + height_fraction * 1.5;
2187 target.width = width_fraction * 2;
2188 target.height = height_fraction * 2;
2190 shot = gdk_drawable_get_image (gid->src->window,
2192 target.width, target.height);
2194 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2197 g_object_unref (shot);
2199 gdk_window_end_paint (gid->src->window);
2200 gdk_window_end_paint (gid->src->window);
2201 gdk_window_end_paint (gid->src->window);
2202 gdk_window_end_paint (gid->src->window);
2203 gdk_window_end_paint (gid->src->window);
2205 gdk_draw_rectangle (gid->src->window,
2206 gid->src->style->black_gc,
2209 target.width, target.height);
2211 g_object_unref (gc);
2215 image_source_expose (GtkWidget *da,
2216 GdkEventExpose *event,
2219 int x = event->area.x;
2220 GdkColor red = { 0, 65535, 0, 0 };
2221 GdkColor green = { 0, 0, 65535, 0 };
2222 GdkColor blue = { 0, 0, 0, 65535 };
2225 gc = gdk_gc_new (event->window);
2227 while (x < (event->area.x + event->area.width))
2234 gdk_gc_set_rgb_fg_color (gc, &red);
2240 gdk_gc_set_rgb_fg_color (gc, &green);
2246 gdk_gc_set_rgb_fg_color (gc, &blue);
2250 g_assert_not_reached ();
2254 gdk_draw_line (event->window,
2257 x, event->area.y + event->area.height);
2262 g_object_unref (gc);
2268 create_get_image (GtkWidget *widget)
2270 static GtkWidget *window = NULL;
2273 gtk_widget_destroy (window);
2282 struct GetImageData *gid;
2284 gid = g_new (struct GetImageData, 1);
2286 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2288 gtk_window_set_screen (GTK_WINDOW (window),
2289 gtk_widget_get_screen (widget));
2291 g_signal_connect (window,
2293 G_CALLBACK (gtk_widget_destroyed),
2296 g_object_set_data_full (G_OBJECT (window),
2297 "testgtk-get-image-data",
2301 hbox = gtk_hbox_new (FALSE, 0);
2303 gtk_container_add (GTK_CONTAINER (window), hbox);
2305 sw = gtk_scrolled_window_new (NULL, NULL);
2306 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2307 GTK_POLICY_AUTOMATIC,
2308 GTK_POLICY_AUTOMATIC);
2312 gtk_widget_set_size_request (sw, 400, 400);
2314 src = gtk_drawing_area_new ();
2315 gtk_widget_set_size_request (src, 10000, 10000);
2317 g_signal_connect (src,
2319 G_CALLBACK (image_source_expose),
2324 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2327 gtk_box_pack_start (GTK_BOX (hbox),
2331 vbox = gtk_vbox_new (FALSE, 3);
2333 snap = g_object_new (GTK_TYPE_IMAGE, NULL);
2337 sw = gtk_scrolled_window_new (NULL, NULL);
2338 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2339 GTK_POLICY_AUTOMATIC,
2340 GTK_POLICY_AUTOMATIC);
2341 gtk_widget_set_size_request (sw, 300, 300);
2343 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2345 gtk_box_pack_end (GTK_BOX (vbox), sw, FALSE, FALSE, 5);
2347 button = gtk_button_new_with_label ("Get image from drawable");
2349 g_signal_connect (button,
2351 G_CALLBACK (take_snapshot),
2354 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2356 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2358 gtk_widget_show_all (window);
2366 sensitivity_toggled (GtkWidget *toggle,
2369 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2373 create_sensitivity_control (GtkWidget *widget)
2377 button = gtk_toggle_button_new_with_label ("Sensitive");
2379 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2380 gtk_widget_is_sensitive (widget));
2382 g_signal_connect (button,
2384 G_CALLBACK (sensitivity_toggled),
2387 gtk_widget_show_all (button);
2393 set_selectable_recursive (GtkWidget *widget,
2396 if (GTK_IS_CONTAINER (widget))
2401 children = gtk_container_get_children (GTK_CONTAINER (widget));
2405 set_selectable_recursive (tmp->data, setting);
2409 g_list_free (children);
2411 else if (GTK_IS_LABEL (widget))
2413 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2418 selectable_toggled (GtkWidget *toggle,
2421 set_selectable_recursive (widget,
2422 GTK_TOGGLE_BUTTON (toggle)->active);
2426 create_selectable_control (GtkWidget *widget)
2430 button = gtk_toggle_button_new_with_label ("Selectable");
2432 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2435 g_signal_connect (button,
2437 G_CALLBACK (selectable_toggled),
2440 gtk_widget_show_all (button);
2446 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
2450 gtk_widget_destroy (dialog);
2452 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2453 "as hyperlinks, which can be clicked\n"
2454 "or activated via <a href=\"keynav\">keynav</a>.\n"
2455 "The links remain the same.";
2456 gtk_label_set_markup (label, text);
2460 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
2462 if (g_strcmp0 (uri, "keynav") == 0)
2466 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
2467 GTK_DIALOG_DESTROY_WITH_PARENT,
2470 "The term <i>keynav</i> is a shorthand for "
2471 "keyboard navigation and refers to the process of using a program "
2472 "(exclusively) via keyboard input.");
2474 gtk_window_present (GTK_WINDOW (dialog));
2476 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
2484 void create_labels (GtkWidget *widget)
2486 static GtkWidget *window = NULL;
2495 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2497 gtk_window_set_screen (GTK_WINDOW (window),
2498 gtk_widget_get_screen (widget));
2500 g_signal_connect (window, "destroy",
2501 G_CALLBACK (gtk_widget_destroyed),
2504 gtk_window_set_title (GTK_WINDOW (window), "Label");
2506 vbox = gtk_vbox_new (FALSE, 5);
2508 hbox = gtk_hbox_new (FALSE, 5);
2509 gtk_container_add (GTK_CONTAINER (window), vbox);
2511 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2513 button = create_sensitivity_control (hbox);
2515 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2517 button = create_selectable_control (hbox);
2519 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2521 vbox = gtk_vbox_new (FALSE, 5);
2523 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2524 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2526 frame = gtk_frame_new ("Normal Label");
2527 label = gtk_label_new ("This is a Normal label");
2528 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2529 gtk_container_add (GTK_CONTAINER (frame), label);
2530 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2532 frame = gtk_frame_new ("Multi-line Label");
2533 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2534 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
2535 gtk_container_add (GTK_CONTAINER (frame), label);
2536 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2538 frame = gtk_frame_new ("Left Justified Label");
2539 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2540 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
2541 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2542 gtk_container_add (GTK_CONTAINER (frame), label);
2543 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2545 frame = gtk_frame_new ("Right Justified Label");
2546 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2547 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2548 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2549 gtk_container_add (GTK_CONTAINER (frame), label);
2550 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2552 frame = gtk_frame_new ("Internationalized Label");
2553 label = gtk_label_new (NULL);
2554 gtk_label_set_markup (GTK_LABEL (label),
2555 "French (Fran\303\247ais) Bonjour, Salut\n"
2556 "Korean (\355\225\234\352\270\200) \354\225\210\353\205\225\355\225\230\354\204\270\354\232\224, \354\225\210\353\205\225\355\225\230\354\213\255\353\213\210\352\271\214\n"
2557 "Russian (\320\240\321\203\321\201\321\201\320\272\320\270\320\271) \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265!\n"
2558 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2559 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2560 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2561 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2562 gtk_container_add (GTK_CONTAINER (frame), label);
2563 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2565 frame = gtk_frame_new ("Bidirection Label");
2566 label = gtk_label_new ("\342\200\217Arabic \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205\n"
2567 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
2568 gtk_container_add (GTK_CONTAINER (frame), label);
2569 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2571 frame = gtk_frame_new ("Links in a label");
2572 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2573 "as hyperlinks, which can be clicked\n"
2574 "or activated via <a href=\"keynav\">keynav</a>");
2575 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
2576 gtk_container_add (GTK_CONTAINER (frame), label);
2577 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2578 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
2580 vbox = gtk_vbox_new (FALSE, 5);
2581 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2582 frame = gtk_frame_new ("Line wrapped label");
2583 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2584 "up the entire "/* big space to test spacing */\
2585 "width allocated to it, but automatically wraps the words to fit. "\
2586 "The time has come, for all good men, to come to the aid of their party. "\
2587 "The sixth sheik's six sheep's sick.\n"\
2588 " It supports multiple paragraphs correctly, and correctly adds "\
2589 "many extra spaces. ");
2591 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2592 gtk_container_add (GTK_CONTAINER (frame), label);
2593 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2595 frame = gtk_frame_new ("Filled, wrapped label");
2596 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2597 "up the entire width allocated to it. Here is a seneance to prove "\
2598 "my point. Here is another sentence. "\
2599 "Here comes the sun, do de do de do.\n"\
2600 " This is a new paragraph.\n"\
2601 " This is another newer, longer, better paragraph. It is coming to an end, "\
2603 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2604 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2605 gtk_container_add (GTK_CONTAINER (frame), label);
2606 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2608 frame = gtk_frame_new ("Underlined label");
2609 label = gtk_label_new ("This label is underlined!\n"
2610 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2611 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2612 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2613 gtk_container_add (GTK_CONTAINER (frame), label);
2614 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2616 frame = gtk_frame_new ("Markup label");
2617 label = gtk_label_new (NULL);
2619 /* There's also a gtk_label_set_markup() without accel if you
2620 * don't have an accelerator key
2622 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2623 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2624 "<b>markup</b> _such as "
2625 "<big><i>Big Italics</i></big>\n"
2626 "<tt>Monospace font</tt>\n"
2627 "<u>Underline!</u>\n"
2629 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2630 "and nothing on this line,\n"
2633 "or even on this one\n"
2634 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2635 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2636 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2638 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2640 gtk_container_add (GTK_CONTAINER (frame), label);
2641 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2644 if (!gtk_widget_get_visible (window))
2645 gtk_widget_show_all (window);
2647 gtk_widget_destroy (window);
2651 on_angle_scale_changed (GtkRange *range,
2654 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2658 create_rotated_label (GtkWidget *widget)
2660 static GtkWidget *window = NULL;
2664 GtkWidget *scale_label;
2665 GtkWidget *scale_hbox;
2669 window = gtk_dialog_new_with_buttons ("Rotated Label",
2670 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2671 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2674 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2676 gtk_window_set_screen (GTK_WINDOW (window),
2677 gtk_widget_get_screen (widget));
2679 g_signal_connect (window, "response",
2680 G_CALLBACK (gtk_object_destroy), NULL);
2681 g_signal_connect (window, "destroy",
2682 G_CALLBACK (gtk_widget_destroyed), &window);
2684 vbox = gtk_vbox_new (FALSE, 5);
2685 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0);
2686 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2688 label = gtk_label_new (NULL);
2689 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2690 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2692 scale_hbox = gtk_hbox_new (FALSE, 0);
2693 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2695 scale_label = gtk_label_new (NULL);
2696 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2697 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2699 hscale = gtk_hscale_new_with_range (0, 360, 5);
2700 g_signal_connect (hscale, "value-changed",
2701 G_CALLBACK (on_angle_scale_changed), label);
2703 gtk_range_set_value (GTK_RANGE (hscale), 45);
2704 gtk_widget_set_size_request (hscale, 200, -1);
2705 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2708 if (!gtk_widget_get_visible (window))
2709 gtk_widget_show_all (window);
2711 gtk_widget_destroy (window);
2714 #define DEFAULT_TEXT_RADIUS 200
2717 on_rotated_text_unrealize (GtkWidget *widget)
2719 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2723 on_rotated_text_expose (GtkWidget *widget,
2724 GdkEventExpose *event,
2725 GdkPixbuf *tile_pixbuf)
2727 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2728 "had", "10,000", "men" };
2729 PangoRenderer *renderer;
2734 PangoMatrix matrix = PANGO_MATRIX_INIT;
2735 PangoLayout *layout;
2736 PangoContext *context;
2737 PangoFontDescription *desc;
2739 gc = g_object_get_data (G_OBJECT (widget), "text-gc");
2742 static GdkColor black = { 0, 0, 0, 0 };
2744 gc = gdk_gc_new (widget->window);
2745 gdk_gc_set_rgb_fg_color (gc, &black);
2751 gint width = gdk_pixbuf_get_width (tile_pixbuf);
2752 gint height = gdk_pixbuf_get_height (tile_pixbuf);
2754 tile = gdk_pixmap_new (widget->window, width, height, -1);
2755 gdk_draw_pixbuf (tile, gc, tile_pixbuf,
2756 0, 0, 0, 0, width, height,
2757 GDK_RGB_DITHER_NORMAL, 0, 0);
2759 gdk_gc_set_tile (gc, tile);
2760 gdk_gc_set_fill (gc, GDK_TILED);
2762 g_object_unref (tile);
2765 g_object_set_data_full (G_OBJECT (widget), "text-gc", gc, (GDestroyNotify)g_object_unref);
2768 renderer = gdk_pango_renderer_get_default (gtk_widget_get_screen (widget));
2769 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), widget->window);
2770 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), gc);
2772 radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
2774 pango_matrix_translate (&matrix,
2775 radius + (widget->allocation.width - 2 * radius) / 2,
2776 radius + (widget->allocation.height - 2 * radius) / 2);
2777 pango_matrix_scale (&matrix, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2779 context = gtk_widget_get_pango_context (widget);
2780 layout = pango_layout_new (context);
2781 desc = pango_font_description_from_string ("Sans Bold 30");
2782 pango_layout_set_font_description (layout, desc);
2783 pango_font_description_free (desc);
2785 n_words = G_N_ELEMENTS (words);
2786 for (i = 0; i < n_words; i++)
2788 PangoMatrix rotated_matrix = matrix;
2791 pango_matrix_rotate (&rotated_matrix, - (360. * i) / n_words);
2793 pango_context_set_matrix (context, &rotated_matrix);
2794 pango_layout_context_changed (layout);
2795 pango_layout_set_text (layout, words[i], -1);
2797 pango_layout_get_size (layout, &width, &height);
2799 pango_renderer_draw_layout (renderer, layout,
2800 - width / 2, - DEFAULT_TEXT_RADIUS * PANGO_SCALE);
2803 gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL);
2804 gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL);
2806 g_object_unref (layout);
2812 create_rotated_text (GtkWidget *widget)
2814 static GtkWidget *window = NULL;
2818 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
2819 GtkRequisition requisition;
2820 GtkWidget *drawing_area;
2821 GdkPixbuf *tile_pixbuf;
2823 window = gtk_dialog_new_with_buttons ("Rotated Text",
2824 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2825 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2828 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2830 gtk_window_set_screen (GTK_WINDOW (window),
2831 gtk_widget_get_screen (widget));
2833 g_signal_connect (window, "response",
2834 G_CALLBACK (gtk_object_destroy), NULL);
2835 g_signal_connect (window, "destroy",
2836 G_CALLBACK (gtk_widget_destroyed), &window);
2838 drawing_area = gtk_drawing_area_new ();
2839 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), drawing_area, TRUE, TRUE, 0);
2840 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
2842 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2844 g_signal_connect (drawing_area, "expose-event",
2845 G_CALLBACK (on_rotated_text_expose), tile_pixbuf);
2846 g_signal_connect (drawing_area, "unrealize",
2847 G_CALLBACK (on_rotated_text_unrealize), NULL);
2849 gtk_widget_show_all (GTK_BIN (window)->child);
2851 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2852 gtk_widget_size_request (window, &requisition);
2853 gtk_widget_set_size_request (drawing_area, -1, -1);
2854 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2857 if (!gtk_widget_get_visible (window))
2858 gtk_widget_show (window);
2860 gtk_widget_destroy (window);
2868 reparent_label (GtkWidget *widget,
2869 GtkWidget *new_parent)
2873 label = g_object_get_data (G_OBJECT (widget), "user_data");
2875 gtk_widget_reparent (label, new_parent);
2879 set_parent_signal (GtkWidget *child,
2880 GtkWidget *old_parent,
2883 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2884 g_type_name (G_OBJECT_TYPE (child)),
2885 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
2886 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2887 GPOINTER_TO_INT (func_data));
2891 create_reparent (GtkWidget *widget)
2893 static GtkWidget *window = NULL;
2900 GtkWidget *separator;
2901 GtkWidget *event_box;
2905 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2907 gtk_window_set_screen (GTK_WINDOW (window),
2908 gtk_widget_get_screen (widget));
2910 g_signal_connect (window, "destroy",
2911 G_CALLBACK (gtk_widget_destroyed),
2914 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2915 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2917 box1 = gtk_vbox_new (FALSE, 0);
2918 gtk_container_add (GTK_CONTAINER (window), box1);
2920 box2 = gtk_hbox_new (FALSE, 5);
2921 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2922 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2924 label = gtk_label_new ("Hello World");
2926 frame = gtk_frame_new ("Frame 1");
2927 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2929 box3 = gtk_vbox_new (FALSE, 5);
2930 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2931 gtk_container_add (GTK_CONTAINER (frame), box3);
2933 button = gtk_button_new_with_label ("switch");
2934 g_object_set_data (G_OBJECT (button), "user_data", label);
2935 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2937 event_box = gtk_event_box_new ();
2938 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2939 gtk_container_add (GTK_CONTAINER (event_box), label);
2941 g_signal_connect (button, "clicked",
2942 G_CALLBACK (reparent_label),
2945 g_signal_connect (label, "parent_set",
2946 G_CALLBACK (set_parent_signal),
2947 GINT_TO_POINTER (42));
2949 frame = gtk_frame_new ("Frame 2");
2950 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2952 box3 = gtk_vbox_new (FALSE, 5);
2953 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2954 gtk_container_add (GTK_CONTAINER (frame), box3);
2956 button = gtk_button_new_with_label ("switch");
2957 g_object_set_data (G_OBJECT (button), "user_data", label);
2958 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2960 event_box = gtk_event_box_new ();
2961 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2963 g_signal_connect (button, "clicked",
2964 G_CALLBACK (reparent_label),
2967 separator = gtk_hseparator_new ();
2968 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2970 box2 = gtk_vbox_new (FALSE, 10);
2971 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2972 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2974 button = gtk_button_new_with_label ("close");
2975 g_signal_connect_swapped (button, "clicked",
2976 G_CALLBACK (gtk_widget_destroy), window);
2977 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2978 gtk_widget_set_can_default (button, TRUE);
2979 gtk_widget_grab_default (button);
2982 if (!gtk_widget_get_visible (window))
2983 gtk_widget_show_all (window);
2985 gtk_widget_destroy (window);
2992 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2994 if (event->type == GDK_BUTTON_PRESS)
2996 if (event->button == 1)
2997 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2998 event->button, event->x_root, event->y_root,
3000 else if (event->button == 2)
3001 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
3002 event->button, event->x_root, event->y_root,
3009 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
3011 gtk_paint_resize_grip (area->style,
3013 gtk_widget_get_state (area),
3019 area->allocation.width,
3020 area->allocation.height);
3026 create_resize_grips (GtkWidget *widget)
3028 static GtkWidget *window = NULL;
3030 GtkWidget *hbox, *vbox;
3033 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3035 gtk_window_set_screen (GTK_WINDOW (window),
3036 gtk_widget_get_screen (widget));
3038 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
3040 g_signal_connect (window, "destroy",
3041 G_CALLBACK (gtk_widget_destroyed),
3044 vbox = gtk_vbox_new (FALSE, 0);
3045 gtk_container_add (GTK_CONTAINER (window), vbox);
3047 hbox = gtk_hbox_new (FALSE, 0);
3048 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3051 area = gtk_drawing_area_new ();
3052 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3053 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3054 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3055 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3056 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3057 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
3060 area = gtk_drawing_area_new ();
3061 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3062 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3063 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3064 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3065 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3066 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
3069 area = gtk_drawing_area_new ();
3070 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3071 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3072 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3073 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3074 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3075 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
3077 hbox = gtk_hbox_new (FALSE, 0);
3078 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3081 area = gtk_drawing_area_new ();
3082 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3083 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3084 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3085 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3086 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3087 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
3090 area = gtk_drawing_area_new ();
3091 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3094 area = gtk_drawing_area_new ();
3095 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3096 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3097 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3098 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3099 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3100 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
3103 hbox = gtk_hbox_new (FALSE, 0);
3104 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
3107 area = gtk_drawing_area_new ();
3108 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3109 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3110 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3111 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3112 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3113 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
3115 area = gtk_drawing_area_new ();
3116 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3117 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3118 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3119 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3120 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3121 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
3124 area = gtk_drawing_area_new ();
3125 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
3126 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
3127 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
3128 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3129 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
3130 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
3133 if (!gtk_widget_get_visible (window))
3134 gtk_widget_show_all (window);
3136 gtk_widget_destroy (window);
3142 gint upositionx = 0;
3143 gint upositiony = 0;
3146 uposition_configure (GtkWidget *window)
3152 lx = g_object_get_data (G_OBJECT (window), "x");
3153 ly = g_object_get_data (G_OBJECT (window), "y");
3155 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
3156 sprintf (buffer, "%d", upositionx);
3157 gtk_label_set_text (lx, buffer);
3158 sprintf (buffer, "%d", upositiony);
3159 gtk_label_set_text (ly, buffer);
3165 uposition_stop_configure (GtkToggleButton *toggle,
3169 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
3171 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
3175 create_saved_position (GtkWidget *widget)
3177 static GtkWidget *window = NULL;
3182 GtkWidget *main_vbox;
3190 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
3191 "type", GTK_WINDOW_TOPLEVEL,
3192 "title", "Saved Position",
3194 "signal::configure_event", uposition_configure, NULL,
3197 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3199 gtk_window_set_screen (GTK_WINDOW (window),
3200 gtk_widget_get_screen (widget));
3203 g_signal_connect (window, "destroy",
3204 G_CALLBACK (gtk_widget_destroyed),
3207 main_vbox = gtk_vbox_new (FALSE, 5);
3208 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3209 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3212 g_object_new (gtk_vbox_get_type (),
3213 "GtkBox::homogeneous", FALSE,
3214 "GtkBox::spacing", 5,
3215 "GtkContainer::border_width", 10,
3216 "GtkWidget::parent", main_vbox,
3217 "GtkWidget::visible", TRUE,
3218 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
3219 "label", "Stop Events",
3223 "signal::clicked", uposition_stop_configure, window,
3227 hbox = gtk_hbox_new (FALSE, 0);
3228 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3229 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3231 label = gtk_label_new ("X Origin : ");
3232 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3233 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3235 x_label = gtk_label_new ("");
3236 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3237 g_object_set_data (G_OBJECT (window), "x", x_label);
3239 hbox = gtk_hbox_new (FALSE, 0);
3240 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3241 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3243 label = gtk_label_new ("Y Origin : ");
3244 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3245 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3247 y_label = gtk_label_new ("");
3248 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3249 g_object_set_data (G_OBJECT (window), "y", y_label);
3252 g_object_new (gtk_hseparator_get_type (),
3253 "GtkWidget::visible", TRUE,
3255 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3257 hbox = gtk_hbox_new (FALSE, 0);
3258 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3259 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3261 button = gtk_button_new_with_label ("Close");
3262 g_signal_connect_swapped (button, "clicked",
3263 G_CALLBACK (gtk_widget_destroy),
3265 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3266 gtk_widget_set_can_default (button, TRUE);
3267 gtk_widget_grab_default (button);
3269 gtk_widget_show_all (window);
3272 gtk_widget_destroy (window);
3280 create_pixmap (GtkWidget *widget)
3282 static GtkWidget *window = NULL;
3288 GtkWidget *separator;
3289 GtkWidget *pixmapwid;
3293 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3295 gtk_window_set_screen (GTK_WINDOW (window),
3296 gtk_widget_get_screen (widget));
3298 g_signal_connect (window, "destroy",
3299 G_CALLBACK (gtk_widget_destroyed),
3302 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3303 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3304 gtk_widget_realize(window);
3306 box1 = gtk_vbox_new (FALSE, 0);
3307 gtk_container_add (GTK_CONTAINER (window), box1);
3309 box2 = gtk_vbox_new (FALSE, 10);
3310 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3311 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3313 button = gtk_button_new ();
3314 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3316 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3318 label = gtk_label_new ("Pixmap\ntest");
3319 box3 = gtk_hbox_new (FALSE, 0);
3320 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3321 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3322 gtk_container_add (GTK_CONTAINER (box3), label);
3323 gtk_container_add (GTK_CONTAINER (button), box3);
3325 button = gtk_button_new ();
3326 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3328 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3330 label = gtk_label_new ("Pixmap\ntest");
3331 box3 = gtk_hbox_new (FALSE, 0);
3332 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3333 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3334 gtk_container_add (GTK_CONTAINER (box3), label);
3335 gtk_container_add (GTK_CONTAINER (button), box3);
3337 gtk_widget_set_sensitive (button, FALSE);
3339 separator = gtk_hseparator_new ();
3340 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3342 box2 = gtk_vbox_new (FALSE, 10);
3343 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3344 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3346 button = gtk_button_new_with_label ("close");
3347 g_signal_connect_swapped (button, "clicked",
3348 G_CALLBACK (gtk_widget_destroy),
3350 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3351 gtk_widget_set_can_default (button, TRUE);
3352 gtk_widget_grab_default (button);
3355 if (!gtk_widget_get_visible (window))
3356 gtk_widget_show_all (window);
3358 gtk_widget_destroy (window);
3362 tips_query_widget_entered (GtkTipsQuery *tips_query,
3364 const gchar *tip_text,
3365 const gchar *tip_private,
3368 if (GTK_TOGGLE_BUTTON (toggle)->active)
3370 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3371 /* don't let GtkTipsQuery reset its label */
3372 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3377 tips_query_widget_selected (GtkWidget *tips_query,
3379 const gchar *tip_text,
3380 const gchar *tip_private,
3381 GdkEventButton *event,
3385 g_print ("Help \"%s\" requested for <%s>\n",
3386 tip_private ? tip_private : "None",
3387 g_type_name (G_OBJECT_TYPE (widget)));
3392 create_tooltips (GtkWidget *widget)
3394 static GtkWidget *window = NULL;
3401 GtkWidget *tips_query;
3402 GtkWidget *separator;
3407 g_object_new (gtk_window_get_type (),
3408 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3409 "GtkContainer::border_width", 0,
3410 "GtkWindow::title", "Tooltips",
3411 "GtkWindow::allow_shrink", TRUE,
3412 "GtkWindow::allow_grow", FALSE,
3415 gtk_window_set_screen (GTK_WINDOW (window),
3416 gtk_widget_get_screen (widget));
3418 box1 = gtk_vbox_new (FALSE, 0);
3419 gtk_container_add (GTK_CONTAINER (window), box1);
3421 box2 = gtk_vbox_new (FALSE, 10);
3422 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3423 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3425 button = gtk_toggle_button_new_with_label ("button1");
3426 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3428 gtk_widget_set_tooltip_text (button, "This is button 1");
3430 button = gtk_toggle_button_new_with_label ("button2");
3431 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3433 gtk_widget_set_tooltip_text (button,
3434 "This is button 2. This is also a really long tooltip which probably "
3435 "won't fit on a single line and will therefore need to be wrapped. "
3436 "Hopefully the wrapping will work correctly.");
3438 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3439 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3441 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
3444 g_object_new (gtk_vbox_get_type (),
3445 "homogeneous", FALSE,
3451 tips_query = gtk_tips_query_new ();
3454 g_object_new (gtk_button_get_type (),
3459 g_object_connect (button,
3460 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3462 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3463 gtk_widget_set_tooltip_text (button "Start the Tooltips Inspector");
3465 g_object_set (g_object_connect (tips_query,
3466 "signal::widget_entered", tips_query_widget_entered, toggle,
3467 "signal::widget_selected", tips_query_widget_selected, NULL,
3474 frame = g_object_new (gtk_frame_get_type (),
3475 "label", "ToolTips Inspector",
3476 "label_xalign", (double) 0.5,
3482 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3484 separator = gtk_hseparator_new ();
3485 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3487 box2 = gtk_vbox_new (FALSE, 10);
3488 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3489 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3491 button = gtk_button_new_with_label ("close");
3492 g_signal_connect_swapped (button, "clicked",
3493 G_CALLBACK (gtk_widget_destroy),
3495 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3496 gtk_widget_set_can_default (button, TRUE);
3497 gtk_widget_grab_default (button);
3499 gtk_widget_set_tooltip_text (button, "Push this button to close window");
3502 if (!gtk_widget_get_visible (window))
3503 gtk_widget_show_all (window);
3505 gtk_widget_destroy (window);
3513 pack_image (GtkWidget *box,
3517 gtk_box_pack_start (GTK_BOX (box),
3518 gtk_label_new (text),
3521 gtk_box_pack_start (GTK_BOX (box),
3527 create_image (GtkWidget *widget)
3529 static GtkWidget *window = NULL;
3537 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3539 gtk_window_set_screen (GTK_WINDOW (window),
3540 gtk_widget_get_screen (widget));
3542 /* this is bogus for testing drawing when allocation < request,
3543 * don't copy into real code
3545 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
3547 g_signal_connect (window, "destroy",
3548 G_CALLBACK (gtk_widget_destroyed),
3551 vbox = gtk_vbox_new (FALSE, 5);
3553 gtk_container_add (GTK_CONTAINER (window), vbox);
3555 pack_image (vbox, "Stock Warning Dialog",
3556 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3557 GTK_ICON_SIZE_DIALOG));
3559 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
3560 gtk_widget_get_colormap (window),
3565 pack_image (vbox, "Pixmap",
3566 gtk_image_new_from_pixmap (pixmap, mask));
3569 if (!gtk_widget_get_visible (window))
3570 gtk_widget_show_all (window);
3572 gtk_widget_destroy (window);
3580 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3583 GtkWidget *menuitem;
3592 menu = gtk_menu_new ();
3593 gtk_menu_set_screen (GTK_MENU (menu), screen);
3599 menuitem = gtk_tearoff_menu_item_new ();
3600 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3601 gtk_widget_show (menuitem);
3604 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3605 GTK_ICON_SIZE_MENU);
3606 gtk_widget_show (image);
3607 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3608 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3609 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3610 gtk_widget_show (menuitem);
3612 for (i = 0, j = 1; i < length; i++, j++)
3614 sprintf (buf, "item %2d - %d", depth, j);
3616 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3617 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3619 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3620 gtk_widget_show (menuitem);
3622 gtk_widget_set_sensitive (menuitem, FALSE);
3625 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3629 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3630 create_menu (screen, depth - 1, 5, TRUE));
3637 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3640 GtkWidget *menuitem;
3646 menu = gtk_menu_new ();
3647 gtk_menu_set_screen (GTK_MENU (menu), screen);
3652 menuitem = gtk_tearoff_menu_item_new ();
3653 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3654 gtk_widget_show (menuitem);
3658 menuitem = gtk_menu_item_new_with_label ("items");
3659 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3661 submenu = gtk_menu_new ();
3662 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3663 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3664 gtk_widget_show (menuitem);
3667 /* now fill the items submenu */
3668 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3669 GTK_ICON_SIZE_MENU);
3670 gtk_widget_show (image);
3671 menuitem = gtk_image_menu_item_new_with_label ("Image");
3672 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3673 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3674 gtk_widget_show (menuitem);
3676 menuitem = gtk_menu_item_new_with_label ("x");
3677 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3678 gtk_widget_show (menuitem);
3680 menuitem = gtk_menu_item_new_with_label ("x");
3681 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3682 gtk_widget_show (menuitem);
3684 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3685 GTK_ICON_SIZE_MENU);
3686 gtk_widget_show (image);
3687 menuitem = gtk_image_menu_item_new_with_label ("Image");
3688 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3689 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3690 gtk_widget_show (menuitem);
3692 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3693 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3694 gtk_widget_show (menuitem);
3696 menuitem = gtk_menu_item_new_with_label ("x");
3697 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3698 gtk_widget_show (menuitem);
3700 menuitem = gtk_menu_item_new_with_label ("x");
3701 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3702 gtk_widget_show (menuitem);
3704 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3705 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3706 gtk_widget_show (menuitem);
3708 menuitem = gtk_check_menu_item_new_with_label ("Check");
3709 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3710 gtk_widget_show (menuitem);
3712 menuitem = gtk_menu_item_new_with_label ("x");
3713 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3714 gtk_widget_show (menuitem);
3716 menuitem = gtk_menu_item_new_with_label ("x");
3717 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3718 gtk_widget_show (menuitem);
3720 menuitem = gtk_check_menu_item_new_with_label ("Check");
3721 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3722 gtk_widget_show (menuitem);
3724 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3725 gtk_widget_show (menuitem);
3726 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3728 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3729 gtk_widget_show (menuitem);
3730 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3732 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3733 gtk_widget_show (menuitem);
3734 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3736 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3737 gtk_widget_show (menuitem);
3738 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3740 /* end of items submenu */
3742 menuitem = gtk_menu_item_new_with_label ("spanning");
3743 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3745 submenu = gtk_menu_new ();
3746 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3747 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3748 gtk_widget_show (menuitem);
3751 /* now fill the spanning submenu */
3752 menuitem = gtk_menu_item_new_with_label ("a");
3753 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3754 gtk_widget_show (menuitem);
3756 menuitem = gtk_menu_item_new_with_label ("b");
3757 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3758 gtk_widget_show (menuitem);
3760 menuitem = gtk_menu_item_new_with_label ("c");
3761 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3762 gtk_widget_show (menuitem);
3764 menuitem = gtk_menu_item_new_with_label ("d");
3765 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3766 gtk_widget_show (menuitem);
3768 menuitem = gtk_menu_item_new_with_label ("e");
3769 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3770 gtk_widget_show (menuitem);
3771 /* end of spanning submenu */
3773 menuitem = gtk_menu_item_new_with_label ("left");
3774 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3775 submenu = gtk_menu_new ();
3776 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3777 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3778 gtk_widget_show (menuitem);
3780 menuitem = gtk_menu_item_new_with_label ("Empty");
3781 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3782 submenu = gtk_menu_new ();
3783 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3784 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3785 gtk_widget_show (menuitem);
3787 menuitem = gtk_menu_item_new_with_label ("right");
3788 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3789 submenu = gtk_menu_new ();
3790 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3791 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3792 gtk_widget_show (menuitem);
3794 menuitem = gtk_menu_item_new_with_label ("Empty");
3795 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3796 gtk_widget_show (menuitem);
3800 for (; j < rows; j++)
3801 for (i = 0; i < cols; i++)
3803 sprintf (buf, "(%d %d)", i, j);
3804 menuitem = gtk_menu_item_new_with_label (buf);
3805 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3806 gtk_widget_show (menuitem);
3809 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3810 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3811 gtk_widget_show (menuitem);
3812 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3813 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3814 gtk_widget_show (menuitem);
3815 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3816 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3817 gtk_widget_show (menuitem);
3818 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3819 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3820 gtk_widget_show (menuitem);
3826 create_menus (GtkWidget *widget)
3828 static GtkWidget *window = NULL;
3832 GtkWidget *optionmenu;
3833 GtkWidget *separator;
3839 GtkWidget *menuitem;
3840 GtkAccelGroup *accel_group;
3842 GdkScreen *screen = gtk_widget_get_screen (widget);
3844 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3846 gtk_window_set_screen (GTK_WINDOW (window), screen);
3848 g_signal_connect (window, "destroy",
3849 G_CALLBACK (gtk_widget_destroyed),
3851 g_signal_connect (window, "delete-event",
3852 G_CALLBACK (gtk_true),
3855 accel_group = gtk_accel_group_new ();
3856 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3858 gtk_window_set_title (GTK_WINDOW (window), "menus");
3859 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3862 box1 = gtk_vbox_new (FALSE, 0);
3863 gtk_container_add (GTK_CONTAINER (window), box1);
3864 gtk_widget_show (box1);
3866 menubar = gtk_menu_bar_new ();
3867 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3868 gtk_widget_show (menubar);
3870 menu = create_menu (screen, 2, 50, TRUE);
3872 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3873 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3874 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3875 gtk_widget_show (menuitem);
3877 menu = create_table_menu (screen, 2, 50, TRUE);
3879 menuitem = gtk_menu_item_new_with_label ("table");
3880 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3881 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3882 gtk_widget_show (menuitem);
3884 menuitem = gtk_menu_item_new_with_label ("foo");
3885 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3886 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3887 gtk_widget_show (menuitem);
3889 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3890 GTK_ICON_SIZE_MENU);
3891 gtk_widget_show (image);
3892 menuitem = gtk_image_menu_item_new_with_label ("Help");
3893 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3894 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3895 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3896 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3897 gtk_widget_show (menuitem);
3899 menubar = gtk_menu_bar_new ();
3900 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3901 gtk_widget_show (menubar);
3903 menu = create_menu (screen, 2, 10, TRUE);
3905 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3906 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3907 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3908 gtk_widget_show (menuitem);
3910 box2 = gtk_vbox_new (FALSE, 10);
3911 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3912 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3913 gtk_widget_show (box2);
3915 menu = create_menu (screen, 1, 5, FALSE);
3916 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3918 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3919 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3920 gtk_widget_show (menuitem);
3922 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3923 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3924 gtk_widget_show (menuitem);
3925 gtk_widget_add_accelerator (menuitem,
3931 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3932 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3933 gtk_widget_show (menuitem);
3934 gtk_widget_add_accelerator (menuitem,
3939 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3940 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3941 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3942 gtk_widget_show (menuitem);
3943 gtk_widget_add_accelerator (menuitem,
3949 gtk_widget_add_accelerator (menuitem,
3956 optionmenu = gtk_combo_box_new_text ();
3957 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3958 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3959 gtk_widget_show (optionmenu);
3961 separator = gtk_hseparator_new ();
3962 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3963 gtk_widget_show (separator);
3965 box2 = gtk_vbox_new (FALSE, 10);
3966 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3967 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3968 gtk_widget_show (box2);
3970 button = gtk_button_new_with_label ("close");
3971 g_signal_connect_swapped (button, "clicked",
3972 G_CALLBACK (gtk_widget_destroy),
3974 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3975 gtk_widget_set_can_default (button, TRUE);
3976 gtk_widget_grab_default (button);
3977 gtk_widget_show (button);
3980 if (!gtk_widget_get_visible (window))
3981 gtk_widget_show (window);
3983 gtk_widget_destroy (window);
3986 /* GdkPixbuf RGBA C-Source image dump */
3988 static const guint8 apple[] =
3990 /* Pixbuf magic (0x47646b50) */
3992 /* length: header (24) + pixel_data (2304) */
3994 /* pixdata_type (0x1010002) */
3996 /* rowstride (96) */
4003 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4004 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4005 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4006 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4007 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4008 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4009 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\24"
4010 "\17\11\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4011 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`m"
4012 "[pn{a\344hv_\345_k[`\0\0\0\0\0\0\0\0\0\0\0\0D>/\305\0\0\0_\0\0\0\0\0"
4013 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4014 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`l[Blza\373s\202d\354w\206g\372p~c"
4015 "\374`l[y\0\0\0\0[S\77/\27\25\17\335\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0"
4016 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4017 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
4018 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
4019 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0eq"
4020 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
4021 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
4022 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ly`\40p~b\360lz`\353^kY\246["
4023 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
4024 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
4025 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
4026 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
4027 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
4028 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
4029 "ff@\377QT5\377LR2d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0]iW(\0\0\0\0\0\0\0"
4030 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
4031 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
4032 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
4033 "\377SW6\377RX6\364Za<\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b]@\20"
4034 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
4035 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
4036 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
4037 "wvL\377X]:\377KR0\377NU5v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\212"
4038 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
4039 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
4040 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
4041 "ttJ\377[_<\377HO/\377GN0\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4042 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
4043 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
4044 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
4045 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4046 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
4047 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
4048 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
4049 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4050 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
4051 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
4052 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
4053 "\377HP0\377@H+\373CJ-\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0xxO>"
4054 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
4055 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
4056 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
4057 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\205W\312\216\220`\377\230"
4058 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
4059 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
4060 "\377=D)\377HQ1:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4061 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
4062 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
4063 "R[;\377BJ-\3778@'\317\0\0\0>\0\0\0\36\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0"
4064 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
4065 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
4066 "\376\0\0\0\347\0\0\0\262\0\0\0Y\0\0\0\32\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4067 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
4068 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
4069 "\0\0\374\0\0\0\320\0\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4070 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
4071 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
4072 "\0\0\0\347\0\0\0\217\0\0\0""4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4073 "\0\0\0\0\0\0\0\20\0\0\0P\0\0\0\252\7\10\5\346\7\7\5\375\0\0\0\377\0\0"
4074 "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\374\0"
4075 "\0\0\336\0\0\0\254\0\0\0i\0\0\0""2\0\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0"
4076 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\0\0\0\40\0\0\0D\0\0\0m\0\0\0"
4077 "\226\0\0\0\234\0\0\0\234\0\0\0\244\0\0\0\246\0\0\0\232\0\0\0\202\0\0"
4078 "\0i\0\0\0T\0\0\0,\0\0\0\15\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
4079 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\6\0\0\0"
4080 "\16\0\0\0\22\0\0\0\24\0\0\0\23\0\0\0\17\0\0\0\14\0\0\0\13\0\0\0\10\0"
4081 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
4085 dump_accels (gpointer callback_data,
4086 guint callback_action,
4089 gtk_accel_map_save_fd (1 /* stdout */);
4093 accel_button_new (GtkAccelGroup *accel_group,
4098 GdkModifierType modifiers;
4102 gtk_accelerator_parse (accel, &keyval, &modifiers);
4105 button = gtk_button_new ();
4106 gtk_widget_add_accelerator (button, "activate", accel_group,
4107 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4109 label = gtk_accel_label_new (text);
4110 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4111 gtk_widget_show (label);
4113 gtk_container_add (GTK_CONTAINER (button), label);
4119 create_key_lookup (GtkWidget *widget)
4121 static GtkWidget *window = NULL;
4122 gpointer window_ptr;
4126 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4129 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4130 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4133 gtk_window_set_screen (GTK_WINDOW (window),
4134 gtk_widget_get_screen (widget));
4136 /* We have to expand it so the accel labels will draw their labels
4138 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4140 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4142 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4143 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4144 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4145 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4146 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4147 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4148 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4149 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4150 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4151 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4152 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4153 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4154 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4155 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4156 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4157 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4158 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4159 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4160 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4161 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4162 button = accel_button_new (accel_group, "Button 12", "<Super>a");
4163 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4164 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
4165 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4166 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
4167 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4168 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
4169 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4171 window_ptr = &window;
4172 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
4173 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4175 gtk_widget_show_all (window);
4178 gtk_widget_destroy (window);
4187 cmw_destroy_cb(GtkWidget *widget)
4189 /* This is needed to get out of gtk_main */
4196 cmw_color (GtkWidget *widget, GtkWidget *parent)
4200 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4202 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4204 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4208 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4210 /* And mark it as a transient dialog */
4211 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4213 g_signal_connect (csd, "destroy",
4214 G_CALLBACK (cmw_destroy_cb), NULL);
4216 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4217 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4218 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4219 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4221 /* wait until destroy calls gtk_main_quit */
4222 gtk_widget_show (csd);
4227 cmw_file (GtkWidget *widget, GtkWidget *parent)
4231 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
4232 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
4233 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
4234 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
4236 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4237 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
4239 g_signal_connect (fs, "destroy",
4240 G_CALLBACK (cmw_destroy_cb), NULL);
4241 g_signal_connect_swapped (fs, "response",
4242 G_CALLBACK (gtk_widget_destroy), fs);
4244 /* wait until destroy calls gtk_main_quit */
4245 gtk_widget_show (fs);
4251 create_modal_window (GtkWidget *widget)
4253 GtkWidget *window = NULL;
4254 GtkWidget *box1,*box2;
4256 GtkWidget *btnColor,*btnFile,*btnClose;
4258 /* Create modal window (Here you can use any window descendent )*/
4259 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4260 gtk_window_set_screen (GTK_WINDOW (window),
4261 gtk_widget_get_screen (widget));
4263 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4265 /* Set window as modal */
4266 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4268 /* Create widgets */
4269 box1 = gtk_vbox_new (FALSE,5);
4270 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4271 box2 = gtk_vbox_new (TRUE,5);
4272 btnColor = gtk_button_new_with_label ("Color");
4273 btnFile = gtk_button_new_with_label ("File Selection");
4274 btnClose = gtk_button_new_with_label ("Close");
4277 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4278 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4281 gtk_container_add (GTK_CONTAINER (window), box1);
4282 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4283 gtk_container_add (GTK_CONTAINER (frame1), box2);
4284 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4285 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4286 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4287 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4289 /* connect signals */
4290 g_signal_connect_swapped (btnClose, "clicked",
4291 G_CALLBACK (gtk_widget_destroy), window);
4293 g_signal_connect (window, "destroy",
4294 G_CALLBACK (cmw_destroy_cb), NULL);
4296 g_signal_connect (btnColor, "clicked",
4297 G_CALLBACK (cmw_color), window);
4298 g_signal_connect (btnFile, "clicked",
4299 G_CALLBACK (cmw_file), window);
4302 gtk_widget_show_all (window);
4304 /* wait until dialog get destroyed */
4313 make_message_dialog (GdkScreen *screen,
4315 GtkMessageType type,
4316 GtkButtonsType buttons,
4317 guint default_response)
4321 gtk_widget_destroy (*dialog);
4326 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4327 "This is a message dialog; it can wrap long lines. This is a long line. La la la. Look this line is wrapped. Blah blah blah blah blah blah. (Note: testgtk has a nonstandard gtkrc that changes some of the message dialog icons.)");
4329 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4331 g_signal_connect_swapped (*dialog,
4333 G_CALLBACK (gtk_widget_destroy),
4336 g_signal_connect (*dialog,
4338 G_CALLBACK (gtk_widget_destroyed),
4341 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4343 gtk_widget_show (*dialog);
4347 create_message_dialog (GtkWidget *widget)
4349 static GtkWidget *info = NULL;
4350 static GtkWidget *warning = NULL;
4351 static GtkWidget *error = NULL;
4352 static GtkWidget *question = NULL;
4353 GdkScreen *screen = gtk_widget_get_screen (widget);
4355 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4356 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
4357 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4358 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
4365 static GtkWidget *sw_parent = NULL;
4366 static GtkWidget *sw_float_parent;
4367 static guint sw_destroyed_handler = 0;
4370 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4372 gtk_widget_reparent (scrollwin, sw_parent);
4374 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4375 sw_float_parent = NULL;
4377 sw_destroyed_handler = 0;
4383 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4385 gtk_widget_destroy (sw_float_parent);
4387 sw_float_parent = NULL;
4389 sw_destroyed_handler = 0;
4393 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4397 gtk_widget_reparent (scrollwin, sw_parent);
4398 gtk_widget_destroy (sw_float_parent);
4400 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4401 sw_float_parent = NULL;
4403 sw_destroyed_handler = 0;
4407 sw_parent = scrollwin->parent;
4408 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4409 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4410 gtk_widget_get_screen (widget));
4412 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4414 gtk_widget_reparent (scrollwin, sw_float_parent);
4415 gtk_widget_show (sw_float_parent);
4417 sw_destroyed_handler =
4418 g_signal_connect (sw_parent, "destroy",
4419 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4420 g_signal_connect (sw_float_parent, "delete_event",
4421 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4426 create_scrolled_windows (GtkWidget *widget)
4428 static GtkWidget *window;
4429 GtkWidget *scrolled_window;
4437 window = gtk_dialog_new ();
4439 gtk_window_set_screen (GTK_WINDOW (window),
4440 gtk_widget_get_screen (widget));
4442 g_signal_connect (window, "destroy",
4443 G_CALLBACK (gtk_widget_destroyed),
4446 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4447 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4450 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4451 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4452 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4453 GTK_POLICY_AUTOMATIC,
4454 GTK_POLICY_AUTOMATIC);
4455 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
4456 scrolled_window, TRUE, TRUE, 0);
4457 gtk_widget_show (scrolled_window);
4459 table = gtk_table_new (20, 20, FALSE);
4460 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4461 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4462 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4463 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4464 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4465 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4466 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4467 gtk_widget_show (table);
4469 for (i = 0; i < 20; i++)
4470 for (j = 0; j < 20; j++)
4472 sprintf (buffer, "button (%d,%d)\n", i, j);
4473 button = gtk_toggle_button_new_with_label (buffer);
4474 gtk_table_attach_defaults (GTK_TABLE (table), button,
4476 gtk_widget_show (button);
4480 button = gtk_button_new_with_label ("Close");
4481 g_signal_connect_swapped (button, "clicked",
4482 G_CALLBACK (gtk_widget_destroy),
4484 gtk_widget_set_can_default (button, TRUE);
4485 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4486 button, TRUE, TRUE, 0);
4487 gtk_widget_grab_default (button);
4488 gtk_widget_show (button);
4490 button = gtk_button_new_with_label ("Reparent Out");
4491 g_signal_connect (button, "clicked",
4492 G_CALLBACK (scrolled_windows_remove),
4494 gtk_widget_set_can_default (button, TRUE);
4495 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4496 button, TRUE, TRUE, 0);
4497 gtk_widget_grab_default (button);
4498 gtk_widget_show (button);
4500 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4503 if (!gtk_widget_get_visible (window))
4504 gtk_widget_show (window);
4506 gtk_widget_destroy (window);
4514 entry_toggle_frame (GtkWidget *checkbutton,
4517 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4518 GTK_TOGGLE_BUTTON(checkbutton)->active);
4522 entry_toggle_sensitive (GtkWidget *checkbutton,
4525 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4529 entry_progress_timeout (gpointer data)
4531 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
4533 gtk_entry_progress_pulse (GTK_ENTRY (data));
4539 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
4542 if (fraction > 1.0001)
4545 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
4552 entry_remove_timeout (gpointer data)
4554 g_source_remove (GPOINTER_TO_UINT (data));
4558 entry_toggle_progress (GtkWidget *checkbutton,
4561 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
4563 guint timeout = gdk_threads_add_timeout (100,
4564 entry_progress_timeout,
4566 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
4567 GUINT_TO_POINTER (timeout),
4568 entry_remove_timeout);
4572 g_object_set_data (G_OBJECT (entry), "timeout-id",
4573 GUINT_TO_POINTER (0));
4575 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
4580 entry_toggle_pulse (GtkWidget *checkbutton,
4583 g_object_set_data (G_OBJECT (entry), "progress-pulse",
4584 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
4588 props_clicked (GtkWidget *button,
4591 GtkWidget *window = create_prop_editor (object, 0);
4593 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
4597 create_entry (GtkWidget *widget)
4599 static GtkWidget *window = NULL;
4603 GtkWidget *has_frame_check;
4604 GtkWidget *sensitive_check;
4605 GtkWidget *progress_check;
4608 GtkWidget *cb_entry;
4610 GtkWidget *separator;
4614 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4615 gtk_window_set_screen (GTK_WINDOW (window),
4616 gtk_widget_get_screen (widget));
4618 g_signal_connect (window, "destroy",
4619 G_CALLBACK (gtk_widget_destroyed),
4622 gtk_window_set_title (GTK_WINDOW (window), "entry");
4623 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4626 box1 = gtk_vbox_new (FALSE, 0);
4627 gtk_container_add (GTK_CONTAINER (window), box1);
4630 box2 = gtk_vbox_new (FALSE, 10);
4631 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4632 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4634 hbox = gtk_hbox_new (FALSE, 5);
4635 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4637 entry = gtk_entry_new ();
4638 gtk_entry_set_text (GTK_ENTRY (entry), "hello world \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205");
4639 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4640 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4642 button = gtk_button_new_with_mnemonic ("_Props");
4643 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4644 g_signal_connect (button, "clicked",
4645 G_CALLBACK (props_clicked),
4648 cb = GTK_COMBO_BOX (gtk_combo_box_entry_new_text ());
4649 gtk_combo_box_append_text (cb, "item0");
4650 gtk_combo_box_append_text (cb, "item0");
4651 gtk_combo_box_append_text (cb, "item1 item1");
4652 gtk_combo_box_append_text (cb, "item2 item2 item2");
4653 gtk_combo_box_append_text (cb, "item3 item3 item3 item3");
4654 gtk_combo_box_append_text (cb, "item4 item4 item4 item4 item4");
4655 gtk_combo_box_append_text (cb, "item5 item5 item5 item5 item5 item5");
4656 gtk_combo_box_append_text (cb, "item6 item6 item6 item6 item6");
4657 gtk_combo_box_append_text (cb, "item7 item7 item7 item7");
4658 gtk_combo_box_append_text (cb, "item8 item8 item8");
4659 gtk_combo_box_append_text (cb, "item9 item9");
4661 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4662 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4663 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4664 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4666 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4667 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4668 g_signal_connect (sensitive_check, "toggled",
4669 G_CALLBACK (entry_toggle_sensitive), entry);
4670 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4672 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4673 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4674 g_signal_connect (has_frame_check, "toggled",
4675 G_CALLBACK (entry_toggle_frame), entry);
4676 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4678 progress_check = gtk_check_button_new_with_label("Show Progress");
4679 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4680 g_signal_connect (progress_check, "toggled",
4681 G_CALLBACK (entry_toggle_progress), entry);
4683 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4684 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4685 g_signal_connect (progress_check, "toggled",
4686 G_CALLBACK (entry_toggle_pulse), entry);
4688 separator = gtk_hseparator_new ();
4689 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4691 box2 = gtk_vbox_new (FALSE, 10);
4692 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4693 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4695 button = gtk_button_new_with_label ("close");
4696 g_signal_connect_swapped (button, "clicked",
4697 G_CALLBACK (gtk_widget_destroy),
4699 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4700 gtk_widget_set_can_default (button, TRUE);
4701 gtk_widget_grab_default (button);
4704 if (!gtk_widget_get_visible (window))
4705 gtk_widget_show_all (window);
4707 gtk_widget_destroy (window);
4711 create_expander (GtkWidget *widget)
4714 GtkWidget *expander;
4716 static GtkWidget *window = NULL;
4720 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4721 gtk_window_set_screen (GTK_WINDOW (window),
4722 gtk_widget_get_screen (widget));
4724 g_signal_connect (window, "destroy",
4725 G_CALLBACK (gtk_widget_destroyed),
4728 gtk_window_set_title (GTK_WINDOW (window), "expander");
4729 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4731 box1 = gtk_vbox_new (FALSE, 0);
4732 gtk_container_add (GTK_CONTAINER (window), box1);
4734 expander = gtk_expander_new ("The Hidden");
4736 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4738 hidden = gtk_label_new ("Revealed!");
4740 gtk_container_add (GTK_CONTAINER (expander), hidden);
4743 if (!gtk_widget_get_visible (window))
4744 gtk_widget_show_all (window);
4746 gtk_widget_destroy (window);
4754 event_box_label_pressed (GtkWidget *widget,
4755 GdkEventButton *event,
4758 g_print ("clicked on event box\n");
4762 event_box_button_clicked (GtkWidget *widget,
4766 g_print ("pushed button\n");
4770 event_box_toggle_visible_window (GtkWidget *checkbutton,
4771 GtkEventBox *event_box)
4773 gtk_event_box_set_visible_window (event_box,
4774 GTK_TOGGLE_BUTTON(checkbutton)->active);
4778 event_box_toggle_above_child (GtkWidget *checkbutton,
4779 GtkEventBox *event_box)
4781 gtk_event_box_set_above_child (event_box,
4782 GTK_TOGGLE_BUTTON(checkbutton)->active);
4786 create_event_box (GtkWidget *widget)
4788 static GtkWidget *window = NULL;
4794 GtkWidget *separator;
4795 GtkWidget *event_box;
4797 GtkWidget *visible_window_check;
4798 GtkWidget *above_child_check;
4807 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4808 gtk_window_set_screen (GTK_WINDOW (window),
4809 gtk_widget_get_screen (widget));
4811 g_signal_connect (window, "destroy",
4812 G_CALLBACK (gtk_widget_destroyed),
4815 gtk_window_set_title (GTK_WINDOW (window), "event box");
4816 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4818 box1 = gtk_vbox_new (FALSE, 0);
4819 gtk_container_add (GTK_CONTAINER (window), box1);
4820 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4822 hbox = gtk_hbox_new (FALSE, 0);
4823 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4825 event_box = gtk_event_box_new ();
4826 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4828 vbox = gtk_vbox_new (FALSE, 0);
4829 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4830 g_signal_connect (event_box, "button_press_event",
4831 G_CALLBACK (event_box_label_pressed),
4834 label = gtk_label_new ("Click on this label");
4835 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4837 button = gtk_button_new_with_label ("button in eventbox");
4838 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4839 g_signal_connect (button, "clicked",
4840 G_CALLBACK (event_box_button_clicked),
4844 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4845 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4846 g_signal_connect (visible_window_check, "toggled",
4847 G_CALLBACK (event_box_toggle_visible_window), event_box);
4848 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4850 above_child_check = gtk_check_button_new_with_label("Above Child");
4851 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4852 g_signal_connect (above_child_check, "toggled",
4853 G_CALLBACK (event_box_toggle_above_child), event_box);
4854 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4856 separator = gtk_hseparator_new ();
4857 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4859 box2 = gtk_vbox_new (FALSE, 10);
4860 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4861 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4863 button = gtk_button_new_with_label ("close");
4864 g_signal_connect_swapped (button, "clicked",
4865 G_CALLBACK (gtk_widget_destroy),
4867 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4868 gtk_widget_set_can_default (button, TRUE);
4869 gtk_widget_grab_default (button);
4872 if (!gtk_widget_get_visible (window))
4873 gtk_widget_show_all (window);
4875 gtk_widget_destroy (window);
4883 #define SIZE_GROUP_INITIAL_SIZE 50
4886 size_group_hsize_changed (GtkSpinButton *spin_button,
4889 gtk_widget_set_size_request (GTK_BIN (button)->child,
4890 gtk_spin_button_get_value_as_int (spin_button),
4895 size_group_vsize_changed (GtkSpinButton *spin_button,
4898 gtk_widget_set_size_request (GTK_BIN (button)->child,
4900 gtk_spin_button_get_value_as_int (spin_button));
4904 create_size_group_window (GdkScreen *screen,
4905 GtkSizeGroup *master_size_group)
4909 GtkWidget *main_button;
4911 GtkWidget *spin_button;
4913 GtkSizeGroup *hgroup1;
4914 GtkSizeGroup *hgroup2;
4915 GtkSizeGroup *vgroup1;
4916 GtkSizeGroup *vgroup2;
4918 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4924 gtk_window_set_screen (GTK_WINDOW (window), screen);
4926 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4928 g_signal_connect (window, "response",
4929 G_CALLBACK (gtk_widget_destroy),
4932 table = gtk_table_new (2, 2, FALSE);
4933 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
4935 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4936 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4937 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4938 gtk_widget_set_size_request (table, 250, 250);
4940 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4941 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4942 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4943 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4945 main_button = gtk_button_new_with_label ("X");
4947 gtk_table_attach (GTK_TABLE (table), main_button,
4949 GTK_EXPAND, GTK_EXPAND,
4951 gtk_size_group_add_widget (master_size_group, main_button);
4952 gtk_size_group_add_widget (hgroup1, main_button);
4953 gtk_size_group_add_widget (vgroup1, main_button);
4954 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
4955 SIZE_GROUP_INITIAL_SIZE,
4956 SIZE_GROUP_INITIAL_SIZE);
4958 button = gtk_button_new ();
4959 gtk_table_attach (GTK_TABLE (table), button,
4961 GTK_EXPAND, GTK_EXPAND,
4963 gtk_size_group_add_widget (vgroup1, button);
4964 gtk_size_group_add_widget (vgroup2, button);
4966 button = gtk_button_new ();
4967 gtk_table_attach (GTK_TABLE (table), button,
4969 GTK_EXPAND, GTK_EXPAND,
4971 gtk_size_group_add_widget (hgroup1, button);
4972 gtk_size_group_add_widget (hgroup2, button);
4974 button = gtk_button_new ();
4975 gtk_table_attach (GTK_TABLE (table), button,
4977 GTK_EXPAND, GTK_EXPAND,
4979 gtk_size_group_add_widget (hgroup2, button);
4980 gtk_size_group_add_widget (vgroup2, button);
4982 g_object_unref (hgroup1);
4983 g_object_unref (hgroup2);
4984 g_object_unref (vgroup1);
4985 g_object_unref (vgroup2);
4987 hbox = gtk_hbox_new (FALSE, 5);
4988 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
4990 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4991 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4992 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4993 g_signal_connect (spin_button, "value_changed",
4994 G_CALLBACK (size_group_hsize_changed), main_button);
4996 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4997 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4998 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4999 g_signal_connect (spin_button, "value_changed",
5000 G_CALLBACK (size_group_vsize_changed), main_button);
5006 create_size_groups (GtkWidget *widget)
5008 static GtkWidget *window1 = NULL;
5009 static GtkWidget *window2 = NULL;
5010 static GtkSizeGroup *master_size_group;
5012 if (!master_size_group)
5013 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
5017 window1 = create_size_group_window (gtk_widget_get_screen (widget),
5020 g_signal_connect (window1, "destroy",
5021 G_CALLBACK (gtk_widget_destroyed),
5027 window2 = create_size_group_window (gtk_widget_get_screen (widget),
5030 g_signal_connect (window2, "destroy",
5031 G_CALLBACK (gtk_widget_destroyed),
5035 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
5037 gtk_widget_destroy (window1);
5038 gtk_widget_destroy (window2);
5042 if (!gtk_widget_get_visible (window1))
5043 gtk_widget_show_all (window1);
5044 if (!gtk_widget_get_visible (window2))
5045 gtk_widget_show_all (window2);
5053 static GtkWidget *spinner1;
5056 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
5058 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
5062 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
5064 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
5068 change_digits (GtkWidget *widget, GtkSpinButton *spin)
5070 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
5071 gtk_spin_button_get_value_as_int (spin));
5075 get_value (GtkWidget *widget, gpointer data)
5079 GtkSpinButton *spin;
5081 spin = GTK_SPIN_BUTTON (spinner1);
5082 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
5083 if (GPOINTER_TO_INT (data) == 1)
5084 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
5086 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
5087 gtk_label_set_text (label, buf);
5091 get_spin_value (GtkWidget *widget, gpointer data)
5095 GtkSpinButton *spin;
5097 spin = GTK_SPIN_BUTTON (widget);
5098 label = GTK_LABEL (data);
5100 buffer = g_strdup_printf ("%0.*f", spin->digits,
5101 gtk_spin_button_get_value (spin));
5102 gtk_label_set_text (label, buffer);
5108 spin_button_time_output_func (GtkSpinButton *spin_button)
5110 static gchar buf[6];
5114 hours = spin_button->adjustment->value / 60.0;
5115 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
5116 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
5117 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5118 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5123 spin_button_month_input_func (GtkSpinButton *spin_button,
5127 static gchar *month[12] = { "January", "February", "March", "April",
5128 "May", "June", "July", "August",
5129 "September", "October", "November", "December" };
5131 gboolean found = FALSE;
5133 for (i = 1; i <= 12; i++)
5135 tmp1 = g_ascii_strup (month[i - 1], -1);
5136 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
5137 if (strstr (tmp1, tmp2) == tmp1)
5147 return GTK_INPUT_ERROR;
5149 *new_val = (gdouble) i;
5154 spin_button_month_output_func (GtkSpinButton *spin_button)
5157 static gchar *month[12] = { "January", "February", "March", "April",
5158 "May", "June", "July", "August", "September",
5159 "October", "November", "December" };
5161 for (i = 1; i <= 12; i++)
5162 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5164 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5165 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5171 spin_button_hex_input_func (GtkSpinButton *spin_button,
5178 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5179 res = strtol(buf, &err, 16);
5182 return GTK_INPUT_ERROR;
5188 spin_button_hex_output_func (GtkSpinButton *spin_button)
5190 static gchar buf[7];
5193 val = (gint) spin_button->adjustment->value;
5194 if (fabs (val) < 1e-5)
5195 sprintf (buf, "0x00");
5197 sprintf (buf, "0x%.2X", val);
5198 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5199 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5204 create_spins (GtkWidget *widget)
5206 static GtkWidget *window = NULL;
5209 GtkWidget *main_vbox;
5212 GtkWidget *spinner2;
5216 GtkWidget *val_label;
5221 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5222 gtk_window_set_screen (GTK_WINDOW (window),
5223 gtk_widget_get_screen (widget));
5225 g_signal_connect (window, "destroy",
5226 G_CALLBACK (gtk_widget_destroyed),
5229 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5231 main_vbox = gtk_vbox_new (FALSE, 5);
5232 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5233 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5235 frame = gtk_frame_new ("Not accelerated");
5236 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5238 vbox = gtk_vbox_new (FALSE, 0);
5239 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5240 gtk_container_add (GTK_CONTAINER (frame), vbox);
5242 /* Time, month, hex spinners */
5244 hbox = gtk_hbox_new (FALSE, 0);
5245 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5247 vbox2 = gtk_vbox_new (FALSE, 0);
5248 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5250 label = gtk_label_new ("Time :");
5251 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5252 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5254 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5255 spinner = gtk_spin_button_new (adj, 0, 0);
5256 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5257 g_signal_connect (spinner,
5259 G_CALLBACK (spin_button_time_output_func),
5261 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5262 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
5263 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5265 vbox2 = gtk_vbox_new (FALSE, 0);
5266 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5268 label = gtk_label_new ("Month :");
5269 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5270 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5272 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5274 spinner = gtk_spin_button_new (adj, 0, 0);
5275 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5276 GTK_UPDATE_IF_VALID);
5277 g_signal_connect (spinner,
5279 G_CALLBACK (spin_button_month_input_func),
5281 g_signal_connect (spinner,
5283 G_CALLBACK (spin_button_month_output_func),
5285 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5286 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
5287 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5289 vbox2 = gtk_vbox_new (FALSE, 0);
5290 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5292 label = gtk_label_new ("Hex :");
5293 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5294 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5296 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5297 spinner = gtk_spin_button_new (adj, 0, 0);
5298 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5299 g_signal_connect (spinner,
5301 G_CALLBACK (spin_button_hex_input_func),
5303 g_signal_connect (spinner,
5305 G_CALLBACK (spin_button_hex_output_func),
5307 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5308 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
5309 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5311 frame = gtk_frame_new ("Accelerated");
5312 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5314 vbox = gtk_vbox_new (FALSE, 0);
5315 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5316 gtk_container_add (GTK_CONTAINER (frame), vbox);
5318 hbox = gtk_hbox_new (FALSE, 0);
5319 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5321 vbox2 = gtk_vbox_new (FALSE, 0);
5322 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5324 label = gtk_label_new ("Value :");
5325 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5326 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5328 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
5330 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5331 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5332 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
5334 vbox2 = gtk_vbox_new (FALSE, 0);
5335 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5337 label = gtk_label_new ("Digits :");
5338 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5339 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5341 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
5342 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
5343 g_signal_connect (adj, "value_changed",
5344 G_CALLBACK (change_digits),
5346 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
5348 hbox = gtk_hbox_new (FALSE, 0);
5349 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
5351 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
5352 g_signal_connect (button, "clicked",
5353 G_CALLBACK (toggle_snap),
5355 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5356 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5358 button = gtk_check_button_new_with_label ("Numeric only input mode");
5359 g_signal_connect (button, "clicked",
5360 G_CALLBACK (toggle_numeric),
5362 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5363 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5365 val_label = gtk_label_new ("");
5367 hbox = gtk_hbox_new (FALSE, 0);
5368 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5370 button = gtk_button_new_with_label ("Value as Int");
5371 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5372 g_signal_connect (button, "clicked",
5373 G_CALLBACK (get_value),
5374 GINT_TO_POINTER (1));
5375 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5377 button = gtk_button_new_with_label ("Value as Float");
5378 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5379 g_signal_connect (button, "clicked",
5380 G_CALLBACK (get_value),
5381 GINT_TO_POINTER (2));
5382 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5384 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
5385 gtk_label_set_text (GTK_LABEL (val_label), "0");
5387 frame = gtk_frame_new ("Using Convenience Constructor");
5388 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5390 hbox = gtk_hbox_new (FALSE, 0);
5391 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5392 gtk_container_add (GTK_CONTAINER (frame), hbox);
5394 val_label = gtk_label_new ("0.0");
5396 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5397 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5398 g_signal_connect (spinner, "value_changed",
5399 G_CALLBACK (get_spin_value), val_label);
5400 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5401 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5403 hbox = gtk_hbox_new (FALSE, 0);
5404 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5406 button = gtk_button_new_with_label ("Close");
5407 g_signal_connect_swapped (button, "clicked",
5408 G_CALLBACK (gtk_widget_destroy),
5410 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5413 if (!gtk_widget_get_visible (window))
5414 gtk_widget_show_all (window);
5416 gtk_widget_destroy (window);
5425 cursor_expose_event (GtkWidget *widget,
5429 GtkDrawingArea *darea;
5430 GdkDrawable *drawable;
5437 g_return_val_if_fail (widget != NULL, TRUE);
5438 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5440 darea = GTK_DRAWING_AREA (widget);
5441 drawable = widget->window;
5442 white_gc = widget->style->white_gc;
5443 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5444 black_gc = widget->style->black_gc;
5445 max_width = widget->allocation.width;
5446 max_height = widget->allocation.height;
5448 gdk_draw_rectangle (drawable, white_gc,
5455 gdk_draw_rectangle (drawable, black_gc,
5462 gdk_draw_rectangle (drawable, gray_gc,
5473 set_cursor (GtkWidget *spinner,
5482 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5485 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5487 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
5488 vals = class->values;
5490 while (vals && vals->value != c)
5493 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5495 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5497 g_type_class_unref (class);
5499 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5500 gdk_window_set_cursor (widget->window, cursor);
5501 gdk_cursor_unref (cursor);
5505 cursor_event (GtkWidget *widget,
5507 GtkSpinButton *spinner)
5509 if ((event->type == GDK_BUTTON_PRESS) &&
5510 ((event->button.button == 1) ||
5511 (event->button.button == 3)))
5513 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5514 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5521 #ifdef GDK_WINDOWING_X11
5522 #include "x11/gdkx.h"
5525 change_cursor_theme (GtkWidget *widget,
5532 children = gtk_container_get_children (GTK_CONTAINER (data));
5534 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
5535 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
5537 g_list_free (children);
5539 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
5546 create_cursors (GtkWidget *widget)
5548 static GtkWidget *window = NULL;
5551 GtkWidget *main_vbox;
5564 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5565 gtk_window_set_screen (GTK_WINDOW (window),
5566 gtk_widget_get_screen (widget));
5568 g_signal_connect (window, "destroy",
5569 G_CALLBACK (gtk_widget_destroyed),
5572 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5574 main_vbox = gtk_vbox_new (FALSE, 5);
5575 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5576 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5579 g_object_new (gtk_vbox_get_type (),
5580 "GtkBox::homogeneous", FALSE,
5581 "GtkBox::spacing", 5,
5582 "GtkContainer::border_width", 10,
5583 "GtkWidget::parent", main_vbox,
5584 "GtkWidget::visible", TRUE,
5587 #ifdef GDK_WINDOWING_X11
5588 hbox = gtk_hbox_new (FALSE, 0);
5589 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5590 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5592 label = gtk_label_new ("Cursor Theme : ");
5593 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5594 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5596 entry = gtk_entry_new ();
5597 gtk_entry_set_text (GTK_ENTRY (entry), "default");
5598 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
5600 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
5601 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
5602 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5604 g_signal_connect (entry, "changed",
5605 G_CALLBACK (change_cursor_theme), hbox);
5606 g_signal_connect (size, "changed",
5607 G_CALLBACK (change_cursor_theme), hbox);
5610 hbox = gtk_hbox_new (FALSE, 0);
5611 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5612 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5614 label = gtk_label_new ("Cursor Value : ");
5615 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5616 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5618 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5622 spinner = gtk_spin_button_new (adj, 0, 0);
5623 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5626 g_object_new (gtk_frame_get_type (),
5627 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5628 "GtkFrame::label_xalign", 0.5,
5629 "GtkFrame::label", "Cursor Area",
5630 "GtkContainer::border_width", 10,
5631 "GtkWidget::parent", vbox,
5632 "GtkWidget::visible", TRUE,
5635 darea = gtk_drawing_area_new ();
5636 gtk_widget_set_size_request (darea, 80, 80);
5637 gtk_container_add (GTK_CONTAINER (frame), darea);
5638 g_signal_connect (darea,
5640 G_CALLBACK (cursor_expose_event),
5642 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5643 g_signal_connect (darea,
5644 "button_press_event",
5645 G_CALLBACK (cursor_event),
5647 gtk_widget_show (darea);
5649 g_signal_connect (spinner, "changed",
5650 G_CALLBACK (set_cursor),
5653 label = g_object_new (GTK_TYPE_LABEL,
5658 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5661 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5664 g_object_new (gtk_hseparator_get_type (),
5665 "GtkWidget::visible", TRUE,
5667 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5669 hbox = gtk_hbox_new (FALSE, 0);
5670 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5671 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5673 button = gtk_button_new_with_label ("Close");
5674 g_signal_connect_swapped (button, "clicked",
5675 G_CALLBACK (gtk_widget_destroy),
5677 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5679 gtk_widget_show_all (window);
5681 set_cursor (spinner, darea);
5684 gtk_widget_destroy (window);
5692 color_selection_ok (GtkWidget *w,
5693 GtkColorSelectionDialog *cs)
5695 GtkWidget *colorsel;
5698 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5700 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5701 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5705 color_selection_changed (GtkWidget *w,
5706 GtkColorSelectionDialog *cs)
5708 GtkWidget *colorsel;
5711 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5712 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5713 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5718 opacity_toggled_cb (GtkWidget *w,
5719 GtkColorSelectionDialog *cs)
5721 GtkColorSelection *colorsel;
5723 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5724 gtk_color_selection_set_has_opacity_control (colorsel,
5725 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5729 palette_toggled_cb (GtkWidget *w,
5730 GtkColorSelectionDialog *cs)
5732 GtkColorSelection *colorsel;
5734 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5735 gtk_color_selection_set_has_palette (colorsel,
5736 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5741 create_color_selection (GtkWidget *widget)
5743 static GtkWidget *window = NULL;
5752 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5753 gtk_window_set_screen (GTK_WINDOW (window),
5754 gtk_widget_get_screen (widget));
5756 g_signal_connect (window, "destroy",
5757 G_CALLBACK (gtk_widget_destroyed),
5760 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5761 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5763 hbox = gtk_hbox_new (FALSE, 8);
5764 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5765 gtk_container_add (GTK_CONTAINER (window), hbox);
5767 label = gtk_label_new ("Pick a color");
5768 gtk_container_add (GTK_CONTAINER (hbox), label);
5770 picker = gtk_color_button_new ();
5771 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5772 gtk_container_add (GTK_CONTAINER (hbox), picker);
5774 button = gtk_button_new_with_mnemonic ("_Props");
5775 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5776 g_signal_connect (button, "clicked",
5777 G_CALLBACK (props_clicked),
5781 if (!gtk_widget_get_visible (window))
5782 gtk_widget_show_all (window);
5784 gtk_widget_destroy (window);
5788 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5790 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5791 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5793 gtk_widget_set_default_direction (new_direction);
5797 orientable_toggle_orientation (GtkOrientable *orientable)
5799 GtkOrientation orientation;
5801 orientation = gtk_orientable_get_orientation (orientable);
5802 gtk_orientable_set_orientation (orientable,
5803 orientation == GTK_ORIENTATION_HORIZONTAL ?
5804 GTK_ORIENTATION_VERTICAL :
5805 GTK_ORIENTATION_HORIZONTAL);
5807 if (GTK_IS_CONTAINER (orientable))
5812 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5814 for (child = children; child; child = child->next)
5816 if (GTK_IS_ORIENTABLE (child->data))
5817 orientable_toggle_orientation (child->data);
5820 g_list_free (children);
5825 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5827 orientable_toggle_orientation (GTK_ORIENTABLE (GTK_DIALOG (gtk_widget_get_toplevel (widget))->vbox));
5831 set_direction_recurse (GtkWidget *widget,
5834 GtkTextDirection *dir = data;
5836 gtk_widget_set_direction (widget, *dir);
5837 if (GTK_IS_CONTAINER (widget))
5838 gtk_container_foreach (GTK_CONTAINER (widget),
5839 set_direction_recurse,
5844 create_forward_back (const char *title,
5845 GtkTextDirection text_dir)
5847 GtkWidget *frame = gtk_frame_new (title);
5848 GtkWidget *bbox = gtk_hbutton_box_new ();
5849 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5850 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5852 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5854 gtk_container_add (GTK_CONTAINER (frame), bbox);
5855 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5856 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5858 set_direction_recurse (frame, &text_dir);
5864 create_flipping (GtkWidget *widget)
5866 static GtkWidget *window = NULL;
5867 GtkWidget *check_button, *button;
5871 window = gtk_dialog_new ();
5873 gtk_window_set_screen (GTK_WINDOW (window),
5874 gtk_widget_get_screen (widget));
5876 g_signal_connect (window, "destroy",
5877 G_CALLBACK (gtk_widget_destroyed),
5880 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5882 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5883 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5884 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5885 check_button, TRUE, TRUE, 0);
5887 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5888 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5890 g_signal_connect (check_button, "toggled",
5891 G_CALLBACK (flipping_toggled_cb), NULL);
5893 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5894 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5895 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5896 check_button, TRUE, TRUE, 0);
5898 g_signal_connect (check_button, "toggled",
5899 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5901 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5902 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5905 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5906 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5909 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
5910 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5913 button = gtk_button_new_with_label ("Close");
5914 g_signal_connect_swapped (button, "clicked",
5915 G_CALLBACK (gtk_widget_destroy), window);
5916 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
5917 button, TRUE, TRUE, 0);
5920 if (!gtk_widget_get_visible (window))
5921 gtk_widget_show_all (window);
5923 gtk_widget_destroy (window);
5931 make_focus_table (GList **list)
5936 table = gtk_table_new (5, 5, FALSE);
5949 widget = gtk_entry_new ();
5951 widget = gtk_button_new_with_label ("Foo");
5953 *list = g_list_prepend (*list, widget);
5955 gtk_table_attach (GTK_TABLE (table),
5959 GTK_EXPAND | GTK_FILL,
5960 GTK_EXPAND | GTK_FILL,
5969 *list = g_list_reverse (*list);
5975 create_focus (GtkWidget *widget)
5977 static GtkWidget *window = NULL;
5985 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5991 gtk_window_set_screen (GTK_WINDOW (window),
5992 gtk_widget_get_screen (widget));
5994 g_signal_connect (window, "destroy",
5995 G_CALLBACK (gtk_widget_destroyed),
5998 g_signal_connect (window, "response",
5999 G_CALLBACK (gtk_widget_destroy),
6002 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
6004 frame = gtk_frame_new ("Weird tab focus chain");
6006 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6007 frame, TRUE, TRUE, 0);
6009 table = make_focus_table (&list);
6011 gtk_container_add (GTK_CONTAINER (frame), table);
6013 gtk_container_set_focus_chain (GTK_CONTAINER (table),
6018 frame = gtk_frame_new ("Default tab focus chain");
6020 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
6021 frame, TRUE, TRUE, 0);
6024 table = make_focus_table (&list);
6028 gtk_container_add (GTK_CONTAINER (frame), table);
6031 if (!gtk_widget_get_visible (window))
6032 gtk_widget_show_all (window);
6034 gtk_widget_destroy (window);
6042 font_selection_ok (GtkWidget *w,
6043 GtkFontSelectionDialog *fs)
6045 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
6047 g_print ("%s\n", s);
6049 gtk_widget_destroy (GTK_WIDGET (fs));
6053 create_font_selection (GtkWidget *widget)
6055 static GtkWidget *window = NULL;
6063 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6064 gtk_window_set_screen (GTK_WINDOW (window),
6065 gtk_widget_get_screen (widget));
6067 g_signal_connect (window, "destroy",
6068 G_CALLBACK (gtk_widget_destroyed),
6071 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
6072 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6074 hbox = gtk_hbox_new (FALSE, 8);
6075 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
6076 gtk_container_add (GTK_CONTAINER (window), hbox);
6078 label = gtk_label_new ("Pick a font");
6079 gtk_container_add (GTK_CONTAINER (hbox), label);
6081 picker = gtk_font_button_new ();
6082 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
6083 gtk_container_add (GTK_CONTAINER (hbox), picker);
6086 if (!gtk_widget_get_visible (window))
6087 gtk_widget_show_all (window);
6089 gtk_widget_destroy (window);
6096 static GtkWidget *dialog_window = NULL;
6099 label_toggle (GtkWidget *widget,
6104 *label = gtk_label_new ("Dialog Test");
6105 g_signal_connect (*label,
6107 G_CALLBACK (gtk_widget_destroyed),
6109 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
6110 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6111 *label, TRUE, TRUE, 0);
6112 gtk_widget_show (*label);
6115 gtk_widget_destroy (*label);
6118 #define RESPONSE_TOGGLE_SEPARATOR 1
6121 print_response (GtkWidget *dialog,
6125 g_print ("response signal received (%d)\n", response_id);
6127 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
6129 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
6130 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
6135 create_dialog (GtkWidget *widget)
6137 static GtkWidget *label;
6142 /* This is a terrible example; it's much simpler to create
6143 * dialogs than this. Don't use testgtk for example code,
6147 dialog_window = gtk_dialog_new ();
6148 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6149 gtk_widget_get_screen (widget));
6151 g_signal_connect (dialog_window,
6153 G_CALLBACK (print_response),
6156 g_signal_connect (dialog_window, "destroy",
6157 G_CALLBACK (gtk_widget_destroyed),
6160 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
6161 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6163 button = gtk_button_new_with_label ("OK");
6164 gtk_widget_set_can_default (button, TRUE);
6165 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6166 button, TRUE, TRUE, 0);
6167 gtk_widget_grab_default (button);
6168 gtk_widget_show (button);
6170 button = gtk_button_new_with_label ("Toggle");
6171 g_signal_connect (button, "clicked",
6172 G_CALLBACK (label_toggle),
6174 gtk_widget_set_can_default (button, TRUE);
6175 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6176 button, TRUE, TRUE, 0);
6177 gtk_widget_show (button);
6181 button = gtk_button_new_with_label ("Separator");
6183 gtk_widget_set_can_default (button, TRUE);
6185 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
6187 RESPONSE_TOGGLE_SEPARATOR);
6188 gtk_widget_show (button);
6191 if (!gtk_widget_get_visible (dialog_window))
6192 gtk_widget_show (dialog_window);
6194 gtk_widget_destroy (dialog_window);
6197 /* Display & Screen test
6204 GtkWidget *radio_dpy;
6205 GtkWidget *toplevel;
6206 GtkWidget *dialog_window;
6207 } ScreenDisplaySelection;
6210 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
6212 const gchar *display_name;
6213 GdkDisplay *display = gtk_widget_get_display (widget);
6215 GdkScreen *new_screen = NULL;
6216 GdkScreen *current_screen = gtk_widget_get_screen (widget);
6218 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
6220 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
6221 display = gdk_display_open (display_name);
6225 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
6226 GTK_DIALOG_DESTROY_WITH_PARENT,
6229 "The display :\n%s\ncannot be opened",
6231 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
6232 gtk_widget_show (dialog);
6233 g_signal_connect (dialog, "response",
6234 G_CALLBACK (gtk_widget_destroy),
6239 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
6242 gboolean found = FALSE;
6243 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
6246 gtk_tree_model_get (model, &iter, 0, &name, -1);
6247 found = !g_ascii_strcasecmp (display_name, name);
6254 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
6255 new_screen = gdk_display_get_default_screen (display);
6260 gint number_of_screens = gdk_display_get_n_screens (display);
6261 gint screen_num = gdk_screen_get_number (current_screen);
6262 if ((screen_num +1) < number_of_screens)
6263 new_screen = gdk_display_get_screen (display, screen_num + 1);
6265 new_screen = gdk_display_get_screen (display, 0);
6270 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
6271 gtk_widget_destroy (data->dialog_window);
6276 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
6278 gtk_widget_destroy (data);
6282 create_display_screen (GtkWidget *widget)
6284 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
6285 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
6287 ScreenDisplaySelection *scr_dpy_data;
6288 GdkScreen *screen = gtk_widget_get_screen (widget);
6289 GdkDisplay *display = gdk_screen_get_display (screen);
6291 window = g_object_new (gtk_window_get_type (),
6294 "type", GTK_WINDOW_TOPLEVEL,
6296 "Screen or Display selection",
6297 "border_width", 10, NULL);
6298 g_signal_connect (window, "destroy",
6299 G_CALLBACK (gtk_widget_destroy), NULL);
6301 vbox = gtk_vbox_new (FALSE, 3);
6302 gtk_container_add (GTK_CONTAINER (window), vbox);
6304 frame = gtk_frame_new ("Select screen or display");
6305 gtk_container_add (GTK_CONTAINER (vbox), frame);
6307 table = gtk_table_new (2, 2, TRUE);
6308 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
6309 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
6311 gtk_container_add (GTK_CONTAINER (frame), table);
6313 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
6314 if (gdk_display_get_n_screens(display) > 1)
6315 radio_scr = gtk_radio_button_new_with_label
6316 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
6319 radio_scr = gtk_radio_button_new_with_label
6320 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
6321 "only one screen on the current display");
6322 gtk_widget_set_sensitive (radio_scr, FALSE);
6324 combo_dpy = gtk_combo_box_new_text ();
6325 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
6326 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
6327 "<hostname>:<X Server Num>.<Screen Num>");
6329 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
6330 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
6331 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
6333 bbox = gtk_hbutton_box_new ();
6334 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
6335 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
6337 gtk_container_add (GTK_CONTAINER (vbox), bbox);
6339 gtk_container_add (GTK_CONTAINER (bbox), applyb);
6340 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
6342 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
6344 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
6345 scr_dpy_data->radio_dpy = radio_dpy;
6346 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
6347 scr_dpy_data->dialog_window = window;
6349 g_signal_connect (cancelb, "clicked",
6350 G_CALLBACK (screen_display_destroy_diag), window);
6351 g_signal_connect (applyb, "clicked",
6352 G_CALLBACK (screen_display_check), scr_dpy_data);
6353 gtk_widget_show_all (window);
6358 static gboolean event_watcher_enter_id = 0;
6359 static gboolean event_watcher_leave_id = 0;
6362 event_watcher (GSignalInvocationHint *ihint,
6363 guint n_param_values,
6364 const GValue *param_values,
6367 g_print ("Watch: \"%s\" emitted for %s\n",
6368 g_signal_name (ihint->signal_id),
6369 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
6375 event_watcher_down (void)
6377 if (event_watcher_enter_id)
6381 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6382 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
6383 event_watcher_enter_id = 0;
6384 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6385 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
6386 event_watcher_leave_id = 0;
6391 event_watcher_toggle (void)
6393 if (event_watcher_enter_id)
6394 event_watcher_down ();
6399 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
6400 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6401 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
6402 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
6407 create_event_watcher (GtkWidget *widget)
6413 dialog_window = gtk_dialog_new ();
6414 gtk_window_set_screen (GTK_WINDOW (dialog_window),
6415 gtk_widget_get_screen (widget));
6417 g_signal_connect (dialog_window, "destroy",
6418 G_CALLBACK (gtk_widget_destroyed),
6420 g_signal_connect (dialog_window, "destroy",
6421 G_CALLBACK (event_watcher_down),
6424 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
6425 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
6426 gtk_widget_set_size_request (dialog_window, 200, 110);
6428 button = gtk_toggle_button_new_with_label ("Activate Watch");
6429 g_signal_connect (button, "clicked",
6430 G_CALLBACK (event_watcher_toggle),
6432 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6433 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
6434 button, TRUE, TRUE, 0);
6435 gtk_widget_show (button);
6437 button = gtk_button_new_with_label ("Close");
6438 g_signal_connect_swapped (button, "clicked",
6439 G_CALLBACK (gtk_widget_destroy),
6441 gtk_widget_set_can_default (button, TRUE);
6442 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
6443 button, TRUE, TRUE, 0);
6444 gtk_widget_grab_default (button);
6445 gtk_widget_show (button);
6448 if (!gtk_widget_get_visible (dialog_window))
6449 gtk_widget_show (dialog_window);
6451 gtk_widget_destroy (dialog_window);
6459 reformat_value (GtkScale *scale,
6462 return g_strdup_printf ("-->%0.*g<--",
6463 gtk_scale_get_digits (scale), value);
6467 create_range_controls (GtkWidget *widget)
6469 static GtkWidget *window = NULL;
6473 GtkWidget *scrollbar;
6475 GtkWidget *separator;
6476 GtkObject *adjustment;
6481 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6483 gtk_window_set_screen (GTK_WINDOW (window),
6484 gtk_widget_get_screen (widget));
6486 g_signal_connect (window, "destroy",
6487 G_CALLBACK (gtk_widget_destroyed),
6490 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6491 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6494 box1 = gtk_vbox_new (FALSE, 0);
6495 gtk_container_add (GTK_CONTAINER (window), box1);
6496 gtk_widget_show (box1);
6499 box2 = gtk_vbox_new (FALSE, 10);
6500 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6501 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6502 gtk_widget_show (box2);
6505 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6507 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6508 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6509 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6510 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6511 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6512 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6513 gtk_widget_show (scale);
6515 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6516 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6517 GTK_UPDATE_CONTINUOUS);
6518 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6519 gtk_widget_show (scrollbar);
6521 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6522 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6523 g_signal_connect (scale,
6525 G_CALLBACK (reformat_value),
6527 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6528 gtk_widget_show (scale);
6530 hbox = gtk_hbox_new (FALSE, 0);
6532 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6533 gtk_widget_set_size_request (scale, -1, 200);
6534 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6535 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6536 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6537 gtk_widget_show (scale);
6539 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6540 gtk_widget_set_size_request (scale, -1, 200);
6541 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6542 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6543 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6544 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6545 gtk_widget_show (scale);
6547 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6548 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6549 g_signal_connect (scale,
6551 G_CALLBACK (reformat_value),
6553 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6554 gtk_widget_show (scale);
6557 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6558 gtk_widget_show (hbox);
6560 separator = gtk_hseparator_new ();
6561 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6562 gtk_widget_show (separator);
6565 box2 = gtk_vbox_new (FALSE, 10);
6566 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6567 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6568 gtk_widget_show (box2);
6571 button = gtk_button_new_with_label ("close");
6572 g_signal_connect_swapped (button, "clicked",
6573 G_CALLBACK (gtk_widget_destroy),
6575 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6576 gtk_widget_set_can_default (button, TRUE);
6577 gtk_widget_grab_default (button);
6578 gtk_widget_show (button);
6581 if (!gtk_widget_get_visible (window))
6582 gtk_widget_show (window);
6584 gtk_widget_destroy (window);
6592 create_rulers (GtkWidget *widget)
6594 static GtkWidget *window = NULL;
6600 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6602 gtk_window_set_screen (GTK_WINDOW (window),
6603 gtk_widget_get_screen (widget));
6605 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
6607 g_signal_connect (window, "destroy",
6608 G_CALLBACK (gtk_widget_destroyed),
6611 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6612 gtk_widget_set_size_request (window, 300, 300);
6613 gtk_widget_set_events (window,
6614 GDK_POINTER_MOTION_MASK
6615 | GDK_POINTER_MOTION_HINT_MASK);
6616 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6618 table = gtk_table_new (2, 2, FALSE);
6619 gtk_container_add (GTK_CONTAINER (window), table);
6620 gtk_widget_show (table);
6622 ruler = gtk_hruler_new ();
6623 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6624 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6626 g_signal_connect_swapped (window,
6627 "motion_notify_event",
6628 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6631 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6632 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6633 gtk_widget_show (ruler);
6636 ruler = gtk_vruler_new ();
6637 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6639 g_signal_connect_swapped (window,
6640 "motion_notify_event",
6641 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6644 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6645 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6646 gtk_widget_show (ruler);
6649 if (!gtk_widget_get_visible (window))
6650 gtk_widget_show (window);
6652 gtk_widget_destroy (window);
6659 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6660 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6661 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6662 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6663 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6664 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6665 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6666 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6669 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6675 GdkPixbuf *book_open;
6676 GdkPixbuf *book_closed;
6677 GtkWidget *sample_notebook;
6680 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6682 GtkWidget *page_widget;
6685 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6687 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6688 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6690 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6691 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6695 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
6697 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6698 gint old_page_num = gtk_notebook_get_current_page (notebook);
6700 if (page_num == old_page_num)
6703 set_page_image (notebook, page_num, book_open);
6705 if (old_page_num != -1)
6706 set_page_image (notebook, old_page_num, book_closed);
6710 tab_fill (GtkToggleButton *button, GtkWidget *child)
6713 GtkPackType pack_type;
6715 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6716 &expand, NULL, &pack_type);
6717 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6718 expand, button->active, pack_type);
6722 tab_expand (GtkToggleButton *button, GtkWidget *child)
6725 GtkPackType pack_type;
6727 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6728 NULL, &fill, &pack_type);
6729 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6730 button->active, fill, pack_type);
6734 tab_pack (GtkToggleButton *button, GtkWidget *child)
6740 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6741 &expand, &fill, NULL);
6742 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
6743 expand, fill, button->active);
6747 create_pages (GtkNotebook *notebook, gint start, gint end)
6749 GtkWidget *child = NULL;
6754 GtkWidget *label_box;
6755 GtkWidget *menu_box;
6759 char accel_buffer[32];
6761 for (i = start; i <= end; i++)
6763 sprintf (buffer, "Page %d", i);
6764 sprintf (accel_buffer, "Page _%d", i);
6766 child = gtk_frame_new (buffer);
6767 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6769 vbox = gtk_vbox_new (TRUE,0);
6770 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6771 gtk_container_add (GTK_CONTAINER (child), vbox);
6773 hbox = gtk_hbox_new (TRUE,0);
6774 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6776 button = gtk_check_button_new_with_label ("Fill Tab");
6777 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6778 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6779 g_signal_connect (button, "toggled",
6780 G_CALLBACK (tab_fill), child);
6782 button = gtk_check_button_new_with_label ("Expand Tab");
6783 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6784 g_signal_connect (button, "toggled",
6785 G_CALLBACK (tab_expand), child);
6787 button = gtk_check_button_new_with_label ("Pack end");
6788 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6789 g_signal_connect (button, "toggled",
6790 G_CALLBACK (tab_pack), child);
6792 button = gtk_button_new_with_label ("Hide Page");
6793 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6794 g_signal_connect_swapped (button, "clicked",
6795 G_CALLBACK (gtk_widget_hide),
6798 gtk_widget_show_all (child);
6800 label_box = gtk_hbox_new (FALSE, 0);
6801 pixwid = gtk_image_new_from_pixbuf (book_closed);
6802 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6804 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6805 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6806 label = gtk_label_new_with_mnemonic (accel_buffer);
6807 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6808 gtk_widget_show_all (label_box);
6811 menu_box = gtk_hbox_new (FALSE, 0);
6812 pixwid = gtk_image_new_from_pixbuf (book_closed);
6813 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6815 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6816 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6817 label = gtk_label_new (buffer);
6818 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6819 gtk_widget_show_all (menu_box);
6821 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6826 rotate_notebook (GtkButton *button,
6827 GtkNotebook *notebook)
6829 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
6833 show_all_pages (GtkButton *button,
6834 GtkNotebook *notebook)
6836 gtk_container_foreach (GTK_CONTAINER (notebook),
6837 (GtkCallback) gtk_widget_show, NULL);
6841 notebook_type_changed (GtkWidget *optionmenu,
6844 GtkNotebook *notebook;
6854 notebook = GTK_NOTEBOOK (data);
6856 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6861 /* standard notebook */
6862 gtk_notebook_set_show_tabs (notebook, TRUE);
6863 gtk_notebook_set_show_border (notebook, TRUE);
6864 gtk_notebook_set_scrollable (notebook, FALSE);
6868 /* notabs notebook */
6869 gtk_notebook_set_show_tabs (notebook, FALSE);
6870 gtk_notebook_set_show_border (notebook, TRUE);
6875 gtk_notebook_set_show_tabs (notebook, FALSE);
6876 gtk_notebook_set_show_border (notebook, FALSE);
6881 gtk_notebook_set_show_tabs (notebook, TRUE);
6882 gtk_notebook_set_show_border (notebook, TRUE);
6883 gtk_notebook_set_scrollable (notebook, TRUE);
6884 if (g_list_length (notebook->children) == 5)
6885 create_pages (notebook, 6, 15);
6891 if (g_list_length (notebook->children) == 15)
6892 for (i = 0; i < 10; i++)
6893 gtk_notebook_remove_page (notebook, 5);
6897 notebook_popup (GtkToggleButton *button,
6898 GtkNotebook *notebook)
6901 gtk_notebook_popup_enable (notebook);
6903 gtk_notebook_popup_disable (notebook);
6907 notebook_homogeneous (GtkToggleButton *button,
6908 GtkNotebook *notebook)
6910 g_object_set (notebook, "homogeneous", button->active, NULL);
6914 create_notebook (GtkWidget *widget)
6916 static GtkWidget *window = NULL;
6920 GtkWidget *separator;
6923 GdkPixbuf *book_open_xpm;
6924 GdkPixbuf *book_closed_xpm;
6926 static gchar *items[] =
6936 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6937 gtk_window_set_screen (GTK_WINDOW (window),
6938 gtk_widget_get_screen (widget));
6940 g_signal_connect (window, "destroy",
6941 G_CALLBACK (gtk_widget_destroyed),
6944 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6945 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6947 box1 = gtk_vbox_new (FALSE, 0);
6948 gtk_container_add (GTK_CONTAINER (window), box1);
6950 sample_notebook = gtk_notebook_new ();
6951 g_signal_connect (sample_notebook, "switch_page",
6952 G_CALLBACK (page_switch), NULL);
6953 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6954 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6955 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6957 gtk_widget_realize (sample_notebook);
6960 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
6963 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
6965 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6967 separator = gtk_hseparator_new ();
6968 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6970 box2 = gtk_hbox_new (FALSE, 5);
6971 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6972 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6974 button = gtk_check_button_new_with_label ("popup menu");
6975 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6976 g_signal_connect (button, "clicked",
6977 G_CALLBACK (notebook_popup),
6980 button = gtk_check_button_new_with_label ("homogeneous tabs");
6981 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6982 g_signal_connect (button, "clicked",
6983 G_CALLBACK (notebook_homogeneous),
6986 box2 = gtk_hbox_new (FALSE, 5);
6987 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6988 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6990 label = gtk_label_new ("Notebook Style :");
6991 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6993 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6994 notebook_type_changed,
6996 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6998 button = gtk_button_new_with_label ("Show all Pages");
6999 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
7000 g_signal_connect (button, "clicked",
7001 G_CALLBACK (show_all_pages), sample_notebook);
7003 box2 = gtk_hbox_new (TRUE, 10);
7004 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7005 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7007 button = gtk_button_new_with_label ("prev");
7008 g_signal_connect_swapped (button, "clicked",
7009 G_CALLBACK (gtk_notebook_prev_page),
7011 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7013 button = gtk_button_new_with_label ("next");
7014 g_signal_connect_swapped (button, "clicked",
7015 G_CALLBACK (gtk_notebook_next_page),
7017 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7019 button = gtk_button_new_with_label ("rotate");
7020 g_signal_connect (button, "clicked",
7021 G_CALLBACK (rotate_notebook), sample_notebook);
7022 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7024 separator = gtk_hseparator_new ();
7025 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
7027 button = gtk_button_new_with_label ("close");
7028 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
7029 g_signal_connect_swapped (button, "clicked",
7030 G_CALLBACK (gtk_widget_destroy),
7032 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
7033 gtk_widget_set_can_default (button, TRUE);
7034 gtk_widget_grab_default (button);
7037 if (!gtk_widget_get_visible (window))
7038 gtk_widget_show_all (window);
7040 gtk_widget_destroy (window);
7048 toggle_resize (GtkWidget *widget, GtkWidget *child)
7050 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7051 GValue value = { 0, };
7052 g_value_init (&value, G_TYPE_BOOLEAN);
7053 gtk_container_child_get_property (container, child, "resize", &value);
7054 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7055 gtk_container_child_set_property (container, child, "resize", &value);
7059 toggle_shrink (GtkWidget *widget, GtkWidget *child)
7061 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
7062 GValue value = { 0, };
7063 g_value_init (&value, G_TYPE_BOOLEAN);
7064 gtk_container_child_get_property (container, child, "shrink", &value);
7065 g_value_set_boolean (&value, !g_value_get_boolean (&value));
7066 gtk_container_child_set_property (container, child, "shrink", &value);
7070 paned_props_clicked (GtkWidget *button,
7073 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
7075 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
7079 create_pane_options (GtkPaned *paned,
7080 const gchar *frame_label,
7081 const gchar *label1,
7082 const gchar *label2)
7088 GtkWidget *check_button;
7090 frame = gtk_frame_new (frame_label);
7091 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
7093 table = gtk_table_new (4, 2, 4);
7094 gtk_container_add (GTK_CONTAINER (frame), table);
7096 label = gtk_label_new (label1);
7097 gtk_table_attach_defaults (GTK_TABLE (table), label,
7100 check_button = gtk_check_button_new_with_label ("Resize");
7101 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7103 g_signal_connect (check_button, "toggled",
7104 G_CALLBACK (toggle_resize),
7107 check_button = gtk_check_button_new_with_label ("Shrink");
7108 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7110 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7112 g_signal_connect (check_button, "toggled",
7113 G_CALLBACK (toggle_shrink),
7116 label = gtk_label_new (label2);
7117 gtk_table_attach_defaults (GTK_TABLE (table), label,
7120 check_button = gtk_check_button_new_with_label ("Resize");
7121 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7123 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7125 g_signal_connect (check_button, "toggled",
7126 G_CALLBACK (toggle_resize),
7129 check_button = gtk_check_button_new_with_label ("Shrink");
7130 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
7132 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
7134 g_signal_connect (check_button, "toggled",
7135 G_CALLBACK (toggle_shrink),
7138 button = gtk_button_new_with_mnemonic ("_Properties");
7139 gtk_table_attach_defaults (GTK_TABLE (table), button,
7141 g_signal_connect (button, "clicked",
7142 G_CALLBACK (paned_props_clicked),
7149 create_panes (GtkWidget *widget)
7151 static GtkWidget *window = NULL;
7160 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7162 gtk_window_set_screen (GTK_WINDOW (window),
7163 gtk_widget_get_screen (widget));
7165 g_signal_connect (window, "destroy",
7166 G_CALLBACK (gtk_widget_destroyed),
7169 gtk_window_set_title (GTK_WINDOW (window), "Panes");
7170 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7172 vbox = gtk_vbox_new (FALSE, 0);
7173 gtk_container_add (GTK_CONTAINER (window), vbox);
7175 vpaned = gtk_vpaned_new ();
7176 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
7177 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
7179 hpaned = gtk_hpaned_new ();
7180 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
7182 frame = gtk_frame_new (NULL);
7183 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7184 gtk_widget_set_size_request (frame, 60, 60);
7185 gtk_paned_add1 (GTK_PANED (hpaned), frame);
7187 button = gtk_button_new_with_label ("Hi there");
7188 gtk_container_add (GTK_CONTAINER(frame), button);
7190 frame = gtk_frame_new (NULL);
7191 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7192 gtk_widget_set_size_request (frame, 80, 60);
7193 gtk_paned_add2 (GTK_PANED (hpaned), frame);
7195 frame = gtk_frame_new (NULL);
7196 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
7197 gtk_widget_set_size_request (frame, 60, 80);
7198 gtk_paned_add2 (GTK_PANED (vpaned), frame);
7200 /* Now create toggle buttons to control sizing */
7202 gtk_box_pack_start (GTK_BOX (vbox),
7203 create_pane_options (GTK_PANED (hpaned),
7209 gtk_box_pack_start (GTK_BOX (vbox),
7210 create_pane_options (GTK_PANED (vpaned),
7216 gtk_widget_show_all (vbox);
7219 if (!gtk_widget_get_visible (window))
7220 gtk_widget_show (window);
7222 gtk_widget_destroy (window);
7226 * Paned keyboard navigation
7230 paned_keyboard_window1 (GtkWidget *widget)
7253 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7254 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
7255 gtk_window_set_screen (GTK_WINDOW (window1),
7256 gtk_widget_get_screen (widget));
7258 hpaned1 = gtk_hpaned_new ();
7259 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
7261 frame1 = gtk_frame_new (NULL);
7262 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
7263 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
7265 vbox1 = gtk_vbox_new (FALSE, 0);
7266 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
7268 button7 = gtk_button_new_with_label ("button7");
7269 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
7271 button8 = gtk_button_new_with_label ("button8");
7272 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
7274 button9 = gtk_button_new_with_label ("button9");
7275 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
7277 vpaned1 = gtk_vpaned_new ();
7278 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
7280 frame2 = gtk_frame_new (NULL);
7281 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
7282 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
7284 frame5 = gtk_frame_new (NULL);
7285 gtk_container_add (GTK_CONTAINER (frame2), frame5);
7287 hbox1 = gtk_hbox_new (FALSE, 0);
7288 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
7290 button5 = gtk_button_new_with_label ("button5");
7291 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
7293 button6 = gtk_button_new_with_label ("button6");
7294 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
7296 frame3 = gtk_frame_new (NULL);
7297 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
7298 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
7300 frame4 = gtk_frame_new ("Buttons");
7301 gtk_container_add (GTK_CONTAINER (frame3), frame4);
7302 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
7304 table1 = gtk_table_new (2, 2, FALSE);
7305 gtk_container_add (GTK_CONTAINER (frame4), table1);
7306 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
7308 button1 = gtk_button_new_with_label ("button1");
7309 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
7310 (GtkAttachOptions) (GTK_FILL),
7311 (GtkAttachOptions) (0), 0, 0);
7313 button2 = gtk_button_new_with_label ("button2");
7314 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
7315 (GtkAttachOptions) (GTK_FILL),
7316 (GtkAttachOptions) (0), 0, 0);
7318 button3 = gtk_button_new_with_label ("button3");
7319 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
7320 (GtkAttachOptions) (GTK_FILL),
7321 (GtkAttachOptions) (0), 0, 0);
7323 button4 = gtk_button_new_with_label ("button4");
7324 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
7325 (GtkAttachOptions) (GTK_FILL),
7326 (GtkAttachOptions) (0), 0, 0);
7332 paned_keyboard_window2 (GtkWidget *widget)
7337 GtkWidget *button13;
7341 GtkWidget *button12;
7343 GtkWidget *button11;
7344 GtkWidget *button10;
7346 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7347 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
7349 gtk_window_set_screen (GTK_WINDOW (window2),
7350 gtk_widget_get_screen (widget));
7352 hpaned2 = gtk_hpaned_new ();
7353 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
7355 frame6 = gtk_frame_new (NULL);
7356 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
7357 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
7359 button13 = gtk_button_new_with_label ("button13");
7360 gtk_container_add (GTK_CONTAINER (frame6), button13);
7362 hbox2 = gtk_hbox_new (FALSE, 0);
7363 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
7365 vpaned2 = gtk_vpaned_new ();
7366 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
7368 frame7 = gtk_frame_new (NULL);
7369 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
7370 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
7372 button12 = gtk_button_new_with_label ("button12");
7373 gtk_container_add (GTK_CONTAINER (frame7), button12);
7375 frame8 = gtk_frame_new (NULL);
7376 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
7377 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
7379 button11 = gtk_button_new_with_label ("button11");
7380 gtk_container_add (GTK_CONTAINER (frame8), button11);
7382 button10 = gtk_button_new_with_label ("button10");
7383 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
7389 paned_keyboard_window3 (GtkWidget *widget)
7396 GtkWidget *button14;
7399 GtkWidget *button15;
7402 GtkWidget *button16;
7404 GtkWidget *button17;
7406 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7407 g_object_set_data (G_OBJECT (window3), "window3", window3);
7408 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
7410 gtk_window_set_screen (GTK_WINDOW (window3),
7411 gtk_widget_get_screen (widget));
7414 vbox2 = gtk_vbox_new (FALSE, 0);
7415 gtk_container_add (GTK_CONTAINER (window3), vbox2);
7417 label1 = gtk_label_new ("Three panes nested inside each other");
7418 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
7420 hpaned3 = gtk_hpaned_new ();
7421 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
7423 frame9 = gtk_frame_new (NULL);
7424 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
7425 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
7427 button14 = gtk_button_new_with_label ("button14");
7428 gtk_container_add (GTK_CONTAINER (frame9), button14);
7430 hpaned4 = gtk_hpaned_new ();
7431 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
7433 frame10 = gtk_frame_new (NULL);
7434 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
7435 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
7437 button15 = gtk_button_new_with_label ("button15");
7438 gtk_container_add (GTK_CONTAINER (frame10), button15);
7440 hpaned5 = gtk_hpaned_new ();
7441 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
7443 frame11 = gtk_frame_new (NULL);
7444 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
7445 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
7447 button16 = gtk_button_new_with_label ("button16");
7448 gtk_container_add (GTK_CONTAINER (frame11), button16);
7450 frame12 = gtk_frame_new (NULL);
7451 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
7452 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7454 button17 = gtk_button_new_with_label ("button17");
7455 gtk_container_add (GTK_CONTAINER (frame12), button17);
7461 paned_keyboard_window4 (GtkWidget *widget)
7468 GtkWidget *button19;
7469 GtkWidget *button18;
7472 GtkWidget *button21;
7473 GtkWidget *button20;
7475 GtkWidget *button23;
7476 GtkWidget *button22;
7478 GtkWidget *button25;
7479 GtkWidget *button24;
7481 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7482 g_object_set_data (G_OBJECT (window4), "window4", window4);
7483 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7485 gtk_window_set_screen (GTK_WINDOW (window4),
7486 gtk_widget_get_screen (widget));
7488 vbox3 = gtk_vbox_new (FALSE, 0);
7489 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7491 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7492 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7493 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7495 hpaned6 = gtk_hpaned_new ();
7496 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7498 vpaned3 = gtk_vpaned_new ();
7499 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7501 button19 = gtk_button_new_with_label ("button19");
7502 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7504 button18 = gtk_button_new_with_label ("button18");
7505 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7507 hbox3 = gtk_hbox_new (FALSE, 0);
7508 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7510 vpaned4 = gtk_vpaned_new ();
7511 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7513 button21 = gtk_button_new_with_label ("button21");
7514 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7516 button20 = gtk_button_new_with_label ("button20");
7517 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7519 vpaned5 = gtk_vpaned_new ();
7520 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7522 button23 = gtk_button_new_with_label ("button23");
7523 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7525 button22 = gtk_button_new_with_label ("button22");
7526 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7528 vpaned6 = gtk_vpaned_new ();
7529 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7531 button25 = gtk_button_new_with_label ("button25");
7532 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7534 button24 = gtk_button_new_with_label ("button24");
7535 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7541 create_paned_keyboard_navigation (GtkWidget *widget)
7543 static GtkWidget *window1 = NULL;
7544 static GtkWidget *window2 = NULL;
7545 static GtkWidget *window3 = NULL;
7546 static GtkWidget *window4 = NULL;
7549 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7551 gtk_widget_destroy (window1);
7552 gtk_widget_destroy (window2);
7553 gtk_widget_destroy (window3);
7554 gtk_widget_destroy (window4);
7559 window1 = paned_keyboard_window1 (widget);
7560 g_signal_connect (window1, "destroy",
7561 G_CALLBACK (gtk_widget_destroyed),
7567 window2 = paned_keyboard_window2 (widget);
7568 g_signal_connect (window2, "destroy",
7569 G_CALLBACK (gtk_widget_destroyed),
7575 window3 = paned_keyboard_window3 (widget);
7576 g_signal_connect (window3, "destroy",
7577 G_CALLBACK (gtk_widget_destroyed),
7583 window4 = paned_keyboard_window4 (widget);
7584 g_signal_connect (window4, "destroy",
7585 G_CALLBACK (gtk_widget_destroyed),
7589 if (gtk_widget_get_visible (window1))
7590 gtk_widget_destroy (GTK_WIDGET (window1));
7592 gtk_widget_show_all (GTK_WIDGET (window1));
7594 if (gtk_widget_get_visible (window2))
7595 gtk_widget_destroy (GTK_WIDGET (window2));
7597 gtk_widget_show_all (GTK_WIDGET (window2));
7599 if (gtk_widget_get_visible (window3))
7600 gtk_widget_destroy (GTK_WIDGET (window3));
7602 gtk_widget_show_all (GTK_WIDGET (window3));
7604 if (gtk_widget_get_visible (window4))
7605 gtk_widget_destroy (GTK_WIDGET (window4));
7607 gtk_widget_show_all (GTK_WIDGET (window4));
7615 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7618 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7622 /* ignore double and triple click */
7623 if (event->type != GDK_BUTTON_PRESS)
7626 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7627 p->x = (int) event->x;
7628 p->y = (int) event->y;
7630 gtk_grab_add (widget);
7631 gdk_pointer_grab (widget->window, TRUE,
7632 GDK_BUTTON_RELEASE_MASK |
7633 GDK_BUTTON_MOTION_MASK |
7634 GDK_POINTER_MOTION_HINT_MASK,
7639 shape_released (GtkWidget *widget)
7641 gtk_grab_remove (widget);
7642 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7647 shape_motion (GtkWidget *widget,
7648 GdkEventMotion *event)
7652 GdkModifierType mask;
7654 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7657 * Can't use event->x / event->y here
7658 * because I need absolute coordinates.
7660 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7661 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7665 shape_create_icon (GdkScreen *screen,
7676 CursorOffset* icon_pos;
7678 GdkBitmap *gdk_pixmap_mask;
7679 GdkPixmap *gdk_pixmap;
7682 style = gtk_widget_get_default_style ();
7683 gc = style->black_gc;
7686 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7688 window = gtk_window_new (window_type);
7689 gtk_window_set_screen (GTK_WINDOW (window), screen);
7691 fixed = gtk_fixed_new ();
7692 gtk_widget_set_size_request (fixed, 100, 100);
7693 gtk_container_add (GTK_CONTAINER (window), fixed);
7694 gtk_widget_show (fixed);
7696 gtk_widget_set_events (window,
7697 gtk_widget_get_events (window) |
7698 GDK_BUTTON_MOTION_MASK |
7699 GDK_POINTER_MOTION_HINT_MASK |
7700 GDK_BUTTON_PRESS_MASK);
7702 gtk_widget_realize (window);
7703 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
7704 &style->bg[GTK_STATE_NORMAL],
7707 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
7708 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
7709 gtk_widget_show (pixmap);
7711 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
7713 g_object_unref (gdk_pixmap_mask);
7714 g_object_unref (gdk_pixmap);
7716 g_signal_connect (window, "button_press_event",
7717 G_CALLBACK (shape_pressed), NULL);
7718 g_signal_connect (window, "button_release_event",
7719 G_CALLBACK (shape_released), NULL);
7720 g_signal_connect (window, "motion_notify_event",
7721 G_CALLBACK (shape_motion), NULL);
7723 icon_pos = g_new (CursorOffset, 1);
7724 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7726 gtk_window_move (GTK_WINDOW (window), x, y);
7727 gtk_widget_show (window);
7733 create_shapes (GtkWidget *widget)
7735 /* Variables used by the Drag/Drop and Shape Window demos */
7736 static GtkWidget *modeller = NULL;
7737 static GtkWidget *sheets = NULL;
7738 static GtkWidget *rings = NULL;
7739 static GtkWidget *with_region = NULL;
7740 GdkScreen *screen = gtk_widget_get_screen (widget);
7742 if (!(file_exists ("Modeller.xpm") &&
7743 file_exists ("FilesQueue.xpm") &&
7744 file_exists ("3DRings.xpm")))
7750 modeller = shape_create_icon (screen, "Modeller.xpm",
7751 440, 140, 0,0, GTK_WINDOW_POPUP);
7753 g_signal_connect (modeller, "destroy",
7754 G_CALLBACK (gtk_widget_destroyed),
7758 gtk_widget_destroy (modeller);
7762 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7763 580, 170, 0,0, GTK_WINDOW_POPUP);
7765 g_signal_connect (sheets, "destroy",
7766 G_CALLBACK (gtk_widget_destroyed),
7771 gtk_widget_destroy (sheets);
7775 rings = shape_create_icon (screen, "3DRings.xpm",
7776 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7778 g_signal_connect (rings, "destroy",
7779 G_CALLBACK (gtk_widget_destroyed),
7783 gtk_widget_destroy (rings);
7790 with_region = shape_create_icon (screen, "3DRings.xpm",
7791 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7793 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7795 g_signal_connect (with_region, "destroy",
7796 G_CALLBACK (gtk_widget_destroyed),
7799 /* reset shape from mask to a region */
7802 region = gdk_region_new ();
7814 gdk_region_union_with_rect (region, &rect);
7822 gdk_window_shape_combine_region (with_region->window,
7827 gtk_widget_destroy (with_region);
7835 create_wmhints (GtkWidget *widget)
7837 static GtkWidget *window = NULL;
7839 GtkWidget *separator;
7848 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7850 gtk_window_set_screen (GTK_WINDOW (window),
7851 gtk_widget_get_screen (widget));
7853 g_signal_connect (window, "destroy",
7854 G_CALLBACK (gtk_widget_destroyed),
7857 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7858 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7860 gtk_widget_realize (window);
7862 circles = gdk_bitmap_create_from_data (window->window,
7863 (gchar *) circles_bits,
7866 gdk_window_set_icon (window->window, NULL,
7869 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
7871 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7872 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7874 box1 = gtk_vbox_new (FALSE, 0);
7875 gtk_container_add (GTK_CONTAINER (window), box1);
7876 gtk_widget_show (box1);
7878 label = gtk_label_new ("Try iconizing me!");
7879 gtk_widget_set_size_request (label, 150, 50);
7880 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7881 gtk_widget_show (label);
7884 separator = gtk_hseparator_new ();
7885 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7886 gtk_widget_show (separator);
7889 box2 = gtk_vbox_new (FALSE, 10);
7890 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7891 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7892 gtk_widget_show (box2);
7895 button = gtk_button_new_with_label ("close");
7897 g_signal_connect_swapped (button, "clicked",
7898 G_CALLBACK (gtk_widget_destroy),
7901 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7902 gtk_widget_set_can_default (button, TRUE);
7903 gtk_widget_grab_default (button);
7904 gtk_widget_show (button);
7907 if (!gtk_widget_get_visible (window))
7908 gtk_widget_show (window);
7910 gtk_widget_destroy (window);
7915 * Window state tracking
7919 window_state_callback (GtkWidget *widget,
7920 GdkEventWindowState *event,
7923 GtkWidget *label = data;
7926 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
7927 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7928 "withdrawn" : "not withdrawn", ", ",
7929 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7930 "iconified" : "not iconified", ", ",
7931 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7932 "sticky" : "not sticky", ", ",
7933 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7934 "maximized" : "not maximized", ", ",
7935 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7936 "fullscreen" : "not fullscreen",
7937 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7938 "above" : "not above", ", ",
7939 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7940 "below" : "not below", ", ",
7943 gtk_label_set_text (GTK_LABEL (label), msg);
7951 tracking_label (GtkWidget *window)
7957 hbox = gtk_hbox_new (FALSE, 5);
7959 g_signal_connect_object (hbox,
7961 G_CALLBACK (gtk_widget_destroy),
7965 label = gtk_label_new ("<no window state events received>");
7966 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7967 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7969 g_signal_connect (window,
7970 "window_state_event",
7971 G_CALLBACK (window_state_callback),
7974 button = gtk_button_new_with_label ("Deiconify");
7975 g_signal_connect_object (button,
7977 G_CALLBACK (gtk_window_deiconify),
7980 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7982 button = gtk_button_new_with_label ("Iconify");
7983 g_signal_connect_object (button,
7985 G_CALLBACK (gtk_window_iconify),
7988 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7990 button = gtk_button_new_with_label ("Fullscreen");
7991 g_signal_connect_object (button,
7993 G_CALLBACK (gtk_window_fullscreen),
7996 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7998 button = gtk_button_new_with_label ("Unfullscreen");
7999 g_signal_connect_object (button,
8001 G_CALLBACK (gtk_window_unfullscreen),
8004 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8006 button = gtk_button_new_with_label ("Present");
8007 g_signal_connect_object (button,
8009 G_CALLBACK (gtk_window_present),
8012 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8014 button = gtk_button_new_with_label ("Show");
8015 g_signal_connect_object (button,
8017 G_CALLBACK (gtk_widget_show),
8020 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
8022 gtk_widget_show_all (hbox);
8028 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
8030 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8032 gtk_window_set_keep_above (GTK_WINDOW (data),
8033 gtk_toggle_button_get_active (togglebutton));
8035 if (gtk_toggle_button_get_active (togglebutton))
8036 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8040 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
8042 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
8044 gtk_window_set_keep_below (GTK_WINDOW (data),
8045 gtk_toggle_button_get_active (togglebutton));
8047 if (gtk_toggle_button_get_active (togglebutton))
8048 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8053 get_state_controls (GtkWidget *window)
8057 GtkWidget *button_above;
8058 GtkWidget *button_below;
8060 vbox = gtk_vbox_new (FALSE, 0);
8062 button = gtk_button_new_with_label ("Stick");
8063 g_signal_connect_object (button,
8065 G_CALLBACK (gtk_window_stick),
8068 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8070 button = gtk_button_new_with_label ("Unstick");
8071 g_signal_connect_object (button,
8073 G_CALLBACK (gtk_window_unstick),
8076 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8078 button = gtk_button_new_with_label ("Maximize");
8079 g_signal_connect_object (button,
8081 G_CALLBACK (gtk_window_maximize),
8084 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8086 button = gtk_button_new_with_label ("Unmaximize");
8087 g_signal_connect_object (button,
8089 G_CALLBACK (gtk_window_unmaximize),
8092 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8094 button = gtk_button_new_with_label ("Iconify");
8095 g_signal_connect_object (button,
8097 G_CALLBACK (gtk_window_iconify),
8100 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8102 button = gtk_button_new_with_label ("Fullscreen");
8103 g_signal_connect_object (button,
8105 G_CALLBACK (gtk_window_fullscreen),
8108 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8110 button = gtk_button_new_with_label ("Unfullscreen");
8111 g_signal_connect_object (button,
8113 G_CALLBACK (gtk_window_unfullscreen),
8116 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8118 button_above = gtk_toggle_button_new_with_label ("Keep above");
8119 g_signal_connect (button_above,
8121 G_CALLBACK (keep_window_above),
8123 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
8125 button_below = gtk_toggle_button_new_with_label ("Keep below");
8126 g_signal_connect (button_below,
8128 G_CALLBACK (keep_window_below),
8130 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
8132 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
8133 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
8135 button = gtk_button_new_with_label ("Hide (withdraw)");
8136 g_signal_connect_object (button,
8138 G_CALLBACK (gtk_widget_hide),
8141 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8143 gtk_widget_show_all (vbox);
8149 create_window_states (GtkWidget *widget)
8151 static GtkWidget *window = NULL;
8154 GtkWidget *iconified;
8156 GtkWidget *controls;
8160 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8161 gtk_window_set_screen (GTK_WINDOW (window),
8162 gtk_widget_get_screen (widget));
8164 g_signal_connect (window, "destroy",
8165 G_CALLBACK (gtk_widget_destroyed),
8168 gtk_window_set_title (GTK_WINDOW (window), "Window states");
8170 box1 = gtk_vbox_new (FALSE, 0);
8171 gtk_container_add (GTK_CONTAINER (window), box1);
8173 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8175 gtk_window_set_screen (GTK_WINDOW (iconified),
8176 gtk_widget_get_screen (widget));
8178 g_signal_connect_object (iconified, "destroy",
8179 G_CALLBACK (gtk_widget_destroy),
8182 gtk_window_iconify (GTK_WINDOW (iconified));
8183 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
8184 controls = get_state_controls (iconified);
8185 gtk_container_add (GTK_CONTAINER (iconified), controls);
8187 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8189 gtk_window_set_screen (GTK_WINDOW (normal),
8190 gtk_widget_get_screen (widget));
8192 g_signal_connect_object (normal, "destroy",
8193 G_CALLBACK (gtk_widget_destroy),
8197 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
8198 controls = get_state_controls (normal);
8199 gtk_container_add (GTK_CONTAINER (normal), controls);
8201 label = tracking_label (iconified);
8202 gtk_container_add (GTK_CONTAINER (box1), label);
8204 label = tracking_label (normal);
8205 gtk_container_add (GTK_CONTAINER (box1), label);
8207 gtk_widget_show_all (iconified);
8208 gtk_widget_show_all (normal);
8209 gtk_widget_show_all (box1);
8212 if (!gtk_widget_get_visible (window))
8213 gtk_widget_show (window);
8215 gtk_widget_destroy (window);
8223 configure_event_callback (GtkWidget *widget,
8224 GdkEventConfigure *event,
8227 GtkWidget *label = data;
8231 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
8233 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
8235 event->x, event->y, event->width, event->height,
8238 gtk_label_set_text (GTK_LABEL (label), msg);
8246 get_ints (GtkWidget *window,
8253 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
8254 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
8256 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
8257 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
8261 set_size_callback (GtkWidget *widget,
8266 get_ints (data, &w, &h);
8268 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
8272 unset_default_size_callback (GtkWidget *widget,
8275 gtk_window_set_default_size (g_object_get_data (data, "target"),
8280 set_default_size_callback (GtkWidget *widget,
8285 get_ints (data, &w, &h);
8287 gtk_window_set_default_size (g_object_get_data (data, "target"),
8292 unset_size_request_callback (GtkWidget *widget,
8295 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8300 set_size_request_callback (GtkWidget *widget,
8305 get_ints (data, &w, &h);
8307 gtk_widget_set_size_request (g_object_get_data (data, "target"),
8312 set_location_callback (GtkWidget *widget,
8317 get_ints (data, &x, &y);
8319 gtk_window_move (g_object_get_data (data, "target"), x, y);
8323 move_to_position_callback (GtkWidget *widget,
8329 window = g_object_get_data (data, "target");
8331 gtk_window_get_position (window, &x, &y);
8333 gtk_window_move (window, x, y);
8337 set_geometry_callback (GtkWidget *entry,
8343 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
8345 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
8347 if (!gtk_window_parse_geometry (target, text))
8348 g_print ("Bad geometry string '%s'\n", text);
8354 allow_shrink_callback (GtkWidget *widget,
8357 g_object_set (g_object_get_data (data, "target"),
8359 GTK_TOGGLE_BUTTON (widget)->active,
8364 allow_grow_callback (GtkWidget *widget,
8367 g_object_set (g_object_get_data (data, "target"),
8369 GTK_TOGGLE_BUTTON (widget)->active,
8374 gravity_selected (GtkWidget *widget,
8377 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
8378 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
8382 pos_selected (GtkWidget *widget,
8385 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
8386 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
8390 move_gravity_window_to_current_position (GtkWidget *widget,
8396 window = GTK_WINDOW (data);
8398 gtk_window_get_position (window, &x, &y);
8400 gtk_window_move (window, x, y);
8404 get_screen_corner (GtkWindow *window,
8409 GdkScreen * screen = gtk_window_get_screen (window);
8411 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
8413 switch (gtk_window_get_gravity (window))
8415 case GDK_GRAVITY_SOUTH_EAST:
8416 *x = gdk_screen_get_width (screen) - w;
8417 *y = gdk_screen_get_height (screen) - h;
8420 case GDK_GRAVITY_NORTH_EAST:
8421 *x = gdk_screen_get_width (screen) - w;
8425 case GDK_GRAVITY_SOUTH_WEST:
8427 *y = gdk_screen_get_height (screen) - h;
8430 case GDK_GRAVITY_NORTH_WEST:
8435 case GDK_GRAVITY_SOUTH:
8436 *x = (gdk_screen_get_width (screen) - w) / 2;
8437 *y = gdk_screen_get_height (screen) - h;
8440 case GDK_GRAVITY_NORTH:
8441 *x = (gdk_screen_get_width (screen) - w) / 2;
8445 case GDK_GRAVITY_WEST:
8447 *y = (gdk_screen_get_height (screen) - h) / 2;
8450 case GDK_GRAVITY_EAST:
8451 *x = gdk_screen_get_width (screen) - w;
8452 *y = (gdk_screen_get_height (screen) - h) / 2;
8455 case GDK_GRAVITY_CENTER:
8456 *x = (gdk_screen_get_width (screen) - w) / 2;
8457 *y = (gdk_screen_get_height (screen) - h) / 2;
8460 case GDK_GRAVITY_STATIC:
8461 /* pick some random numbers */
8467 g_assert_not_reached ();
8473 move_gravity_window_to_starting_position (GtkWidget *widget,
8479 window = GTK_WINDOW (data);
8481 get_screen_corner (window,
8484 gtk_window_move (window, x, y);
8488 make_gravity_window (GtkWidget *destroy_with,
8497 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8499 gtk_window_set_screen (GTK_WINDOW (window),
8500 gtk_widget_get_screen (destroy_with));
8502 vbox = gtk_vbox_new (FALSE, 0);
8503 gtk_widget_show (vbox);
8505 gtk_container_add (GTK_CONTAINER (window), vbox);
8506 gtk_window_set_title (GTK_WINDOW (window), title);
8507 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8509 g_signal_connect_object (destroy_with,
8511 G_CALLBACK (gtk_widget_destroy),
8516 button = gtk_button_new_with_mnemonic ("_Move to current position");
8518 g_signal_connect (button, "clicked",
8519 G_CALLBACK (move_gravity_window_to_current_position),
8522 gtk_container_add (GTK_CONTAINER (vbox), button);
8523 gtk_widget_show (button);
8525 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8527 g_signal_connect (button, "clicked",
8528 G_CALLBACK (move_gravity_window_to_starting_position),
8531 gtk_container_add (GTK_CONTAINER (vbox), button);
8532 gtk_widget_show (button);
8534 /* Pretend this is the result of --geometry.
8535 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8536 * and in that case you probably should just use gtk_window_parse_geometry().
8537 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8538 * you are parsing --geometry or equivalent.
8540 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8544 gtk_window_set_default_size (GTK_WINDOW (window),
8547 get_screen_corner (GTK_WINDOW (window), &x, &y);
8549 gtk_window_move (GTK_WINDOW (window),
8556 do_gravity_test (GtkWidget *widget,
8559 GtkWidget *destroy_with = data;
8562 /* We put a window at each gravity point on the screen. */
8563 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8565 gtk_widget_show (window);
8567 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8569 gtk_widget_show (window);
8571 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8573 gtk_widget_show (window);
8575 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8577 gtk_widget_show (window);
8579 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8581 gtk_widget_show (window);
8583 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8585 gtk_widget_show (window);
8588 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8590 gtk_widget_show (window);
8593 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8595 gtk_widget_show (window);
8597 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8599 gtk_widget_show (window);
8601 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8603 gtk_widget_show (window);
8607 window_controls (GtkWidget *window)
8609 GtkWidget *control_window;
8619 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8621 gtk_window_set_screen (GTK_WINDOW (control_window),
8622 gtk_widget_get_screen (window));
8624 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8626 g_object_set_data (G_OBJECT (control_window),
8630 g_signal_connect_object (control_window,
8632 G_CALLBACK (gtk_widget_destroy),
8636 vbox = gtk_vbox_new (FALSE, 5);
8638 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8640 label = gtk_label_new ("<no configure events>");
8641 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8643 g_signal_connect (window,
8645 G_CALLBACK (configure_event_callback),
8648 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8650 spin = gtk_spin_button_new (adj, 0, 0);
8652 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8654 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8656 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8658 spin = gtk_spin_button_new (adj, 0, 0);
8660 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8662 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8664 entry = gtk_entry_new ();
8665 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8667 g_signal_connect (entry, "changed",
8668 G_CALLBACK (set_geometry_callback),
8671 button = gtk_button_new_with_label ("Show gravity test windows");
8672 g_signal_connect_swapped (button,
8674 G_CALLBACK (do_gravity_test),
8676 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8678 button = gtk_button_new_with_label ("Reshow with initial size");
8679 g_signal_connect_object (button,
8681 G_CALLBACK (gtk_window_reshow_with_initial_size),
8684 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8686 button = gtk_button_new_with_label ("Queue resize");
8687 g_signal_connect_object (button,
8689 G_CALLBACK (gtk_widget_queue_resize),
8692 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8694 button = gtk_button_new_with_label ("Resize");
8695 g_signal_connect (button,
8697 G_CALLBACK (set_size_callback),
8699 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8701 button = gtk_button_new_with_label ("Set default size");
8702 g_signal_connect (button,
8704 G_CALLBACK (set_default_size_callback),
8706 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8708 button = gtk_button_new_with_label ("Unset default size");
8709 g_signal_connect (button,
8711 G_CALLBACK (unset_default_size_callback),
8713 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8715 button = gtk_button_new_with_label ("Set size request");
8716 g_signal_connect (button,
8718 G_CALLBACK (set_size_request_callback),
8720 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8722 button = gtk_button_new_with_label ("Unset size request");
8723 g_signal_connect (button,
8725 G_CALLBACK (unset_size_request_callback),
8727 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8729 button = gtk_button_new_with_label ("Move");
8730 g_signal_connect (button,
8732 G_CALLBACK (set_location_callback),
8734 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8736 button = gtk_button_new_with_label ("Move to current position");
8737 g_signal_connect (button,
8739 G_CALLBACK (move_to_position_callback),
8741 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8743 button = gtk_check_button_new_with_label ("Allow shrink");
8744 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
8745 g_signal_connect (button,
8747 G_CALLBACK (allow_shrink_callback),
8749 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8751 button = gtk_check_button_new_with_label ("Allow grow");
8752 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8753 g_signal_connect (button,
8755 G_CALLBACK (allow_grow_callback),
8757 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8759 button = gtk_button_new_with_mnemonic ("_Show");
8760 g_signal_connect_object (button,
8762 G_CALLBACK (gtk_widget_show),
8765 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8767 button = gtk_button_new_with_mnemonic ("_Hide");
8768 g_signal_connect_object (button,
8770 G_CALLBACK (gtk_widget_hide),
8773 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8775 om = gtk_combo_box_new_text ();
8779 static gchar *names[] = {
8780 "GDK_GRAVITY_NORTH_WEST",
8781 "GDK_GRAVITY_NORTH",
8782 "GDK_GRAVITY_NORTH_EAST",
8784 "GDK_GRAVITY_CENTER",
8786 "GDK_GRAVITY_SOUTH_WEST",
8787 "GDK_GRAVITY_SOUTH",
8788 "GDK_GRAVITY_SOUTH_EAST",
8789 "GDK_GRAVITY_STATIC",
8793 g_assert (names[i]);
8794 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8799 g_signal_connect (om,
8801 G_CALLBACK (gravity_selected),
8804 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8807 om = gtk_combo_box_new_text ();
8811 static gchar *names[] = {
8813 "GTK_WIN_POS_CENTER",
8814 "GTK_WIN_POS_MOUSE",
8815 "GTK_WIN_POS_CENTER_ALWAYS",
8816 "GTK_WIN_POS_CENTER_ON_PARENT",
8820 g_assert (names[i]);
8821 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8826 g_signal_connect (om,
8828 G_CALLBACK (pos_selected),
8831 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8833 gtk_widget_show_all (vbox);
8835 return control_window;
8839 create_window_sizing (GtkWidget *widget)
8841 static GtkWidget *window = NULL;
8842 static GtkWidget *target_window = NULL;
8848 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8849 gtk_window_set_screen (GTK_WINDOW (target_window),
8850 gtk_widget_get_screen (widget));
8851 label = gtk_label_new (NULL);
8852 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");
8853 gtk_container_add (GTK_CONTAINER (target_window), label);
8854 gtk_widget_show (label);
8856 g_signal_connect (target_window, "destroy",
8857 G_CALLBACK (gtk_widget_destroyed),
8860 window = window_controls (target_window);
8862 g_signal_connect (window, "destroy",
8863 G_CALLBACK (gtk_widget_destroyed),
8866 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8869 /* don't show target window by default, we want to allow testing
8870 * of behavior on first show.
8873 if (!gtk_widget_get_visible (window))
8874 gtk_widget_show (window);
8876 gtk_widget_destroy (window);
8883 typedef struct _ProgressData {
8886 GtkWidget *block_spin;
8887 GtkWidget *x_align_spin;
8888 GtkWidget *y_align_spin;
8889 GtkWidget *step_spin;
8890 GtkWidget *act_blocks_spin;
8901 progress_timeout (gpointer data)
8903 ProgressData *pdata = data;
8906 if (pdata->activity)
8908 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8912 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8916 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8922 destroy_progress (GtkWidget *widget,
8923 ProgressData **pdata)
8925 g_source_remove ((*pdata)->timer);
8926 (*pdata)->timer = 0;
8927 (*pdata)->window = NULL;
8933 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8935 ProgressData *pdata;
8938 pdata = (ProgressData *) data;
8940 if (!gtk_widget_get_mapped (widget))
8943 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8945 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
8946 (GtkProgressBarOrientation) i);
8950 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8952 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
8953 GTK_TOGGLE_BUTTON (widget)->active);
8954 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
8958 progressbar_toggle_ellipsize (GtkWidget *widget,
8961 ProgressData *pdata = data;
8962 if (gtk_widget_is_drawable (widget))
8964 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8965 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8970 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
8974 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
8975 sprintf (buf, "???");
8977 sprintf (buf, "%.0f%%", 100 *
8978 gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)));
8979 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
8983 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
8985 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
8986 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
8987 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
8991 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8993 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8997 entry_changed (GtkWidget *widget, ProgressData *pdata)
8999 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
9000 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
9004 create_progress_bar (GtkWidget *widget)
9016 static ProgressData *pdata = NULL;
9018 static gchar *items1[] =
9026 static char *ellipsize_items[] = {
9027 "None", // PANGO_ELLIPSIZE_NONE,
9028 "Start", // PANGO_ELLIPSIZE_START,
9029 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
9030 "End", // PANGO_ELLIPSIZE_END
9034 pdata = g_new0 (ProgressData, 1);
9038 pdata->window = gtk_dialog_new ();
9040 gtk_window_set_screen (GTK_WINDOW (pdata->window),
9041 gtk_widget_get_screen (widget));
9043 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
9045 g_signal_connect (pdata->window, "destroy",
9046 G_CALLBACK (destroy_progress),
9051 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
9052 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
9054 vbox = gtk_vbox_new (FALSE, 5);
9055 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9056 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
9057 vbox, FALSE, TRUE, 0);
9059 frame = gtk_frame_new ("Progress");
9060 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9062 vbox2 = gtk_vbox_new (FALSE, 5);
9063 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9065 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9066 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9068 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
9069 g_signal_connect (adj, "value_changed",
9070 G_CALLBACK (progress_value_changed), pdata);
9072 pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
9074 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
9076 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
9077 "%v from [%l,%u] (=%p%%)");
9078 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
9079 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
9081 align = gtk_alignment_new (0.5, 0.5, 0, 0);
9082 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
9084 hbox = gtk_hbox_new (FALSE, 5);
9085 gtk_container_add (GTK_CONTAINER (align), hbox);
9086 label = gtk_label_new ("Label updated by user :");
9087 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9088 pdata->label = gtk_label_new ("");
9089 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
9091 frame = gtk_frame_new ("Options");
9092 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
9094 vbox2 = gtk_vbox_new (FALSE, 5);
9095 gtk_container_add (GTK_CONTAINER (frame), vbox2);
9097 tab = gtk_table_new (7, 2, FALSE);
9098 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
9100 label = gtk_label_new ("Orientation :");
9101 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
9102 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9104 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9106 pdata->omenu1 = build_option_menu (items1, 4, 0,
9107 progressbar_toggle_orientation,
9109 hbox = gtk_hbox_new (FALSE, 0);
9110 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
9111 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9113 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
9115 check = gtk_check_button_new_with_label ("Show text");
9116 g_signal_connect (check, "clicked",
9117 G_CALLBACK (toggle_show_text),
9119 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
9120 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9123 hbox = gtk_hbox_new (FALSE, 0);
9124 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
9125 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9128 label = gtk_label_new ("Format : ");
9129 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
9131 pdata->entry = gtk_entry_new ();
9132 g_signal_connect (pdata->entry, "changed",
9133 G_CALLBACK (entry_changed),
9135 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
9136 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
9137 gtk_widget_set_size_request (pdata->entry, 100, -1);
9138 gtk_widget_set_sensitive (pdata->entry, FALSE);
9140 label = gtk_label_new ("Text align :");
9141 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
9142 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9144 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9146 hbox = gtk_hbox_new (FALSE, 0);
9147 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
9148 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9151 label = gtk_label_new ("x :");
9152 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
9154 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
9155 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
9156 g_signal_connect (adj, "value_changed",
9157 G_CALLBACK (adjust_align), pdata);
9158 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
9159 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
9161 label = gtk_label_new ("y :");
9162 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
9164 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
9165 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
9166 g_signal_connect (adj, "value_changed",
9167 G_CALLBACK (adjust_align), pdata);
9168 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
9169 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
9171 label = gtk_label_new ("Ellipsize text :");
9172 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
9173 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9175 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
9176 pdata->elmenu = build_option_menu (ellipsize_items,
9177 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
9178 2, // PANGO_ELLIPSIZE_MIDDLE
9179 progressbar_toggle_ellipsize,
9181 hbox = gtk_hbox_new (FALSE, 0);
9182 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
9183 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9185 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
9187 check = gtk_check_button_new_with_label ("Activity mode");
9188 g_signal_connect (check, "clicked",
9189 G_CALLBACK (toggle_activity_mode), pdata);
9190 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
9191 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
9194 button = gtk_button_new_with_label ("close");
9195 g_signal_connect_swapped (button, "clicked",
9196 G_CALLBACK (gtk_widget_destroy),
9198 gtk_widget_set_can_default (button, TRUE);
9199 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
9200 button, TRUE, TRUE, 0);
9201 gtk_widget_grab_default (button);
9204 if (!gtk_widget_get_visible (pdata->window))
9205 gtk_widget_show_all (pdata->window);
9207 gtk_widget_destroy (pdata->window);
9219 GtkWidget *res_widget;
9223 find_widget (GtkWidget *widget, FindWidgetData *data)
9225 GtkAllocation new_allocation;
9229 new_allocation = widget->allocation;
9231 if (data->found || !gtk_widget_get_mapped (widget))
9234 /* Note that in the following code, we only count the
9235 * position as being inside a WINDOW widget if it is inside
9236 * widget->window; points that are outside of widget->window
9237 * but within the allocation are not counted. This is consistent
9238 * with the way we highlight drag targets.
9240 if (gtk_widget_get_has_window (widget))
9242 new_allocation.x = 0;
9243 new_allocation.y = 0;
9246 if (widget->parent && !data->first)
9248 GdkWindow *window = widget->window;
9249 while (window != widget->parent->window)
9251 gint tx, ty, twidth, theight;
9252 gdk_drawable_get_size (window, &twidth, &theight);
9254 if (new_allocation.x < 0)
9256 new_allocation.width += new_allocation.x;
9257 new_allocation.x = 0;
9259 if (new_allocation.y < 0)
9261 new_allocation.height += new_allocation.y;
9262 new_allocation.y = 0;
9264 if (new_allocation.x + new_allocation.width > twidth)
9265 new_allocation.width = twidth - new_allocation.x;
9266 if (new_allocation.y + new_allocation.height > theight)
9267 new_allocation.height = theight - new_allocation.y;
9269 gdk_window_get_position (window, &tx, &ty);
9270 new_allocation.x += tx;
9272 new_allocation.y += ty;
9275 window = gdk_window_get_parent (window);
9279 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
9280 (data->x < new_allocation.x + new_allocation.width) &&
9281 (data->y < new_allocation.y + new_allocation.height))
9283 /* First, check if the drag is in a valid drop site in
9284 * one of our children
9286 if (GTK_IS_CONTAINER (widget))
9288 FindWidgetData new_data = *data;
9290 new_data.x -= x_offset;
9291 new_data.y -= y_offset;
9292 new_data.found = FALSE;
9293 new_data.first = FALSE;
9295 gtk_container_forall (GTK_CONTAINER (widget),
9296 (GtkCallback)find_widget,
9299 data->found = new_data.found;
9301 data->res_widget = new_data.res_widget;
9304 /* If not, and this widget is registered as a drop site, check to
9305 * emit "drag_motion" to check if we are actually in
9311 data->res_widget = widget;
9317 find_widget_at_pointer (GdkDisplay *display)
9319 GtkWidget *widget = NULL;
9320 GdkWindow *pointer_window;
9322 FindWidgetData data;
9324 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
9328 gpointer widget_ptr;
9330 gdk_window_get_user_data (pointer_window, &widget_ptr);
9331 widget = widget_ptr;
9336 gdk_window_get_pointer (widget->window,
9344 find_widget (widget, &data);
9346 return data.res_widget;
9352 struct PropertiesData {
9360 destroy_properties (GtkWidget *widget,
9361 struct PropertiesData *data)
9365 *data->window = NULL;
9366 data->window = NULL;
9371 gdk_cursor_unref (data->cursor);
9372 data->cursor = NULL;
9377 g_signal_handler_disconnect (widget, data->handler);
9385 property_query_event (GtkWidget *widget,
9387 struct PropertiesData *data)
9389 GtkWidget *res_widget = NULL;
9391 if (!data->in_query)
9394 if (event->type == GDK_BUTTON_RELEASE)
9396 gtk_grab_remove (widget);
9397 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9400 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9403 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
9404 gtk_widget_get_screen (widget));
9405 create_prop_editor (G_OBJECT (res_widget), 0);
9408 data->in_query = FALSE;
9415 query_properties (GtkButton *button,
9416 struct PropertiesData *data)
9420 g_signal_connect (button, "event",
9421 G_CALLBACK (property_query_event), data);
9425 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9428 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9430 GDK_BUTTON_RELEASE_MASK,
9435 gtk_grab_add (GTK_WIDGET (button));
9437 data->in_query = TRUE;
9441 create_properties (GtkWidget *widget)
9443 static GtkWidget *window = NULL;
9447 struct PropertiesData *data;
9449 data = g_new (struct PropertiesData, 1);
9450 data->window = &window;
9451 data->in_query = FALSE;
9452 data->cursor = NULL;
9457 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9459 gtk_window_set_screen (GTK_WINDOW (window),
9460 gtk_widget_get_screen (widget));
9462 data->handler = g_signal_connect (window, "destroy",
9463 G_CALLBACK (destroy_properties),
9466 gtk_window_set_title (GTK_WINDOW (window), "test properties");
9467 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9469 vbox = gtk_vbox_new (FALSE, 1);
9470 gtk_container_add (GTK_CONTAINER (window), vbox);
9472 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
9473 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
9475 button = gtk_button_new_with_label ("Query properties");
9476 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9477 g_signal_connect (button, "clicked",
9478 G_CALLBACK (query_properties),
9482 if (!gtk_widget_get_visible (window))
9483 gtk_widget_show_all (window);
9485 gtk_widget_destroy (window);
9489 struct SnapshotData {
9490 GtkWidget *toplevel_button;
9494 gboolean is_toplevel;
9499 destroy_snapshot_data (GtkWidget *widget,
9500 struct SnapshotData *data)
9503 *data->window = NULL;
9507 gdk_cursor_unref (data->cursor);
9508 data->cursor = NULL;
9513 g_signal_handler_disconnect (widget, data->handler);
9521 snapshot_widget_event (GtkWidget *widget,
9523 struct SnapshotData *data)
9525 GtkWidget *res_widget = NULL;
9527 if (!data->in_query)
9530 if (event->type == GDK_BUTTON_RELEASE)
9532 gtk_grab_remove (widget);
9533 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9536 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
9537 if (data->is_toplevel && res_widget)
9538 res_widget = gtk_widget_get_toplevel (res_widget);
9542 GtkWidget *window, *image;
9544 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9545 pixmap = gtk_widget_get_snapshot (res_widget, NULL);
9546 gtk_widget_realize (window);
9547 if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
9549 /* this branch is needed to convert ARGB -> RGB */
9552 gdk_drawable_get_size (pixmap, &width, &height);
9553 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
9554 gtk_widget_get_colormap (res_widget),
9558 image = gtk_image_new_from_pixbuf (pixbuf);
9559 g_object_unref (pixbuf);
9562 image = gtk_image_new_from_pixmap (pixmap, NULL);
9563 gtk_container_add (GTK_CONTAINER (window), image);
9564 g_object_unref (pixmap);
9565 gtk_widget_show_all (window);
9568 data->in_query = FALSE;
9575 snapshot_widget (GtkButton *button,
9576 struct SnapshotData *data)
9580 g_signal_connect (button, "event",
9581 G_CALLBACK (snapshot_widget_event), data);
9583 data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
9586 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
9589 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
9591 GDK_BUTTON_RELEASE_MASK,
9596 gtk_grab_add (GTK_WIDGET (button));
9598 data->in_query = TRUE;
9602 create_snapshot (GtkWidget *widget)
9604 static GtkWidget *window = NULL;
9607 struct SnapshotData *data;
9609 data = g_new (struct SnapshotData, 1);
9610 data->window = &window;
9611 data->in_query = FALSE;
9612 data->cursor = NULL;
9617 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9619 gtk_window_set_screen (GTK_WINDOW (window),
9620 gtk_widget_get_screen (widget));
9622 data->handler = g_signal_connect (window, "destroy",
9623 G_CALLBACK (destroy_snapshot_data),
9626 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
9627 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
9629 vbox = gtk_vbox_new (FALSE, 1);
9630 gtk_container_add (GTK_CONTAINER (window), vbox);
9632 button = gtk_button_new_with_label ("Snapshot widget");
9633 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9634 g_signal_connect (button, "clicked",
9635 G_CALLBACK (snapshot_widget),
9638 button = gtk_button_new_with_label ("Snapshot toplevel");
9639 data->toplevel_button = button;
9640 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
9641 g_signal_connect (button, "clicked",
9642 G_CALLBACK (snapshot_widget),
9646 if (!gtk_widget_get_visible (window))
9647 gtk_widget_show_all (window);
9649 gtk_widget_destroy (window);
9658 selection_test_received (GtkWidget *tree_view,
9659 GtkSelectionData *data)
9661 GtkTreeModel *model;
9662 GtkListStore *store;
9666 if (data->length < 0)
9668 g_print ("Selection retrieval failed\n");
9671 if (data->type != GDK_SELECTION_TYPE_ATOM)
9673 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9677 /* Clear out any current list items */
9679 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9680 store = GTK_LIST_STORE (model);
9681 gtk_list_store_clear (store);
9683 /* Add new items to list */
9685 atoms = (GdkAtom *)data->data;
9687 l = data->length / sizeof (GdkAtom);
9688 for (i = 0; i < l; i++)
9693 name = gdk_atom_name (atoms[i]);
9696 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9700 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9707 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9709 static GdkAtom targets_atom = GDK_NONE;
9711 if (targets_atom == GDK_NONE)
9712 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9714 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9719 create_selection_test (GtkWidget *widget)
9721 static GtkWidget *window = NULL;
9724 GtkWidget *scrolled_win;
9725 GtkListStore* store;
9726 GtkWidget *tree_view;
9727 GtkTreeViewColumn *column;
9728 GtkCellRenderer *renderer;
9733 window = gtk_dialog_new ();
9735 gtk_window_set_screen (GTK_WINDOW (window),
9736 gtk_widget_get_screen (widget));
9738 g_signal_connect (window, "destroy",
9739 G_CALLBACK (gtk_widget_destroyed),
9742 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9743 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9745 /* Create the list */
9747 vbox = gtk_vbox_new (FALSE, 5);
9748 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9749 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
9752 label = gtk_label_new ("Gets available targets for current selection");
9753 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9755 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9756 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9757 GTK_POLICY_AUTOMATIC,
9758 GTK_POLICY_AUTOMATIC);
9759 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9760 gtk_widget_set_size_request (scrolled_win, 100, 200);
9762 store = gtk_list_store_new (1, G_TYPE_STRING);
9763 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9764 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9766 renderer = gtk_cell_renderer_text_new ();
9767 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9769 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9771 g_signal_connect (tree_view, "selection_received",
9772 G_CALLBACK (selection_test_received), NULL);
9774 /* .. And create some buttons */
9775 button = gtk_button_new_with_label ("Get Targets");
9776 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9777 button, TRUE, TRUE, 0);
9779 g_signal_connect (button, "clicked",
9780 G_CALLBACK (selection_test_get_targets), tree_view);
9782 button = gtk_button_new_with_label ("Quit");
9783 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9784 button, TRUE, TRUE, 0);
9786 g_signal_connect_swapped (button, "clicked",
9787 G_CALLBACK (gtk_widget_destroy),
9791 if (!gtk_widget_get_visible (window))
9792 gtk_widget_show_all (window);
9794 gtk_widget_destroy (window);
9801 static int scroll_test_pos = 0.0;
9804 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9808 gint imin, imax, jmin, jmax;
9810 imin = (event->area.x) / 10;
9811 imax = (event->area.x + event->area.width + 9) / 10;
9813 jmin = ((int)adj->value + event->area.y) / 10;
9814 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9816 gdk_window_clear_area (widget->window,
9817 event->area.x, event->area.y,
9818 event->area.width, event->area.height);
9820 for (i=imin; i<imax; i++)
9821 for (j=jmin; j<jmax; j++)
9823 gdk_draw_rectangle (widget->window,
9824 widget->style->black_gc,
9826 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9832 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9835 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9836 -adj->page_increment / 2:
9837 adj->page_increment / 2);
9838 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9839 gtk_adjustment_set_value (adj, new_value);
9845 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9848 adj->page_increment = 0.9 * widget->allocation.height;
9849 adj->page_size = widget->allocation.height;
9851 g_signal_emit_by_name (adj, "changed");
9855 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9857 /* gint source_min = (int)adj->value - scroll_test_pos; */
9860 dy = scroll_test_pos - (int)adj->value;
9861 scroll_test_pos = adj->value;
9863 if (!gtk_widget_is_drawable (widget))
9865 gdk_window_scroll (widget->window, 0, dy);
9866 gdk_window_process_updates (widget->window, FALSE);
9871 create_scroll_test (GtkWidget *widget)
9873 static GtkWidget *window = NULL;
9875 GtkWidget *drawing_area;
9876 GtkWidget *scrollbar;
9879 GdkGeometry geometry;
9880 GdkWindowHints geometry_mask;
9884 window = gtk_dialog_new ();
9886 gtk_window_set_screen (GTK_WINDOW (window),
9887 gtk_widget_get_screen (widget));
9889 g_signal_connect (window, "destroy",
9890 G_CALLBACK (gtk_widget_destroyed),
9893 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9894 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9896 hbox = gtk_hbox_new (FALSE, 0);
9897 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
9899 gtk_widget_show (hbox);
9901 drawing_area = gtk_drawing_area_new ();
9902 gtk_widget_set_size_request (drawing_area, 200, 200);
9903 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9904 gtk_widget_show (drawing_area);
9906 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9908 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9909 scroll_test_pos = 0.0;
9911 scrollbar = gtk_vscrollbar_new (adj);
9912 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9913 gtk_widget_show (scrollbar);
9915 g_signal_connect (drawing_area, "expose_event",
9916 G_CALLBACK (scroll_test_expose), adj);
9917 g_signal_connect (drawing_area, "configure_event",
9918 G_CALLBACK (scroll_test_configure), adj);
9919 g_signal_connect (drawing_area, "scroll_event",
9920 G_CALLBACK (scroll_test_scroll), adj);
9922 g_signal_connect (adj, "value_changed",
9923 G_CALLBACK (scroll_test_adjustment_changed),
9926 /* .. And create some buttons */
9928 button = gtk_button_new_with_label ("Quit");
9929 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
9930 button, TRUE, TRUE, 0);
9932 g_signal_connect_swapped (button, "clicked",
9933 G_CALLBACK (gtk_widget_destroy),
9935 gtk_widget_show (button);
9937 /* Set up gridded geometry */
9939 geometry_mask = GDK_HINT_MIN_SIZE |
9940 GDK_HINT_BASE_SIZE |
9941 GDK_HINT_RESIZE_INC;
9943 geometry.min_width = 20;
9944 geometry.min_height = 20;
9945 geometry.base_width = 0;
9946 geometry.base_height = 0;
9947 geometry.width_inc = 10;
9948 geometry.height_inc = 10;
9950 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9951 drawing_area, &geometry, geometry_mask);
9954 if (!gtk_widget_get_visible (window))
9955 gtk_widget_show (window);
9957 gtk_widget_destroy (window);
9964 static int timer = 0;
9967 timeout_test (GtkWidget *label)
9969 static int count = 0;
9970 static char buffer[32];
9972 sprintf (buffer, "count: %d", ++count);
9973 gtk_label_set_text (GTK_LABEL (label), buffer);
9979 start_timeout_test (GtkWidget *widget,
9984 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9989 stop_timeout_test (GtkWidget *widget,
9994 g_source_remove (timer);
10000 destroy_timeout_test (GtkWidget *widget,
10001 GtkWidget **window)
10003 stop_timeout_test (NULL, NULL);
10009 create_timeout_test (GtkWidget *widget)
10011 static GtkWidget *window = NULL;
10017 window = gtk_dialog_new ();
10019 gtk_window_set_screen (GTK_WINDOW (window),
10020 gtk_widget_get_screen (widget));
10022 g_signal_connect (window, "destroy",
10023 G_CALLBACK (destroy_timeout_test),
10026 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
10027 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10029 label = gtk_label_new ("count: 0");
10030 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10031 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
10032 label, TRUE, TRUE, 0);
10033 gtk_widget_show (label);
10035 button = gtk_button_new_with_label ("close");
10036 g_signal_connect_swapped (button, "clicked",
10037 G_CALLBACK (gtk_widget_destroy),
10039 gtk_widget_set_can_default (button, TRUE);
10040 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10041 button, TRUE, TRUE, 0);
10042 gtk_widget_grab_default (button);
10043 gtk_widget_show (button);
10045 button = gtk_button_new_with_label ("start");
10046 g_signal_connect (button, "clicked",
10047 G_CALLBACK(start_timeout_test),
10049 gtk_widget_set_can_default (button, TRUE);
10050 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10051 button, TRUE, TRUE, 0);
10052 gtk_widget_show (button);
10054 button = gtk_button_new_with_label ("stop");
10055 g_signal_connect (button, "clicked",
10056 G_CALLBACK (stop_timeout_test),
10058 gtk_widget_set_can_default (button, TRUE);
10059 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10060 button, TRUE, TRUE, 0);
10061 gtk_widget_show (button);
10064 if (!gtk_widget_get_visible (window))
10065 gtk_widget_show (window);
10067 gtk_widget_destroy (window);
10074 static int idle_id = 0;
10077 idle_test (GtkWidget *label)
10079 static int count = 0;
10080 static char buffer[32];
10082 sprintf (buffer, "count: %d", ++count);
10083 gtk_label_set_text (GTK_LABEL (label), buffer);
10089 start_idle_test (GtkWidget *widget,
10094 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
10099 stop_idle_test (GtkWidget *widget,
10104 g_source_remove (idle_id);
10110 destroy_idle_test (GtkWidget *widget,
10111 GtkWidget **window)
10113 stop_idle_test (NULL, NULL);
10119 toggle_idle_container (GObject *button,
10120 GtkContainer *container)
10122 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
10126 create_idle_test (GtkWidget *widget)
10128 static GtkWidget *window = NULL;
10131 GtkWidget *container;
10135 GtkWidget *button2;
10139 window = gtk_dialog_new ();
10141 gtk_window_set_screen (GTK_WINDOW (window),
10142 gtk_widget_get_screen (widget));
10144 g_signal_connect (window, "destroy",
10145 G_CALLBACK (destroy_idle_test),
10148 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
10149 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10151 label = gtk_label_new ("count: 0");
10152 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
10153 gtk_widget_show (label);
10156 g_object_new (GTK_TYPE_HBOX,
10158 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
10159 * "GtkWidget::visible", TRUE,
10164 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
10165 container, TRUE, TRUE, 0);
10168 g_object_new (GTK_TYPE_FRAME,
10170 "label", "Label Container",
10172 "parent", GTK_DIALOG (window)->vbox,
10175 g_object_new (GTK_TYPE_VBOX,
10180 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
10181 "label", "Resize-Parent",
10182 "user_data", (void*)GTK_RESIZE_PARENT,
10186 "signal::clicked", toggle_idle_container, container,
10188 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
10189 "label", "Resize-Queue",
10190 "user_data", (void*)GTK_RESIZE_QUEUE,
10195 g_object_connect (button,
10196 "signal::clicked", toggle_idle_container, container,
10198 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
10199 "label", "Resize-Immediate",
10200 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
10202 g_object_connect (button2,
10203 "signal::clicked", toggle_idle_container, container,
10205 g_object_set (button2,
10211 button = gtk_button_new_with_label ("close");
10212 g_signal_connect_swapped (button, "clicked",
10213 G_CALLBACK (gtk_widget_destroy),
10215 gtk_widget_set_can_default (button, TRUE);
10216 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10217 button, TRUE, TRUE, 0);
10218 gtk_widget_grab_default (button);
10219 gtk_widget_show (button);
10221 button = gtk_button_new_with_label ("start");
10222 g_signal_connect (button, "clicked",
10223 G_CALLBACK (start_idle_test),
10225 gtk_widget_set_can_default (button, TRUE);
10226 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10227 button, TRUE, TRUE, 0);
10228 gtk_widget_show (button);
10230 button = gtk_button_new_with_label ("stop");
10231 g_signal_connect (button, "clicked",
10232 G_CALLBACK (stop_idle_test),
10234 gtk_widget_set_can_default (button, TRUE);
10235 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10236 button, TRUE, TRUE, 0);
10237 gtk_widget_show (button);
10240 if (!gtk_widget_get_visible (window))
10241 gtk_widget_show (window);
10243 gtk_widget_destroy (window);
10251 reload_all_rc_files (void)
10253 static GdkAtom atom_rcfiles = GDK_NONE;
10255 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
10259 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
10261 for(i = 0; i < 5; i++)
10262 send_event->client.data.l[i] = 0;
10263 send_event->client.data_format = 32;
10264 send_event->client.message_type = atom_rcfiles;
10265 gdk_event_send_clientmessage_toall (send_event);
10267 gdk_event_free (send_event);
10271 create_rc_file (GtkWidget *widget)
10273 static GtkWidget *window = NULL;
10281 window = gtk_dialog_new ();
10283 gtk_window_set_screen (GTK_WINDOW (window),
10284 gtk_widget_get_screen (widget));
10286 g_signal_connect (window, "destroy",
10287 G_CALLBACK (gtk_widget_destroyed),
10290 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
10291 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
10293 vbox = gtk_vbox_new (FALSE, 0);
10294 gtk_container_add (GTK_CONTAINER (frame), vbox);
10296 label = gtk_label_new ("This label should be red");
10297 gtk_widget_set_name (label, "testgtk-red-label");
10298 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10300 label = gtk_label_new ("This label should be green");
10301 gtk_widget_set_name (label, "testgtk-green-label");
10302 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10304 label = gtk_label_new ("This label should be blue");
10305 gtk_widget_set_name (label, "testgtk-blue-label");
10306 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10308 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
10309 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
10311 button = gtk_button_new_with_label ("Reload");
10312 g_signal_connect (button, "clicked",
10313 G_CALLBACK (gtk_rc_reparse_all), NULL);
10314 gtk_widget_set_can_default (button, TRUE);
10315 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10316 button, TRUE, TRUE, 0);
10317 gtk_widget_grab_default (button);
10319 button = gtk_button_new_with_label ("Reload All");
10320 g_signal_connect (button, "clicked",
10321 G_CALLBACK (reload_all_rc_files), NULL);
10322 gtk_widget_set_can_default (button, TRUE);
10323 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10324 button, TRUE, TRUE, 0);
10326 button = gtk_button_new_with_label ("Close");
10327 g_signal_connect_swapped (button, "clicked",
10328 G_CALLBACK (gtk_widget_destroy),
10330 gtk_widget_set_can_default (button, TRUE);
10331 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10332 button, TRUE, TRUE, 0);
10335 if (!gtk_widget_get_visible (window))
10336 gtk_widget_show_all (window);
10338 gtk_widget_destroy (window);
10342 * Test of recursive mainloop
10346 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
10353 create_mainloop (GtkWidget *widget)
10355 static GtkWidget *window = NULL;
10361 window = gtk_dialog_new ();
10363 gtk_window_set_screen (GTK_WINDOW (window),
10364 gtk_widget_get_screen (widget));
10366 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
10368 g_signal_connect (window, "destroy",
10369 G_CALLBACK (mainloop_destroyed),
10372 label = gtk_label_new ("In recursive main loop...");
10373 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
10375 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
10377 gtk_widget_show (label);
10379 button = gtk_button_new_with_label ("Leave");
10380 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
10383 g_signal_connect_swapped (button, "clicked",
10384 G_CALLBACK (gtk_widget_destroy),
10387 gtk_widget_set_can_default (button, TRUE);
10388 gtk_widget_grab_default (button);
10390 gtk_widget_show (button);
10393 if (!gtk_widget_get_visible (window))
10395 gtk_widget_show (window);
10397 g_print ("create_mainloop: start\n");
10399 g_print ("create_mainloop: done\n");
10402 gtk_widget_destroy (window);
10406 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
10411 gint imin, imax, jmin, jmax;
10413 layout = GTK_LAYOUT (widget);
10415 if (event->window != layout->bin_window)
10418 imin = (event->area.x) / 10;
10419 imax = (event->area.x + event->area.width + 9) / 10;
10421 jmin = (event->area.y) / 10;
10422 jmax = (event->area.y + event->area.height + 9) / 10;
10424 for (i=imin; i<imax; i++)
10425 for (j=jmin; j<jmax; j++)
10427 gdk_draw_rectangle (layout->bin_window,
10428 widget->style->black_gc,
10436 void create_layout (GtkWidget *widget)
10438 static GtkWidget *window = NULL;
10440 GtkWidget *scrolledwindow;
10449 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10450 gtk_window_set_screen (GTK_WINDOW (window),
10451 gtk_widget_get_screen (widget));
10453 g_signal_connect (window, "destroy",
10454 G_CALLBACK (gtk_widget_destroyed),
10457 gtk_window_set_title (GTK_WINDOW (window), "Layout");
10458 gtk_widget_set_size_request (window, 200, 200);
10460 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
10461 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
10463 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
10464 GTK_CORNER_TOP_RIGHT);
10466 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
10468 layout = gtk_layout_new (NULL, NULL);
10469 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
10471 /* We set step sizes here since GtkLayout does not set
10474 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
10475 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
10477 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
10478 g_signal_connect (layout, "expose_event",
10479 G_CALLBACK (layout_expose_handler), NULL);
10481 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
10483 for (i=0 ; i < 16 ; i++)
10484 for (j=0 ; j < 16 ; j++)
10486 sprintf(buf, "Button %d, %d", i, j);
10488 button = gtk_button_new_with_label (buf);
10490 button = gtk_label_new (buf);
10492 gtk_layout_put (GTK_LAYOUT (layout), button,
10496 for (i=16; i < 1280; i++)
10498 sprintf(buf, "Button %d, %d", i, 0);
10500 button = gtk_button_new_with_label (buf);
10502 button = gtk_label_new (buf);
10504 gtk_layout_put (GTK_LAYOUT (layout), button,
10509 if (!gtk_widget_get_visible (window))
10510 gtk_widget_show_all (window);
10512 gtk_widget_destroy (window);
10516 create_styles (GtkWidget *widget)
10518 static GtkWidget *window = NULL;
10523 static GdkColor red = { 0, 0xffff, 0, 0 };
10524 static GdkColor green = { 0, 0, 0xffff, 0 };
10525 static GdkColor blue = { 0, 0, 0, 0xffff };
10526 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
10527 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
10528 PangoFontDescription *font_desc;
10530 GtkRcStyle *rc_style;
10534 window = gtk_dialog_new ();
10535 gtk_window_set_screen (GTK_WINDOW (window),
10536 gtk_widget_get_screen (widget));
10538 g_signal_connect (window, "destroy",
10539 G_CALLBACK (gtk_widget_destroyed),
10543 button = gtk_button_new_with_label ("Close");
10544 g_signal_connect_swapped (button, "clicked",
10545 G_CALLBACK (gtk_widget_destroy),
10547 gtk_widget_set_can_default (button, TRUE);
10548 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
10549 button, TRUE, TRUE, 0);
10550 gtk_widget_show (button);
10552 vbox = gtk_vbox_new (FALSE, 5);
10553 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10554 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
10556 label = gtk_label_new ("Font:");
10557 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10558 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10560 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
10562 button = gtk_button_new_with_label ("Some Text");
10563 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
10564 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10566 label = gtk_label_new ("Foreground:");
10567 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10568 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10570 button = gtk_button_new_with_label ("Some Text");
10571 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
10572 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10574 label = gtk_label_new ("Background:");
10575 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10576 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10578 button = gtk_button_new_with_label ("Some Text");
10579 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
10580 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10582 label = gtk_label_new ("Text:");
10583 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10584 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10586 entry = gtk_entry_new ();
10587 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10588 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
10589 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10591 label = gtk_label_new ("Base:");
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 entry = gtk_entry_new ();
10596 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10597 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
10598 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10600 label = gtk_label_new ("Cursor:");
10601 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10602 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10604 entry = gtk_entry_new ();
10605 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
10606 gtk_widget_modify_cursor (entry, &red, &red);
10607 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10609 label = gtk_label_new ("Multiple:");
10610 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
10611 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10613 button = gtk_button_new_with_label ("Some Text");
10615 rc_style = gtk_rc_style_new ();
10617 rc_style->font_desc = pango_font_description_copy (font_desc);
10618 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
10619 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
10620 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
10621 rc_style->fg[GTK_STATE_NORMAL] = yellow;
10622 rc_style->bg[GTK_STATE_NORMAL] = blue;
10623 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
10624 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
10625 rc_style->fg[GTK_STATE_ACTIVE] = red;
10626 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
10627 rc_style->xthickness = 5;
10628 rc_style->ythickness = 5;
10630 gtk_widget_modify_style (button, rc_style);
10631 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
10633 g_object_unref (rc_style);
10635 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10638 if (!gtk_widget_get_visible (window))
10639 gtk_widget_show_all (window);
10641 gtk_widget_destroy (window);
10645 * Main Window and Exit
10649 do_exit (GtkWidget *widget, GtkWidget *window)
10651 gtk_widget_destroy (window);
10657 void (*func) (GtkWidget *widget);
10658 gboolean do_not_benchmark;
10661 { "alpha window", create_alpha_window },
10662 { "big windows", create_big_windows },
10663 { "button box", create_button_box },
10664 { "buttons", create_buttons },
10665 { "check buttons", create_check_buttons },
10666 { "color selection", create_color_selection },
10667 { "composited window", create_composited_window },
10668 { "cursors", create_cursors },
10669 { "dialog", create_dialog },
10670 { "display & screen", create_display_screen, TRUE },
10671 { "entry", create_entry },
10672 { "event box", create_event_box },
10673 { "event watcher", create_event_watcher },
10674 { "expander", create_expander },
10675 { "flipping", create_flipping },
10676 { "focus", create_focus },
10677 { "font selection", create_font_selection },
10678 { "gridded geometry", create_gridded_geometry },
10679 { "handle box", create_handle_box },
10680 { "image from drawable", create_get_image },
10681 { "image", create_image },
10682 { "key lookup", create_key_lookup },
10683 { "labels", create_labels },
10684 { "layout", create_layout },
10685 { "menus", create_menus },
10686 { "message dialog", create_message_dialog },
10687 { "modal window", create_modal_window, TRUE },
10688 { "notebook", create_notebook },
10689 { "panes", create_panes },
10690 { "paned keyboard", create_paned_keyboard_navigation },
10691 { "pixmap", create_pixmap },
10692 { "progress bar", create_progress_bar },
10693 { "properties", create_properties },
10694 { "radio buttons", create_radio_buttons },
10695 { "range controls", create_range_controls },
10696 { "rc file", create_rc_file },
10697 { "reparent", create_reparent },
10698 { "resize grips", create_resize_grips },
10699 { "rotated label", create_rotated_label },
10700 { "rotated text", create_rotated_text },
10701 { "rulers", create_rulers },
10702 { "saved position", create_saved_position },
10703 { "scrolled windows", create_scrolled_windows },
10704 { "shapes", create_shapes },
10705 { "size groups", create_size_groups },
10706 { "snapshot", create_snapshot },
10707 { "spinbutton", create_spins },
10708 { "statusbar", create_statusbar },
10709 { "styles", create_styles },
10710 { "test idle", create_idle_test },
10711 { "test mainloop", create_mainloop, TRUE },
10712 { "test scrolling", create_scroll_test },
10713 { "test selection", create_selection_test },
10714 { "test timeout", create_timeout_test },
10715 { "toggle buttons", create_toggle_buttons },
10716 { "toolbar", create_toolbar },
10717 { "tooltips", create_tooltips },
10718 { "WM hints", create_wmhints },
10719 { "window sizing", create_window_sizing },
10720 { "window states", create_window_states }
10722 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10725 create_main_window (void)
10730 GtkWidget *scrolled_window;
10734 GtkWidget *separator;
10735 GdkGeometry geometry;
10738 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10739 gtk_widget_set_name (window, "main window");
10740 gtk_window_move (GTK_WINDOW (window), 50, 20);
10741 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10743 geometry.min_width = -1;
10744 geometry.min_height = -1;
10745 geometry.max_width = -1;
10746 geometry.max_height = G_MAXSHORT;
10747 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10749 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10751 g_signal_connect (window, "destroy",
10752 G_CALLBACK (gtk_main_quit),
10754 g_signal_connect (window, "delete-event",
10755 G_CALLBACK (gtk_false),
10758 box1 = gtk_vbox_new (FALSE, 0);
10759 gtk_container_add (GTK_CONTAINER (window), box1);
10761 if (gtk_micro_version > 0)
10766 gtk_micro_version);
10771 gtk_minor_version);
10773 label = gtk_label_new (buffer);
10774 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10775 gtk_widget_set_name (label, "testgtk-version-label");
10777 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10778 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10779 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10781 GTK_POLICY_AUTOMATIC);
10782 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10784 box2 = gtk_vbox_new (FALSE, 0);
10785 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10786 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10787 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10788 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10789 gtk_widget_show (box2);
10791 for (i = 0; i < nbuttons; i++)
10793 button = gtk_button_new_with_label (buttons[i].label);
10794 if (buttons[i].func)
10795 g_signal_connect (button,
10797 G_CALLBACK(buttons[i].func),
10800 gtk_widget_set_sensitive (button, FALSE);
10801 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10804 separator = gtk_hseparator_new ();
10805 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10807 box2 = gtk_vbox_new (FALSE, 10);
10808 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10809 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10811 button = gtk_button_new_with_mnemonic ("_Close");
10812 g_signal_connect (button, "clicked",
10813 G_CALLBACK (do_exit),
10815 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10816 gtk_widget_set_can_default (button, TRUE);
10817 gtk_widget_grab_default (button);
10819 gtk_widget_show_all (window);
10825 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10826 G_FILE_TEST_EXISTS))
10828 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
10829 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
10834 pad (const char *str, int to)
10836 static char buf[256];
10837 int len = strlen (str);
10840 for (i = 0; i < to; i++)
10845 memcpy (buf, str, len);
10851 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10853 fn (widget); /* on */
10854 while (g_main_context_iteration (NULL, FALSE));
10855 fn (widget); /* off */
10856 while (g_main_context_iteration (NULL, FALSE));
10860 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10866 static gboolean printed_headers = FALSE;
10868 if (!printed_headers) {
10869 g_print ("Test Iters First Other\n");
10870 g_print ("-------------------- ----- ---------- ----------\n");
10871 printed_headers = TRUE;
10874 g_get_current_time (&tv0);
10875 bench_iteration (widget, fn);
10876 g_get_current_time (&tv1);
10878 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10879 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10881 g_get_current_time (&tv0);
10882 for (n = 0; n < num - 1; n++)
10883 bench_iteration (widget, fn);
10884 g_get_current_time (&tv1);
10885 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10886 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10888 g_print ("%s %5d ", pad (name, 20), num);
10890 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10892 g_print ("%10.1f\n", dt_first);
10896 do_bench (char* what, int num)
10900 void (* fn) (GtkWidget *widget);
10902 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10904 if (g_ascii_strcasecmp (what, "ALL") == 0)
10906 for (i = 0; i < nbuttons; i++)
10908 if (!buttons[i].do_not_benchmark)
10909 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10916 for (i = 0; i < nbuttons; i++)
10918 if (strcmp (buttons[i].label, what) == 0)
10920 fn = buttons[i].func;
10926 g_print ("Can't bench: \"%s\" not found.\n", what);
10928 do_real_bench (widget, fn, buttons[i].label, num);
10935 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10940 main (int argc, char *argv[])
10942 GtkBindingSet *binding_set;
10944 gboolean done_benchmarks = FALSE;
10946 srand (time (NULL));
10950 /* Check to see if we are being run from the correct
10953 if (file_exists ("testgtkrc"))
10954 gtk_rc_add_default_file ("testgtkrc");
10955 else if (file_exists ("tests/testgtkrc"))
10956 gtk_rc_add_default_file ("tests/testgtkrc");
10958 g_warning ("Couldn't find file \"testgtkrc\".");
10960 g_set_application_name ("GTK+ Test Program");
10962 gtk_init (&argc, &argv);
10964 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10973 for (i = 1; i < argc; i++)
10975 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10982 nextarg = strchr (argv[i], '=');
10993 count = strchr (nextarg, ':');
10996 what = g_strndup (nextarg, count - nextarg);
10998 num = atoi (count);
11003 what = g_strdup (nextarg);
11005 do_bench (what, num ? num : 1);
11006 done_benchmarks = TRUE;
11011 if (done_benchmarks)
11016 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
11017 gtk_binding_entry_add_signal (binding_set,
11018 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
11021 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
11023 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
11027 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
11028 " fg[NORMAL] = \"#ff0000\"\n"
11029 " font = \"Sans 18\"\n"
11031 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
11033 create_main_window ();
11039 while (g_main_context_pending (NULL))
11040 g_main_context_iteration (NULL, FALSE);
11043 while (g_main_context_pending (NULL))
11044 g_main_context_iteration (NULL, FALSE);