1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
44 #include "gdk/gdkkeysyms.h"
47 #define sleep(n) _sleep(n)
50 #include "prop-editor.h"
55 file_exists (const char *filename)
59 return stat (filename, &statbuf) == 0;
63 shape_create_icon (GdkScreen *screen,
72 build_option_menu (gchar *items[],
75 void (*func) (GtkWidget *widget, gpointer data),
78 /* macro, structure and variables used by tree window demos */
79 #define DEFAULT_NUMBER_OF_ITEM 3
80 #define DEFAULT_RECURSION_LEVEL 3
83 GSList* selection_mode_group;
84 GtkWidget* single_button;
85 GtkWidget* browse_button;
86 GtkWidget* multiple_button;
87 GtkWidget* draw_line_button;
88 GtkWidget* view_line_button;
89 GtkWidget* no_root_item_button;
90 GtkWidget* nb_item_spinner;
91 GtkWidget* recursion_spinner;
92 } sTreeSampleSelection;
94 typedef struct sTreeButtons {
96 GtkWidget* add_button;
97 GtkWidget* remove_button;
98 GtkWidget* subtree_button;
100 /* end of tree section */
103 build_option_menu (gchar *items[],
106 void (*func)(GtkWidget *widget, gpointer data),
112 omenu = gtk_combo_box_text_new ();
113 g_signal_connect (omenu, "changed",
114 G_CALLBACK (func), data);
116 for (i = 0; i < num_items; i++)
117 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), items[i]);
119 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
125 * Windows with an alpha channel
130 on_alpha_window_draw (GtkWidget *widget,
133 cairo_pattern_t *pattern;
134 int radius, width, height;
136 width = gtk_widget_get_allocated_width (widget);
137 height = gtk_widget_get_allocated_height (widget);
138 radius = MIN (width, height) / 2;
139 pattern = cairo_pattern_create_radial (width / 2,
146 if (gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)) &&
147 gtk_widget_is_composited (widget))
148 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
150 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
152 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
155 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
156 1.0, 0.75, 0.0, 1.0); /* solid orange */
157 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
158 1.0, 0.75, 0.0, 0.0); /* transparent orange */
160 cairo_set_source (cr, pattern);
161 cairo_pattern_destroy (pattern);
163 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
170 build_alpha_widgets (void)
173 GtkWidget *radio_button;
174 GtkWidget *check_button;
179 grid = gtk_grid_new ();
181 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
182 gtk_widget_set_hexpand (radio_button, TRUE);
183 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 0, 1, 1);
185 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
186 gtk_widget_set_hexpand (radio_button, TRUE);
187 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 1, 1, 1);
189 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
190 gtk_widget_set_hexpand (radio_button, TRUE);
191 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 2, 1, 1);
193 check_button = gtk_check_button_new_with_label ("Sedentary"),
194 gtk_widget_set_hexpand (check_button, TRUE);
195 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 0, 1, 1);
197 check_button = gtk_check_button_new_with_label ("Nocturnal"),
198 gtk_widget_set_hexpand (check_button, TRUE);
199 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 1, 1, 1);
201 check_button = gtk_check_button_new_with_label ("Compulsive"),
202 gtk_widget_set_hexpand (check_button, TRUE);
203 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 2, 1, 1);
205 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
206 label = gtk_label_new (NULL);
207 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
208 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
209 entry = gtk_entry_new ();
210 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
211 gtk_widget_set_hexpand (hbox, TRUE);
212 gtk_grid_attach (GTK_GRID (grid), hbox, 0, 3, 2, 1);
218 on_alpha_screen_changed (GtkWindow *window,
219 GdkScreen *old_screen,
222 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window));
223 GdkVisual *visual = gdk_screen_get_rgba_visual (screen);
227 visual = gdk_screen_get_system_visual (screen);
228 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
232 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
235 gtk_widget_set_visual (GTK_WIDGET (window), visual);
239 on_composited_changed (GtkWidget *window,
242 gboolean is_composited = gtk_widget_is_composited (window);
245 gtk_label_set_text (label, "Composited");
247 gtk_label_set_text (label, "Not composited");
251 create_alpha_window (GtkWidget *widget)
253 static GtkWidget *window;
257 GtkWidget *content_area;
261 window = gtk_dialog_new_with_buttons ("Alpha Window",
262 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
266 gtk_widget_set_app_paintable (window, TRUE);
267 g_signal_connect (window, "draw",
268 G_CALLBACK (on_alpha_window_draw), NULL);
270 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
272 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
273 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
274 gtk_box_pack_start (GTK_BOX (content_area), vbox,
277 label = gtk_label_new (NULL);
278 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
279 on_alpha_screen_changed (GTK_WINDOW (window), NULL, label);
280 g_signal_connect (window, "screen-changed",
281 G_CALLBACK (on_alpha_screen_changed), label);
283 label = gtk_label_new (NULL);
284 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
285 on_composited_changed (window, GTK_LABEL (label));
286 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
288 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
290 g_signal_connect (window, "destroy",
291 G_CALLBACK (gtk_widget_destroyed),
294 g_signal_connect (window, "response",
295 G_CALLBACK (gtk_widget_destroy),
299 if (!gtk_widget_get_visible (window))
300 gtk_widget_show_all (window);
302 gtk_widget_destroy (window);
306 * Composited non-toplevel window
309 /* The draw event handler for the event box.
311 * This function simply draws a transparency onto a widget on the area
312 * for which it receives expose events. This is intended to give the
313 * event box a "transparent" background.
315 * In order for this to work properly, the widget must have an RGBA
316 * colourmap. The widget should also be set as app-paintable since it
317 * doesn't make sense for GTK to draw a background if we are drawing it
318 * (and because GTK might actually replace our transparency with its
319 * default background colour).
322 transparent_draw (GtkWidget *widget,
325 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
331 /* The expose event handler for the window.
333 * This function performs the actual compositing of the event box onto
334 * the already-existing background of the window at 50% normal opacity.
336 * In this case we do not want app-paintable to be set on the widget
337 * since we want it to draw its own (red) background. Because of this,
338 * however, we must ensure that we use g_signal_register_after so that
339 * this handler is called after the red has been drawn. If it was
340 * called before then GTK would just blindly paint over our work.
343 window_draw (GtkWidget *widget,
346 GtkAllocation allocation;
349 /* get our child (in this case, the event box) */
350 child = gtk_bin_get_child (GTK_BIN (widget));
352 gtk_widget_get_allocation (child, &allocation);
354 /* the source data is the (composited) event box */
355 gdk_cairo_set_source_window (cr, gtk_widget_get_window (child),
359 /* composite, with a 50% opacity */
360 cairo_paint_with_alpha (cr, 0.5);
366 create_composited_window (GtkWidget *widget)
368 static GtkWidget *window;
372 GtkWidget *event, *button;
375 /* make the widgets */
376 button = gtk_button_new_with_label ("A Button");
377 event = gtk_event_box_new ();
378 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
380 g_signal_connect (window, "destroy",
381 G_CALLBACK (gtk_widget_destroyed),
384 /* put a red background on the window */
385 gdk_rgba_parse (&red, "red");
386 gtk_widget_override_background_color (window, 0, &red);
388 /* set our event box to have a fully-transparent background
389 * drawn on it. currently there is no way to simply tell gtk
390 * that "transparency" is the background colour for a widget.
392 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
393 g_signal_connect (event, "draw",
394 G_CALLBACK (transparent_draw), NULL);
396 /* put them inside one another */
397 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
398 gtk_container_add (GTK_CONTAINER (window), event);
399 gtk_container_add (GTK_CONTAINER (event), button);
401 /* realise and show everything */
402 gtk_widget_realize (button);
404 /* set the event box GdkWindow to be composited.
405 * obviously must be performed after event box is realised.
407 gdk_window_set_composited (gtk_widget_get_window (event),
410 /* set up the compositing handler.
411 * note that we do _after so that the normal (red) background is drawn
412 * by gtk before our compositing occurs.
414 g_signal_connect_after (window, "draw",
415 G_CALLBACK (window_draw), NULL);
418 if (!gtk_widget_get_visible (window))
419 gtk_widget_show_all (window);
421 gtk_widget_destroy (window);
425 * Big windows and guffaw scrolling
429 pattern_set_bg (GtkWidget *widget,
433 static const GdkColor colors[] = {
434 { 0, 0x4444, 0x4444, 0xffff },
435 { 0, 0x8888, 0x8888, 0xffff },
436 { 0, 0xaaaa, 0xaaaa, 0xffff }
439 gdk_window_set_user_data (child, widget);
440 gdk_window_set_background (child, &colors[level]);
444 create_pattern (GtkWidget *widget,
455 while (2 * h <= height)
460 while (2 * w <= width)
462 if ((i + j) % 2 == 0)
467 GdkWindowAttr attributes;
469 attributes.window_type = GDK_WINDOW_CHILD;
472 attributes.width = w;
473 attributes.height = h;
474 attributes.wclass = GDK_INPUT_OUTPUT;
475 attributes.event_mask = GDK_EXPOSURE_MASK;
476 attributes.visual = gtk_widget_get_visual (widget);
478 child = gdk_window_new (parent, &attributes,
479 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
481 pattern_set_bg (widget, child, level);
484 create_pattern (widget, child, level + 1, w, h);
486 gdk_window_show (child);
496 #define PATTERN_SIZE (1 << 18)
499 pattern_hadj_changed (GtkAdjustment *adjustment,
502 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
503 gint new_value = gtk_adjustment_get_value (adjustment);
505 if (gtk_widget_get_realized (darea))
507 gdk_window_scroll (gtk_widget_get_window (darea),
508 *old_value - new_value, 0);
509 *old_value = new_value;
514 pattern_vadj_changed (GtkAdjustment *adjustment,
517 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
518 gint new_value = gtk_adjustment_get_value (adjustment);
520 if (gtk_widget_get_realized (darea))
522 gdk_window_scroll (gtk_widget_get_window (darea),
523 0, *old_value - new_value);
524 *old_value = new_value;
529 pattern_realize (GtkWidget *widget,
534 window = gtk_widget_get_window (widget);
535 pattern_set_bg (widget, window, 0);
536 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
540 create_big_windows (GtkWidget *widget)
542 static GtkWidget *window = NULL;
543 GtkWidget *content_area;
544 GtkWidget *darea, *grid, *scrollbar;
546 GtkAdjustment *hadjustment;
547 GtkAdjustment *vadjustment;
548 static gint current_x;
549 static gint current_y;
556 window = gtk_dialog_new_with_buttons ("Big Windows",
562 gtk_window_set_screen (GTK_WINDOW (window),
563 gtk_widget_get_screen (widget));
565 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
567 g_signal_connect (window, "destroy",
568 G_CALLBACK (gtk_widget_destroyed),
571 g_signal_connect (window, "response",
572 G_CALLBACK (gtk_widget_destroy),
575 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
577 grid = gtk_grid_new ();
578 gtk_box_pack_start (GTK_BOX (content_area), grid, TRUE, TRUE, 0);
580 darea = gtk_drawing_area_new ();
582 hadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
583 g_signal_connect (hadjustment, "value_changed",
584 G_CALLBACK (pattern_hadj_changed), darea);
585 g_object_set_data (G_OBJECT (hadjustment), "old-value", ¤t_x);
587 vadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
588 g_signal_connect (vadjustment, "value_changed",
589 G_CALLBACK (pattern_vadj_changed), darea);
590 g_object_set_data (G_OBJECT (vadjustment), "old-value", ¤t_y);
592 g_signal_connect (darea, "realize",
593 G_CALLBACK (pattern_realize),
596 eventbox = gtk_event_box_new ();
597 gtk_widget_set_hexpand (eventbox, TRUE);
598 gtk_widget_set_vexpand (eventbox, TRUE);
599 gtk_grid_attach (GTK_GRID (grid), eventbox, 0, 0, 1, 1);
601 gtk_container_add (GTK_CONTAINER (eventbox), darea);
603 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
604 gtk_widget_set_hexpand (scrollbar, TRUE);
605 gtk_grid_attach (GTK_GRID (grid), scrollbar, 0, 1, 1, 1);
607 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
608 gtk_widget_set_vexpand (scrollbar, TRUE);
609 gtk_grid_attach (GTK_GRID (grid), scrollbar, 1, 0, 1, 1);
612 if (!gtk_widget_get_visible (window))
613 gtk_widget_show_all (window);
615 gtk_widget_hide (window);
623 button_window (GtkWidget *widget,
626 if (!gtk_widget_get_visible (button))
627 gtk_widget_show (button);
629 gtk_widget_hide (button);
633 create_buttons (GtkWidget *widget)
635 static GtkWidget *window = NULL;
639 GtkWidget *separator;
640 GtkWidget *button[10];
641 int button_x[9] = { 0, 1, 2, 0, 2, 1, 1, 2, 0 };
642 int button_y[9] = { 0, 1, 2, 2, 0, 2, 0, 1, 1 };
647 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
648 gtk_window_set_screen (GTK_WINDOW (window),
649 gtk_widget_get_screen (widget));
651 g_signal_connect (window, "destroy",
652 G_CALLBACK (gtk_widget_destroyed),
655 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
656 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
658 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
659 gtk_container_add (GTK_CONTAINER (window), box1);
661 grid = gtk_grid_new ();
662 gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
663 gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
664 gtk_container_set_border_width (GTK_CONTAINER (grid), 10);
665 gtk_box_pack_start (GTK_BOX (box1), grid, TRUE, TRUE, 0);
667 button[0] = gtk_button_new_with_label ("button1");
668 button[1] = gtk_button_new_with_mnemonic ("_button2");
669 button[2] = gtk_button_new_with_mnemonic ("_button3");
670 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
671 button[4] = gtk_button_new_with_label ("button5");
672 button[5] = gtk_button_new_with_label ("button6");
673 button[6] = gtk_button_new_with_label ("button7");
674 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
675 button[8] = gtk_button_new_with_label ("button9");
677 for (i = 0; i < 9; i++)
679 g_signal_connect (button[i], "clicked",
680 G_CALLBACK (button_window),
681 button[(i + 1) % 9]);
682 gtk_widget_set_hexpand (button[i], TRUE);
683 gtk_widget_set_vexpand (button[i], TRUE);
685 gtk_grid_attach (GTK_GRID (grid), button[i],
686 button_x[i], button_y[i] + 1, 1, 1);
689 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
690 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
692 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
693 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
694 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
696 button[9] = gtk_button_new_with_label ("close");
697 g_signal_connect_swapped (button[9], "clicked",
698 G_CALLBACK (gtk_widget_destroy),
700 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
701 gtk_widget_set_can_default (button[9], TRUE);
702 gtk_widget_grab_default (button[9]);
705 if (!gtk_widget_get_visible (window))
706 gtk_widget_show_all (window);
708 gtk_widget_destroy (window);
716 create_toggle_buttons (GtkWidget *widget)
718 static GtkWidget *window = NULL;
722 GtkWidget *separator;
726 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
727 gtk_window_set_screen (GTK_WINDOW (window),
728 gtk_widget_get_screen (widget));
730 g_signal_connect (window, "destroy",
731 G_CALLBACK (gtk_widget_destroyed),
734 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
735 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
737 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
738 gtk_container_add (GTK_CONTAINER (window), box1);
740 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
741 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
742 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
744 button = gtk_toggle_button_new_with_label ("button1");
745 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
747 button = gtk_toggle_button_new_with_label ("button2");
748 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
750 button = gtk_toggle_button_new_with_label ("button3");
751 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
753 button = gtk_toggle_button_new_with_label ("inconsistent");
754 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
755 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
757 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
758 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
760 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
761 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
762 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
764 button = gtk_button_new_with_label ("close");
765 g_signal_connect_swapped (button, "clicked",
766 G_CALLBACK (gtk_widget_destroy),
768 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
769 gtk_widget_set_can_default (button, TRUE);
770 gtk_widget_grab_default (button);
773 if (!gtk_widget_get_visible (window))
774 gtk_widget_show_all (window);
776 gtk_widget_destroy (window);
780 create_widget_grid (GType widget_type)
783 GtkWidget *group_widget = NULL;
786 grid = gtk_grid_new ();
788 for (i = 0; i < 5; i++)
790 for (j = 0; j < 5; j++)
795 if (i == 0 && j == 0)
801 tmp = g_strdup_printf ("%d", j);
802 widget = gtk_label_new (tmp);
807 tmp = g_strdup_printf ("%c", 'A' + i - 1);
808 widget = gtk_label_new (tmp);
813 widget = g_object_new (widget_type, NULL);
815 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
818 group_widget = widget;
820 g_object_set (widget, "group", group_widget, NULL);
825 gtk_grid_attach (GTK_GRID (grid), widget, i, j, 1, 1);
837 create_check_buttons (GtkWidget *widget)
839 static GtkWidget *window = NULL;
843 GtkWidget *separator;
848 window = gtk_dialog_new_with_buttons ("Check Buttons",
854 gtk_window_set_screen (GTK_WINDOW (window),
855 gtk_widget_get_screen (widget));
857 g_signal_connect (window, "destroy",
858 G_CALLBACK (gtk_widget_destroyed),
860 g_signal_connect (window, "response",
861 G_CALLBACK (gtk_widget_destroy),
864 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
866 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
867 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
868 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
870 button = gtk_check_button_new_with_mnemonic ("_button1");
871 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
873 button = gtk_check_button_new_with_label ("button2");
874 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
876 button = gtk_check_button_new_with_label ("button3");
877 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
879 button = gtk_check_button_new_with_label ("inconsistent");
880 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
881 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
883 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
884 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
886 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
887 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
888 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
891 if (!gtk_widget_get_visible (window))
892 gtk_widget_show_all (window);
894 gtk_widget_destroy (window);
902 create_radio_buttons (GtkWidget *widget)
904 static GtkWidget *window = NULL;
908 GtkWidget *separator;
913 window = gtk_dialog_new_with_buttons ("Radio Buttons",
919 gtk_window_set_screen (GTK_WINDOW (window),
920 gtk_widget_get_screen (widget));
922 g_signal_connect (window, "destroy",
923 G_CALLBACK (gtk_widget_destroyed),
925 g_signal_connect (window, "response",
926 G_CALLBACK (gtk_widget_destroy),
929 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
931 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
932 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
933 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
935 button = gtk_radio_button_new_with_label (NULL, "button1");
936 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
938 button = gtk_radio_button_new_with_label (
939 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
941 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
942 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
944 button = gtk_radio_button_new_with_label (
945 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
947 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
949 button = gtk_radio_button_new_with_label (
950 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
952 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
953 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
955 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
956 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
958 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
959 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
960 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
962 button = gtk_radio_button_new_with_label (NULL, "button4");
963 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
964 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
966 button = gtk_radio_button_new_with_label (
967 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
969 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
970 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
971 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
973 button = gtk_radio_button_new_with_label (
974 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
976 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
977 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
979 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
980 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
982 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
983 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
984 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
987 if (!gtk_widget_get_visible (window))
988 gtk_widget_show_all (window);
990 gtk_widget_destroy (window);
998 create_bbox (gint horizontal,
1009 frame = gtk_frame_new (title);
1012 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1014 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1016 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1017 gtk_container_add (GTK_CONTAINER (frame), bbox);
1019 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1020 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1022 button = gtk_button_new_with_label ("OK");
1023 gtk_container_add (GTK_CONTAINER (bbox), button);
1025 button = gtk_button_new_with_label ("Cancel");
1026 gtk_container_add (GTK_CONTAINER (bbox), button);
1028 button = gtk_button_new_with_label ("Help");
1029 gtk_container_add (GTK_CONTAINER (bbox), button);
1035 create_button_box (GtkWidget *widget)
1037 static GtkWidget* window = NULL;
1038 GtkWidget *main_vbox;
1041 GtkWidget *frame_horz;
1042 GtkWidget *frame_vert;
1046 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1047 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1048 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1050 g_signal_connect (window, "destroy",
1051 G_CALLBACK (gtk_widget_destroyed),
1054 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1056 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1057 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1059 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1060 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1062 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1063 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1064 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1066 gtk_box_pack_start (GTK_BOX (vbox),
1067 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1070 gtk_box_pack_start (GTK_BOX (vbox),
1071 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1074 gtk_box_pack_start (GTK_BOX (vbox),
1075 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1078 gtk_box_pack_start (GTK_BOX (vbox),
1079 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1082 gtk_box_pack_start (GTK_BOX (vbox),
1083 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1086 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1087 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1089 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1090 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1091 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1093 gtk_box_pack_start (GTK_BOX (hbox),
1094 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1097 gtk_box_pack_start (GTK_BOX (hbox),
1098 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1101 gtk_box_pack_start (GTK_BOX (hbox),
1102 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1105 gtk_box_pack_start (GTK_BOX (hbox),
1106 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1109 gtk_box_pack_start (GTK_BOX (hbox),
1110 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1114 if (!gtk_widget_get_visible (window))
1115 gtk_widget_show_all (window);
1117 gtk_widget_destroy (window);
1125 new_pixbuf (char *filename,
1131 if (strcmp (filename, "test.xpm") == 0)
1134 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1137 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1139 widget = gtk_image_new_from_pixbuf (pixbuf);
1141 g_object_unref (pixbuf);
1148 set_toolbar_small_stock (GtkWidget *widget,
1151 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1155 set_toolbar_large_stock (GtkWidget *widget,
1158 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1162 set_toolbar_horizontal (GtkWidget *widget,
1165 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1169 set_toolbar_vertical (GtkWidget *widget,
1172 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1176 set_toolbar_icons (GtkWidget *widget,
1179 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1183 set_toolbar_text (GtkWidget *widget,
1186 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1190 set_toolbar_both (GtkWidget *widget,
1193 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1197 set_toolbar_both_horiz (GtkWidget *widget,
1200 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1204 set_toolbar_enable (GtkWidget *widget,
1207 GtkSettings *settings = gtk_widget_get_settings (widget);
1208 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1212 set_toolbar_disable (GtkWidget *widget,
1215 GtkSettings *settings = gtk_widget_get_settings (widget);
1216 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1219 static GtkActionEntry create_toolbar_items[] = {
1220 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1221 G_CALLBACK (set_toolbar_small_stock) },
1222 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1223 G_CALLBACK (set_toolbar_large_stock) },
1224 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1225 G_CALLBACK (set_toolbar_horizontal) },
1226 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1227 G_CALLBACK (set_toolbar_vertical) },
1229 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1230 G_CALLBACK (set_toolbar_icons) },
1231 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1232 G_CALLBACK (set_toolbar_text) },
1233 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1234 G_CALLBACK (set_toolbar_both) },
1235 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1236 G_CALLBACK (set_toolbar_both_horiz) },
1238 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1242 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1243 G_CALLBACK (set_toolbar_enable) },
1244 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1245 G_CALLBACK (set_toolbar_disable) },
1247 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1249 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1252 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1254 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1259 create_toolbar (GtkWidget *widget)
1261 static GtkWidget *window = NULL;
1268 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1269 gtk_window_set_screen (GTK_WINDOW (window),
1270 gtk_widget_get_screen (widget));
1272 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1274 g_signal_connect (window, "destroy",
1275 G_CALLBACK (gtk_widget_destroyed),
1278 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1279 gtk_widget_realize (window);
1281 toolbar = gtk_toolbar_new ();
1282 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1284 GtkToolItem *toolitem;
1286 if (create_toolbar_items[i].tooltip == NULL)
1287 toolitem = gtk_separator_tool_item_new ();
1288 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1292 toolitem = gtk_tool_item_new ();
1293 entry = gtk_entry_new ();
1294 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1296 else if (create_toolbar_items[i].stock_id)
1297 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1302 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1303 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1305 if (create_toolbar_items[i].callback)
1306 g_signal_connect (toolitem, "clicked",
1307 create_toolbar_items[i].callback, toolbar);
1308 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1309 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1312 gtk_container_add (GTK_CONTAINER (window), toolbar);
1314 gtk_widget_set_size_request (toolbar, 200, -1);
1317 if (!gtk_widget_get_visible (window))
1318 gtk_widget_show_all (window);
1320 gtk_widget_destroy (window);
1323 static GtkActionEntry make_toolbar_items[] = {
1324 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1325 G_CALLBACK (set_toolbar_horizontal) },
1326 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1327 G_CALLBACK (set_toolbar_vertical) },
1329 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1330 G_CALLBACK (set_toolbar_icons) },
1331 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1332 G_CALLBACK (set_toolbar_text) },
1333 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1334 G_CALLBACK (set_toolbar_both) },
1336 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1338 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1341 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1342 G_CALLBACK (set_toolbar_enable) },
1343 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1344 G_CALLBACK (set_toolbar_disable) },
1346 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1348 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1353 make_toolbar (GtkWidget *window)
1358 if (!gtk_widget_get_realized (window))
1359 gtk_widget_realize (window);
1361 toolbar = gtk_toolbar_new ();
1362 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1365 GtkToolItem *toolitem;
1367 if (make_toolbar_items[i].label == NULL)
1369 toolitem = gtk_separator_tool_item_new ();
1373 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1374 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1375 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1376 if (make_toolbar_items[i].callback != NULL)
1377 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1379 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1389 static guint statusbar_counter = 1;
1392 statusbar_push (GtkWidget *button,
1393 GtkStatusbar *statusbar)
1397 sprintf (text, "something %d", statusbar_counter++);
1399 gtk_statusbar_push (statusbar, 1, text);
1403 statusbar_push_long (GtkWidget *button,
1404 GtkStatusbar *statusbar)
1408 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\").");
1410 gtk_statusbar_push (statusbar, 1, text);
1414 statusbar_pop (GtkWidget *button,
1415 GtkStatusbar *statusbar)
1417 gtk_statusbar_pop (statusbar, 1);
1421 statusbar_steal (GtkWidget *button,
1422 GtkStatusbar *statusbar)
1424 gtk_statusbar_remove (statusbar, 1, 4);
1428 statusbar_popped (GtkStatusbar *statusbar,
1433 statusbar_counter = 1;
1437 statusbar_contexts (GtkStatusbar *statusbar)
1441 string = "any context";
1442 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1444 gtk_statusbar_get_context_id (statusbar, string));
1446 string = "idle messages";
1447 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1449 gtk_statusbar_get_context_id (statusbar, string));
1451 string = "some text";
1452 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1454 gtk_statusbar_get_context_id (statusbar, string));
1456 string = "hit the mouse";
1457 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1459 gtk_statusbar_get_context_id (statusbar, string));
1461 string = "hit the mouse2";
1462 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1464 gtk_statusbar_get_context_id (statusbar, string));
1468 create_statusbar (GtkWidget *widget)
1470 static GtkWidget *window = NULL;
1474 GtkWidget *separator;
1475 GtkWidget *statusbar;
1479 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1480 gtk_window_set_screen (GTK_WINDOW (window),
1481 gtk_widget_get_screen (widget));
1483 g_signal_connect (window, "destroy",
1484 G_CALLBACK (gtk_widget_destroyed),
1487 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1488 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1490 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1491 gtk_container_add (GTK_CONTAINER (window), box1);
1493 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1494 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1495 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1497 statusbar = gtk_statusbar_new ();
1498 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1499 g_signal_connect (statusbar,
1501 G_CALLBACK (statusbar_popped),
1504 button = g_object_new (gtk_button_get_type (),
1505 "label", "push something",
1509 g_object_connect (button,
1510 "signal::clicked", statusbar_push, statusbar,
1513 button = g_object_connect (g_object_new (gtk_button_get_type (),
1518 "signal_after::clicked", statusbar_pop, statusbar,
1521 button = g_object_connect (g_object_new (gtk_button_get_type (),
1522 "label", "steal #4",
1526 "signal_after::clicked", statusbar_steal, statusbar,
1529 button = g_object_connect (g_object_new (gtk_button_get_type (),
1530 "label", "test contexts",
1534 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1537 button = g_object_connect (g_object_new (gtk_button_get_type (),
1538 "label", "push something long",
1542 "signal_after::clicked", statusbar_push_long, statusbar,
1545 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1546 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1548 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1549 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1550 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1552 button = gtk_button_new_with_label ("close");
1553 g_signal_connect_swapped (button, "clicked",
1554 G_CALLBACK (gtk_widget_destroy),
1556 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1557 gtk_widget_set_can_default (button, TRUE);
1558 gtk_widget_grab_default (button);
1561 if (!gtk_widget_get_visible (window))
1562 gtk_widget_show_all (window);
1564 gtk_widget_destroy (window);
1572 handle_box_child_signal (GtkHandleBox *hb,
1574 const gchar *action)
1576 printf ("%s: child <%s> %sed\n",
1577 g_type_name (G_OBJECT_TYPE (hb)),
1578 g_type_name (G_OBJECT_TYPE (child)),
1583 create_handle_box (GtkWidget *widget)
1585 static GtkWidget* window = NULL;
1586 GtkWidget *handle_box;
1587 GtkWidget *handle_box2;
1592 GtkWidget *separator;
1596 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1598 gtk_window_set_screen (GTK_WINDOW (window),
1599 gtk_widget_get_screen (widget));
1600 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1601 gtk_window_set_title (GTK_WINDOW (window),
1603 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1605 g_signal_connect (window, "destroy",
1606 G_CALLBACK (gtk_widget_destroyed),
1609 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1611 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1612 gtk_container_add (GTK_CONTAINER (window), vbox);
1613 gtk_widget_show (vbox);
1615 label = gtk_label_new ("Above");
1616 gtk_container_add (GTK_CONTAINER (vbox), label);
1617 gtk_widget_show (label);
1619 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1620 gtk_container_add (GTK_CONTAINER (vbox), separator);
1621 gtk_widget_show (separator);
1623 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
1624 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1625 gtk_widget_show (hbox);
1627 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1628 gtk_container_add (GTK_CONTAINER (vbox), separator);
1629 gtk_widget_show (separator);
1631 label = gtk_label_new ("Below");
1632 gtk_container_add (GTK_CONTAINER (vbox), label);
1633 gtk_widget_show (label);
1635 handle_box = gtk_handle_box_new ();
1636 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1637 g_signal_connect (handle_box,
1639 G_CALLBACK (handle_box_child_signal),
1641 g_signal_connect (handle_box,
1643 G_CALLBACK (handle_box_child_signal),
1645 gtk_widget_show (handle_box);
1647 toolbar = make_toolbar (window);
1649 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1650 gtk_widget_show (toolbar);
1652 handle_box = gtk_handle_box_new ();
1653 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1654 g_signal_connect (handle_box,
1656 G_CALLBACK (handle_box_child_signal),
1658 g_signal_connect (handle_box,
1660 G_CALLBACK (handle_box_child_signal),
1662 gtk_widget_show (handle_box);
1664 handle_box2 = gtk_handle_box_new ();
1665 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1666 g_signal_connect (handle_box2,
1668 G_CALLBACK (handle_box_child_signal),
1670 g_signal_connect (handle_box2,
1672 G_CALLBACK (handle_box_child_signal),
1674 gtk_widget_show (handle_box2);
1676 hbox = g_object_new (GTK_TYPE_BOX, "visible", 1, "parent", handle_box2, NULL);
1677 label = gtk_label_new ("Fooo!");
1678 gtk_container_add (GTK_CONTAINER (hbox), label);
1679 gtk_widget_show (label);
1680 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1683 if (!gtk_widget_get_visible (window))
1684 gtk_widget_show (window);
1686 gtk_widget_destroy (window);
1693 sensitivity_toggled (GtkWidget *toggle,
1696 gtk_widget_set_sensitive (widget,
1697 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1701 create_sensitivity_control (GtkWidget *widget)
1705 button = gtk_toggle_button_new_with_label ("Sensitive");
1707 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1708 gtk_widget_is_sensitive (widget));
1710 g_signal_connect (button,
1712 G_CALLBACK (sensitivity_toggled),
1715 gtk_widget_show_all (button);
1721 set_selectable_recursive (GtkWidget *widget,
1724 if (GTK_IS_CONTAINER (widget))
1729 children = gtk_container_get_children (GTK_CONTAINER (widget));
1733 set_selectable_recursive (tmp->data, setting);
1737 g_list_free (children);
1739 else if (GTK_IS_LABEL (widget))
1741 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1746 selectable_toggled (GtkWidget *toggle,
1749 set_selectable_recursive (widget,
1750 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1754 create_selectable_control (GtkWidget *widget)
1758 button = gtk_toggle_button_new_with_label ("Selectable");
1760 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1763 g_signal_connect (button,
1765 G_CALLBACK (selectable_toggled),
1768 gtk_widget_show_all (button);
1774 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1778 gtk_widget_destroy (dialog);
1780 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1781 "as hyperlinks, which can be clicked\n"
1782 "or activated via <a href=\"keynav\">keynav</a>.\n"
1783 "The links remain the same.";
1784 gtk_label_set_markup (label, text);
1788 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1790 if (g_strcmp0 (uri, "keynav") == 0)
1794 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1795 GTK_DIALOG_DESTROY_WITH_PARENT,
1798 "The term <i>keynav</i> is a shorthand for "
1799 "keyboard navigation and refers to the process of using a program "
1800 "(exclusively) via keyboard input.");
1802 gtk_window_present (GTK_WINDOW (dialog));
1804 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1812 void create_labels (GtkWidget *widget)
1814 static GtkWidget *window = NULL;
1823 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1825 gtk_window_set_screen (GTK_WINDOW (window),
1826 gtk_widget_get_screen (widget));
1828 g_signal_connect (window, "destroy",
1829 G_CALLBACK (gtk_widget_destroyed),
1832 gtk_window_set_title (GTK_WINDOW (window), "Label");
1834 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1836 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1837 gtk_container_add (GTK_CONTAINER (window), vbox);
1839 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1841 button = create_sensitivity_control (hbox);
1843 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1845 button = create_selectable_control (hbox);
1847 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1849 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1851 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1852 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1854 frame = gtk_frame_new ("Normal Label");
1855 label = gtk_label_new ("This is a Normal label");
1856 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1857 gtk_container_add (GTK_CONTAINER (frame), label);
1858 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1860 frame = gtk_frame_new ("Multi-line Label");
1861 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1862 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1863 gtk_container_add (GTK_CONTAINER (frame), label);
1864 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1866 frame = gtk_frame_new ("Left Justified Label");
1867 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1868 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1869 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1870 gtk_container_add (GTK_CONTAINER (frame), label);
1871 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1873 frame = gtk_frame_new ("Right Justified Label");
1874 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1875 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1876 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1877 gtk_container_add (GTK_CONTAINER (frame), label);
1878 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1880 frame = gtk_frame_new ("Internationalized Label");
1881 label = gtk_label_new (NULL);
1882 gtk_label_set_markup (GTK_LABEL (label),
1883 "French (Fran\303\247ais) Bonjour, Salut\n"
1884 "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"
1885 "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"
1886 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1887 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1888 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1889 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1890 gtk_container_add (GTK_CONTAINER (frame), label);
1891 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1893 frame = gtk_frame_new ("Bidirection Label");
1894 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"
1895 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1896 gtk_container_add (GTK_CONTAINER (frame), label);
1897 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1899 frame = gtk_frame_new ("Links in a label");
1900 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1901 "as hyperlinks, which can be clicked\n"
1902 "or activated via <a href=\"keynav\">keynav</a>");
1903 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1904 gtk_container_add (GTK_CONTAINER (frame), label);
1905 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1906 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1908 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1909 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1910 frame = gtk_frame_new ("Line wrapped label");
1911 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1912 "up the entire "/* big space to test spacing */\
1913 "width allocated to it, but automatically wraps the words to fit. "\
1914 "The time has come, for all good men, to come to the aid of their party. "\
1915 "The sixth sheik's six sheep's sick.\n"\
1916 " It supports multiple paragraphs correctly, and correctly adds "\
1917 "many extra spaces. ");
1919 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1920 gtk_container_add (GTK_CONTAINER (frame), label);
1921 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1923 frame = gtk_frame_new ("Filled, wrapped label");
1924 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
1925 "up the entire width allocated to it. Here is a seneance to prove "\
1926 "my point. Here is another sentence. "\
1927 "Here comes the sun, do de do de do.\n"\
1928 " This is a new paragraph.\n"\
1929 " This is another newer, longer, better paragraph. It is coming to an end, "\
1931 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
1932 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1933 gtk_container_add (GTK_CONTAINER (frame), label);
1934 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1936 frame = gtk_frame_new ("Underlined label");
1937 label = gtk_label_new ("This label is underlined!\n"
1938 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
1939 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1940 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
1941 gtk_container_add (GTK_CONTAINER (frame), label);
1942 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1944 frame = gtk_frame_new ("Markup label");
1945 label = gtk_label_new (NULL);
1947 /* There's also a gtk_label_set_markup() without accel if you
1948 * don't have an accelerator key
1950 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
1951 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
1952 "<b>markup</b> _such as "
1953 "<big><i>Big Italics</i></big>\n"
1954 "<tt>Monospace font</tt>\n"
1955 "<u>Underline!</u>\n"
1957 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
1958 "and nothing on this line,\n"
1961 "or even on this one\n"
1962 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
1963 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
1964 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
1966 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
1968 gtk_container_add (GTK_CONTAINER (frame), label);
1969 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1972 if (!gtk_widget_get_visible (window))
1973 gtk_widget_show_all (window);
1975 gtk_widget_destroy (window);
1979 on_angle_scale_changed (GtkRange *range,
1982 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
1986 create_rotated_label (GtkWidget *widget)
1988 static GtkWidget *window = NULL;
1989 GtkWidget *content_area;
1993 GtkWidget *scale_label;
1994 GtkWidget *scale_hbox;
1998 window = gtk_dialog_new_with_buttons ("Rotated Label",
1999 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2000 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2003 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2005 gtk_window_set_screen (GTK_WINDOW (window),
2006 gtk_widget_get_screen (widget));
2008 g_signal_connect (window, "response",
2009 G_CALLBACK (gtk_widget_destroy), NULL);
2010 g_signal_connect (window, "destroy",
2011 G_CALLBACK (gtk_widget_destroyed), &window);
2013 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2015 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2016 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2017 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2019 label = gtk_label_new (NULL);
2020 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2021 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2023 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2024 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2026 scale_label = gtk_label_new (NULL);
2027 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2028 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2030 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2032 g_signal_connect (hscale, "value-changed",
2033 G_CALLBACK (on_angle_scale_changed), label);
2035 gtk_range_set_value (GTK_RANGE (hscale), 45);
2036 gtk_widget_set_size_request (hscale, 200, -1);
2037 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2040 if (!gtk_widget_get_visible (window))
2041 gtk_widget_show_all (window);
2043 gtk_widget_destroy (window);
2046 #define DEFAULT_TEXT_RADIUS 200
2049 on_rotated_text_unrealize (GtkWidget *widget)
2051 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2055 on_rotated_text_draw (GtkWidget *widget,
2057 GdkPixbuf *tile_pixbuf)
2059 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2060 "had", "10,000", "men" };
2065 PangoLayout *layout;
2066 PangoContext *context;
2067 PangoFontDescription *desc;
2071 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2072 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2075 cairo_set_source_rgb (cr, 0, 0, 0);
2077 width = gtk_widget_get_allocated_width (widget);
2078 height = gtk_widget_get_allocated_height (widget);
2079 radius = MIN (width, height) / 2.;
2081 cairo_translate (cr,
2082 radius + (width - 2 * radius) / 2,
2083 radius + (height - 2 * radius) / 2);
2084 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2086 context = gtk_widget_get_pango_context (widget);
2087 layout = pango_layout_new (context);
2088 desc = pango_font_description_from_string ("Sans Bold 30");
2089 pango_layout_set_font_description (layout, desc);
2090 pango_font_description_free (desc);
2092 n_words = G_N_ELEMENTS (words);
2093 for (i = 0; i < n_words; i++)
2099 cairo_rotate (cr, 2 * G_PI * i / n_words);
2100 pango_cairo_update_layout (cr, layout);
2102 pango_layout_set_text (layout, words[i], -1);
2103 pango_layout_get_size (layout, &width, &height);
2105 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2106 pango_cairo_show_layout (cr, layout);
2111 g_object_unref (layout);
2117 create_rotated_text (GtkWidget *widget)
2119 static GtkWidget *window = NULL;
2123 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
2124 GtkRequisition requisition;
2125 GtkWidget *content_area;
2126 GtkWidget *drawing_area;
2127 GdkPixbuf *tile_pixbuf;
2129 window = gtk_dialog_new_with_buttons ("Rotated Text",
2130 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2131 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2134 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2136 gtk_window_set_screen (GTK_WINDOW (window),
2137 gtk_widget_get_screen (widget));
2139 g_signal_connect (window, "response",
2140 G_CALLBACK (gtk_widget_destroy), NULL);
2141 g_signal_connect (window, "destroy",
2142 G_CALLBACK (gtk_widget_destroyed), &window);
2144 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2146 drawing_area = gtk_drawing_area_new ();
2147 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2148 gtk_widget_override_background_color (drawing_area, 0, &white);
2150 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2152 g_signal_connect (drawing_area, "draw",
2153 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2154 g_signal_connect (drawing_area, "unrealize",
2155 G_CALLBACK (on_rotated_text_unrealize), NULL);
2157 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2159 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2160 gtk_widget_get_preferred_size ( (window),
2161 &requisition, NULL);
2162 gtk_widget_set_size_request (drawing_area, -1, -1);
2163 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2166 if (!gtk_widget_get_visible (window))
2167 gtk_widget_show (window);
2169 gtk_widget_destroy (window);
2177 reparent_label (GtkWidget *widget,
2178 GtkWidget *new_parent)
2182 label = g_object_get_data (G_OBJECT (widget), "user_data");
2184 gtk_widget_reparent (label, new_parent);
2188 set_parent_signal (GtkWidget *child,
2189 GtkWidget *old_parent,
2194 parent = gtk_widget_get_parent (child);
2195 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2196 g_type_name (G_OBJECT_TYPE (child)),
2197 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2198 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2199 GPOINTER_TO_INT (func_data));
2203 create_reparent (GtkWidget *widget)
2205 static GtkWidget *window = NULL;
2212 GtkWidget *separator;
2213 GtkWidget *event_box;
2217 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2219 gtk_window_set_screen (GTK_WINDOW (window),
2220 gtk_widget_get_screen (widget));
2222 g_signal_connect (window, "destroy",
2223 G_CALLBACK (gtk_widget_destroyed),
2226 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2227 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2229 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2230 gtk_container_add (GTK_CONTAINER (window), box1);
2232 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2233 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2234 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2236 label = gtk_label_new ("Hello World");
2238 frame = gtk_frame_new ("Frame 1");
2239 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2241 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2242 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2243 gtk_container_add (GTK_CONTAINER (frame), box3);
2245 button = gtk_button_new_with_label ("switch");
2246 g_object_set_data (G_OBJECT (button), "user_data", label);
2247 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2249 event_box = gtk_event_box_new ();
2250 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2251 gtk_container_add (GTK_CONTAINER (event_box), label);
2253 g_signal_connect (button, "clicked",
2254 G_CALLBACK (reparent_label),
2257 g_signal_connect (label, "parent_set",
2258 G_CALLBACK (set_parent_signal),
2259 GINT_TO_POINTER (42));
2261 frame = gtk_frame_new ("Frame 2");
2262 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2264 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2265 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2266 gtk_container_add (GTK_CONTAINER (frame), box3);
2268 button = gtk_button_new_with_label ("switch");
2269 g_object_set_data (G_OBJECT (button), "user_data", label);
2270 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2272 event_box = gtk_event_box_new ();
2273 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2275 g_signal_connect (button, "clicked",
2276 G_CALLBACK (reparent_label),
2279 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2280 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2282 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2283 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2284 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2286 button = gtk_button_new_with_label ("close");
2287 g_signal_connect_swapped (button, "clicked",
2288 G_CALLBACK (gtk_widget_destroy), window);
2289 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2290 gtk_widget_set_can_default (button, TRUE);
2291 gtk_widget_grab_default (button);
2294 if (!gtk_widget_get_visible (window))
2295 gtk_widget_show_all (window);
2297 gtk_widget_destroy (window);
2304 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2306 if (event->type == GDK_BUTTON_PRESS)
2308 if (event->button == 1)
2309 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2310 event->button, event->x_root, event->y_root,
2312 else if (event->button == 2)
2313 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2314 event->button, event->x_root, event->y_root,
2321 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2323 GtkStyleContext *context;
2324 GtkJunctionSides sides;
2328 case GDK_WINDOW_EDGE_NORTH_WEST:
2329 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2331 case GDK_WINDOW_EDGE_NORTH:
2332 sides = GTK_JUNCTION_TOP;
2334 case GDK_WINDOW_EDGE_NORTH_EAST:
2335 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2337 case GDK_WINDOW_EDGE_WEST:
2338 sides = GTK_JUNCTION_LEFT;
2340 case GDK_WINDOW_EDGE_EAST:
2341 sides = GTK_JUNCTION_RIGHT;
2343 case GDK_WINDOW_EDGE_SOUTH_WEST:
2344 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2346 case GDK_WINDOW_EDGE_SOUTH:
2347 sides = GTK_JUNCTION_BOTTOM;
2349 case GDK_WINDOW_EDGE_SOUTH_EAST:
2350 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2353 g_assert_not_reached();
2356 context = gtk_widget_get_style_context (area);
2357 gtk_style_context_save (context);
2358 gtk_style_context_add_class (context, "grip");
2359 gtk_style_context_set_junction_sides (context, sides);
2360 gtk_render_handle (context, cr,
2362 gtk_widget_get_allocated_width (area),
2363 gtk_widget_get_allocated_height (area));
2365 gtk_style_context_restore (context);
2371 create_resize_grips (GtkWidget *widget)
2373 static GtkWidget *window = NULL;
2375 GtkWidget *hbox, *vbox;
2378 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2380 gtk_window_set_screen (GTK_WINDOW (window),
2381 gtk_widget_get_screen (widget));
2383 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2385 g_signal_connect (window, "destroy",
2386 G_CALLBACK (gtk_widget_destroyed),
2389 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2390 gtk_container_add (GTK_CONTAINER (window), vbox);
2392 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2393 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2396 area = gtk_drawing_area_new ();
2397 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2398 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2399 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2400 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2401 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2402 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2405 area = gtk_drawing_area_new ();
2406 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2407 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2408 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2409 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2410 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2411 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2414 area = gtk_drawing_area_new ();
2415 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2416 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2417 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2418 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2419 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2420 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2422 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2423 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2426 area = gtk_drawing_area_new ();
2427 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2428 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2429 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2430 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2431 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2432 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2435 area = gtk_drawing_area_new ();
2436 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2439 area = gtk_drawing_area_new ();
2440 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2441 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2442 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2443 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2444 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2445 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2448 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2449 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2452 area = gtk_drawing_area_new ();
2453 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2454 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2455 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2456 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2457 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2458 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2460 area = gtk_drawing_area_new ();
2461 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2462 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2463 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2464 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2465 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2466 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2469 area = gtk_drawing_area_new ();
2470 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2471 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2472 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2473 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2474 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2475 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2478 if (!gtk_widget_get_visible (window))
2479 gtk_widget_show_all (window);
2481 gtk_widget_destroy (window);
2487 gint upositionx = 0;
2488 gint upositiony = 0;
2491 uposition_configure (GtkWidget *window)
2497 lx = g_object_get_data (G_OBJECT (window), "x");
2498 ly = g_object_get_data (G_OBJECT (window), "y");
2500 gdk_window_get_root_origin (gtk_widget_get_window (window),
2501 &upositionx, &upositiony);
2502 sprintf (buffer, "%d", upositionx);
2503 gtk_label_set_text (lx, buffer);
2504 sprintf (buffer, "%d", upositiony);
2505 gtk_label_set_text (ly, buffer);
2511 uposition_stop_configure (GtkToggleButton *toggle,
2514 if (gtk_toggle_button_get_active (toggle))
2515 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2517 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2521 create_saved_position (GtkWidget *widget)
2523 static GtkWidget *window = NULL;
2528 GtkWidget *main_vbox;
2536 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2537 "type", GTK_WINDOW_TOPLEVEL,
2538 "title", "Saved Position",
2540 "signal::configure_event", uposition_configure, NULL,
2543 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2545 gtk_window_set_screen (GTK_WINDOW (window),
2546 gtk_widget_get_screen (widget));
2549 g_signal_connect (window, "destroy",
2550 G_CALLBACK (gtk_widget_destroyed),
2553 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2554 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2555 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2558 g_object_new (GTK_TYPE_BOX,
2559 "orientation", GTK_ORIENTATION_VERTICAL,
2560 "GtkBox::homogeneous", FALSE,
2561 "GtkBox::spacing", 5,
2562 "GtkContainer::border_width", 10,
2563 "GtkWidget::parent", main_vbox,
2564 "GtkWidget::visible", TRUE,
2565 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2566 "label", "Stop Events",
2570 "signal::clicked", uposition_stop_configure, window,
2574 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2575 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2576 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2578 label = gtk_label_new ("X Origin : ");
2579 gtk_widget_set_halign (label, GTK_ALIGN_START);
2580 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2581 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2583 x_label = gtk_label_new ("");
2584 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2585 g_object_set_data (G_OBJECT (window), "x", x_label);
2587 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2588 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2589 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2591 label = gtk_label_new ("Y Origin : ");
2592 gtk_widget_set_halign (label, GTK_ALIGN_START);
2593 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2594 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2596 y_label = gtk_label_new ("");
2597 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2598 g_object_set_data (G_OBJECT (window), "y", y_label);
2601 g_object_new (gtk_separator_get_type (),
2602 "GtkWidget::visible", TRUE,
2604 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2606 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2607 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2608 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2610 button = gtk_button_new_with_label ("Close");
2611 g_signal_connect_swapped (button, "clicked",
2612 G_CALLBACK (gtk_widget_destroy),
2614 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2615 gtk_widget_set_can_default (button, TRUE);
2616 gtk_widget_grab_default (button);
2618 gtk_widget_show_all (window);
2621 gtk_widget_destroy (window);
2629 create_pixbuf (GtkWidget *widget)
2631 static GtkWidget *window = NULL;
2637 GtkWidget *separator;
2638 GtkWidget *pixbufwid;
2639 GdkWindow *gdk_window;
2643 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2645 gtk_window_set_screen (GTK_WINDOW (window),
2646 gtk_widget_get_screen (widget));
2648 g_signal_connect (window, "destroy",
2649 G_CALLBACK (gtk_widget_destroyed),
2652 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2653 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2654 gtk_widget_realize(window);
2656 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2657 gtk_container_add (GTK_CONTAINER (window), box1);
2659 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2660 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2661 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2663 button = gtk_button_new ();
2664 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2666 gdk_window = gtk_widget_get_window (window);
2668 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2670 label = gtk_label_new ("Pixbuf\ntest");
2671 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2672 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2673 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2674 gtk_container_add (GTK_CONTAINER (box3), label);
2675 gtk_container_add (GTK_CONTAINER (button), box3);
2677 button = gtk_button_new ();
2678 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2680 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2682 label = gtk_label_new ("Pixbuf\ntest");
2683 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2684 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2685 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2686 gtk_container_add (GTK_CONTAINER (box3), label);
2687 gtk_container_add (GTK_CONTAINER (button), box3);
2689 gtk_widget_set_sensitive (button, FALSE);
2691 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2692 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2694 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2695 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2696 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2698 button = gtk_button_new_with_label ("close");
2699 g_signal_connect_swapped (button, "clicked",
2700 G_CALLBACK (gtk_widget_destroy),
2702 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2703 gtk_widget_set_can_default (button, TRUE);
2704 gtk_widget_grab_default (button);
2707 if (!gtk_widget_get_visible (window))
2708 gtk_widget_show_all (window);
2710 gtk_widget_destroy (window);
2714 create_tooltips (GtkWidget *widget)
2716 static GtkWidget *window = NULL;
2723 GtkWidget *separator;
2728 g_object_new (gtk_window_get_type (),
2729 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2730 "GtkContainer::border_width", 0,
2731 "GtkWindow::title", "Tooltips",
2732 "GtkWindow::resizable", FALSE,
2735 gtk_window_set_screen (GTK_WINDOW (window),
2736 gtk_widget_get_screen (widget));
2738 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2739 gtk_container_add (GTK_CONTAINER (window), box1);
2741 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2742 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2743 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2745 button = gtk_toggle_button_new_with_label ("button1");
2746 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2748 gtk_widget_set_tooltip_text (button, "This is button 1");
2750 button = gtk_toggle_button_new_with_label ("button2");
2751 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2753 gtk_widget_set_tooltip_text (button,
2754 "This is button 2. This is also a really long tooltip which probably "
2755 "won't fit on a single line and will therefore need to be wrapped. "
2756 "Hopefully the wrapping will work correctly.");
2758 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2759 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2761 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2764 g_object_new (GTK_TYPE_BOX,
2765 "orientation", GTK_ORIENTATION_VERTICAL,
2766 "homogeneous", FALSE,
2773 g_object_new (gtk_button_get_type (),
2778 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2779 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2781 frame = g_object_new (gtk_frame_get_type (),
2782 "label", "ToolTips Inspector",
2783 "label_xalign", (double) 0.5,
2789 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2791 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2792 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2794 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2795 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2796 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2798 button = gtk_button_new_with_label ("close");
2799 g_signal_connect_swapped (button, "clicked",
2800 G_CALLBACK (gtk_widget_destroy),
2802 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2803 gtk_widget_set_can_default (button, TRUE);
2804 gtk_widget_grab_default (button);
2806 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2809 if (!gtk_widget_get_visible (window))
2810 gtk_widget_show_all (window);
2812 gtk_widget_destroy (window);
2820 pack_image (GtkWidget *box,
2824 gtk_box_pack_start (GTK_BOX (box),
2825 gtk_label_new (text),
2828 gtk_box_pack_start (GTK_BOX (box),
2834 create_image (GtkWidget *widget)
2836 static GtkWidget *window = NULL;
2843 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2845 gtk_window_set_screen (GTK_WINDOW (window),
2846 gtk_widget_get_screen (widget));
2848 /* this is bogus for testing drawing when allocation < request,
2849 * don't copy into real code
2851 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2853 g_signal_connect (window, "destroy",
2854 G_CALLBACK (gtk_widget_destroyed),
2857 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2859 gtk_container_add (GTK_CONTAINER (window), vbox);
2861 pack_image (vbox, "Stock Warning Dialog",
2862 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2863 GTK_ICON_SIZE_DIALOG));
2865 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2867 pack_image (vbox, "Pixbuf",
2868 gtk_image_new_from_pixbuf (pixbuf));
2870 g_object_unref (pixbuf);
2873 if (!gtk_widget_get_visible (window))
2874 gtk_widget_show_all (window);
2876 gtk_widget_destroy (window);
2884 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2887 GtkWidget *menuitem;
2896 menu = gtk_menu_new ();
2897 gtk_menu_set_screen (GTK_MENU (menu), screen);
2903 menuitem = gtk_tearoff_menu_item_new ();
2904 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2905 gtk_widget_show (menuitem);
2908 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2909 GTK_ICON_SIZE_MENU);
2910 gtk_widget_show (image);
2911 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2912 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2913 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2914 gtk_widget_show (menuitem);
2916 for (i = 0, j = 1; i < length; i++, j++)
2918 sprintf (buf, "item %2d - %d", depth, j);
2920 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2921 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2923 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2924 gtk_widget_show (menuitem);
2926 gtk_widget_set_sensitive (menuitem, FALSE);
2929 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
2933 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
2934 create_menu (screen, depth - 1, 5, TRUE));
2941 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
2944 GtkWidget *menuitem;
2950 menu = gtk_menu_new ();
2951 gtk_menu_set_screen (GTK_MENU (menu), screen);
2956 menuitem = gtk_tearoff_menu_item_new ();
2957 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
2958 gtk_widget_show (menuitem);
2962 menuitem = gtk_menu_item_new_with_label ("items");
2963 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
2965 submenu = gtk_menu_new ();
2966 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2967 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2968 gtk_widget_show (menuitem);
2971 /* now fill the items submenu */
2972 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2973 GTK_ICON_SIZE_MENU);
2974 gtk_widget_show (image);
2975 menuitem = gtk_image_menu_item_new_with_label ("Image");
2976 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2977 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
2978 gtk_widget_show (menuitem);
2980 menuitem = gtk_menu_item_new_with_label ("x");
2981 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
2982 gtk_widget_show (menuitem);
2984 menuitem = gtk_menu_item_new_with_label ("x");
2985 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
2986 gtk_widget_show (menuitem);
2988 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2989 GTK_ICON_SIZE_MENU);
2990 gtk_widget_show (image);
2991 menuitem = gtk_image_menu_item_new_with_label ("Image");
2992 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2993 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
2994 gtk_widget_show (menuitem);
2996 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
2997 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
2998 gtk_widget_show (menuitem);
3000 menuitem = gtk_menu_item_new_with_label ("x");
3001 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3002 gtk_widget_show (menuitem);
3004 menuitem = gtk_menu_item_new_with_label ("x");
3005 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3006 gtk_widget_show (menuitem);
3008 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3009 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3010 gtk_widget_show (menuitem);
3012 menuitem = gtk_check_menu_item_new_with_label ("Check");
3013 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3014 gtk_widget_show (menuitem);
3016 menuitem = gtk_menu_item_new_with_label ("x");
3017 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3018 gtk_widget_show (menuitem);
3020 menuitem = gtk_menu_item_new_with_label ("x");
3021 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3022 gtk_widget_show (menuitem);
3024 menuitem = gtk_check_menu_item_new_with_label ("Check");
3025 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3026 gtk_widget_show (menuitem);
3028 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3029 gtk_widget_show (menuitem);
3030 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3032 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3033 gtk_widget_show (menuitem);
3034 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3036 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3037 gtk_widget_show (menuitem);
3038 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3040 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3041 gtk_widget_show (menuitem);
3042 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3044 /* end of items submenu */
3046 menuitem = gtk_menu_item_new_with_label ("spanning");
3047 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3049 submenu = gtk_menu_new ();
3050 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3051 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3052 gtk_widget_show (menuitem);
3055 /* now fill the spanning submenu */
3056 menuitem = gtk_menu_item_new_with_label ("a");
3057 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3058 gtk_widget_show (menuitem);
3060 menuitem = gtk_menu_item_new_with_label ("b");
3061 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3062 gtk_widget_show (menuitem);
3064 menuitem = gtk_menu_item_new_with_label ("c");
3065 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3066 gtk_widget_show (menuitem);
3068 menuitem = gtk_menu_item_new_with_label ("d");
3069 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3070 gtk_widget_show (menuitem);
3072 menuitem = gtk_menu_item_new_with_label ("e");
3073 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3074 gtk_widget_show (menuitem);
3075 /* end of spanning submenu */
3077 menuitem = gtk_menu_item_new_with_label ("left");
3078 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3079 submenu = gtk_menu_new ();
3080 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3081 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3082 gtk_widget_show (menuitem);
3084 menuitem = gtk_menu_item_new_with_label ("Empty");
3085 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3086 submenu = gtk_menu_new ();
3087 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3088 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3089 gtk_widget_show (menuitem);
3091 menuitem = gtk_menu_item_new_with_label ("right");
3092 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3093 submenu = gtk_menu_new ();
3094 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3095 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3096 gtk_widget_show (menuitem);
3098 menuitem = gtk_menu_item_new_with_label ("Empty");
3099 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3100 gtk_widget_show (menuitem);
3104 for (; j < rows; j++)
3105 for (i = 0; i < cols; i++)
3107 sprintf (buf, "(%d %d)", i, j);
3108 menuitem = gtk_menu_item_new_with_label (buf);
3109 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3110 gtk_widget_show (menuitem);
3113 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3114 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3115 gtk_widget_show (menuitem);
3116 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3117 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3118 gtk_widget_show (menuitem);
3119 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3120 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3121 gtk_widget_show (menuitem);
3122 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3123 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3124 gtk_widget_show (menuitem);
3130 create_menus (GtkWidget *widget)
3132 static GtkWidget *window = NULL;
3136 GtkWidget *optionmenu;
3137 GtkWidget *separator;
3143 GtkWidget *menuitem;
3144 GtkAccelGroup *accel_group;
3146 GdkScreen *screen = gtk_widget_get_screen (widget);
3148 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3150 gtk_window_set_screen (GTK_WINDOW (window), screen);
3152 g_signal_connect (window, "destroy",
3153 G_CALLBACK (gtk_widget_destroyed),
3155 g_signal_connect (window, "delete-event",
3156 G_CALLBACK (gtk_true),
3159 accel_group = gtk_accel_group_new ();
3160 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3162 gtk_window_set_title (GTK_WINDOW (window), "menus");
3163 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3166 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3167 gtk_container_add (GTK_CONTAINER (window), box1);
3168 gtk_widget_show (box1);
3170 menubar = gtk_menu_bar_new ();
3171 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3172 gtk_widget_show (menubar);
3174 menu = create_menu (screen, 2, 50, TRUE);
3176 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3177 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3178 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3179 gtk_widget_show (menuitem);
3181 menu = create_table_menu (screen, 2, 50, TRUE);
3183 menuitem = gtk_menu_item_new_with_label ("table");
3184 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3185 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3186 gtk_widget_show (menuitem);
3188 menuitem = gtk_menu_item_new_with_label ("foo");
3189 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3190 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3191 gtk_widget_show (menuitem);
3193 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3194 GTK_ICON_SIZE_MENU);
3195 gtk_widget_show (image);
3196 menuitem = gtk_image_menu_item_new_with_label ("Help");
3197 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3198 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3199 gtk_widget_set_hexpand (menuitem, TRUE);
3200 gtk_widget_set_halign (menuitem, GTK_ALIGN_END);
3201 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3202 gtk_widget_show (menuitem);
3204 menubar = gtk_menu_bar_new ();
3205 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3206 gtk_widget_show (menubar);
3208 menu = create_menu (screen, 2, 10, TRUE);
3210 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3211 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3212 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3213 gtk_widget_show (menuitem);
3215 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3216 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3217 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3218 gtk_widget_show (box2);
3220 menu = create_menu (screen, 1, 5, FALSE);
3221 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3223 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3224 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3225 gtk_widget_show (menuitem);
3227 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3228 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3229 gtk_widget_show (menuitem);
3230 gtk_widget_add_accelerator (menuitem,
3236 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3237 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3238 gtk_widget_show (menuitem);
3239 gtk_widget_add_accelerator (menuitem,
3244 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3245 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3246 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3247 gtk_widget_show (menuitem);
3248 gtk_widget_add_accelerator (menuitem,
3254 gtk_widget_add_accelerator (menuitem,
3261 optionmenu = gtk_combo_box_text_new ();
3262 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3263 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3264 gtk_widget_show (optionmenu);
3266 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3267 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3268 gtk_widget_show (separator);
3270 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3271 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3272 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3273 gtk_widget_show (box2);
3275 button = gtk_button_new_with_label ("close");
3276 g_signal_connect_swapped (button, "clicked",
3277 G_CALLBACK (gtk_widget_destroy),
3279 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3280 gtk_widget_set_can_default (button, TRUE);
3281 gtk_widget_grab_default (button);
3282 gtk_widget_show (button);
3285 if (!gtk_widget_get_visible (window))
3286 gtk_widget_show (window);
3288 gtk_widget_destroy (window);
3291 /* GdkPixbuf RGBA C-Source image dump */
3293 static const guint8 apple[] =
3295 /* Pixbuf magic (0x47646b50) */
3297 /* length: header (24) + pixel_data (2304) */
3299 /* pixdata_type (0x1010002) */
3301 /* rowstride (96) */
3308 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3309 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3310 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3311 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3312 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3313 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3314 "\0\0\0\0\0\0\0\0\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"
3315 "\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"
3316 "\0\0\0\0\0\0\0\0\0\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"
3317 "[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"
3318 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3319 "\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"
3320 "\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"
3321 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3322 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3323 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3324 "\0\0\0\0\0\0\0\0\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"
3325 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3326 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3327 "\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["
3328 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3329 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3330 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3331 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3332 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3333 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3334 "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"
3335 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3336 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3337 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3338 "\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"
3339 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3340 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3341 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3342 "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"
3343 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3344 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3345 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3346 "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"
3347 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3348 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3349 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3350 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3351 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3352 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3353 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3354 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3355 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3356 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3357 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3358 "\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>"
3359 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3360 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3361 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3362 "\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"
3363 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3364 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3365 "\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"
3366 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3367 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3368 "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"
3369 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3370 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3371 "\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"
3372 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3373 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3374 "\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"
3375 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3376 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3377 "\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"
3378 "\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"
3379 "\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"
3380 "\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"
3381 "\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"
3382 "\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"
3383 "\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"
3384 "\0\0\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"
3385 "\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"
3386 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3390 accel_button_new (GtkAccelGroup *accel_group,
3395 GdkModifierType modifiers;
3399 gtk_accelerator_parse (accel, &keyval, &modifiers);
3402 button = gtk_button_new ();
3403 gtk_widget_add_accelerator (button, "activate", accel_group,
3404 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3406 label = gtk_accel_label_new (text);
3407 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3408 gtk_widget_show (label);
3410 gtk_container_add (GTK_CONTAINER (button), label);
3416 create_key_lookup (GtkWidget *widget)
3418 static GtkWidget *window = NULL;
3419 gpointer window_ptr;
3423 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3425 GtkWidget *content_area;
3427 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3428 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3431 gtk_window_set_screen (GTK_WINDOW (window),
3432 gtk_widget_get_screen (widget));
3434 /* We have to expand it so the accel labels will draw their labels
3436 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3438 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3440 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3442 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3443 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3444 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3445 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3446 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3447 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3448 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3449 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3450 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3451 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3452 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3453 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3454 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3455 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3456 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3457 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3458 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3459 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3460 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3461 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3462 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3463 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3464 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3465 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3466 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3467 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3468 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3469 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3471 window_ptr = &window;
3472 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3473 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3475 gtk_widget_show_all (window);
3478 gtk_widget_destroy (window);
3487 cmw_destroy_cb(GtkWidget *widget)
3489 /* This is needed to get out of gtk_main */
3496 cmw_color (GtkWidget *widget, GtkWidget *parent)
3499 GtkWidget *colorsel;
3500 GtkWidget *ok_button, *cancel_button;
3502 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3504 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3506 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3507 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3511 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3513 /* And mark it as a transient dialog */
3514 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3516 g_signal_connect (csd, "destroy",
3517 G_CALLBACK (cmw_destroy_cb), NULL);
3520 "ok-button", &ok_button,
3521 "cancel-button", &cancel_button,
3524 g_signal_connect_swapped (ok_button,
3525 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3526 g_signal_connect_swapped (cancel_button,
3527 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3529 /* wait until destroy calls gtk_main_quit */
3530 gtk_widget_show (csd);
3535 cmw_file (GtkWidget *widget, GtkWidget *parent)
3539 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3540 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3541 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3542 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3544 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3545 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3547 g_signal_connect (fs, "destroy",
3548 G_CALLBACK (cmw_destroy_cb), NULL);
3549 g_signal_connect_swapped (fs, "response",
3550 G_CALLBACK (gtk_widget_destroy), fs);
3552 /* wait until destroy calls gtk_main_quit */
3553 gtk_widget_show (fs);
3559 create_modal_window (GtkWidget *widget)
3561 GtkWidget *window = NULL;
3562 GtkWidget *box1,*box2;
3564 GtkWidget *btnColor,*btnFile,*btnClose;
3566 /* Create modal window (Here you can use any window descendent )*/
3567 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3568 gtk_window_set_screen (GTK_WINDOW (window),
3569 gtk_widget_get_screen (widget));
3571 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3573 /* Set window as modal */
3574 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3576 /* Create widgets */
3577 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3578 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3579 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3580 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3581 btnColor = gtk_button_new_with_label ("Color");
3582 btnFile = gtk_button_new_with_label ("File Selection");
3583 btnClose = gtk_button_new_with_label ("Close");
3586 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3587 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3590 gtk_container_add (GTK_CONTAINER (window), box1);
3591 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3592 gtk_container_add (GTK_CONTAINER (frame1), box2);
3593 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3594 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3595 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3596 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3598 /* connect signals */
3599 g_signal_connect_swapped (btnClose, "clicked",
3600 G_CALLBACK (gtk_widget_destroy), window);
3602 g_signal_connect (window, "destroy",
3603 G_CALLBACK (cmw_destroy_cb), NULL);
3605 g_signal_connect (btnColor, "clicked",
3606 G_CALLBACK (cmw_color), window);
3607 g_signal_connect (btnFile, "clicked",
3608 G_CALLBACK (cmw_file), window);
3611 gtk_widget_show_all (window);
3613 /* wait until dialog get destroyed */
3622 make_message_dialog (GdkScreen *screen,
3624 GtkMessageType type,
3625 GtkButtonsType buttons,
3626 guint default_response)
3630 gtk_widget_destroy (*dialog);
3635 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3636 "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.)");
3638 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3640 g_signal_connect_swapped (*dialog,
3642 G_CALLBACK (gtk_widget_destroy),
3645 g_signal_connect (*dialog,
3647 G_CALLBACK (gtk_widget_destroyed),
3650 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3652 gtk_widget_show (*dialog);
3656 create_message_dialog (GtkWidget *widget)
3658 static GtkWidget *info = NULL;
3659 static GtkWidget *warning = NULL;
3660 static GtkWidget *error = NULL;
3661 static GtkWidget *question = NULL;
3662 GdkScreen *screen = gtk_widget_get_screen (widget);
3664 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3665 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3666 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3667 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3674 static GtkWidget *sw_parent = NULL;
3675 static GtkWidget *sw_float_parent;
3676 static gulong sw_destroyed_handler = 0;
3679 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3681 gtk_widget_reparent (scrollwin, sw_parent);
3683 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3684 sw_float_parent = NULL;
3686 sw_destroyed_handler = 0;
3692 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3694 gtk_widget_destroy (sw_float_parent);
3696 sw_float_parent = NULL;
3698 sw_destroyed_handler = 0;
3702 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3706 gtk_widget_reparent (scrollwin, sw_parent);
3707 gtk_widget_destroy (sw_float_parent);
3709 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3710 sw_float_parent = NULL;
3712 sw_destroyed_handler = 0;
3716 sw_parent = gtk_widget_get_parent (scrollwin);
3717 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3718 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3719 gtk_widget_get_screen (widget));
3721 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3723 gtk_widget_reparent (scrollwin, sw_float_parent);
3724 gtk_widget_show (sw_float_parent);
3726 sw_destroyed_handler =
3727 g_signal_connect (sw_parent, "destroy",
3728 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3729 g_signal_connect (sw_float_parent, "delete_event",
3730 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3735 create_scrolled_windows (GtkWidget *widget)
3737 static GtkWidget *window;
3738 GtkWidget *content_area, *action_area;
3739 GtkWidget *scrolled_window;
3747 window = gtk_dialog_new ();
3749 gtk_window_set_screen (GTK_WINDOW (window),
3750 gtk_widget_get_screen (widget));
3752 g_signal_connect (window, "destroy",
3753 G_CALLBACK (gtk_widget_destroyed),
3756 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3757 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3759 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3760 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3762 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3763 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3764 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3765 GTK_POLICY_AUTOMATIC,
3766 GTK_POLICY_AUTOMATIC);
3767 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3768 gtk_widget_show (scrolled_window);
3770 grid = gtk_grid_new ();
3771 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
3772 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
3773 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), grid);
3774 gtk_container_set_focus_hadjustment (GTK_CONTAINER (grid),
3775 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3776 gtk_container_set_focus_vadjustment (GTK_CONTAINER (grid),
3777 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3778 gtk_widget_show (grid);
3780 for (i = 0; i < 20; i++)
3781 for (j = 0; j < 20; j++)
3783 sprintf (buffer, "button (%d,%d)\n", i, j);
3784 button = gtk_toggle_button_new_with_label (buffer);
3785 gtk_grid_attach (GTK_GRID (grid), button, i, j, 1, 1);
3786 gtk_widget_show (button);
3790 button = gtk_button_new_with_label ("Close");
3791 g_signal_connect_swapped (button, "clicked",
3792 G_CALLBACK (gtk_widget_destroy),
3794 gtk_widget_set_can_default (button, TRUE);
3795 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3796 gtk_widget_grab_default (button);
3797 gtk_widget_show (button);
3799 button = gtk_button_new_with_label ("Reparent Out");
3800 g_signal_connect (button, "clicked",
3801 G_CALLBACK (scrolled_windows_remove),
3803 gtk_widget_set_can_default (button, TRUE);
3804 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3805 gtk_widget_grab_default (button);
3806 gtk_widget_show (button);
3808 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3811 if (!gtk_widget_get_visible (window))
3812 gtk_widget_show (window);
3814 gtk_widget_destroy (window);
3822 entry_toggle_frame (GtkWidget *checkbutton,
3825 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3826 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3830 entry_toggle_sensitive (GtkWidget *checkbutton,
3833 gtk_widget_set_sensitive (entry,
3834 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3838 entry_progress_timeout (gpointer data)
3840 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3842 gtk_entry_progress_pulse (GTK_ENTRY (data));
3848 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3851 if (fraction > 1.0001)
3854 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3861 entry_remove_timeout (gpointer data)
3863 g_source_remove (GPOINTER_TO_UINT (data));
3867 entry_toggle_progress (GtkWidget *checkbutton,
3870 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3872 guint timeout = gdk_threads_add_timeout (100,
3873 entry_progress_timeout,
3875 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3876 GUINT_TO_POINTER (timeout),
3877 entry_remove_timeout);
3881 g_object_set_data (G_OBJECT (entry), "timeout-id",
3882 GUINT_TO_POINTER (0));
3884 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3889 entry_toggle_pulse (GtkWidget *checkbutton,
3892 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3893 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3897 props_clicked (GtkWidget *button,
3900 GtkWidget *window = create_prop_editor (object, 0);
3902 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3906 create_entry (GtkWidget *widget)
3908 static GtkWidget *window = NULL;
3912 GtkWidget *has_frame_check;
3913 GtkWidget *sensitive_check;
3914 GtkWidget *progress_check;
3916 GtkComboBoxText *cb;
3917 GtkWidget *cb_entry;
3919 GtkWidget *separator;
3923 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3924 gtk_window_set_screen (GTK_WINDOW (window),
3925 gtk_widget_get_screen (widget));
3927 g_signal_connect (window, "destroy",
3928 G_CALLBACK (gtk_widget_destroyed),
3931 gtk_window_set_title (GTK_WINDOW (window), "entry");
3932 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3935 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3936 gtk_container_add (GTK_CONTAINER (window), box1);
3939 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3940 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3941 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3943 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
3944 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
3946 entry = gtk_entry_new ();
3947 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");
3948 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
3949 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
3951 button = gtk_button_new_with_mnemonic ("_Props");
3952 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
3953 g_signal_connect (button, "clicked",
3954 G_CALLBACK (props_clicked),
3957 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
3959 gtk_combo_box_text_append_text (cb, "item0");
3960 gtk_combo_box_text_append_text (cb, "item0");
3961 gtk_combo_box_text_append_text (cb, "item1 item1");
3962 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
3963 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
3964 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
3965 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
3966 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
3967 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
3968 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
3969 gtk_combo_box_text_append_text (cb, "item9 item9");
3971 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
3972 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
3973 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
3974 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
3976 sensitive_check = gtk_check_button_new_with_label("Sensitive");
3977 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
3978 g_signal_connect (sensitive_check, "toggled",
3979 G_CALLBACK (entry_toggle_sensitive), entry);
3980 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
3982 has_frame_check = gtk_check_button_new_with_label("Has Frame");
3983 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
3984 g_signal_connect (has_frame_check, "toggled",
3985 G_CALLBACK (entry_toggle_frame), entry);
3986 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
3988 progress_check = gtk_check_button_new_with_label("Show Progress");
3989 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
3990 g_signal_connect (progress_check, "toggled",
3991 G_CALLBACK (entry_toggle_progress), entry);
3993 progress_check = gtk_check_button_new_with_label("Pulse Progress");
3994 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
3995 g_signal_connect (progress_check, "toggled",
3996 G_CALLBACK (entry_toggle_pulse), entry);
3998 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3999 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4001 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4002 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4003 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4005 button = gtk_button_new_with_label ("close");
4006 g_signal_connect_swapped (button, "clicked",
4007 G_CALLBACK (gtk_widget_destroy),
4009 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4010 gtk_widget_set_can_default (button, TRUE);
4011 gtk_widget_grab_default (button);
4014 if (!gtk_widget_get_visible (window))
4015 gtk_widget_show_all (window);
4017 gtk_widget_destroy (window);
4021 create_expander (GtkWidget *widget)
4024 GtkWidget *expander;
4026 static GtkWidget *window = NULL;
4030 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4031 gtk_window_set_screen (GTK_WINDOW (window),
4032 gtk_widget_get_screen (widget));
4034 g_signal_connect (window, "destroy",
4035 G_CALLBACK (gtk_widget_destroyed),
4038 gtk_window_set_title (GTK_WINDOW (window), "expander");
4039 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4041 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4042 gtk_container_add (GTK_CONTAINER (window), box1);
4044 expander = gtk_expander_new ("The Hidden");
4046 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4048 hidden = gtk_label_new ("Revealed!");
4050 gtk_container_add (GTK_CONTAINER (expander), hidden);
4053 if (!gtk_widget_get_visible (window))
4054 gtk_widget_show_all (window);
4056 gtk_widget_destroy (window);
4064 event_box_label_pressed (GtkWidget *widget,
4065 GdkEventButton *event,
4068 g_print ("clicked on event box\n");
4072 event_box_button_clicked (GtkWidget *widget,
4076 g_print ("pushed button\n");
4080 event_box_toggle_visible_window (GtkWidget *checkbutton,
4081 GtkEventBox *event_box)
4083 gtk_event_box_set_visible_window (event_box,
4084 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4088 event_box_toggle_above_child (GtkWidget *checkbutton,
4089 GtkEventBox *event_box)
4091 gtk_event_box_set_above_child (event_box,
4092 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4096 create_event_box (GtkWidget *widget)
4098 static GtkWidget *window = NULL;
4104 GtkWidget *separator;
4105 GtkWidget *event_box;
4107 GtkWidget *visible_window_check;
4108 GtkWidget *above_child_check;
4118 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4119 gtk_window_set_screen (GTK_WINDOW (window),
4120 gtk_widget_get_screen (widget));
4122 g_signal_connect (window, "destroy",
4123 G_CALLBACK (gtk_widget_destroyed),
4126 gtk_window_set_title (GTK_WINDOW (window), "event box");
4127 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4129 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4130 gtk_container_add (GTK_CONTAINER (window), box1);
4131 gtk_widget_override_background_color (window, 0, &color);
4133 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4134 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4136 event_box = gtk_event_box_new ();
4137 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4139 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4140 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4141 g_signal_connect (event_box, "button_press_event",
4142 G_CALLBACK (event_box_label_pressed),
4145 label = gtk_label_new ("Click on this label");
4146 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4148 button = gtk_button_new_with_label ("button in eventbox");
4149 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4150 g_signal_connect (button, "clicked",
4151 G_CALLBACK (event_box_button_clicked),
4155 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4156 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4157 g_signal_connect (visible_window_check, "toggled",
4158 G_CALLBACK (event_box_toggle_visible_window), event_box);
4159 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4161 above_child_check = gtk_check_button_new_with_label("Above Child");
4162 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4163 g_signal_connect (above_child_check, "toggled",
4164 G_CALLBACK (event_box_toggle_above_child), event_box);
4165 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4167 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4168 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4170 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4171 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4172 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4174 button = gtk_button_new_with_label ("close");
4175 g_signal_connect_swapped (button, "clicked",
4176 G_CALLBACK (gtk_widget_destroy),
4178 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4179 gtk_widget_set_can_default (button, TRUE);
4180 gtk_widget_grab_default (button);
4183 if (!gtk_widget_get_visible (window))
4184 gtk_widget_show_all (window);
4186 gtk_widget_destroy (window);
4194 #define SIZE_GROUP_INITIAL_SIZE 50
4197 size_group_hsize_changed (GtkSpinButton *spin_button,
4200 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4201 gtk_spin_button_get_value_as_int (spin_button),
4206 size_group_vsize_changed (GtkSpinButton *spin_button,
4209 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4211 gtk_spin_button_get_value_as_int (spin_button));
4215 create_size_group_window (GdkScreen *screen,
4216 GtkSizeGroup *master_size_group)
4218 GtkWidget *content_area;
4221 GtkWidget *main_button;
4223 GtkWidget *spin_button;
4225 GtkSizeGroup *hgroup1;
4226 GtkSizeGroup *hgroup2;
4227 GtkSizeGroup *vgroup1;
4228 GtkSizeGroup *vgroup2;
4230 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4236 gtk_window_set_screen (GTK_WINDOW (window), screen);
4238 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4240 g_signal_connect (window, "response",
4241 G_CALLBACK (gtk_widget_destroy),
4244 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4246 grid = gtk_grid_new ();
4247 gtk_box_pack_start (GTK_BOX (content_area), grid, TRUE, TRUE, 0);
4249 gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
4250 gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
4251 gtk_container_set_border_width (GTK_CONTAINER (grid), 5);
4252 gtk_widget_set_size_request (grid, 250, 250);
4254 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4255 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4256 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4257 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4259 main_button = gtk_button_new_with_label ("X");
4260 gtk_widget_set_hexpand (main_button, TRUE);
4261 gtk_widget_set_vexpand (main_button, TRUE);
4262 gtk_widget_set_halign (main_button, GTK_ALIGN_CENTER);
4263 gtk_widget_set_valign (main_button, GTK_ALIGN_CENTER);
4264 gtk_grid_attach (GTK_GRID (grid), main_button, 0, 0, 1, 1);
4266 gtk_size_group_add_widget (master_size_group, main_button);
4267 gtk_size_group_add_widget (hgroup1, main_button);
4268 gtk_size_group_add_widget (vgroup1, main_button);
4269 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4270 SIZE_GROUP_INITIAL_SIZE,
4271 SIZE_GROUP_INITIAL_SIZE);
4273 button = gtk_button_new ();
4274 gtk_widget_set_hexpand (button, TRUE);
4275 gtk_widget_set_vexpand (button, TRUE);
4276 gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
4277 gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
4278 gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 1);
4280 gtk_size_group_add_widget (vgroup1, button);
4281 gtk_size_group_add_widget (vgroup2, button);
4283 button = gtk_button_new ();
4284 gtk_widget_set_hexpand (button, TRUE);
4285 gtk_widget_set_vexpand (button, TRUE);
4286 gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
4287 gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
4288 gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 1, 1);
4290 gtk_size_group_add_widget (hgroup1, button);
4291 gtk_size_group_add_widget (hgroup2, button);
4293 button = gtk_button_new ();
4294 gtk_widget_set_hexpand (button, TRUE);
4295 gtk_widget_set_vexpand (button, TRUE);
4296 gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
4297 gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
4298 gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1);
4300 gtk_size_group_add_widget (hgroup2, button);
4301 gtk_size_group_add_widget (vgroup2, button);
4303 g_object_unref (hgroup1);
4304 g_object_unref (hgroup2);
4305 g_object_unref (vgroup1);
4306 g_object_unref (vgroup2);
4308 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4309 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4311 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4312 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4313 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4314 g_signal_connect (spin_button, "value_changed",
4315 G_CALLBACK (size_group_hsize_changed), main_button);
4317 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4318 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4319 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4320 g_signal_connect (spin_button, "value_changed",
4321 G_CALLBACK (size_group_vsize_changed), main_button);
4327 create_size_groups (GtkWidget *widget)
4329 static GtkWidget *window1 = NULL;
4330 static GtkWidget *window2 = NULL;
4331 static GtkSizeGroup *master_size_group;
4333 if (!master_size_group)
4334 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4338 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4341 g_signal_connect (window1, "destroy",
4342 G_CALLBACK (gtk_widget_destroyed),
4348 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4351 g_signal_connect (window2, "destroy",
4352 G_CALLBACK (gtk_widget_destroyed),
4356 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4358 gtk_widget_destroy (window1);
4359 gtk_widget_destroy (window2);
4363 if (!gtk_widget_get_visible (window1))
4364 gtk_widget_show_all (window1);
4365 if (!gtk_widget_get_visible (window2))
4366 gtk_widget_show_all (window2);
4374 static GtkWidget *spinner1;
4377 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4379 gtk_spin_button_set_snap_to_ticks (spin,
4380 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4384 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4386 gtk_spin_button_set_numeric (spin,
4387 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4391 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4393 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4394 gtk_spin_button_get_value_as_int (spin));
4398 get_value (GtkWidget *widget, gpointer data)
4402 GtkSpinButton *spin;
4404 spin = GTK_SPIN_BUTTON (spinner1);
4405 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4406 if (GPOINTER_TO_INT (data) == 1)
4407 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4409 sprintf (buf, "%0.*f",
4410 gtk_spin_button_get_digits (spin),
4411 gtk_spin_button_get_value (spin));
4413 gtk_label_set_text (label, buf);
4417 get_spin_value (GtkWidget *widget, gpointer data)
4421 GtkSpinButton *spin;
4423 spin = GTK_SPIN_BUTTON (widget);
4424 label = GTK_LABEL (data);
4426 buffer = g_strdup_printf ("%0.*f",
4427 gtk_spin_button_get_digits (spin),
4428 gtk_spin_button_get_value (spin));
4429 gtk_label_set_text (label, buffer);
4435 spin_button_time_output_func (GtkSpinButton *spin_button)
4437 GtkAdjustment *adjustment;
4438 static gchar buf[6];
4442 adjustment = gtk_spin_button_get_adjustment (spin_button);
4443 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4444 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4445 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4446 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4447 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4452 spin_button_month_input_func (GtkSpinButton *spin_button,
4456 static gchar *month[12] = { "January", "February", "March", "April",
4457 "May", "June", "July", "August",
4458 "September", "October", "November", "December" };
4460 gboolean found = FALSE;
4462 for (i = 1; i <= 12; i++)
4464 tmp1 = g_ascii_strup (month[i - 1], -1);
4465 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4466 if (strstr (tmp1, tmp2) == tmp1)
4476 return GTK_INPUT_ERROR;
4478 *new_val = (gdouble) i;
4483 spin_button_month_output_func (GtkSpinButton *spin_button)
4485 GtkAdjustment *adjustment;
4488 static gchar *month[12] = { "January", "February", "March", "April",
4489 "May", "June", "July", "August", "September",
4490 "October", "November", "December" };
4492 adjustment = gtk_spin_button_get_adjustment (spin_button);
4493 value = gtk_adjustment_get_value (adjustment);
4494 for (i = 1; i <= 12; i++)
4495 if (fabs (value - (double)i) < 1e-5)
4497 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4498 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4504 spin_button_hex_input_func (GtkSpinButton *spin_button,
4511 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4512 res = strtol(buf, &err, 16);
4515 return GTK_INPUT_ERROR;
4521 spin_button_hex_output_func (GtkSpinButton *spin_button)
4523 GtkAdjustment *adjustment;
4524 static gchar buf[7];
4527 adjustment = gtk_spin_button_get_adjustment (spin_button);
4528 val = (gint) gtk_adjustment_get_value (adjustment);
4529 if (fabs (val) < 1e-5)
4530 sprintf (buf, "0x00");
4532 sprintf (buf, "0x%.2X", val);
4533 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4534 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4539 create_spins (GtkWidget *widget)
4541 static GtkWidget *window = NULL;
4544 GtkWidget *main_vbox;
4547 GtkWidget *spinner2;
4551 GtkWidget *val_label;
4552 GtkAdjustment *adjustment;
4556 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4557 gtk_window_set_screen (GTK_WINDOW (window),
4558 gtk_widget_get_screen (widget));
4560 g_signal_connect (window, "destroy",
4561 G_CALLBACK (gtk_widget_destroyed),
4564 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4566 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4567 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4568 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4570 frame = gtk_frame_new ("Not accelerated");
4571 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4573 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4574 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4575 gtk_container_add (GTK_CONTAINER (frame), vbox);
4577 /* Time, month, hex spinners */
4579 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4580 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4582 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4583 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4585 label = gtk_label_new ("Time :");
4586 gtk_widget_set_halign (label, GTK_ALIGN_START);
4587 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4588 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4590 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4591 spinner = gtk_spin_button_new (adjustment, 0, 0);
4592 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4593 g_signal_connect (spinner,
4595 G_CALLBACK (spin_button_time_output_func),
4597 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4598 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4599 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4601 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4602 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4604 label = gtk_label_new ("Month :");
4605 gtk_widget_set_halign (label, GTK_ALIGN_START);
4606 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4607 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4609 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4611 spinner = gtk_spin_button_new (adjustment, 0, 0);
4612 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4613 GTK_UPDATE_IF_VALID);
4614 g_signal_connect (spinner,
4616 G_CALLBACK (spin_button_month_input_func),
4618 g_signal_connect (spinner,
4620 G_CALLBACK (spin_button_month_output_func),
4622 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4623 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4624 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4626 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4627 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4629 label = gtk_label_new ("Hex :");
4630 gtk_widget_set_halign (label, GTK_ALIGN_START);
4631 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4632 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4634 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4635 spinner = gtk_spin_button_new (adjustment, 0, 0);
4636 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4637 g_signal_connect (spinner,
4639 G_CALLBACK (spin_button_hex_input_func),
4641 g_signal_connect (spinner,
4643 G_CALLBACK (spin_button_hex_output_func),
4645 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4646 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4647 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4649 frame = gtk_frame_new ("Accelerated");
4650 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4652 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4653 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4654 gtk_container_add (GTK_CONTAINER (frame), vbox);
4656 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4657 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4659 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4660 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4662 label = gtk_label_new ("Value :");
4663 gtk_widget_set_halign (label, GTK_ALIGN_START);
4664 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4665 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4667 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4669 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4670 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4671 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4673 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4674 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4676 label = gtk_label_new ("Digits :");
4677 gtk_widget_set_halign (label, GTK_ALIGN_START);
4678 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4679 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4681 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4682 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4683 g_signal_connect (adjustment, "value_changed",
4684 G_CALLBACK (change_digits),
4686 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4688 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4689 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4691 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4692 g_signal_connect (button, "clicked",
4693 G_CALLBACK (toggle_snap),
4695 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4696 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4698 button = gtk_check_button_new_with_label ("Numeric only input mode");
4699 g_signal_connect (button, "clicked",
4700 G_CALLBACK (toggle_numeric),
4702 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4703 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4705 val_label = gtk_label_new ("");
4707 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4708 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4710 button = gtk_button_new_with_label ("Value as Int");
4711 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4712 g_signal_connect (button, "clicked",
4713 G_CALLBACK (get_value),
4714 GINT_TO_POINTER (1));
4715 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4717 button = gtk_button_new_with_label ("Value as Float");
4718 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4719 g_signal_connect (button, "clicked",
4720 G_CALLBACK (get_value),
4721 GINT_TO_POINTER (2));
4722 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4724 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4725 gtk_label_set_text (GTK_LABEL (val_label), "0");
4727 frame = gtk_frame_new ("Using Convenience Constructor");
4728 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4730 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4731 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4732 gtk_container_add (GTK_CONTAINER (frame), hbox);
4734 val_label = gtk_label_new ("0.0");
4736 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4737 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4738 g_signal_connect (spinner, "value_changed",
4739 G_CALLBACK (get_spin_value), val_label);
4740 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4741 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4743 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4744 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4746 button = gtk_button_new_with_label ("Close");
4747 g_signal_connect_swapped (button, "clicked",
4748 G_CALLBACK (gtk_widget_destroy),
4750 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4753 if (!gtk_widget_get_visible (window))
4754 gtk_widget_show_all (window);
4756 gtk_widget_destroy (window);
4765 cursor_draw (GtkWidget *widget,
4770 GtkStyleContext *context;
4773 width = gtk_widget_get_allocated_width (widget);
4774 height = gtk_widget_get_allocated_height (widget);
4776 cairo_set_source_rgb (cr, 1, 1, 1);
4777 cairo_rectangle (cr, 0, 0, width, height / 2);
4780 cairo_set_source_rgb (cr, 0, 0, 0);
4781 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4784 context = gtk_widget_get_style_context (widget);
4785 gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
4786 gdk_cairo_set_source_rgba (cr, &bg);
4787 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4794 set_cursor (GtkWidget *spinner,
4803 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4806 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4808 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4809 vals = class->values;
4811 while (vals && vals->value != c)
4814 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4816 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4818 g_type_class_unref (class);
4820 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4821 gdk_window_set_cursor (gtk_widget_get_window (widget),
4823 g_object_unref (cursor);
4827 cursor_event (GtkWidget *widget,
4829 GtkSpinButton *spinner)
4831 if ((event->type == GDK_BUTTON_PRESS) &&
4832 ((event->button.button == 1) ||
4833 (event->button.button == 3)))
4835 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4836 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4843 #ifdef GDK_WINDOWING_X11
4844 #include "x11/gdkx.h"
4847 change_cursor_theme (GtkWidget *widget,
4854 children = gtk_container_get_children (GTK_CONTAINER (data));
4856 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4857 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4859 g_list_free (children);
4861 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4868 create_cursors (GtkWidget *widget)
4870 static GtkWidget *window = NULL;
4873 GtkWidget *main_vbox;
4880 GtkAdjustment *adjustment;
4886 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4887 gtk_window_set_screen (GTK_WINDOW (window),
4888 gtk_widget_get_screen (widget));
4890 g_signal_connect (window, "destroy",
4891 G_CALLBACK (gtk_widget_destroyed),
4894 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4896 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4897 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4898 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4901 g_object_new (GTK_TYPE_BOX,
4902 "orientation", GTK_ORIENTATION_VERTICAL,
4903 "GtkBox::homogeneous", FALSE,
4904 "GtkBox::spacing", 5,
4905 "GtkContainer::border_width", 10,
4906 "GtkWidget::parent", main_vbox,
4907 "GtkWidget::visible", TRUE,
4910 #ifdef GDK_WINDOWING_X11
4911 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4912 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4913 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4915 label = gtk_label_new ("Cursor Theme : ");
4916 gtk_widget_set_halign (label, GTK_ALIGN_START);
4917 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4918 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4920 entry = gtk_entry_new ();
4921 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4922 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4924 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4925 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4926 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4928 g_signal_connect (entry, "changed",
4929 G_CALLBACK (change_cursor_theme), hbox);
4930 g_signal_connect (size, "changed",
4931 G_CALLBACK (change_cursor_theme), hbox);
4934 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4935 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4936 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4938 label = gtk_label_new ("Cursor Value : ");
4939 gtk_widget_set_halign (label, GTK_ALIGN_START);
4940 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4941 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4943 adjustment = gtk_adjustment_new (0,
4947 spinner = gtk_spin_button_new (adjustment, 0, 0);
4948 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
4951 g_object_new (gtk_frame_get_type (),
4952 "GtkFrame::label_xalign", 0.5,
4953 "GtkFrame::label", "Cursor Area",
4954 "GtkContainer::border_width", 10,
4955 "GtkWidget::parent", vbox,
4956 "GtkWidget::visible", TRUE,
4959 darea = gtk_drawing_area_new ();
4960 gtk_widget_set_size_request (darea, 80, 80);
4961 gtk_container_add (GTK_CONTAINER (frame), darea);
4962 g_signal_connect (darea,
4964 G_CALLBACK (cursor_draw),
4966 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
4967 g_signal_connect (darea,
4968 "button_press_event",
4969 G_CALLBACK (cursor_event),
4971 gtk_widget_show (darea);
4973 g_signal_connect (spinner, "changed",
4974 G_CALLBACK (set_cursor),
4977 label = g_object_new (GTK_TYPE_LABEL,
4982 gtk_container_child_set (GTK_CONTAINER (vbox), label,
4985 g_object_set_data (G_OBJECT (spinner), "user_data", label);
4987 any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4988 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
4990 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4991 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
4992 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4994 button = gtk_button_new_with_label ("Close");
4995 g_signal_connect_swapped (button, "clicked",
4996 G_CALLBACK (gtk_widget_destroy),
4998 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5000 gtk_widget_show_all (window);
5002 set_cursor (spinner, darea);
5005 gtk_widget_destroy (window);
5013 color_selection_ok (GtkWidget *w,
5014 GtkColorSelectionDialog *cs)
5016 GtkWidget *colorsel;
5019 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5021 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5022 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5026 color_selection_changed (GtkWidget *w,
5027 GtkColorSelectionDialog *cs)
5029 GtkWidget *colorsel;
5032 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5033 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5034 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5039 opacity_toggled_cb (GtkWidget *w,
5040 GtkColorSelectionDialog *cs)
5042 GtkColorSelection *colorsel;
5044 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5045 gtk_color_selection_set_has_opacity_control (colorsel,
5046 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5050 palette_toggled_cb (GtkWidget *w,
5051 GtkColorSelectionDialog *cs)
5053 GtkColorSelection *colorsel;
5055 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5056 gtk_color_selection_set_has_palette (colorsel,
5057 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5062 create_color_selection (GtkWidget *widget)
5064 static GtkWidget *window = NULL;
5073 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5074 gtk_window_set_screen (GTK_WINDOW (window),
5075 gtk_widget_get_screen (widget));
5077 g_signal_connect (window, "destroy",
5078 G_CALLBACK (gtk_widget_destroyed),
5081 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5082 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5084 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5085 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5086 gtk_container_add (GTK_CONTAINER (window), hbox);
5088 label = gtk_label_new ("Pick a color");
5089 gtk_container_add (GTK_CONTAINER (hbox), label);
5091 picker = gtk_color_button_new ();
5092 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5093 gtk_container_add (GTK_CONTAINER (hbox), picker);
5095 button = gtk_button_new_with_mnemonic ("_Props");
5096 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5097 g_signal_connect (button, "clicked",
5098 G_CALLBACK (props_clicked),
5102 if (!gtk_widget_get_visible (window))
5103 gtk_widget_show_all (window);
5105 gtk_widget_destroy (window);
5109 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5111 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5112 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5114 gtk_widget_set_default_direction (new_direction);
5118 orientable_toggle_orientation (GtkOrientable *orientable)
5120 GtkOrientation orientation;
5122 orientation = gtk_orientable_get_orientation (orientable);
5123 gtk_orientable_set_orientation (orientable,
5124 orientation == GTK_ORIENTATION_HORIZONTAL ?
5125 GTK_ORIENTATION_VERTICAL :
5126 GTK_ORIENTATION_HORIZONTAL);
5128 if (GTK_IS_CONTAINER (orientable))
5133 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5135 for (child = children; child; child = child->next)
5137 if (GTK_IS_ORIENTABLE (child->data))
5138 orientable_toggle_orientation (child->data);
5141 g_list_free (children);
5146 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5148 GtkWidget *content_area;
5149 GtkWidget *toplevel;
5151 toplevel = gtk_widget_get_toplevel (widget);
5152 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5153 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5157 set_direction_recurse (GtkWidget *widget,
5160 GtkTextDirection *dir = data;
5162 gtk_widget_set_direction (widget, *dir);
5163 if (GTK_IS_CONTAINER (widget))
5164 gtk_container_foreach (GTK_CONTAINER (widget),
5165 set_direction_recurse,
5170 create_forward_back (const char *title,
5171 GtkTextDirection text_dir)
5173 GtkWidget *frame = gtk_frame_new (title);
5174 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5175 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5176 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5178 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5180 gtk_container_add (GTK_CONTAINER (frame), bbox);
5181 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5182 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5184 set_direction_recurse (frame, &text_dir);
5190 create_flipping (GtkWidget *widget)
5192 static GtkWidget *window = NULL;
5193 GtkWidget *check_button, *button;
5194 GtkWidget *action_area, *content_area;
5198 window = gtk_dialog_new ();
5200 gtk_window_set_screen (GTK_WINDOW (window),
5201 gtk_widget_get_screen (widget));
5203 g_signal_connect (window, "destroy",
5204 G_CALLBACK (gtk_widget_destroyed),
5207 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5208 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5210 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5212 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5213 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5214 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5216 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5217 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5219 g_signal_connect (check_button, "toggled",
5220 G_CALLBACK (flipping_toggled_cb), NULL);
5222 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5223 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5224 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5226 g_signal_connect (check_button, "toggled",
5227 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5229 gtk_box_pack_start (GTK_BOX (content_area),
5230 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5233 gtk_box_pack_start (GTK_BOX (content_area),
5234 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5237 gtk_box_pack_start (GTK_BOX (content_area),
5238 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5241 button = gtk_button_new_with_label ("Close");
5242 g_signal_connect_swapped (button, "clicked",
5243 G_CALLBACK (gtk_widget_destroy), window);
5244 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5247 if (!gtk_widget_get_visible (window))
5248 gtk_widget_show_all (window);
5250 gtk_widget_destroy (window);
5258 make_focus_table (GList **list)
5263 grid = gtk_grid_new ();
5265 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
5266 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
5268 for (i = 0; i < 5; i++)
5270 for (j = 0; j < 5; j++)
5275 widget = gtk_entry_new ();
5277 widget = gtk_button_new_with_label ("Foo");
5279 *list = g_list_prepend (*list, widget);
5281 gtk_widget_set_hexpand (widget, TRUE);
5282 gtk_widget_set_vexpand (widget, TRUE);
5284 gtk_grid_attach (GTK_GRID (grid), widget, i, j, 1, 1);
5288 *list = g_list_reverse (*list);
5294 create_focus (GtkWidget *widget)
5296 static GtkWidget *window = NULL;
5300 GtkWidget *content_area;
5305 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5311 gtk_window_set_screen (GTK_WINDOW (window),
5312 gtk_widget_get_screen (widget));
5314 g_signal_connect (window, "destroy",
5315 G_CALLBACK (gtk_widget_destroyed),
5318 g_signal_connect (window, "response",
5319 G_CALLBACK (gtk_widget_destroy),
5322 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5324 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5326 frame = gtk_frame_new ("Weird tab focus chain");
5328 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5330 table = make_focus_table (&list);
5332 gtk_container_add (GTK_CONTAINER (frame), table);
5334 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5339 frame = gtk_frame_new ("Default tab focus chain");
5341 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5344 table = make_focus_table (&list);
5348 gtk_container_add (GTK_CONTAINER (frame), table);
5351 if (!gtk_widget_get_visible (window))
5352 gtk_widget_show_all (window);
5354 gtk_widget_destroy (window);
5362 create_font_selection (GtkWidget *widget)
5364 static GtkWidget *window = NULL;
5372 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5373 gtk_window_set_screen (GTK_WINDOW (window),
5374 gtk_widget_get_screen (widget));
5376 g_signal_connect (window, "destroy",
5377 G_CALLBACK (gtk_widget_destroyed),
5380 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5381 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5383 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5384 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5385 gtk_container_add (GTK_CONTAINER (window), hbox);
5387 label = gtk_label_new ("Pick a font");
5388 gtk_container_add (GTK_CONTAINER (hbox), label);
5390 picker = gtk_font_button_new ();
5391 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5392 gtk_container_add (GTK_CONTAINER (hbox), picker);
5395 if (!gtk_widget_get_visible (window))
5396 gtk_widget_show_all (window);
5398 gtk_widget_destroy (window);
5405 static GtkWidget *dialog_window = NULL;
5408 label_toggle (GtkWidget *widget,
5413 *label = gtk_label_new ("Dialog Test");
5414 g_signal_connect (*label,
5416 G_CALLBACK (gtk_widget_destroyed),
5418 g_object_set (*label, "margin", 10, NULL);
5419 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5420 *label, TRUE, TRUE, 0);
5421 gtk_widget_show (*label);
5424 gtk_widget_destroy (*label);
5428 create_dialog (GtkWidget *widget)
5430 static GtkWidget *label;
5431 GtkWidget *action_area;
5436 /* This is a terrible example; it's much simpler to create
5437 * dialogs than this. Don't use testgtk for example code,
5441 dialog_window = gtk_dialog_new ();
5442 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5443 gtk_widget_get_screen (widget));
5445 g_signal_connect (dialog_window, "destroy",
5446 G_CALLBACK (gtk_widget_destroyed),
5449 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5451 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5452 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5454 button = gtk_button_new_with_label ("OK");
5455 gtk_widget_set_can_default (button, TRUE);
5456 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5457 gtk_widget_grab_default (button);
5458 gtk_widget_show (button);
5460 button = gtk_button_new_with_label ("Toggle");
5461 g_signal_connect (button, "clicked",
5462 G_CALLBACK (label_toggle),
5464 gtk_widget_set_can_default (button, TRUE);
5465 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5466 gtk_widget_show (button);
5471 if (!gtk_widget_get_visible (dialog_window))
5472 gtk_widget_show (dialog_window);
5474 gtk_widget_destroy (dialog_window);
5477 /* Display & Screen test
5484 GtkWidget *radio_dpy;
5485 GtkWidget *toplevel;
5486 GtkWidget *dialog_window;
5487 } ScreenDisplaySelection;
5490 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5492 const gchar *display_name;
5493 GdkDisplay *display = gtk_widget_get_display (widget);
5495 GdkScreen *new_screen = NULL;
5496 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5498 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5500 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5501 display = gdk_display_open (display_name);
5505 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5506 GTK_DIALOG_DESTROY_WITH_PARENT,
5509 "The display :\n%s\ncannot be opened",
5511 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5512 gtk_widget_show (dialog);
5513 g_signal_connect (dialog, "response",
5514 G_CALLBACK (gtk_widget_destroy),
5519 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5522 gboolean found = FALSE;
5523 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5526 gtk_tree_model_get (model, &iter, 0, &name, -1);
5527 found = !g_ascii_strcasecmp (display_name, name);
5534 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5535 new_screen = gdk_display_get_default_screen (display);
5540 gint number_of_screens = gdk_display_get_n_screens (display);
5541 gint screen_num = gdk_screen_get_number (current_screen);
5542 if ((screen_num +1) < number_of_screens)
5543 new_screen = gdk_display_get_screen (display, screen_num + 1);
5545 new_screen = gdk_display_get_screen (display, 0);
5550 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5551 gtk_widget_destroy (data->dialog_window);
5556 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5558 gtk_widget_destroy (data);
5562 create_display_screen (GtkWidget *widget)
5564 GtkWidget *grid, *frame, *window, *combo_dpy, *vbox;
5565 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5567 ScreenDisplaySelection *scr_dpy_data;
5568 GdkScreen *screen = gtk_widget_get_screen (widget);
5569 GdkDisplay *display = gdk_screen_get_display (screen);
5571 window = g_object_new (gtk_window_get_type (),
5573 "type", GTK_WINDOW_TOPLEVEL,
5574 "title", "Screen or Display selection",
5577 g_signal_connect (window, "destroy",
5578 G_CALLBACK (gtk_widget_destroy), NULL);
5580 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5581 gtk_container_add (GTK_CONTAINER (window), vbox);
5583 frame = gtk_frame_new ("Select screen or display");
5584 gtk_container_add (GTK_CONTAINER (vbox), frame);
5586 grid = gtk_grid_new ();
5587 gtk_grid_set_row_spacing (GTK_GRID (grid), 3);
5588 gtk_grid_set_column_spacing (GTK_GRID (grid), 3);
5590 gtk_container_add (GTK_CONTAINER (frame), grid);
5592 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5593 if (gdk_display_get_n_screens(display) > 1)
5594 radio_scr = gtk_radio_button_new_with_label
5595 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5598 radio_scr = gtk_radio_button_new_with_label
5599 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5600 "only one screen on the current display");
5601 gtk_widget_set_sensitive (radio_scr, FALSE);
5603 combo_dpy = gtk_combo_box_text_new_with_entry ();
5604 gtk_widget_set_hexpand (combo_dpy, TRUE);
5605 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5606 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5607 "<hostname>:<X Server Num>.<Screen Num>");
5609 gtk_grid_attach (GTK_GRID (grid), radio_dpy, 0, 0, 1, 1);
5610 gtk_grid_attach (GTK_GRID (grid), radio_scr, 0, 1, 1, 1);
5611 gtk_grid_attach (GTK_GRID (grid), combo_dpy, 1, 0, 1, 1);
5613 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5614 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5615 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5617 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5619 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5620 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5622 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5624 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5625 scr_dpy_data->radio_dpy = radio_dpy;
5626 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5627 scr_dpy_data->dialog_window = window;
5629 g_signal_connect (cancelb, "clicked",
5630 G_CALLBACK (screen_display_destroy_diag), window);
5631 g_signal_connect (applyb, "clicked",
5632 G_CALLBACK (screen_display_check), scr_dpy_data);
5633 gtk_widget_show_all (window);
5638 static gulong event_watcher_enter_id = 0;
5639 static gulong event_watcher_leave_id = 0;
5642 event_watcher (GSignalInvocationHint *ihint,
5643 guint n_param_values,
5644 const GValue *param_values,
5647 g_print ("Watch: \"%s\" emitted for %s\n",
5648 g_signal_name (ihint->signal_id),
5649 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5655 event_watcher_down (void)
5657 if (event_watcher_enter_id)
5661 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5662 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5663 event_watcher_enter_id = 0;
5664 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5665 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5666 event_watcher_leave_id = 0;
5671 event_watcher_toggle (void)
5673 if (event_watcher_enter_id)
5674 event_watcher_down ();
5679 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5680 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5681 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5682 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5687 create_event_watcher (GtkWidget *widget)
5689 GtkWidget *action_area, *content_area;
5694 dialog_window = gtk_dialog_new ();
5695 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5696 gtk_widget_get_screen (widget));
5698 g_signal_connect (dialog_window, "destroy",
5699 G_CALLBACK (gtk_widget_destroyed),
5701 g_signal_connect (dialog_window, "destroy",
5702 G_CALLBACK (event_watcher_down),
5705 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5706 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5708 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5709 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5710 gtk_widget_set_size_request (dialog_window, 200, 110);
5712 button = gtk_toggle_button_new_with_label ("Activate Watch");
5713 g_signal_connect (button, "clicked",
5714 G_CALLBACK (event_watcher_toggle),
5716 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5717 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5718 gtk_widget_show (button);
5720 button = gtk_button_new_with_label ("Close");
5721 g_signal_connect_swapped (button, "clicked",
5722 G_CALLBACK (gtk_widget_destroy),
5724 gtk_widget_set_can_default (button, TRUE);
5725 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5726 gtk_widget_grab_default (button);
5727 gtk_widget_show (button);
5730 if (!gtk_widget_get_visible (dialog_window))
5731 gtk_widget_show (dialog_window);
5733 gtk_widget_destroy (dialog_window);
5741 reformat_value (GtkScale *scale,
5744 return g_strdup_printf ("-->%0.*g<--",
5745 gtk_scale_get_digits (scale), value);
5749 create_range_controls (GtkWidget *widget)
5751 static GtkWidget *window = NULL;
5755 GtkWidget *scrollbar;
5757 GtkWidget *separator;
5758 GtkAdjustment *adjustment;
5763 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5765 gtk_window_set_screen (GTK_WINDOW (window),
5766 gtk_widget_get_screen (widget));
5768 g_signal_connect (window, "destroy",
5769 G_CALLBACK (gtk_widget_destroyed),
5772 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5773 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5776 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5777 gtk_container_add (GTK_CONTAINER (window), box1);
5778 gtk_widget_show (box1);
5781 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5782 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5783 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5784 gtk_widget_show (box2);
5787 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5789 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5790 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5791 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5792 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5793 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5794 gtk_widget_show (scale);
5796 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5797 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5798 gtk_widget_show (scrollbar);
5800 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5801 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5802 g_signal_connect (scale,
5804 G_CALLBACK (reformat_value),
5806 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5807 gtk_widget_show (scale);
5809 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5811 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5812 gtk_widget_set_size_request (scale, -1, 200);
5813 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5814 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5815 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5816 gtk_widget_show (scale);
5818 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5819 gtk_widget_set_size_request (scale, -1, 200);
5820 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5821 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5822 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5823 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5824 gtk_widget_show (scale);
5826 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5827 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5828 g_signal_connect (scale,
5830 G_CALLBACK (reformat_value),
5832 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5833 gtk_widget_show (scale);
5836 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5837 gtk_widget_show (hbox);
5839 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5840 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5841 gtk_widget_show (separator);
5844 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5845 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5846 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5847 gtk_widget_show (box2);
5850 button = gtk_button_new_with_label ("close");
5851 g_signal_connect_swapped (button, "clicked",
5852 G_CALLBACK (gtk_widget_destroy),
5854 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5855 gtk_widget_set_can_default (button, TRUE);
5856 gtk_widget_grab_default (button);
5857 gtk_widget_show (button);
5860 if (!gtk_widget_get_visible (window))
5861 gtk_widget_show (window);
5863 gtk_widget_destroy (window);
5870 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5871 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5872 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5873 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5874 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5875 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5876 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5877 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5880 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5886 static const char * book_open_xpm[] = {
5909 static const char * book_closed_xpm[] = {
5934 GdkPixbuf *book_open;
5935 GdkPixbuf *book_closed;
5936 GtkWidget *sample_notebook;
5939 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
5941 GtkWidget *page_widget;
5944 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
5946 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
5947 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5949 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
5950 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5954 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
5956 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
5957 gint old_page_num = gtk_notebook_get_current_page (notebook);
5959 if (page_num == old_page_num)
5962 set_page_image (notebook, page_num, book_open);
5964 if (old_page_num != -1)
5965 set_page_image (notebook, old_page_num, book_closed);
5969 tab_fill (GtkToggleButton *button, GtkWidget *child)
5971 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5972 "tab-fill", gtk_toggle_button_get_active (button),
5977 tab_expand (GtkToggleButton *button, GtkWidget *child)
5979 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5980 "tab-expand", gtk_toggle_button_get_active (button),
5985 create_pages (GtkNotebook *notebook, gint start, gint end)
5987 GtkWidget *child = NULL;
5992 GtkWidget *label_box;
5993 GtkWidget *menu_box;
5997 char accel_buffer[32];
5999 for (i = start; i <= end; i++)
6001 sprintf (buffer, "Page %d", i);
6002 sprintf (accel_buffer, "Page _%d", i);
6004 child = gtk_frame_new (buffer);
6005 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6007 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6008 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6009 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6010 gtk_container_add (GTK_CONTAINER (child), vbox);
6012 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6013 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6014 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6016 button = gtk_check_button_new_with_label ("Fill Tab");
6017 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6018 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6019 g_signal_connect (button, "toggled",
6020 G_CALLBACK (tab_fill), child);
6022 button = gtk_check_button_new_with_label ("Expand Tab");
6023 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6024 g_signal_connect (button, "toggled",
6025 G_CALLBACK (tab_expand), child);
6027 button = gtk_button_new_with_label ("Hide Page");
6028 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6029 g_signal_connect_swapped (button, "clicked",
6030 G_CALLBACK (gtk_widget_hide),
6033 gtk_widget_show_all (child);
6035 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6036 pixwid = gtk_image_new_from_pixbuf (book_closed);
6037 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6039 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6040 gtk_widget_set_margin_left (pixwid, 3);
6041 gtk_widget_set_margin_right (pixwid, 3);
6042 gtk_widget_set_margin_bottom (pixwid, 1);
6043 gtk_widget_set_margin_top (pixwid, 1);
6044 label = gtk_label_new_with_mnemonic (accel_buffer);
6045 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6046 gtk_widget_show_all (label_box);
6049 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6050 pixwid = gtk_image_new_from_pixbuf (book_closed);
6051 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6053 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6054 gtk_widget_set_margin_left (pixwid, 3);
6055 gtk_widget_set_margin_right (pixwid, 3);
6056 gtk_widget_set_margin_bottom (pixwid, 1);
6057 gtk_widget_set_margin_top (pixwid, 1);
6058 label = gtk_label_new (buffer);
6059 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6060 gtk_widget_show_all (menu_box);
6062 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6067 rotate_notebook (GtkButton *button,
6068 GtkNotebook *notebook)
6070 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6074 show_all_pages (GtkButton *button,
6075 GtkNotebook *notebook)
6077 gtk_container_foreach (GTK_CONTAINER (notebook),
6078 (GtkCallback) gtk_widget_show, NULL);
6082 notebook_type_changed (GtkWidget *optionmenu,
6085 GtkNotebook *notebook;
6095 notebook = GTK_NOTEBOOK (data);
6097 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6102 /* standard notebook */
6103 gtk_notebook_set_show_tabs (notebook, TRUE);
6104 gtk_notebook_set_show_border (notebook, TRUE);
6105 gtk_notebook_set_scrollable (notebook, FALSE);
6109 /* notabs notebook */
6110 gtk_notebook_set_show_tabs (notebook, FALSE);
6111 gtk_notebook_set_show_border (notebook, TRUE);
6116 gtk_notebook_set_show_tabs (notebook, FALSE);
6117 gtk_notebook_set_show_border (notebook, FALSE);
6122 gtk_notebook_set_show_tabs (notebook, TRUE);
6123 gtk_notebook_set_show_border (notebook, TRUE);
6124 gtk_notebook_set_scrollable (notebook, TRUE);
6125 if (gtk_notebook_get_n_pages (notebook) == 5)
6126 create_pages (notebook, 6, 15);
6132 if (gtk_notebook_get_n_pages (notebook) == 15)
6133 for (i = 0; i < 10; i++)
6134 gtk_notebook_remove_page (notebook, 5);
6138 notebook_popup (GtkToggleButton *button,
6139 GtkNotebook *notebook)
6141 if (gtk_toggle_button_get_active (button))
6142 gtk_notebook_popup_enable (notebook);
6144 gtk_notebook_popup_disable (notebook);
6148 create_notebook (GtkWidget *widget)
6150 static GtkWidget *window = NULL;
6154 GtkWidget *separator;
6158 static gchar *items[] =
6168 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6169 gtk_window_set_screen (GTK_WINDOW (window),
6170 gtk_widget_get_screen (widget));
6172 g_signal_connect (window, "destroy",
6173 G_CALLBACK (gtk_widget_destroyed),
6176 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6177 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6179 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6180 gtk_container_add (GTK_CONTAINER (window), box1);
6182 sample_notebook = gtk_notebook_new ();
6183 g_signal_connect (sample_notebook, "switch_page",
6184 G_CALLBACK (page_switch), NULL);
6185 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6186 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6187 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6189 gtk_widget_realize (sample_notebook);
6192 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6195 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6197 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6199 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6200 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6202 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6203 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6204 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6206 button = gtk_check_button_new_with_label ("popup menu");
6207 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6208 g_signal_connect (button, "clicked",
6209 G_CALLBACK (notebook_popup),
6212 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6213 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6214 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6216 label = gtk_label_new ("Notebook Style :");
6217 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6219 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6220 notebook_type_changed,
6222 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6224 button = gtk_button_new_with_label ("Show all Pages");
6225 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6226 g_signal_connect (button, "clicked",
6227 G_CALLBACK (show_all_pages), sample_notebook);
6229 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6230 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6231 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6232 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6234 button = gtk_button_new_with_label ("prev");
6235 g_signal_connect_swapped (button, "clicked",
6236 G_CALLBACK (gtk_notebook_prev_page),
6238 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6240 button = gtk_button_new_with_label ("next");
6241 g_signal_connect_swapped (button, "clicked",
6242 G_CALLBACK (gtk_notebook_next_page),
6244 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6246 button = gtk_button_new_with_label ("rotate");
6247 g_signal_connect (button, "clicked",
6248 G_CALLBACK (rotate_notebook), sample_notebook);
6249 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6251 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6252 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6254 button = gtk_button_new_with_label ("close");
6255 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6256 g_signal_connect_swapped (button, "clicked",
6257 G_CALLBACK (gtk_widget_destroy),
6259 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6260 gtk_widget_set_can_default (button, TRUE);
6261 gtk_widget_grab_default (button);
6264 if (!gtk_widget_get_visible (window))
6265 gtk_widget_show_all (window);
6267 gtk_widget_destroy (window);
6275 toggle_resize (GtkWidget *widget, GtkWidget *child)
6277 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6278 GValue value = { 0, };
6279 g_value_init (&value, G_TYPE_BOOLEAN);
6280 gtk_container_child_get_property (container, child, "resize", &value);
6281 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6282 gtk_container_child_set_property (container, child, "resize", &value);
6286 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6288 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6289 GValue value = { 0, };
6290 g_value_init (&value, G_TYPE_BOOLEAN);
6291 gtk_container_child_get_property (container, child, "shrink", &value);
6292 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6293 gtk_container_child_set_property (container, child, "shrink", &value);
6297 paned_props_clicked (GtkWidget *button,
6300 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6302 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6306 create_pane_options (GtkPaned *paned,
6307 const gchar *frame_label,
6308 const gchar *label1,
6309 const gchar *label2)
6311 GtkWidget *child1, *child2;
6316 GtkWidget *check_button;
6318 child1 = gtk_paned_get_child1 (paned);
6319 child2 = gtk_paned_get_child2 (paned);
6321 frame = gtk_frame_new (frame_label);
6322 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6324 grid = gtk_grid_new ();
6325 gtk_container_add (GTK_CONTAINER (frame), grid);
6327 label = gtk_label_new (label1);
6328 gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
6330 check_button = gtk_check_button_new_with_label ("Resize");
6331 gtk_grid_attach (GTK_GRID (grid), check_button, 0, 1, 1, 1);
6332 g_signal_connect (check_button, "toggled",
6333 G_CALLBACK (toggle_resize),
6336 check_button = gtk_check_button_new_with_label ("Shrink");
6337 gtk_grid_attach (GTK_GRID (grid), check_button, 0, 2, 1, 1);
6338 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6340 g_signal_connect (check_button, "toggled",
6341 G_CALLBACK (toggle_shrink),
6344 label = gtk_label_new (label2);
6345 gtk_grid_attach (GTK_GRID (grid), label, 1, 0, 1, 1);
6347 check_button = gtk_check_button_new_with_label ("Resize");
6348 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 1, 1, 1);
6349 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6351 g_signal_connect (check_button, "toggled",
6352 G_CALLBACK (toggle_resize),
6355 check_button = gtk_check_button_new_with_label ("Shrink");
6356 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 2, 1, 1);
6357 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6359 g_signal_connect (check_button, "toggled",
6360 G_CALLBACK (toggle_shrink),
6363 button = gtk_button_new_with_mnemonic ("_Properties");
6364 gtk_grid_attach (GTK_GRID (grid), button, 0, 3, 2, 1);
6365 g_signal_connect (button, "clicked",
6366 G_CALLBACK (paned_props_clicked),
6373 create_panes (GtkWidget *widget)
6375 static GtkWidget *window = NULL;
6384 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6386 gtk_window_set_screen (GTK_WINDOW (window),
6387 gtk_widget_get_screen (widget));
6389 g_signal_connect (window, "destroy",
6390 G_CALLBACK (gtk_widget_destroyed),
6393 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6394 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6396 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6397 gtk_container_add (GTK_CONTAINER (window), vbox);
6399 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6400 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6401 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6403 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6404 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6406 frame = gtk_frame_new (NULL);
6407 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6408 gtk_widget_set_size_request (frame, 60, 60);
6409 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6411 button = gtk_button_new_with_label ("Hi there");
6412 gtk_container_add (GTK_CONTAINER(frame), button);
6414 frame = gtk_frame_new (NULL);
6415 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6416 gtk_widget_set_size_request (frame, 80, 60);
6417 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6419 frame = gtk_frame_new (NULL);
6420 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6421 gtk_widget_set_size_request (frame, 60, 80);
6422 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6424 /* Now create toggle buttons to control sizing */
6426 gtk_box_pack_start (GTK_BOX (vbox),
6427 create_pane_options (GTK_PANED (hpaned),
6433 gtk_box_pack_start (GTK_BOX (vbox),
6434 create_pane_options (GTK_PANED (vpaned),
6440 gtk_widget_show_all (vbox);
6443 if (!gtk_widget_get_visible (window))
6444 gtk_widget_show (window);
6446 gtk_widget_destroy (window);
6450 * Paned keyboard navigation
6454 paned_keyboard_window1 (GtkWidget *widget)
6477 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6478 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6479 gtk_window_set_screen (GTK_WINDOW (window1),
6480 gtk_widget_get_screen (widget));
6482 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6483 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6485 frame1 = gtk_frame_new (NULL);
6486 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6487 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6489 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6490 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6492 button7 = gtk_button_new_with_label ("button7");
6493 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6495 button8 = gtk_button_new_with_label ("button8");
6496 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6498 button9 = gtk_button_new_with_label ("button9");
6499 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6501 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6502 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6504 frame2 = gtk_frame_new (NULL);
6505 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6506 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6508 frame5 = gtk_frame_new (NULL);
6509 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6511 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6512 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6514 button5 = gtk_button_new_with_label ("button5");
6515 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6517 button6 = gtk_button_new_with_label ("button6");
6518 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6520 frame3 = gtk_frame_new (NULL);
6521 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6522 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6524 frame4 = gtk_frame_new ("Buttons");
6525 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6526 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6528 grid1 = gtk_grid_new ();
6529 gtk_container_add (GTK_CONTAINER (frame4), grid1);
6530 gtk_container_set_border_width (GTK_CONTAINER (grid1), 11);
6532 button1 = gtk_button_new_with_label ("button1");
6533 gtk_grid_attach (GTK_GRID (grid1), button1, 0, 0, 1, 1);
6535 button2 = gtk_button_new_with_label ("button2");
6536 gtk_grid_attach (GTK_GRID (grid1), button2, 1, 0, 1, 1);
6538 button3 = gtk_button_new_with_label ("button3");
6539 gtk_grid_attach (GTK_GRID (grid1), button3, 0, 1, 1, 1);
6541 button4 = gtk_button_new_with_label ("button4");
6542 gtk_grid_attach (GTK_GRID (grid1), button4, 1, 1, 1, 1);
6548 paned_keyboard_window2 (GtkWidget *widget)
6553 GtkWidget *button13;
6557 GtkWidget *button12;
6559 GtkWidget *button11;
6560 GtkWidget *button10;
6562 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6563 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6565 gtk_window_set_screen (GTK_WINDOW (window2),
6566 gtk_widget_get_screen (widget));
6568 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6569 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6571 frame6 = gtk_frame_new (NULL);
6572 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6573 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6575 button13 = gtk_button_new_with_label ("button13");
6576 gtk_container_add (GTK_CONTAINER (frame6), button13);
6578 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6579 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6581 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6582 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6584 frame7 = gtk_frame_new (NULL);
6585 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6586 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6588 button12 = gtk_button_new_with_label ("button12");
6589 gtk_container_add (GTK_CONTAINER (frame7), button12);
6591 frame8 = gtk_frame_new (NULL);
6592 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6593 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6595 button11 = gtk_button_new_with_label ("button11");
6596 gtk_container_add (GTK_CONTAINER (frame8), button11);
6598 button10 = gtk_button_new_with_label ("button10");
6599 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6605 paned_keyboard_window3 (GtkWidget *widget)
6612 GtkWidget *button14;
6615 GtkWidget *button15;
6618 GtkWidget *button16;
6620 GtkWidget *button17;
6622 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6623 g_object_set_data (G_OBJECT (window3), "window3", window3);
6624 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6626 gtk_window_set_screen (GTK_WINDOW (window3),
6627 gtk_widget_get_screen (widget));
6630 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6631 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6633 label1 = gtk_label_new ("Three panes nested inside each other");
6634 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6636 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6637 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6639 frame9 = gtk_frame_new (NULL);
6640 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6641 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6643 button14 = gtk_button_new_with_label ("button14");
6644 gtk_container_add (GTK_CONTAINER (frame9), button14);
6646 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6647 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6649 frame10 = gtk_frame_new (NULL);
6650 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6651 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6653 button15 = gtk_button_new_with_label ("button15");
6654 gtk_container_add (GTK_CONTAINER (frame10), button15);
6656 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6657 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6659 frame11 = gtk_frame_new (NULL);
6660 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6661 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6663 button16 = gtk_button_new_with_label ("button16");
6664 gtk_container_add (GTK_CONTAINER (frame11), button16);
6666 frame12 = gtk_frame_new (NULL);
6667 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6668 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6670 button17 = gtk_button_new_with_label ("button17");
6671 gtk_container_add (GTK_CONTAINER (frame12), button17);
6677 paned_keyboard_window4 (GtkWidget *widget)
6684 GtkWidget *button19;
6685 GtkWidget *button18;
6688 GtkWidget *button21;
6689 GtkWidget *button20;
6691 GtkWidget *button23;
6692 GtkWidget *button22;
6694 GtkWidget *button25;
6695 GtkWidget *button24;
6697 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6698 g_object_set_data (G_OBJECT (window4), "window4", window4);
6699 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6701 gtk_window_set_screen (GTK_WINDOW (window4),
6702 gtk_widget_get_screen (widget));
6704 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6705 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6707 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6708 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6709 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6711 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6712 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6714 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6715 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6717 button19 = gtk_button_new_with_label ("button19");
6718 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6720 button18 = gtk_button_new_with_label ("button18");
6721 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6723 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6724 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6726 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6727 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6729 button21 = gtk_button_new_with_label ("button21");
6730 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6732 button20 = gtk_button_new_with_label ("button20");
6733 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6735 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6736 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6738 button23 = gtk_button_new_with_label ("button23");
6739 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6741 button22 = gtk_button_new_with_label ("button22");
6742 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6744 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6745 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6747 button25 = gtk_button_new_with_label ("button25");
6748 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6750 button24 = gtk_button_new_with_label ("button24");
6751 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6757 create_paned_keyboard_navigation (GtkWidget *widget)
6759 static GtkWidget *window1 = NULL;
6760 static GtkWidget *window2 = NULL;
6761 static GtkWidget *window3 = NULL;
6762 static GtkWidget *window4 = NULL;
6765 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6767 gtk_widget_destroy (window1);
6768 gtk_widget_destroy (window2);
6769 gtk_widget_destroy (window3);
6770 gtk_widget_destroy (window4);
6775 window1 = paned_keyboard_window1 (widget);
6776 g_signal_connect (window1, "destroy",
6777 G_CALLBACK (gtk_widget_destroyed),
6783 window2 = paned_keyboard_window2 (widget);
6784 g_signal_connect (window2, "destroy",
6785 G_CALLBACK (gtk_widget_destroyed),
6791 window3 = paned_keyboard_window3 (widget);
6792 g_signal_connect (window3, "destroy",
6793 G_CALLBACK (gtk_widget_destroyed),
6799 window4 = paned_keyboard_window4 (widget);
6800 g_signal_connect (window4, "destroy",
6801 G_CALLBACK (gtk_widget_destroyed),
6805 if (gtk_widget_get_visible (window1))
6806 gtk_widget_destroy (GTK_WIDGET (window1));
6808 gtk_widget_show_all (GTK_WIDGET (window1));
6810 if (gtk_widget_get_visible (window2))
6811 gtk_widget_destroy (GTK_WIDGET (window2));
6813 gtk_widget_show_all (GTK_WIDGET (window2));
6815 if (gtk_widget_get_visible (window3))
6816 gtk_widget_destroy (GTK_WIDGET (window3));
6818 gtk_widget_show_all (GTK_WIDGET (window3));
6820 if (gtk_widget_get_visible (window4))
6821 gtk_widget_destroy (GTK_WIDGET (window4));
6823 gtk_widget_show_all (GTK_WIDGET (window4));
6831 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6834 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6838 /* ignore double and triple click */
6839 if (event->type != GDK_BUTTON_PRESS)
6842 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6843 p->x = (int) event->x;
6844 p->y = (int) event->y;
6846 gtk_grab_add (widget);
6847 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6848 gtk_widget_get_window (widget),
6851 GDK_BUTTON_RELEASE_MASK |
6852 GDK_BUTTON_MOTION_MASK |
6853 GDK_POINTER_MOTION_HINT_MASK,
6859 shape_released (GtkWidget *widget,
6860 GdkEventButton *event)
6862 gtk_grab_remove (widget);
6863 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6867 shape_motion (GtkWidget *widget,
6868 GdkEventMotion *event)
6872 GdkModifierType mask;
6874 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6877 * Can't use event->x / event->y here
6878 * because I need absolute coordinates.
6880 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6881 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6885 shape_create_icon (GdkScreen *screen,
6896 CursorOffset* icon_pos;
6897 cairo_surface_t *mask;
6898 cairo_region_t *mask_region;
6903 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
6905 window = gtk_window_new (window_type);
6906 gtk_window_set_screen (GTK_WINDOW (window), screen);
6908 fixed = gtk_fixed_new ();
6909 gtk_widget_set_size_request (fixed, 100, 100);
6910 gtk_container_add (GTK_CONTAINER (window), fixed);
6911 gtk_widget_show (fixed);
6913 gtk_widget_set_events (window,
6914 gtk_widget_get_events (window) |
6915 GDK_BUTTON_MOTION_MASK |
6916 GDK_POINTER_MOTION_HINT_MASK |
6917 GDK_BUTTON_PRESS_MASK);
6919 gtk_widget_realize (window);
6921 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
6922 g_assert (pixbuf); /* FIXME: error handling */
6924 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
6925 gdk_pixbuf_get_width (pixbuf),
6926 gdk_pixbuf_get_height (pixbuf));
6927 cr = cairo_create (mask);
6928 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
6932 mask_region = gdk_cairo_region_create_from_surface (mask);
6934 cairo_region_translate (mask_region, px, py);
6936 image = gtk_image_new_from_pixbuf (pixbuf);
6937 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
6938 gtk_widget_show (image);
6940 gtk_widget_shape_combine_region (window, mask_region);
6942 cairo_region_destroy (mask_region);
6943 cairo_surface_destroy (mask);
6944 g_object_unref (pixbuf);
6946 g_signal_connect (window, "button_press_event",
6947 G_CALLBACK (shape_pressed), NULL);
6948 g_signal_connect (window, "button_release_event",
6949 G_CALLBACK (shape_released), NULL);
6950 g_signal_connect (window, "motion_notify_event",
6951 G_CALLBACK (shape_motion), NULL);
6953 icon_pos = g_new (CursorOffset, 1);
6954 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
6956 gtk_window_move (GTK_WINDOW (window), x, y);
6957 gtk_widget_show (window);
6963 create_shapes (GtkWidget *widget)
6965 /* Variables used by the Drag/Drop and Shape Window demos */
6966 static GtkWidget *modeller = NULL;
6967 static GtkWidget *sheets = NULL;
6968 static GtkWidget *rings = NULL;
6969 static GtkWidget *with_region = NULL;
6970 GdkScreen *screen = gtk_widget_get_screen (widget);
6972 if (!(file_exists ("Modeller.xpm") &&
6973 file_exists ("FilesQueue.xpm") &&
6974 file_exists ("3DRings.xpm")))
6980 modeller = shape_create_icon (screen, "Modeller.xpm",
6981 440, 140, 0,0, GTK_WINDOW_POPUP);
6983 g_signal_connect (modeller, "destroy",
6984 G_CALLBACK (gtk_widget_destroyed),
6988 gtk_widget_destroy (modeller);
6992 sheets = shape_create_icon (screen, "FilesQueue.xpm",
6993 580, 170, 0,0, GTK_WINDOW_POPUP);
6995 g_signal_connect (sheets, "destroy",
6996 G_CALLBACK (gtk_widget_destroyed),
7001 gtk_widget_destroy (sheets);
7005 rings = shape_create_icon (screen, "3DRings.xpm",
7006 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7008 g_signal_connect (rings, "destroy",
7009 G_CALLBACK (gtk_widget_destroyed),
7013 gtk_widget_destroy (rings);
7017 cairo_region_t *region;
7020 with_region = shape_create_icon (screen, "3DRings.xpm",
7021 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7023 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7025 g_signal_connect (with_region, "destroy",
7026 G_CALLBACK (gtk_widget_destroyed),
7029 /* reset shape from mask to a region */
7032 region = cairo_region_create ();
7044 cairo_region_union_rectangle (region, &rect);
7052 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7057 gtk_widget_destroy (with_region);
7065 create_wmhints (GtkWidget *widget)
7067 static GtkWidget *window = NULL;
7069 GtkWidget *separator;
7073 GdkWindow *gdk_window;
7079 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7081 gtk_window_set_screen (GTK_WINDOW (window),
7082 gtk_widget_get_screen (widget));
7084 g_signal_connect (window, "destroy",
7085 G_CALLBACK (gtk_widget_destroyed),
7088 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7089 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7091 gtk_widget_realize (window);
7093 gdk_window = gtk_widget_get_window (window);
7095 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7096 list = g_list_prepend (NULL, pixbuf);
7098 gdk_window_set_icon_list (gdk_window, list);
7101 g_object_unref (pixbuf);
7103 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7105 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7106 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7108 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7109 gtk_container_add (GTK_CONTAINER (window), box1);
7110 gtk_widget_show (box1);
7112 label = gtk_label_new ("Try iconizing me!");
7113 gtk_widget_set_size_request (label, 150, 50);
7114 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7115 gtk_widget_show (label);
7118 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7119 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7120 gtk_widget_show (separator);
7123 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
7124 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7125 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7126 gtk_widget_show (box2);
7129 button = gtk_button_new_with_label ("close");
7131 g_signal_connect_swapped (button, "clicked",
7132 G_CALLBACK (gtk_widget_destroy),
7135 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7136 gtk_widget_set_can_default (button, TRUE);
7137 gtk_widget_grab_default (button);
7138 gtk_widget_show (button);
7141 if (!gtk_widget_get_visible (window))
7142 gtk_widget_show (window);
7144 gtk_widget_destroy (window);
7149 * Window state tracking
7153 window_state_callback (GtkWidget *widget,
7154 GdkEventWindowState *event,
7157 GtkWidget *label = data;
7160 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7161 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7162 "withdrawn" : "not withdrawn", ", ",
7163 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7164 "iconified" : "not iconified", ", ",
7165 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7166 "sticky" : "not sticky", ", ",
7167 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7168 "maximized" : "not maximized", ", ",
7169 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7170 "fullscreen" : "not fullscreen",
7171 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7172 "above" : "not above", ", ",
7173 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7174 "below" : "not below", ", ",
7177 gtk_label_set_text (GTK_LABEL (label), msg);
7185 tracking_label (GtkWidget *window)
7191 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
7193 g_signal_connect_object (hbox,
7195 G_CALLBACK (gtk_widget_destroy),
7199 label = gtk_label_new ("<no window state events received>");
7200 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7201 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7203 g_signal_connect (window,
7204 "window_state_event",
7205 G_CALLBACK (window_state_callback),
7208 button = gtk_button_new_with_label ("Deiconify");
7209 g_signal_connect_object (button,
7211 G_CALLBACK (gtk_window_deiconify),
7214 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7216 button = gtk_button_new_with_label ("Iconify");
7217 g_signal_connect_object (button,
7219 G_CALLBACK (gtk_window_iconify),
7222 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7224 button = gtk_button_new_with_label ("Fullscreen");
7225 g_signal_connect_object (button,
7227 G_CALLBACK (gtk_window_fullscreen),
7230 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7232 button = gtk_button_new_with_label ("Unfullscreen");
7233 g_signal_connect_object (button,
7235 G_CALLBACK (gtk_window_unfullscreen),
7238 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7240 button = gtk_button_new_with_label ("Present");
7241 g_signal_connect_object (button,
7243 G_CALLBACK (gtk_window_present),
7246 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7248 button = gtk_button_new_with_label ("Show");
7249 g_signal_connect_object (button,
7251 G_CALLBACK (gtk_widget_show),
7254 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7256 gtk_widget_show_all (hbox);
7262 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7264 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7266 gtk_window_set_keep_above (GTK_WINDOW (data),
7267 gtk_toggle_button_get_active (togglebutton));
7269 if (gtk_toggle_button_get_active (togglebutton))
7270 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7274 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7276 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7278 gtk_window_set_keep_below (GTK_WINDOW (data),
7279 gtk_toggle_button_get_active (togglebutton));
7281 if (gtk_toggle_button_get_active (togglebutton))
7282 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7287 get_state_controls (GtkWidget *window)
7291 GtkWidget *button_above;
7292 GtkWidget *button_below;
7294 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7296 button = gtk_button_new_with_label ("Stick");
7297 g_signal_connect_object (button,
7299 G_CALLBACK (gtk_window_stick),
7302 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7304 button = gtk_button_new_with_label ("Unstick");
7305 g_signal_connect_object (button,
7307 G_CALLBACK (gtk_window_unstick),
7310 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7312 button = gtk_button_new_with_label ("Maximize");
7313 g_signal_connect_object (button,
7315 G_CALLBACK (gtk_window_maximize),
7318 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7320 button = gtk_button_new_with_label ("Unmaximize");
7321 g_signal_connect_object (button,
7323 G_CALLBACK (gtk_window_unmaximize),
7326 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7328 button = gtk_button_new_with_label ("Iconify");
7329 g_signal_connect_object (button,
7331 G_CALLBACK (gtk_window_iconify),
7334 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7336 button = gtk_button_new_with_label ("Fullscreen");
7337 g_signal_connect_object (button,
7339 G_CALLBACK (gtk_window_fullscreen),
7342 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7344 button = gtk_button_new_with_label ("Unfullscreen");
7345 g_signal_connect_object (button,
7347 G_CALLBACK (gtk_window_unfullscreen),
7350 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7352 button_above = gtk_toggle_button_new_with_label ("Keep above");
7353 g_signal_connect (button_above,
7355 G_CALLBACK (keep_window_above),
7357 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7359 button_below = gtk_toggle_button_new_with_label ("Keep below");
7360 g_signal_connect (button_below,
7362 G_CALLBACK (keep_window_below),
7364 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7366 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7367 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7369 button = gtk_button_new_with_label ("Hide (withdraw)");
7370 g_signal_connect_object (button,
7372 G_CALLBACK (gtk_widget_hide),
7375 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7377 gtk_widget_show_all (vbox);
7383 create_window_states (GtkWidget *widget)
7385 static GtkWidget *window = NULL;
7388 GtkWidget *iconified;
7390 GtkWidget *controls;
7394 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7395 gtk_window_set_screen (GTK_WINDOW (window),
7396 gtk_widget_get_screen (widget));
7398 g_signal_connect (window, "destroy",
7399 G_CALLBACK (gtk_widget_destroyed),
7402 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7404 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7405 gtk_container_add (GTK_CONTAINER (window), box1);
7407 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7409 gtk_window_set_screen (GTK_WINDOW (iconified),
7410 gtk_widget_get_screen (widget));
7412 g_signal_connect_object (iconified, "destroy",
7413 G_CALLBACK (gtk_widget_destroy),
7416 gtk_window_iconify (GTK_WINDOW (iconified));
7417 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7418 controls = get_state_controls (iconified);
7419 gtk_container_add (GTK_CONTAINER (iconified), controls);
7421 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7423 gtk_window_set_screen (GTK_WINDOW (normal),
7424 gtk_widget_get_screen (widget));
7426 g_signal_connect_object (normal, "destroy",
7427 G_CALLBACK (gtk_widget_destroy),
7431 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7432 controls = get_state_controls (normal);
7433 gtk_container_add (GTK_CONTAINER (normal), controls);
7435 label = tracking_label (iconified);
7436 gtk_container_add (GTK_CONTAINER (box1), label);
7438 label = tracking_label (normal);
7439 gtk_container_add (GTK_CONTAINER (box1), label);
7441 gtk_widget_show_all (iconified);
7442 gtk_widget_show_all (normal);
7443 gtk_widget_show_all (box1);
7446 if (!gtk_widget_get_visible (window))
7447 gtk_widget_show (window);
7449 gtk_widget_destroy (window);
7457 configure_event_callback (GtkWidget *widget,
7458 GdkEventConfigure *event,
7461 GtkWidget *label = data;
7465 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7467 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7469 event->x, event->y, event->width, event->height,
7472 gtk_label_set_text (GTK_LABEL (label), msg);
7480 get_ints (GtkWidget *window,
7487 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7488 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7490 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7491 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7495 set_size_callback (GtkWidget *widget,
7500 get_ints (data, &w, &h);
7502 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7506 unset_default_size_callback (GtkWidget *widget,
7509 gtk_window_set_default_size (g_object_get_data (data, "target"),
7514 set_default_size_callback (GtkWidget *widget,
7519 get_ints (data, &w, &h);
7521 gtk_window_set_default_size (g_object_get_data (data, "target"),
7526 unset_size_request_callback (GtkWidget *widget,
7529 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7534 set_size_request_callback (GtkWidget *widget,
7539 get_ints (data, &w, &h);
7541 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7546 set_location_callback (GtkWidget *widget,
7551 get_ints (data, &x, &y);
7553 gtk_window_move (g_object_get_data (data, "target"), x, y);
7557 move_to_position_callback (GtkWidget *widget,
7563 window = g_object_get_data (data, "target");
7565 gtk_window_get_position (window, &x, &y);
7567 gtk_window_move (window, x, y);
7571 set_geometry_callback (GtkWidget *entry,
7577 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7579 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7581 if (!gtk_window_parse_geometry (target, text))
7582 g_print ("Bad geometry string '%s'\n", text);
7588 resizable_callback (GtkWidget *widget,
7591 g_object_set (g_object_get_data (data, "target"),
7592 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7597 gravity_selected (GtkWidget *widget,
7600 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7601 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7605 pos_selected (GtkWidget *widget,
7608 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7609 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7613 move_gravity_window_to_current_position (GtkWidget *widget,
7619 window = GTK_WINDOW (data);
7621 gtk_window_get_position (window, &x, &y);
7623 gtk_window_move (window, x, y);
7627 get_screen_corner (GtkWindow *window,
7632 GdkScreen * screen = gtk_window_get_screen (window);
7634 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7636 switch (gtk_window_get_gravity (window))
7638 case GDK_GRAVITY_SOUTH_EAST:
7639 *x = gdk_screen_get_width (screen) - w;
7640 *y = gdk_screen_get_height (screen) - h;
7643 case GDK_GRAVITY_NORTH_EAST:
7644 *x = gdk_screen_get_width (screen) - w;
7648 case GDK_GRAVITY_SOUTH_WEST:
7650 *y = gdk_screen_get_height (screen) - h;
7653 case GDK_GRAVITY_NORTH_WEST:
7658 case GDK_GRAVITY_SOUTH:
7659 *x = (gdk_screen_get_width (screen) - w) / 2;
7660 *y = gdk_screen_get_height (screen) - h;
7663 case GDK_GRAVITY_NORTH:
7664 *x = (gdk_screen_get_width (screen) - w) / 2;
7668 case GDK_GRAVITY_WEST:
7670 *y = (gdk_screen_get_height (screen) - h) / 2;
7673 case GDK_GRAVITY_EAST:
7674 *x = gdk_screen_get_width (screen) - w;
7675 *y = (gdk_screen_get_height (screen) - h) / 2;
7678 case GDK_GRAVITY_CENTER:
7679 *x = (gdk_screen_get_width (screen) - w) / 2;
7680 *y = (gdk_screen_get_height (screen) - h) / 2;
7683 case GDK_GRAVITY_STATIC:
7684 /* pick some random numbers */
7690 g_assert_not_reached ();
7696 move_gravity_window_to_starting_position (GtkWidget *widget,
7702 window = GTK_WINDOW (data);
7704 get_screen_corner (window,
7707 gtk_window_move (window, x, y);
7711 make_gravity_window (GtkWidget *destroy_with,
7720 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7722 gtk_window_set_screen (GTK_WINDOW (window),
7723 gtk_widget_get_screen (destroy_with));
7725 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7726 gtk_widget_show (vbox);
7728 gtk_container_add (GTK_CONTAINER (window), vbox);
7729 gtk_window_set_title (GTK_WINDOW (window), title);
7730 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7732 g_signal_connect_object (destroy_with,
7734 G_CALLBACK (gtk_widget_destroy),
7739 button = gtk_button_new_with_mnemonic ("_Move to current position");
7741 g_signal_connect (button, "clicked",
7742 G_CALLBACK (move_gravity_window_to_current_position),
7745 gtk_container_add (GTK_CONTAINER (vbox), button);
7746 gtk_widget_show (button);
7748 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7750 g_signal_connect (button, "clicked",
7751 G_CALLBACK (move_gravity_window_to_starting_position),
7754 gtk_container_add (GTK_CONTAINER (vbox), button);
7755 gtk_widget_show (button);
7757 /* Pretend this is the result of --geometry.
7758 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7759 * and in that case you probably should just use gtk_window_parse_geometry().
7760 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7761 * you are parsing --geometry or equivalent.
7763 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7767 gtk_window_set_default_size (GTK_WINDOW (window),
7770 get_screen_corner (GTK_WINDOW (window), &x, &y);
7772 gtk_window_move (GTK_WINDOW (window),
7779 do_gravity_test (GtkWidget *widget,
7782 GtkWidget *destroy_with = data;
7785 /* We put a window at each gravity point on the screen. */
7786 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7788 gtk_widget_show (window);
7790 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7792 gtk_widget_show (window);
7794 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7796 gtk_widget_show (window);
7798 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7800 gtk_widget_show (window);
7802 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7804 gtk_widget_show (window);
7806 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7808 gtk_widget_show (window);
7811 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7813 gtk_widget_show (window);
7816 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7818 gtk_widget_show (window);
7820 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7822 gtk_widget_show (window);
7824 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7826 gtk_widget_show (window);
7830 window_controls (GtkWidget *window)
7832 GtkWidget *control_window;
7837 GtkAdjustment *adjustment;
7842 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7844 gtk_window_set_screen (GTK_WINDOW (control_window),
7845 gtk_widget_get_screen (window));
7847 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7849 g_object_set_data (G_OBJECT (control_window),
7853 g_signal_connect_object (control_window,
7855 G_CALLBACK (gtk_widget_destroy),
7859 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7861 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7863 label = gtk_label_new ("<no configure events>");
7864 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7866 g_signal_connect (window,
7868 G_CALLBACK (configure_event_callback),
7871 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7872 spin = gtk_spin_button_new (adjustment, 0, 0);
7874 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7876 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7878 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7879 spin = gtk_spin_button_new (adjustment, 0, 0);
7881 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7883 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7885 entry = gtk_entry_new ();
7886 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7888 g_signal_connect (entry, "changed",
7889 G_CALLBACK (set_geometry_callback),
7892 button = gtk_button_new_with_label ("Show gravity test windows");
7893 g_signal_connect_swapped (button,
7895 G_CALLBACK (do_gravity_test),
7897 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7899 button = gtk_button_new_with_label ("Reshow with initial size");
7900 g_signal_connect_object (button,
7902 G_CALLBACK (gtk_window_reshow_with_initial_size),
7905 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7907 button = gtk_button_new_with_label ("Queue resize");
7908 g_signal_connect_object (button,
7910 G_CALLBACK (gtk_widget_queue_resize),
7913 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7915 button = gtk_button_new_with_label ("Resize");
7916 g_signal_connect (button,
7918 G_CALLBACK (set_size_callback),
7920 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7922 button = gtk_button_new_with_label ("Set default size");
7923 g_signal_connect (button,
7925 G_CALLBACK (set_default_size_callback),
7927 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7929 button = gtk_button_new_with_label ("Unset default size");
7930 g_signal_connect (button,
7932 G_CALLBACK (unset_default_size_callback),
7934 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7936 button = gtk_button_new_with_label ("Set size request");
7937 g_signal_connect (button,
7939 G_CALLBACK (set_size_request_callback),
7941 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7943 button = gtk_button_new_with_label ("Unset size request");
7944 g_signal_connect (button,
7946 G_CALLBACK (unset_size_request_callback),
7948 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7950 button = gtk_button_new_with_label ("Move");
7951 g_signal_connect (button,
7953 G_CALLBACK (set_location_callback),
7955 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7957 button = gtk_button_new_with_label ("Move to current position");
7958 g_signal_connect (button,
7960 G_CALLBACK (move_to_position_callback),
7962 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7964 button = gtk_check_button_new_with_label ("Allow resize");
7965 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
7966 g_signal_connect (button,
7968 G_CALLBACK (resizable_callback),
7970 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7972 button = gtk_button_new_with_mnemonic ("_Show");
7973 g_signal_connect_object (button,
7975 G_CALLBACK (gtk_widget_show),
7978 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7980 button = gtk_button_new_with_mnemonic ("_Hide");
7981 g_signal_connect_object (button,
7983 G_CALLBACK (gtk_widget_hide),
7986 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7988 om = gtk_combo_box_text_new ();
7992 static gchar *names[] = {
7993 "GDK_GRAVITY_NORTH_WEST",
7994 "GDK_GRAVITY_NORTH",
7995 "GDK_GRAVITY_NORTH_EAST",
7997 "GDK_GRAVITY_CENTER",
7999 "GDK_GRAVITY_SOUTH_WEST",
8000 "GDK_GRAVITY_SOUTH",
8001 "GDK_GRAVITY_SOUTH_EAST",
8002 "GDK_GRAVITY_STATIC",
8006 g_assert (names[i]);
8007 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8012 g_signal_connect (om,
8014 G_CALLBACK (gravity_selected),
8017 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8020 om = gtk_combo_box_text_new ();
8024 static gchar *names[] = {
8026 "GTK_WIN_POS_CENTER",
8027 "GTK_WIN_POS_MOUSE",
8028 "GTK_WIN_POS_CENTER_ALWAYS",
8029 "GTK_WIN_POS_CENTER_ON_PARENT",
8033 g_assert (names[i]);
8034 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8039 g_signal_connect (om,
8041 G_CALLBACK (pos_selected),
8044 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8046 gtk_widget_show_all (vbox);
8048 return control_window;
8052 create_window_sizing (GtkWidget *widget)
8054 static GtkWidget *window = NULL;
8055 static GtkWidget *target_window = NULL;
8061 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8062 gtk_window_set_screen (GTK_WINDOW (target_window),
8063 gtk_widget_get_screen (widget));
8064 label = gtk_label_new (NULL);
8065 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");
8066 gtk_container_add (GTK_CONTAINER (target_window), label);
8067 gtk_widget_show (label);
8069 g_signal_connect (target_window, "destroy",
8070 G_CALLBACK (gtk_widget_destroyed),
8073 window = window_controls (target_window);
8075 g_signal_connect (window, "destroy",
8076 G_CALLBACK (gtk_widget_destroyed),
8079 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8082 /* don't show target window by default, we want to allow testing
8083 * of behavior on first show.
8086 if (!gtk_widget_get_visible (window))
8087 gtk_widget_show (window);
8089 gtk_widget_destroy (window);
8096 typedef struct _ProgressData {
8099 GtkWidget *block_spin;
8100 GtkWidget *x_align_spin;
8101 GtkWidget *y_align_spin;
8102 GtkWidget *step_spin;
8103 GtkWidget *act_blocks_spin;
8114 progress_timeout (gpointer data)
8116 ProgressData *pdata = data;
8120 if (pdata->activity)
8122 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8124 text = g_strdup_printf ("%s", "???");
8128 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8131 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8133 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8136 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8143 destroy_progress (GtkWidget *widget,
8144 ProgressData **pdata)
8146 if ((*pdata)->timer)
8148 g_source_remove ((*pdata)->timer);
8149 (*pdata)->timer = 0;
8151 (*pdata)->window = NULL;
8157 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8159 ProgressData *pdata;
8162 pdata = (ProgressData *) data;
8164 if (!gtk_widget_get_mapped (widget))
8167 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8169 if (i == 0 || i == 1)
8170 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8172 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8174 if (i == 1 || i == 2)
8175 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8177 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8181 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8185 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8186 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8190 progressbar_toggle_ellipsize (GtkWidget *widget,
8193 ProgressData *pdata = data;
8194 if (gtk_widget_is_drawable (widget))
8196 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8197 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8202 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8204 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8208 toggle_running (GtkWidget *widget, ProgressData *pdata)
8210 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
8212 if (pdata->timer == 0)
8213 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8217 if (pdata->timer != 0)
8219 g_source_remove (pdata->timer);
8226 entry_changed (GtkWidget *widget, ProgressData *pdata)
8228 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8229 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8233 create_progress_bar (GtkWidget *widget)
8235 GtkWidget *action_area, *content_area;
8245 static ProgressData *pdata = NULL;
8247 static gchar *items1[] =
8255 static char *ellipsize_items[] = {
8256 "None", // PANGO_ELLIPSIZE_NONE,
8257 "Start", // PANGO_ELLIPSIZE_START,
8258 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8259 "End", // PANGO_ELLIPSIZE_END
8263 pdata = g_new0 (ProgressData, 1);
8267 pdata->window = gtk_dialog_new ();
8269 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8270 gtk_widget_get_screen (widget));
8272 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8274 g_signal_connect (pdata->window, "destroy",
8275 G_CALLBACK (destroy_progress),
8279 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8280 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8282 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8283 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8285 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8286 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8287 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8289 frame = gtk_frame_new ("Progress");
8290 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8292 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8293 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8295 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8296 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8298 pdata->pbar = gtk_progress_bar_new ();
8299 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8300 PANGO_ELLIPSIZE_MIDDLE);
8302 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8304 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8305 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8307 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8308 gtk_container_add (GTK_CONTAINER (align), hbox);
8309 label = gtk_label_new ("Label updated by user :");
8310 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8311 pdata->label = gtk_label_new ("");
8312 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8314 frame = gtk_frame_new ("Options");
8315 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8317 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8318 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8320 grid = gtk_grid_new ();
8321 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
8322 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
8323 gtk_box_pack_start (GTK_BOX (vbox2), grid, FALSE, TRUE, 0);
8325 label = gtk_label_new ("Orientation :");
8326 gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
8327 gtk_widget_set_halign (label, GTK_ALIGN_START);
8328 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8330 pdata->omenu1 = build_option_menu (items1, 4, 0,
8331 progressbar_toggle_orientation,
8333 gtk_grid_attach (GTK_GRID (grid), pdata->omenu1, 1, 0, 1, 1);
8335 check = gtk_check_button_new_with_label ("Running");
8336 g_signal_connect (check, "toggled",
8337 G_CALLBACK (toggle_running),
8339 gtk_grid_attach (GTK_GRID (grid), check, 0, 1, 2, 1);
8340 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8342 check = gtk_check_button_new_with_label ("Show text");
8343 g_signal_connect (check, "clicked",
8344 G_CALLBACK (toggle_show_text),
8346 gtk_grid_attach (GTK_GRID (grid), check, 0, 2, 1, 1);
8348 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8349 gtk_grid_attach (GTK_GRID (grid), hbox, 1, 2, 1, 1);
8351 label = gtk_label_new ("Text: ");
8352 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8354 pdata->entry = gtk_entry_new ();
8355 gtk_widget_set_hexpand (pdata->entry, TRUE);
8356 g_signal_connect (pdata->entry, "changed",
8357 G_CALLBACK (entry_changed),
8359 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8360 gtk_widget_set_size_request (pdata->entry, 100, -1);
8362 label = gtk_label_new ("Ellipsize text :");
8363 gtk_grid_attach (GTK_GRID (grid), label, 0, 10, 1, 1);
8365 gtk_widget_set_halign (label, GTK_ALIGN_START);
8366 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8367 pdata->elmenu = build_option_menu (ellipsize_items,
8368 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8369 2, // PANGO_ELLIPSIZE_MIDDLE
8370 progressbar_toggle_ellipsize,
8372 gtk_grid_attach (GTK_GRID (grid), pdata->elmenu, 1, 10, 1, 1);
8374 check = gtk_check_button_new_with_label ("Activity mode");
8375 g_signal_connect (check, "clicked",
8376 G_CALLBACK (toggle_activity_mode), pdata);
8377 gtk_grid_attach (GTK_GRID (grid), check, 0, 15, 1, 1);
8379 button = gtk_button_new_with_label ("close");
8380 g_signal_connect_swapped (button, "clicked",
8381 G_CALLBACK (gtk_widget_destroy),
8383 gtk_widget_set_can_default (button, TRUE);
8384 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8385 gtk_widget_grab_default (button);
8388 if (!gtk_widget_get_visible (pdata->window))
8389 gtk_widget_show_all (pdata->window);
8391 gtk_widget_destroy (pdata->window);
8403 GtkWidget *res_widget;
8407 find_widget (GtkWidget *widget, FindWidgetData *data)
8409 GtkAllocation new_allocation;
8413 gtk_widget_get_allocation (widget, &new_allocation);
8415 if (data->found || !gtk_widget_get_mapped (widget))
8418 /* Note that in the following code, we only count the
8419 * position as being inside a WINDOW widget if it is inside
8420 * widget->window; points that are outside of widget->window
8421 * but within the allocation are not counted. This is consistent
8422 * with the way we highlight drag targets.
8424 if (gtk_widget_get_has_window (widget))
8426 new_allocation.x = 0;
8427 new_allocation.y = 0;
8430 if (gtk_widget_get_parent (widget) && !data->first)
8432 GdkWindow *window = gtk_widget_get_window (widget);
8433 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8435 gint tx, ty, twidth, theight;
8437 twidth = gdk_window_get_width (window);
8438 theight = gdk_window_get_height (window);
8440 if (new_allocation.x < 0)
8442 new_allocation.width += new_allocation.x;
8443 new_allocation.x = 0;
8445 if (new_allocation.y < 0)
8447 new_allocation.height += new_allocation.y;
8448 new_allocation.y = 0;
8450 if (new_allocation.x + new_allocation.width > twidth)
8451 new_allocation.width = twidth - new_allocation.x;
8452 if (new_allocation.y + new_allocation.height > theight)
8453 new_allocation.height = theight - new_allocation.y;
8455 gdk_window_get_position (window, &tx, &ty);
8456 new_allocation.x += tx;
8458 new_allocation.y += ty;
8461 window = gdk_window_get_parent (window);
8465 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8466 (data->x < new_allocation.x + new_allocation.width) &&
8467 (data->y < new_allocation.y + new_allocation.height))
8469 /* First, check if the drag is in a valid drop site in
8470 * one of our children
8472 if (GTK_IS_CONTAINER (widget))
8474 FindWidgetData new_data = *data;
8476 new_data.x -= x_offset;
8477 new_data.y -= y_offset;
8478 new_data.found = FALSE;
8479 new_data.first = FALSE;
8481 gtk_container_forall (GTK_CONTAINER (widget),
8482 (GtkCallback)find_widget,
8485 data->found = new_data.found;
8487 data->res_widget = new_data.res_widget;
8490 /* If not, and this widget is registered as a drop site, check to
8491 * emit "drag_motion" to check if we are actually in
8497 data->res_widget = widget;
8503 find_widget_at_pointer (GdkDevice *device)
8505 GtkWidget *widget = NULL;
8506 GdkWindow *pointer_window;
8508 FindWidgetData data;
8510 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8514 gpointer widget_ptr;
8516 gdk_window_get_user_data (pointer_window, &widget_ptr);
8517 widget = widget_ptr;
8522 gdk_window_get_pointer (gtk_widget_get_window (widget),
8530 find_widget (widget, &data);
8532 return data.res_widget;
8538 struct PropertiesData {
8546 destroy_properties (GtkWidget *widget,
8547 struct PropertiesData *data)
8551 *data->window = NULL;
8552 data->window = NULL;
8557 g_object_unref (data->cursor);
8558 data->cursor = NULL;
8563 g_signal_handler_disconnect (widget, data->handler);
8571 property_query_event (GtkWidget *widget,
8573 struct PropertiesData *data)
8575 GtkWidget *res_widget = NULL;
8577 if (!data->in_query)
8580 if (event->type == GDK_BUTTON_RELEASE)
8582 gtk_grab_remove (widget);
8583 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8585 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8588 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8589 gtk_widget_get_screen (widget));
8590 create_prop_editor (G_OBJECT (res_widget), 0);
8593 data->in_query = FALSE;
8600 query_properties (GtkButton *button,
8601 struct PropertiesData *data)
8603 GtkWidget *widget = GTK_WIDGET (button);
8604 GdkDisplay *display;
8605 GdkDeviceManager *device_manager;
8608 g_signal_connect (button, "event",
8609 G_CALLBACK (property_query_event), data);
8611 display = gtk_widget_get_display (widget);
8614 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8616 device_manager = gdk_display_get_device_manager (display);
8617 device = gdk_device_manager_get_client_pointer (device_manager);
8618 gdk_device_grab (device,
8619 gtk_widget_get_window (widget),
8622 GDK_BUTTON_RELEASE_MASK,
8625 gtk_grab_add (widget);
8627 data->in_query = TRUE;
8631 create_properties (GtkWidget *widget)
8633 static GtkWidget *window = NULL;
8637 struct PropertiesData *data;
8639 data = g_new (struct PropertiesData, 1);
8640 data->window = &window;
8641 data->in_query = FALSE;
8642 data->cursor = NULL;
8647 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8649 gtk_window_set_screen (GTK_WINDOW (window),
8650 gtk_widget_get_screen (widget));
8652 data->handler = g_signal_connect (window, "destroy",
8653 G_CALLBACK (destroy_properties),
8656 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8657 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8659 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8660 gtk_container_add (GTK_CONTAINER (window), vbox);
8662 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8663 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8665 button = gtk_button_new_with_label ("Query properties");
8666 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8667 g_signal_connect (button, "clicked",
8668 G_CALLBACK (query_properties),
8672 if (!gtk_widget_get_visible (window))
8673 gtk_widget_show_all (window);
8675 gtk_widget_destroy (window);
8679 struct SnapshotData {
8680 GtkWidget *toplevel_button;
8684 gboolean is_toplevel;
8689 destroy_snapshot_data (GtkWidget *widget,
8690 struct SnapshotData *data)
8693 *data->window = NULL;
8697 g_object_unref (data->cursor);
8698 data->cursor = NULL;
8703 g_signal_handler_disconnect (widget, data->handler);
8711 snapshot_widget_event (GtkWidget *widget,
8713 struct SnapshotData *data)
8715 GtkWidget *res_widget = NULL;
8717 if (!data->in_query)
8720 if (event->type == GDK_BUTTON_RELEASE)
8722 gtk_grab_remove (widget);
8723 gdk_device_ungrab (gdk_event_get_device (event),
8726 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8727 if (data->is_toplevel && res_widget)
8728 res_widget = gtk_widget_get_toplevel (res_widget);
8731 cairo_surface_t *surface;
8732 GtkWidget *window, *image;
8737 width = gtk_widget_get_allocated_width (res_widget);
8738 height = gtk_widget_get_allocated_height (res_widget);
8740 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8742 cr = cairo_create (surface);
8743 gtk_widget_draw (res_widget, cr);
8746 pixbuf = gdk_pixbuf_get_from_surface (surface,
8749 cairo_surface_destroy (surface);
8751 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8752 image = gtk_image_new_from_pixbuf (pixbuf);
8753 g_object_unref (pixbuf);
8755 gtk_container_add (GTK_CONTAINER (window), image);
8756 gtk_widget_show_all (window);
8759 data->in_query = FALSE;
8766 snapshot_widget (GtkButton *button,
8767 struct SnapshotData *data)
8769 GtkWidget *widget = GTK_WIDGET (button);
8772 device = gtk_get_current_event_device ();
8776 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8777 device = gdk_device_get_associated_device (device);
8779 data->is_toplevel = widget == data->toplevel_button;
8782 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8785 gdk_device_grab (device,
8786 gtk_widget_get_window (widget),
8787 GDK_OWNERSHIP_APPLICATION,
8789 GDK_BUTTON_RELEASE_MASK,
8793 g_signal_connect (button, "event",
8794 G_CALLBACK (snapshot_widget_event), data);
8796 gtk_grab_add (widget);
8798 data->in_query = TRUE;
8802 create_snapshot (GtkWidget *widget)
8804 static GtkWidget *window = NULL;
8807 struct SnapshotData *data;
8809 data = g_new (struct SnapshotData, 1);
8810 data->window = &window;
8811 data->in_query = FALSE;
8812 data->cursor = NULL;
8817 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8819 gtk_window_set_screen (GTK_WINDOW (window),
8820 gtk_widget_get_screen (widget));
8822 data->handler = g_signal_connect (window, "destroy",
8823 G_CALLBACK (destroy_snapshot_data),
8826 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8827 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8829 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8830 gtk_container_add (GTK_CONTAINER (window), vbox);
8832 button = gtk_button_new_with_label ("Snapshot widget");
8833 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8834 g_signal_connect (button, "clicked",
8835 G_CALLBACK (snapshot_widget),
8838 button = gtk_button_new_with_label ("Snapshot toplevel");
8839 data->toplevel_button = button;
8840 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8841 g_signal_connect (button, "clicked",
8842 G_CALLBACK (snapshot_widget),
8846 if (!gtk_widget_get_visible (window))
8847 gtk_widget_show_all (window);
8849 gtk_widget_destroy (window);
8858 selection_test_received (GtkWidget *tree_view,
8859 GtkSelectionData *selection_data)
8861 GtkTreeModel *model;
8862 GtkListStore *store;
8866 if (gtk_selection_data_get_length (selection_data) < 0)
8868 g_print ("Selection retrieval failed\n");
8871 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8873 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8877 /* Clear out any current list items */
8879 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8880 store = GTK_LIST_STORE (model);
8881 gtk_list_store_clear (store);
8883 /* Add new items to list */
8885 gtk_selection_data_get_targets (selection_data,
8888 for (i = 0; i < l; i++)
8893 name = gdk_atom_name (atoms[i]);
8896 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
8900 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
8907 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
8909 static GdkAtom targets_atom = GDK_NONE;
8911 if (targets_atom == GDK_NONE)
8912 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
8914 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
8919 create_selection_test (GtkWidget *widget)
8921 static GtkWidget *window = NULL;
8922 GtkWidget *action_area, *content_area;
8925 GtkWidget *scrolled_win;
8926 GtkListStore* store;
8927 GtkWidget *tree_view;
8928 GtkTreeViewColumn *column;
8929 GtkCellRenderer *renderer;
8934 window = gtk_dialog_new ();
8936 gtk_window_set_screen (GTK_WINDOW (window),
8937 gtk_widget_get_screen (widget));
8939 g_signal_connect (window, "destroy",
8940 G_CALLBACK (gtk_widget_destroyed),
8943 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8944 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
8946 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
8947 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8949 /* Create the list */
8951 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8952 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8953 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
8955 label = gtk_label_new ("Gets available targets for current selection");
8956 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8958 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
8959 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
8960 GTK_POLICY_AUTOMATIC,
8961 GTK_POLICY_AUTOMATIC);
8962 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
8963 gtk_widget_set_size_request (scrolled_win, 100, 200);
8965 store = gtk_list_store_new (1, G_TYPE_STRING);
8966 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
8967 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
8969 renderer = gtk_cell_renderer_text_new ();
8970 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
8972 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
8974 g_signal_connect (tree_view, "selection_received",
8975 G_CALLBACK (selection_test_received), NULL);
8977 /* .. And create some buttons */
8978 button = gtk_button_new_with_label ("Get Targets");
8979 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8981 g_signal_connect (button, "clicked",
8982 G_CALLBACK (selection_test_get_targets), tree_view);
8984 button = gtk_button_new_with_label ("Quit");
8985 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8987 g_signal_connect_swapped (button, "clicked",
8988 G_CALLBACK (gtk_widget_destroy),
8992 if (!gtk_widget_get_visible (window))
8993 gtk_widget_show_all (window);
8995 gtk_widget_destroy (window);
9002 static int scroll_test_pos = 0.0;
9005 scroll_test_draw (GtkWidget *widget,
9007 GtkAdjustment *adjustment)
9010 gint imin, imax, jmin, jmax;
9013 gdk_cairo_get_clip_rectangle (cr, &clip);
9015 imin = (clip.x) / 10;
9016 imax = (clip.x + clip.width + 9) / 10;
9018 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
9019 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
9021 for (i=imin; i<imax; i++)
9022 for (j=jmin; j<jmax; j++)
9024 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
9032 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9033 GtkAdjustment *adjustment)
9035 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
9036 -gtk_adjustment_get_page_increment (adjustment) / 2:
9037 gtk_adjustment_get_page_increment (adjustment) / 2);
9038 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
9039 gtk_adjustment_set_value (adjustment, new_value);
9045 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9046 GtkAdjustment *adjustment)
9048 GtkAllocation allocation;
9050 gtk_widget_get_allocation (widget, &allocation);
9051 gtk_adjustment_configure (adjustment,
9052 gtk_adjustment_get_value (adjustment),
9053 gtk_adjustment_get_lower (adjustment),
9054 gtk_adjustment_get_upper (adjustment),
9055 0.1 * allocation.height,
9056 0.9 * allocation.height,
9061 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
9066 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
9067 scroll_test_pos = gtk_adjustment_get_value (adjustment);
9069 if (!gtk_widget_is_drawable (widget))
9072 window = gtk_widget_get_window (widget);
9073 gdk_window_scroll (window, 0, dy);
9074 gdk_window_process_updates (window, FALSE);
9079 create_scroll_test (GtkWidget *widget)
9081 static GtkWidget *window = NULL;
9082 GtkWidget *action_area, *content_area;
9084 GtkWidget *drawing_area;
9085 GtkWidget *scrollbar;
9087 GtkAdjustment *adjustment;
9088 GdkGeometry geometry;
9089 GdkWindowHints geometry_mask;
9093 window = gtk_dialog_new ();
9095 gtk_window_set_screen (GTK_WINDOW (window),
9096 gtk_widget_get_screen (widget));
9098 g_signal_connect (window, "destroy",
9099 G_CALLBACK (gtk_widget_destroyed),
9102 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9103 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9105 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9106 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9108 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9109 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9110 gtk_widget_show (hbox);
9112 drawing_area = gtk_drawing_area_new ();
9113 gtk_widget_set_size_request (drawing_area, 200, 200);
9114 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9115 gtk_widget_show (drawing_area);
9117 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9119 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9120 scroll_test_pos = 0.0;
9122 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
9123 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9124 gtk_widget_show (scrollbar);
9126 g_signal_connect (drawing_area, "draw",
9127 G_CALLBACK (scroll_test_draw), adjustment);
9128 g_signal_connect (drawing_area, "configure_event",
9129 G_CALLBACK (scroll_test_configure), adjustment);
9130 g_signal_connect (drawing_area, "scroll_event",
9131 G_CALLBACK (scroll_test_scroll), adjustment);
9133 g_signal_connect (adjustment, "value_changed",
9134 G_CALLBACK (scroll_test_adjustment_changed),
9137 /* .. And create some buttons */
9139 button = gtk_button_new_with_label ("Quit");
9140 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9142 g_signal_connect_swapped (button, "clicked",
9143 G_CALLBACK (gtk_widget_destroy),
9145 gtk_widget_show (button);
9147 /* Set up gridded geometry */
9149 geometry_mask = GDK_HINT_MIN_SIZE |
9150 GDK_HINT_BASE_SIZE |
9151 GDK_HINT_RESIZE_INC;
9153 geometry.min_width = 20;
9154 geometry.min_height = 20;
9155 geometry.base_width = 0;
9156 geometry.base_height = 0;
9157 geometry.width_inc = 10;
9158 geometry.height_inc = 10;
9160 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9161 drawing_area, &geometry, geometry_mask);
9164 if (!gtk_widget_get_visible (window))
9165 gtk_widget_show (window);
9167 gtk_widget_destroy (window);
9174 static int timer = 0;
9177 timeout_test (GtkWidget *label)
9179 static int count = 0;
9180 static char buffer[32];
9182 sprintf (buffer, "count: %d", ++count);
9183 gtk_label_set_text (GTK_LABEL (label), buffer);
9189 start_timeout_test (GtkWidget *widget,
9194 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9199 stop_timeout_test (GtkWidget *widget,
9204 g_source_remove (timer);
9210 destroy_timeout_test (GtkWidget *widget,
9213 stop_timeout_test (NULL, NULL);
9219 create_timeout_test (GtkWidget *widget)
9221 static GtkWidget *window = NULL;
9222 GtkWidget *action_area, *content_area;
9228 window = gtk_dialog_new ();
9230 gtk_window_set_screen (GTK_WINDOW (window),
9231 gtk_widget_get_screen (widget));
9233 g_signal_connect (window, "destroy",
9234 G_CALLBACK (destroy_timeout_test),
9237 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9238 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9240 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9241 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9243 label = gtk_label_new ("count: 0");
9244 g_object_set (label, "margin", 10, NULL);
9245 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9246 gtk_widget_show (label);
9248 button = gtk_button_new_with_label ("close");
9249 g_signal_connect_swapped (button, "clicked",
9250 G_CALLBACK (gtk_widget_destroy),
9252 gtk_widget_set_can_default (button, TRUE);
9253 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9254 gtk_widget_grab_default (button);
9255 gtk_widget_show (button);
9257 button = gtk_button_new_with_label ("start");
9258 g_signal_connect (button, "clicked",
9259 G_CALLBACK(start_timeout_test),
9261 gtk_widget_set_can_default (button, TRUE);
9262 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9263 gtk_widget_show (button);
9265 button = gtk_button_new_with_label ("stop");
9266 g_signal_connect (button, "clicked",
9267 G_CALLBACK (stop_timeout_test),
9269 gtk_widget_set_can_default (button, TRUE);
9270 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9271 gtk_widget_show (button);
9274 if (!gtk_widget_get_visible (window))
9275 gtk_widget_show (window);
9277 gtk_widget_destroy (window);
9284 static int idle_id = 0;
9287 idle_test (GtkWidget *label)
9289 static int count = 0;
9290 static char buffer[32];
9292 sprintf (buffer, "count: %d", ++count);
9293 gtk_label_set_text (GTK_LABEL (label), buffer);
9299 start_idle_test (GtkWidget *widget,
9304 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9309 stop_idle_test (GtkWidget *widget,
9314 g_source_remove (idle_id);
9320 destroy_idle_test (GtkWidget *widget,
9323 stop_idle_test (NULL, NULL);
9329 toggle_idle_container (GObject *button,
9330 GtkContainer *container)
9332 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9336 create_idle_test (GtkWidget *widget)
9338 static GtkWidget *window = NULL;
9341 GtkWidget *container;
9345 GtkWidget *action_area, *content_area;
9350 window = gtk_dialog_new ();
9352 gtk_window_set_screen (GTK_WINDOW (window),
9353 gtk_widget_get_screen (widget));
9355 g_signal_connect (window, "destroy",
9356 G_CALLBACK (destroy_idle_test),
9359 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9360 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9362 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9363 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9365 label = gtk_label_new ("count: 0");
9366 g_object_set (label, "margin", 10, NULL);
9367 gtk_widget_show (label);
9370 g_object_new (GTK_TYPE_BOX,
9372 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9373 * "GtkWidget::visible", TRUE,
9378 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9381 g_object_new (GTK_TYPE_FRAME,
9383 "label", "Label Container",
9385 "parent", content_area,
9388 g_object_new (GTK_TYPE_BOX,
9391 "orientation", GTK_ORIENTATION_VERTICAL,
9394 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9395 "label", "Resize-Parent",
9396 "user_data", (void*)GTK_RESIZE_PARENT,
9400 "signal::clicked", toggle_idle_container, container,
9402 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9403 "label", "Resize-Queue",
9404 "user_data", (void*)GTK_RESIZE_QUEUE,
9409 g_object_connect (button,
9410 "signal::clicked", toggle_idle_container, container,
9412 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9413 "label", "Resize-Immediate",
9414 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9416 g_object_connect (button2,
9417 "signal::clicked", toggle_idle_container, container,
9419 g_object_set (button2,
9425 button = gtk_button_new_with_label ("close");
9426 g_signal_connect_swapped (button, "clicked",
9427 G_CALLBACK (gtk_widget_destroy),
9429 gtk_widget_set_can_default (button, TRUE);
9430 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9431 gtk_widget_grab_default (button);
9432 gtk_widget_show (button);
9434 button = gtk_button_new_with_label ("start");
9435 g_signal_connect (button, "clicked",
9436 G_CALLBACK (start_idle_test),
9438 gtk_widget_set_can_default (button, TRUE);
9439 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9440 gtk_widget_show (button);
9442 button = gtk_button_new_with_label ("stop");
9443 g_signal_connect (button, "clicked",
9444 G_CALLBACK (stop_idle_test),
9446 gtk_widget_set_can_default (button, TRUE);
9447 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9448 gtk_widget_show (button);
9451 if (!gtk_widget_get_visible (window))
9452 gtk_widget_show (window);
9454 gtk_widget_destroy (window);
9462 create_rc_file (GtkWidget *widget)
9464 static GtkWidget *window = NULL;
9465 GtkWidget *action_area, *content_area;
9473 window = gtk_dialog_new ();
9475 gtk_window_set_screen (GTK_WINDOW (window),
9476 gtk_widget_get_screen (widget));
9478 g_signal_connect (window, "destroy",
9479 G_CALLBACK (gtk_widget_destroyed),
9482 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9483 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9485 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9486 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9488 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9489 gtk_container_add (GTK_CONTAINER (frame), vbox);
9491 label = gtk_label_new ("This label should be red");
9492 gtk_widget_set_name (label, "testgtk-red-label");
9493 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9495 label = gtk_label_new ("This label should be green");
9496 gtk_widget_set_name (label, "testgtk-green-label");
9497 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9499 label = gtk_label_new ("This label should be blue");
9500 gtk_widget_set_name (label, "testgtk-blue-label");
9501 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9503 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9504 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9506 button = gtk_button_new_with_label ("Reload");
9507 g_signal_connect_swapped (button, "clicked",
9508 G_CALLBACK (gtk_style_context_reset_widgets),
9509 gtk_widget_get_screen (button));
9510 gtk_widget_set_can_default (button, TRUE);
9511 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9512 gtk_widget_grab_default (button);
9514 button = gtk_button_new_with_label ("Close");
9515 g_signal_connect_swapped (button, "clicked",
9516 G_CALLBACK (gtk_widget_destroy),
9518 gtk_widget_set_can_default (button, TRUE);
9519 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9522 if (!gtk_widget_get_visible (window))
9523 gtk_widget_show_all (window);
9525 gtk_widget_destroy (window);
9529 * Test of recursive mainloop
9533 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9540 create_mainloop (GtkWidget *widget)
9542 static GtkWidget *window = NULL;
9543 GtkWidget *action_area, *content_area;
9549 window = gtk_dialog_new ();
9551 gtk_window_set_screen (GTK_WINDOW (window),
9552 gtk_widget_get_screen (widget));
9554 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9556 g_signal_connect (window, "destroy",
9557 G_CALLBACK (mainloop_destroyed),
9560 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9561 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9563 label = gtk_label_new ("In recursive main loop...");
9564 g_object_set (label, "margin", 20, NULL);
9566 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9567 gtk_widget_show (label);
9569 button = gtk_button_new_with_label ("Leave");
9570 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9572 g_signal_connect_swapped (button, "clicked",
9573 G_CALLBACK (gtk_widget_destroy),
9576 gtk_widget_set_can_default (button, TRUE);
9577 gtk_widget_grab_default (button);
9579 gtk_widget_show (button);
9582 if (!gtk_widget_get_visible (window))
9584 gtk_widget_show (window);
9586 g_print ("create_mainloop: start\n");
9588 g_print ("create_mainloop: done\n");
9591 gtk_widget_destroy (window);
9595 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9598 GdkWindow *bin_window;
9601 gint imin, imax, jmin, jmax;
9603 layout = GTK_LAYOUT (widget);
9604 bin_window = gtk_layout_get_bin_window (layout);
9606 if (!gtk_cairo_should_draw_window (cr, bin_window))
9609 gdk_window_get_position (bin_window, &x, &y);
9610 cairo_translate (cr, x, y);
9612 gdk_cairo_get_clip_rectangle (cr, &clip);
9614 imin = (clip.x) / 10;
9615 imax = (clip.x + clip.width + 9) / 10;
9617 jmin = (clip.y) / 10;
9618 jmax = (clip.y + clip.height + 9) / 10;
9620 for (i=imin; i<imax; i++)
9621 for (j=jmin; j<jmax; j++)
9623 cairo_rectangle (cr,
9632 void create_layout (GtkWidget *widget)
9634 GtkAdjustment *hadjustment, *vadjustment;
9636 static GtkWidget *window = NULL;
9637 GtkWidget *layout_widget;
9638 GtkWidget *scrolledwindow;
9647 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9648 gtk_window_set_screen (GTK_WINDOW (window),
9649 gtk_widget_get_screen (widget));
9651 g_signal_connect (window, "destroy",
9652 G_CALLBACK (gtk_widget_destroyed),
9655 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9656 gtk_widget_set_size_request (window, 200, 200);
9658 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9659 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9661 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9662 GTK_CORNER_TOP_RIGHT);
9664 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9666 layout_widget = gtk_layout_new (NULL, NULL);
9667 layout = GTK_LAYOUT (layout_widget);
9668 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9670 /* We set step sizes here since GtkLayout does not set
9673 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9674 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9675 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9676 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9677 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9678 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9680 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9681 g_signal_connect (layout, "draw",
9682 G_CALLBACK (layout_draw_handler), NULL);
9684 gtk_layout_set_size (layout, 1600, 128000);
9686 for (i=0 ; i < 16 ; i++)
9687 for (j=0 ; j < 16 ; j++)
9689 sprintf(buf, "Button %d, %d", i, j);
9691 button = gtk_button_new_with_label (buf);
9693 button = gtk_label_new (buf);
9695 gtk_layout_put (layout, button, j*100, i*100);
9698 for (i=16; i < 1280; i++)
9700 sprintf(buf, "Button %d, %d", i, 0);
9702 button = gtk_button_new_with_label (buf);
9704 button = gtk_label_new (buf);
9706 gtk_layout_put (layout, button, 0, i*100);
9710 if (!gtk_widget_get_visible (window))
9711 gtk_widget_show_all (window);
9713 gtk_widget_destroy (window);
9717 /* FIXME: need to completely redo this for GtkStyleContext */
9719 create_styles (GtkWidget *widget)
9721 static GtkWidget *window = NULL;
9722 GtkWidget *content_area, *action_area;
9727 static GdkRGBA red = { 1,0,0,1 };
9728 static GdkRGBA green = { 0,1,0,1 };
9729 static GdkRGBA blue = { 0,0,1,1 };
9730 static GdkRGBA yellow = { 1,1,0,1 };
9731 static GdkRGBA cyan = { 0,1,1,1 };
9732 PangoFontDescription *font_desc;
9734 GtkRcStyle *rc_style;
9738 window = gtk_dialog_new ();
9739 gtk_window_set_screen (GTK_WINDOW (window),
9740 gtk_widget_get_screen (widget));
9742 g_signal_connect (window, "destroy",
9743 G_CALLBACK (gtk_widget_destroyed),
9746 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9747 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9749 button = gtk_button_new_with_label ("Close");
9750 g_signal_connect_swapped (button, "clicked",
9751 G_CALLBACK (gtk_widget_destroy),
9753 gtk_widget_set_can_default (button, TRUE);
9754 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9755 gtk_widget_show (button);
9757 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9758 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9759 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9761 label = gtk_label_new ("Font:");
9762 gtk_widget_set_halign (label, GTK_ALIGN_START);
9763 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9764 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9766 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9768 button = gtk_button_new_with_label ("Some Text");
9769 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9770 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9772 label = gtk_label_new ("Foreground:");
9773 gtk_widget_set_halign (label, GTK_ALIGN_START);
9774 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9775 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9777 button = gtk_button_new_with_label ("Some Text");
9778 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9779 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9781 label = gtk_label_new ("Background:");
9782 gtk_widget_set_halign (label, GTK_ALIGN_START);
9783 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9784 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9786 button = gtk_button_new_with_label ("Some Text");
9787 gtk_widget_override_background_color (button, 0, &green);
9788 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9790 label = gtk_label_new ("Text:");
9791 gtk_widget_set_halign (label, GTK_ALIGN_START);
9792 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9793 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9795 entry = gtk_entry_new ();
9796 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9797 gtk_widget_override_color (entry, 0, &blue);
9798 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9800 label = gtk_label_new ("Base:");
9801 gtk_widget_set_halign (label, GTK_ALIGN_START);
9802 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9803 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9805 entry = gtk_entry_new ();
9806 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9807 gtk_widget_override_background_color (entry, 0, &yellow);
9808 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9810 label = gtk_label_new ("Cursor:");
9811 gtk_widget_set_halign (label, GTK_ALIGN_START);
9812 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9813 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9815 entry = gtk_entry_new ();
9816 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9817 gtk_widget_modify_cursor (entry, &red, &red);
9818 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9820 label = gtk_label_new ("Multiple:");
9821 gtk_widget_set_halign (label, GTK_ALIGN_START);
9822 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9823 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9825 button = gtk_button_new_with_label ("Some Text");
9827 rc_style = gtk_rc_style_new ();
9829 rc_style->font_desc = pango_font_description_copy (font_desc);
9830 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9831 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9832 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9833 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9834 rc_style->bg[GTK_STATE_NORMAL] = blue;
9835 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9836 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9837 rc_style->fg[GTK_STATE_ACTIVE] = red;
9838 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9839 rc_style->xthickness = 5;
9840 rc_style->ythickness = 5;
9842 gtk_widget_modify_style (button, rc_style);
9843 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9845 g_object_unref (rc_style);
9847 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9850 if (!gtk_widget_get_visible (window))
9851 gtk_widget_show_all (window);
9853 gtk_widget_destroy (window);
9858 * Main Window and Exit
9862 do_exit (GtkWidget *widget, GtkWidget *window)
9864 gtk_widget_destroy (window);
9870 void (*func) (GtkWidget *widget);
9871 gboolean do_not_benchmark;
9874 { "alpha window", create_alpha_window },
9875 { "big windows", create_big_windows },
9876 { "button box", create_button_box },
9877 { "buttons", create_buttons },
9878 { "check buttons", create_check_buttons },
9879 { "color selection", create_color_selection },
9880 { "composited window", create_composited_window },
9881 { "cursors", create_cursors },
9882 { "dialog", create_dialog },
9883 { "display & screen", create_display_screen, TRUE },
9884 { "entry", create_entry },
9885 { "event box", create_event_box },
9886 { "event watcher", create_event_watcher },
9887 { "expander", create_expander },
9888 { "flipping", create_flipping },
9889 { "focus", create_focus },
9890 { "font selection", create_font_selection },
9891 { "handle box", create_handle_box },
9892 { "image", create_image },
9893 { "key lookup", create_key_lookup },
9894 { "labels", create_labels },
9895 { "layout", create_layout },
9896 { "menus", create_menus },
9897 { "message dialog", create_message_dialog },
9898 { "modal window", create_modal_window, TRUE },
9899 { "notebook", create_notebook },
9900 { "panes", create_panes },
9901 { "paned keyboard", create_paned_keyboard_navigation },
9902 { "pixbuf", create_pixbuf },
9903 { "progress bar", create_progress_bar },
9904 { "properties", create_properties },
9905 { "radio buttons", create_radio_buttons },
9906 { "range controls", create_range_controls },
9907 { "rc file", create_rc_file },
9908 { "reparent", create_reparent },
9909 { "resize grips", create_resize_grips },
9910 { "rotated label", create_rotated_label },
9911 { "rotated text", create_rotated_text },
9912 { "saved position", create_saved_position },
9913 { "scrolled windows", create_scrolled_windows },
9914 { "shapes", create_shapes },
9915 { "size groups", create_size_groups },
9916 { "snapshot", create_snapshot },
9917 { "spinbutton", create_spins },
9918 { "statusbar", create_statusbar },
9920 { "styles", create_styles },
9922 { "test idle", create_idle_test },
9923 { "test mainloop", create_mainloop, TRUE },
9924 { "test scrolling", create_scroll_test },
9925 { "test selection", create_selection_test },
9926 { "test timeout", create_timeout_test },
9927 { "toggle buttons", create_toggle_buttons },
9928 { "toolbar", create_toolbar },
9929 { "tooltips", create_tooltips },
9930 { "WM hints", create_wmhints },
9931 { "window sizing", create_window_sizing },
9932 { "window states", create_window_states }
9934 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
9937 create_main_window (void)
9942 GtkWidget *scrolled_window;
9946 GtkWidget *separator;
9947 GdkGeometry geometry;
9950 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9951 gtk_widget_set_name (window, "main_window");
9952 gtk_window_move (GTK_WINDOW (window), 50, 20);
9953 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
9955 geometry.min_width = -1;
9956 geometry.min_height = -1;
9957 geometry.max_width = -1;
9958 geometry.max_height = G_MAXSHORT;
9959 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
9961 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
9963 g_signal_connect (window, "destroy",
9964 G_CALLBACK (gtk_main_quit),
9966 g_signal_connect (window, "delete-event",
9967 G_CALLBACK (gtk_false),
9970 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9971 gtk_container_add (GTK_CONTAINER (window), box1);
9973 if (gtk_micro_version > 0)
9976 gtk_get_major_version (),
9977 gtk_get_minor_version (),
9978 gtk_get_micro_version ());
9982 gtk_get_major_version (),
9983 gtk_get_minor_version ());
9985 label = gtk_label_new (buffer);
9986 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
9987 gtk_widget_set_name (label, "testgtk-version-label");
9989 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
9990 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
9991 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
9993 GTK_POLICY_AUTOMATIC);
9994 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
9996 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9997 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9998 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
9999 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10000 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10001 gtk_widget_show (box2);
10003 for (i = 0; i < nbuttons; i++)
10005 button = gtk_button_new_with_label (buttons[i].label);
10006 if (buttons[i].func)
10007 g_signal_connect (button,
10009 G_CALLBACK(buttons[i].func),
10012 gtk_widget_set_sensitive (button, FALSE);
10013 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10016 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10017 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10019 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10020 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10021 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10023 button = gtk_button_new_with_mnemonic ("_Close");
10024 g_signal_connect (button, "clicked",
10025 G_CALLBACK (do_exit),
10027 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10028 gtk_widget_set_can_default (button, TRUE);
10029 gtk_widget_grab_default (button);
10031 gtk_widget_show_all (window);
10037 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
10038 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10042 pad (const char *str, int to)
10044 static char buf[256];
10045 int len = strlen (str);
10048 for (i = 0; i < to; i++)
10053 memcpy (buf, str, len);
10059 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10061 fn (widget); /* on */
10062 while (g_main_context_iteration (NULL, FALSE));
10063 fn (widget); /* off */
10064 while (g_main_context_iteration (NULL, FALSE));
10068 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10074 static gboolean printed_headers = FALSE;
10076 if (!printed_headers) {
10077 g_print ("Test Iters First Other\n");
10078 g_print ("-------------------- ----- ---------- ----------\n");
10079 printed_headers = TRUE;
10082 g_get_current_time (&tv0);
10083 bench_iteration (widget, fn);
10084 g_get_current_time (&tv1);
10086 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10087 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10089 g_get_current_time (&tv0);
10090 for (n = 0; n < num - 1; n++)
10091 bench_iteration (widget, fn);
10092 g_get_current_time (&tv1);
10093 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10094 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10096 g_print ("%s %5d ", pad (name, 20), num);
10098 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10100 g_print ("%10.1f\n", dt_first);
10104 do_bench (char* what, int num)
10108 void (* fn) (GtkWidget *widget);
10110 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10112 if (g_ascii_strcasecmp (what, "ALL") == 0)
10114 for (i = 0; i < nbuttons; i++)
10116 if (!buttons[i].do_not_benchmark)
10117 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10124 for (i = 0; i < nbuttons; i++)
10126 if (strcmp (buttons[i].label, what) == 0)
10128 fn = buttons[i].func;
10134 g_print ("Can't bench: \"%s\" not found.\n", what);
10136 do_real_bench (widget, fn, buttons[i].label, num);
10143 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10148 main (int argc, char *argv[])
10150 GtkCssProvider *provider, *memory_provider;
10151 GdkDisplay *display;
10153 GtkBindingSet *binding_set;
10155 gboolean done_benchmarks = FALSE;
10157 srand (time (NULL));
10161 g_set_application_name ("GTK+ Test Program");
10163 gtk_init (&argc, &argv);
10165 provider = gtk_css_provider_new ();
10167 /* Check to see if we are being run from the correct
10170 if (file_exists ("testgtk.css"))
10171 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10172 else if (file_exists ("tests/testgtk.css"))
10173 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10175 g_warning ("Couldn't find file \"testgtk.css\".");
10177 display = gdk_display_get_default ();
10178 screen = gdk_display_get_default_screen (display);
10180 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10181 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10182 g_object_unref (provider);
10184 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10193 for (i = 1; i < argc; i++)
10195 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10202 nextarg = strchr (argv[i], '=');
10213 count = strchr (nextarg, ':');
10216 what = g_strndup (nextarg, count - nextarg);
10218 num = atoi (count);
10223 what = g_strdup (nextarg);
10225 do_bench (what, num ? num : 1);
10226 done_benchmarks = TRUE;
10231 if (done_benchmarks)
10236 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10237 gtk_binding_entry_add_signal (binding_set,
10238 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10241 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10243 memory_provider = gtk_css_provider_new ();
10244 gtk_css_provider_load_from_data (memory_provider,
10245 "#testgtk-version-label {\n"
10247 " font: Sans 18;\n"
10250 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10251 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10253 create_main_window ();
10259 while (g_main_context_pending (NULL))
10260 g_main_context_iteration (NULL, FALSE);
10263 while (g_main_context_pending (NULL))
10264 g_main_context_iteration (NULL, FALSE);