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 table = gtk_table_new (2, 2, FALSE);
4247 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4249 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4250 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4251 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4252 gtk_widget_set_size_request (table, 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");
4261 gtk_table_attach (GTK_TABLE (table), main_button,
4263 GTK_EXPAND, GTK_EXPAND,
4265 gtk_size_group_add_widget (master_size_group, main_button);
4266 gtk_size_group_add_widget (hgroup1, main_button);
4267 gtk_size_group_add_widget (vgroup1, main_button);
4268 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4269 SIZE_GROUP_INITIAL_SIZE,
4270 SIZE_GROUP_INITIAL_SIZE);
4272 button = gtk_button_new ();
4273 gtk_table_attach (GTK_TABLE (table), button,
4275 GTK_EXPAND, GTK_EXPAND,
4277 gtk_size_group_add_widget (vgroup1, button);
4278 gtk_size_group_add_widget (vgroup2, button);
4280 button = gtk_button_new ();
4281 gtk_table_attach (GTK_TABLE (table), button,
4283 GTK_EXPAND, GTK_EXPAND,
4285 gtk_size_group_add_widget (hgroup1, button);
4286 gtk_size_group_add_widget (hgroup2, button);
4288 button = gtk_button_new ();
4289 gtk_table_attach (GTK_TABLE (table), button,
4291 GTK_EXPAND, GTK_EXPAND,
4293 gtk_size_group_add_widget (hgroup2, button);
4294 gtk_size_group_add_widget (vgroup2, button);
4296 g_object_unref (hgroup1);
4297 g_object_unref (hgroup2);
4298 g_object_unref (vgroup1);
4299 g_object_unref (vgroup2);
4301 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4302 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4304 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4305 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4306 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4307 g_signal_connect (spin_button, "value_changed",
4308 G_CALLBACK (size_group_hsize_changed), main_button);
4310 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4311 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4312 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4313 g_signal_connect (spin_button, "value_changed",
4314 G_CALLBACK (size_group_vsize_changed), main_button);
4320 create_size_groups (GtkWidget *widget)
4322 static GtkWidget *window1 = NULL;
4323 static GtkWidget *window2 = NULL;
4324 static GtkSizeGroup *master_size_group;
4326 if (!master_size_group)
4327 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4331 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4334 g_signal_connect (window1, "destroy",
4335 G_CALLBACK (gtk_widget_destroyed),
4341 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4344 g_signal_connect (window2, "destroy",
4345 G_CALLBACK (gtk_widget_destroyed),
4349 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4351 gtk_widget_destroy (window1);
4352 gtk_widget_destroy (window2);
4356 if (!gtk_widget_get_visible (window1))
4357 gtk_widget_show_all (window1);
4358 if (!gtk_widget_get_visible (window2))
4359 gtk_widget_show_all (window2);
4367 static GtkWidget *spinner1;
4370 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4372 gtk_spin_button_set_snap_to_ticks (spin,
4373 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4377 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4379 gtk_spin_button_set_numeric (spin,
4380 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4384 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4386 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4387 gtk_spin_button_get_value_as_int (spin));
4391 get_value (GtkWidget *widget, gpointer data)
4395 GtkSpinButton *spin;
4397 spin = GTK_SPIN_BUTTON (spinner1);
4398 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4399 if (GPOINTER_TO_INT (data) == 1)
4400 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4402 sprintf (buf, "%0.*f",
4403 gtk_spin_button_get_digits (spin),
4404 gtk_spin_button_get_value (spin));
4406 gtk_label_set_text (label, buf);
4410 get_spin_value (GtkWidget *widget, gpointer data)
4414 GtkSpinButton *spin;
4416 spin = GTK_SPIN_BUTTON (widget);
4417 label = GTK_LABEL (data);
4419 buffer = g_strdup_printf ("%0.*f",
4420 gtk_spin_button_get_digits (spin),
4421 gtk_spin_button_get_value (spin));
4422 gtk_label_set_text (label, buffer);
4428 spin_button_time_output_func (GtkSpinButton *spin_button)
4430 GtkAdjustment *adjustment;
4431 static gchar buf[6];
4435 adjustment = gtk_spin_button_get_adjustment (spin_button);
4436 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4437 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4438 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4439 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4440 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4445 spin_button_month_input_func (GtkSpinButton *spin_button,
4449 static gchar *month[12] = { "January", "February", "March", "April",
4450 "May", "June", "July", "August",
4451 "September", "October", "November", "December" };
4453 gboolean found = FALSE;
4455 for (i = 1; i <= 12; i++)
4457 tmp1 = g_ascii_strup (month[i - 1], -1);
4458 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4459 if (strstr (tmp1, tmp2) == tmp1)
4469 return GTK_INPUT_ERROR;
4471 *new_val = (gdouble) i;
4476 spin_button_month_output_func (GtkSpinButton *spin_button)
4478 GtkAdjustment *adjustment;
4481 static gchar *month[12] = { "January", "February", "March", "April",
4482 "May", "June", "July", "August", "September",
4483 "October", "November", "December" };
4485 adjustment = gtk_spin_button_get_adjustment (spin_button);
4486 value = gtk_adjustment_get_value (adjustment);
4487 for (i = 1; i <= 12; i++)
4488 if (fabs (value - (double)i) < 1e-5)
4490 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4491 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4497 spin_button_hex_input_func (GtkSpinButton *spin_button,
4504 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4505 res = strtol(buf, &err, 16);
4508 return GTK_INPUT_ERROR;
4514 spin_button_hex_output_func (GtkSpinButton *spin_button)
4516 GtkAdjustment *adjustment;
4517 static gchar buf[7];
4520 adjustment = gtk_spin_button_get_adjustment (spin_button);
4521 val = (gint) gtk_adjustment_get_value (adjustment);
4522 if (fabs (val) < 1e-5)
4523 sprintf (buf, "0x00");
4525 sprintf (buf, "0x%.2X", val);
4526 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4527 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4532 create_spins (GtkWidget *widget)
4534 static GtkWidget *window = NULL;
4537 GtkWidget *main_vbox;
4540 GtkWidget *spinner2;
4544 GtkWidget *val_label;
4545 GtkAdjustment *adjustment;
4549 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4550 gtk_window_set_screen (GTK_WINDOW (window),
4551 gtk_widget_get_screen (widget));
4553 g_signal_connect (window, "destroy",
4554 G_CALLBACK (gtk_widget_destroyed),
4557 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4559 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4560 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4561 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4563 frame = gtk_frame_new ("Not accelerated");
4564 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4566 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4567 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4568 gtk_container_add (GTK_CONTAINER (frame), vbox);
4570 /* Time, month, hex spinners */
4572 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4573 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4575 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4576 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4578 label = gtk_label_new ("Time :");
4579 gtk_widget_set_halign (label, GTK_ALIGN_START);
4580 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4581 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4583 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4584 spinner = gtk_spin_button_new (adjustment, 0, 0);
4585 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4586 g_signal_connect (spinner,
4588 G_CALLBACK (spin_button_time_output_func),
4590 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4591 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4592 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4594 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4595 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4597 label = gtk_label_new ("Month :");
4598 gtk_widget_set_halign (label, GTK_ALIGN_START);
4599 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4600 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4602 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4604 spinner = gtk_spin_button_new (adjustment, 0, 0);
4605 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4606 GTK_UPDATE_IF_VALID);
4607 g_signal_connect (spinner,
4609 G_CALLBACK (spin_button_month_input_func),
4611 g_signal_connect (spinner,
4613 G_CALLBACK (spin_button_month_output_func),
4615 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4616 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4617 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4619 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4620 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4622 label = gtk_label_new ("Hex :");
4623 gtk_widget_set_halign (label, GTK_ALIGN_START);
4624 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4625 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4627 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4628 spinner = gtk_spin_button_new (adjustment, 0, 0);
4629 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4630 g_signal_connect (spinner,
4632 G_CALLBACK (spin_button_hex_input_func),
4634 g_signal_connect (spinner,
4636 G_CALLBACK (spin_button_hex_output_func),
4638 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4639 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4640 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4642 frame = gtk_frame_new ("Accelerated");
4643 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4645 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4646 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4647 gtk_container_add (GTK_CONTAINER (frame), vbox);
4649 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4650 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4652 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4653 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4655 label = gtk_label_new ("Value :");
4656 gtk_widget_set_halign (label, GTK_ALIGN_START);
4657 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4658 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4660 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4662 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4663 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4664 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4666 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4667 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4669 label = gtk_label_new ("Digits :");
4670 gtk_widget_set_halign (label, GTK_ALIGN_START);
4671 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4672 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4674 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4675 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4676 g_signal_connect (adjustment, "value_changed",
4677 G_CALLBACK (change_digits),
4679 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4681 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4682 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4684 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4685 g_signal_connect (button, "clicked",
4686 G_CALLBACK (toggle_snap),
4688 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4689 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4691 button = gtk_check_button_new_with_label ("Numeric only input mode");
4692 g_signal_connect (button, "clicked",
4693 G_CALLBACK (toggle_numeric),
4695 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4696 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4698 val_label = gtk_label_new ("");
4700 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4701 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4703 button = gtk_button_new_with_label ("Value as Int");
4704 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4705 g_signal_connect (button, "clicked",
4706 G_CALLBACK (get_value),
4707 GINT_TO_POINTER (1));
4708 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4710 button = gtk_button_new_with_label ("Value as Float");
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 (2));
4715 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4717 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4718 gtk_label_set_text (GTK_LABEL (val_label), "0");
4720 frame = gtk_frame_new ("Using Convenience Constructor");
4721 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4723 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4724 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4725 gtk_container_add (GTK_CONTAINER (frame), hbox);
4727 val_label = gtk_label_new ("0.0");
4729 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4730 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4731 g_signal_connect (spinner, "value_changed",
4732 G_CALLBACK (get_spin_value), val_label);
4733 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4734 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4736 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4737 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4739 button = gtk_button_new_with_label ("Close");
4740 g_signal_connect_swapped (button, "clicked",
4741 G_CALLBACK (gtk_widget_destroy),
4743 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4746 if (!gtk_widget_get_visible (window))
4747 gtk_widget_show_all (window);
4749 gtk_widget_destroy (window);
4758 cursor_draw (GtkWidget *widget,
4763 GtkStyleContext *context;
4766 width = gtk_widget_get_allocated_width (widget);
4767 height = gtk_widget_get_allocated_height (widget);
4769 cairo_set_source_rgb (cr, 1, 1, 1);
4770 cairo_rectangle (cr, 0, 0, width, height / 2);
4773 cairo_set_source_rgb (cr, 0, 0, 0);
4774 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4777 context = gtk_widget_get_style_context (widget);
4778 gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
4779 gdk_cairo_set_source_rgba (cr, &bg);
4780 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4787 set_cursor (GtkWidget *spinner,
4796 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4799 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4801 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4802 vals = class->values;
4804 while (vals && vals->value != c)
4807 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4809 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4811 g_type_class_unref (class);
4813 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4814 gdk_window_set_cursor (gtk_widget_get_window (widget),
4816 g_object_unref (cursor);
4820 cursor_event (GtkWidget *widget,
4822 GtkSpinButton *spinner)
4824 if ((event->type == GDK_BUTTON_PRESS) &&
4825 ((event->button.button == 1) ||
4826 (event->button.button == 3)))
4828 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4829 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4836 #ifdef GDK_WINDOWING_X11
4837 #include "x11/gdkx.h"
4840 change_cursor_theme (GtkWidget *widget,
4847 children = gtk_container_get_children (GTK_CONTAINER (data));
4849 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4850 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4852 g_list_free (children);
4854 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4861 create_cursors (GtkWidget *widget)
4863 static GtkWidget *window = NULL;
4866 GtkWidget *main_vbox;
4873 GtkAdjustment *adjustment;
4879 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4880 gtk_window_set_screen (GTK_WINDOW (window),
4881 gtk_widget_get_screen (widget));
4883 g_signal_connect (window, "destroy",
4884 G_CALLBACK (gtk_widget_destroyed),
4887 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4889 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4890 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4891 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4894 g_object_new (GTK_TYPE_BOX,
4895 "orientation", GTK_ORIENTATION_VERTICAL,
4896 "GtkBox::homogeneous", FALSE,
4897 "GtkBox::spacing", 5,
4898 "GtkContainer::border_width", 10,
4899 "GtkWidget::parent", main_vbox,
4900 "GtkWidget::visible", TRUE,
4903 #ifdef GDK_WINDOWING_X11
4904 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4905 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4906 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4908 label = gtk_label_new ("Cursor Theme : ");
4909 gtk_widget_set_halign (label, GTK_ALIGN_START);
4910 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4911 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4913 entry = gtk_entry_new ();
4914 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4915 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4917 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4918 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4919 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4921 g_signal_connect (entry, "changed",
4922 G_CALLBACK (change_cursor_theme), hbox);
4923 g_signal_connect (size, "changed",
4924 G_CALLBACK (change_cursor_theme), hbox);
4927 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4928 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4929 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4931 label = gtk_label_new ("Cursor Value : ");
4932 gtk_widget_set_halign (label, GTK_ALIGN_START);
4933 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4934 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4936 adjustment = gtk_adjustment_new (0,
4940 spinner = gtk_spin_button_new (adjustment, 0, 0);
4941 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
4944 g_object_new (gtk_frame_get_type (),
4945 "GtkFrame::label_xalign", 0.5,
4946 "GtkFrame::label", "Cursor Area",
4947 "GtkContainer::border_width", 10,
4948 "GtkWidget::parent", vbox,
4949 "GtkWidget::visible", TRUE,
4952 darea = gtk_drawing_area_new ();
4953 gtk_widget_set_size_request (darea, 80, 80);
4954 gtk_container_add (GTK_CONTAINER (frame), darea);
4955 g_signal_connect (darea,
4957 G_CALLBACK (cursor_draw),
4959 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
4960 g_signal_connect (darea,
4961 "button_press_event",
4962 G_CALLBACK (cursor_event),
4964 gtk_widget_show (darea);
4966 g_signal_connect (spinner, "changed",
4967 G_CALLBACK (set_cursor),
4970 label = g_object_new (GTK_TYPE_LABEL,
4975 gtk_container_child_set (GTK_CONTAINER (vbox), label,
4978 g_object_set_data (G_OBJECT (spinner), "user_data", label);
4980 any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4981 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
4983 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4984 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
4985 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4987 button = gtk_button_new_with_label ("Close");
4988 g_signal_connect_swapped (button, "clicked",
4989 G_CALLBACK (gtk_widget_destroy),
4991 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4993 gtk_widget_show_all (window);
4995 set_cursor (spinner, darea);
4998 gtk_widget_destroy (window);
5006 color_selection_ok (GtkWidget *w,
5007 GtkColorSelectionDialog *cs)
5009 GtkWidget *colorsel;
5012 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5014 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5015 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5019 color_selection_changed (GtkWidget *w,
5020 GtkColorSelectionDialog *cs)
5022 GtkWidget *colorsel;
5025 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5026 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5027 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5032 opacity_toggled_cb (GtkWidget *w,
5033 GtkColorSelectionDialog *cs)
5035 GtkColorSelection *colorsel;
5037 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5038 gtk_color_selection_set_has_opacity_control (colorsel,
5039 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5043 palette_toggled_cb (GtkWidget *w,
5044 GtkColorSelectionDialog *cs)
5046 GtkColorSelection *colorsel;
5048 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5049 gtk_color_selection_set_has_palette (colorsel,
5050 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5055 create_color_selection (GtkWidget *widget)
5057 static GtkWidget *window = NULL;
5066 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5067 gtk_window_set_screen (GTK_WINDOW (window),
5068 gtk_widget_get_screen (widget));
5070 g_signal_connect (window, "destroy",
5071 G_CALLBACK (gtk_widget_destroyed),
5074 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5075 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5077 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5078 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5079 gtk_container_add (GTK_CONTAINER (window), hbox);
5081 label = gtk_label_new ("Pick a color");
5082 gtk_container_add (GTK_CONTAINER (hbox), label);
5084 picker = gtk_color_button_new ();
5085 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5086 gtk_container_add (GTK_CONTAINER (hbox), picker);
5088 button = gtk_button_new_with_mnemonic ("_Props");
5089 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5090 g_signal_connect (button, "clicked",
5091 G_CALLBACK (props_clicked),
5095 if (!gtk_widget_get_visible (window))
5096 gtk_widget_show_all (window);
5098 gtk_widget_destroy (window);
5102 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5104 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5105 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5107 gtk_widget_set_default_direction (new_direction);
5111 orientable_toggle_orientation (GtkOrientable *orientable)
5113 GtkOrientation orientation;
5115 orientation = gtk_orientable_get_orientation (orientable);
5116 gtk_orientable_set_orientation (orientable,
5117 orientation == GTK_ORIENTATION_HORIZONTAL ?
5118 GTK_ORIENTATION_VERTICAL :
5119 GTK_ORIENTATION_HORIZONTAL);
5121 if (GTK_IS_CONTAINER (orientable))
5126 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5128 for (child = children; child; child = child->next)
5130 if (GTK_IS_ORIENTABLE (child->data))
5131 orientable_toggle_orientation (child->data);
5134 g_list_free (children);
5139 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5141 GtkWidget *content_area;
5142 GtkWidget *toplevel;
5144 toplevel = gtk_widget_get_toplevel (widget);
5145 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5146 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5150 set_direction_recurse (GtkWidget *widget,
5153 GtkTextDirection *dir = data;
5155 gtk_widget_set_direction (widget, *dir);
5156 if (GTK_IS_CONTAINER (widget))
5157 gtk_container_foreach (GTK_CONTAINER (widget),
5158 set_direction_recurse,
5163 create_forward_back (const char *title,
5164 GtkTextDirection text_dir)
5166 GtkWidget *frame = gtk_frame_new (title);
5167 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5168 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5169 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5171 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5173 gtk_container_add (GTK_CONTAINER (frame), bbox);
5174 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5175 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5177 set_direction_recurse (frame, &text_dir);
5183 create_flipping (GtkWidget *widget)
5185 static GtkWidget *window = NULL;
5186 GtkWidget *check_button, *button;
5187 GtkWidget *action_area, *content_area;
5191 window = gtk_dialog_new ();
5193 gtk_window_set_screen (GTK_WINDOW (window),
5194 gtk_widget_get_screen (widget));
5196 g_signal_connect (window, "destroy",
5197 G_CALLBACK (gtk_widget_destroyed),
5200 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5201 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5203 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5205 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5206 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5207 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5209 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5210 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5212 g_signal_connect (check_button, "toggled",
5213 G_CALLBACK (flipping_toggled_cb), NULL);
5215 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5216 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5217 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5219 g_signal_connect (check_button, "toggled",
5220 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5222 gtk_box_pack_start (GTK_BOX (content_area),
5223 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5226 gtk_box_pack_start (GTK_BOX (content_area),
5227 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5230 gtk_box_pack_start (GTK_BOX (content_area),
5231 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5234 button = gtk_button_new_with_label ("Close");
5235 g_signal_connect_swapped (button, "clicked",
5236 G_CALLBACK (gtk_widget_destroy), window);
5237 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5240 if (!gtk_widget_get_visible (window))
5241 gtk_widget_show_all (window);
5243 gtk_widget_destroy (window);
5251 make_focus_table (GList **list)
5256 grid = gtk_grid_new ();
5258 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
5259 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
5261 for (i = 0; i < 5; i++)
5263 for (j = 0; j < 5; j++)
5268 widget = gtk_entry_new ();
5270 widget = gtk_button_new_with_label ("Foo");
5272 *list = g_list_prepend (*list, widget);
5274 gtk_widget_set_hexpand (widget, TRUE);
5275 gtk_widget_set_vexpand (widget, TRUE);
5277 gtk_grid_attach (GTK_GRID (grid), widget, i, j, 1, 1);
5281 *list = g_list_reverse (*list);
5287 create_focus (GtkWidget *widget)
5289 static GtkWidget *window = NULL;
5293 GtkWidget *content_area;
5298 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5304 gtk_window_set_screen (GTK_WINDOW (window),
5305 gtk_widget_get_screen (widget));
5307 g_signal_connect (window, "destroy",
5308 G_CALLBACK (gtk_widget_destroyed),
5311 g_signal_connect (window, "response",
5312 G_CALLBACK (gtk_widget_destroy),
5315 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5317 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5319 frame = gtk_frame_new ("Weird tab focus chain");
5321 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5323 table = make_focus_table (&list);
5325 gtk_container_add (GTK_CONTAINER (frame), table);
5327 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5332 frame = gtk_frame_new ("Default tab focus chain");
5334 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5337 table = make_focus_table (&list);
5341 gtk_container_add (GTK_CONTAINER (frame), table);
5344 if (!gtk_widget_get_visible (window))
5345 gtk_widget_show_all (window);
5347 gtk_widget_destroy (window);
5355 create_font_selection (GtkWidget *widget)
5357 static GtkWidget *window = NULL;
5365 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5366 gtk_window_set_screen (GTK_WINDOW (window),
5367 gtk_widget_get_screen (widget));
5369 g_signal_connect (window, "destroy",
5370 G_CALLBACK (gtk_widget_destroyed),
5373 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5374 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5376 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5377 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5378 gtk_container_add (GTK_CONTAINER (window), hbox);
5380 label = gtk_label_new ("Pick a font");
5381 gtk_container_add (GTK_CONTAINER (hbox), label);
5383 picker = gtk_font_button_new ();
5384 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5385 gtk_container_add (GTK_CONTAINER (hbox), picker);
5388 if (!gtk_widget_get_visible (window))
5389 gtk_widget_show_all (window);
5391 gtk_widget_destroy (window);
5398 static GtkWidget *dialog_window = NULL;
5401 label_toggle (GtkWidget *widget,
5406 *label = gtk_label_new ("Dialog Test");
5407 g_signal_connect (*label,
5409 G_CALLBACK (gtk_widget_destroyed),
5411 g_object_set (*label, "margin", 10, NULL);
5412 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5413 *label, TRUE, TRUE, 0);
5414 gtk_widget_show (*label);
5417 gtk_widget_destroy (*label);
5421 create_dialog (GtkWidget *widget)
5423 static GtkWidget *label;
5424 GtkWidget *action_area;
5429 /* This is a terrible example; it's much simpler to create
5430 * dialogs than this. Don't use testgtk for example code,
5434 dialog_window = gtk_dialog_new ();
5435 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5436 gtk_widget_get_screen (widget));
5438 g_signal_connect (dialog_window, "destroy",
5439 G_CALLBACK (gtk_widget_destroyed),
5442 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5444 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5445 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5447 button = gtk_button_new_with_label ("OK");
5448 gtk_widget_set_can_default (button, TRUE);
5449 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5450 gtk_widget_grab_default (button);
5451 gtk_widget_show (button);
5453 button = gtk_button_new_with_label ("Toggle");
5454 g_signal_connect (button, "clicked",
5455 G_CALLBACK (label_toggle),
5457 gtk_widget_set_can_default (button, TRUE);
5458 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5459 gtk_widget_show (button);
5464 if (!gtk_widget_get_visible (dialog_window))
5465 gtk_widget_show (dialog_window);
5467 gtk_widget_destroy (dialog_window);
5470 /* Display & Screen test
5477 GtkWidget *radio_dpy;
5478 GtkWidget *toplevel;
5479 GtkWidget *dialog_window;
5480 } ScreenDisplaySelection;
5483 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5485 const gchar *display_name;
5486 GdkDisplay *display = gtk_widget_get_display (widget);
5488 GdkScreen *new_screen = NULL;
5489 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5491 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5493 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5494 display = gdk_display_open (display_name);
5498 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5499 GTK_DIALOG_DESTROY_WITH_PARENT,
5502 "The display :\n%s\ncannot be opened",
5504 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5505 gtk_widget_show (dialog);
5506 g_signal_connect (dialog, "response",
5507 G_CALLBACK (gtk_widget_destroy),
5512 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5515 gboolean found = FALSE;
5516 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5519 gtk_tree_model_get (model, &iter, 0, &name, -1);
5520 found = !g_ascii_strcasecmp (display_name, name);
5527 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5528 new_screen = gdk_display_get_default_screen (display);
5533 gint number_of_screens = gdk_display_get_n_screens (display);
5534 gint screen_num = gdk_screen_get_number (current_screen);
5535 if ((screen_num +1) < number_of_screens)
5536 new_screen = gdk_display_get_screen (display, screen_num + 1);
5538 new_screen = gdk_display_get_screen (display, 0);
5543 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5544 gtk_widget_destroy (data->dialog_window);
5549 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5551 gtk_widget_destroy (data);
5555 create_display_screen (GtkWidget *widget)
5557 GtkWidget *grid, *frame, *window, *combo_dpy, *vbox;
5558 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5560 ScreenDisplaySelection *scr_dpy_data;
5561 GdkScreen *screen = gtk_widget_get_screen (widget);
5562 GdkDisplay *display = gdk_screen_get_display (screen);
5564 window = g_object_new (gtk_window_get_type (),
5566 "type", GTK_WINDOW_TOPLEVEL,
5567 "title", "Screen or Display selection",
5570 g_signal_connect (window, "destroy",
5571 G_CALLBACK (gtk_widget_destroy), NULL);
5573 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5574 gtk_container_add (GTK_CONTAINER (window), vbox);
5576 frame = gtk_frame_new ("Select screen or display");
5577 gtk_container_add (GTK_CONTAINER (vbox), frame);
5579 grid = gtk_grid_new ();
5580 gtk_grid_set_row_spacing (GTK_GRID (grid), 3);
5581 gtk_grid_set_column_spacing (GTK_GRID (grid), 3);
5583 gtk_container_add (GTK_CONTAINER (frame), grid);
5585 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5586 if (gdk_display_get_n_screens(display) > 1)
5587 radio_scr = gtk_radio_button_new_with_label
5588 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5591 radio_scr = gtk_radio_button_new_with_label
5592 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5593 "only one screen on the current display");
5594 gtk_widget_set_sensitive (radio_scr, FALSE);
5596 combo_dpy = gtk_combo_box_text_new_with_entry ();
5597 gtk_widget_set_hexpand (combo_dpy, TRUE);
5598 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5599 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5600 "<hostname>:<X Server Num>.<Screen Num>");
5602 gtk_grid_attach (GTK_GRID (grid), radio_dpy, 0, 0, 1, 1);
5603 gtk_grid_attach (GTK_GRID (grid), radio_scr, 0, 1, 1, 1);
5604 gtk_grid_attach (GTK_GRID (grid), combo_dpy, 1, 0, 1, 1);
5606 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5607 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5608 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5610 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5612 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5613 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5615 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5617 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5618 scr_dpy_data->radio_dpy = radio_dpy;
5619 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5620 scr_dpy_data->dialog_window = window;
5622 g_signal_connect (cancelb, "clicked",
5623 G_CALLBACK (screen_display_destroy_diag), window);
5624 g_signal_connect (applyb, "clicked",
5625 G_CALLBACK (screen_display_check), scr_dpy_data);
5626 gtk_widget_show_all (window);
5631 static gulong event_watcher_enter_id = 0;
5632 static gulong event_watcher_leave_id = 0;
5635 event_watcher (GSignalInvocationHint *ihint,
5636 guint n_param_values,
5637 const GValue *param_values,
5640 g_print ("Watch: \"%s\" emitted for %s\n",
5641 g_signal_name (ihint->signal_id),
5642 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5648 event_watcher_down (void)
5650 if (event_watcher_enter_id)
5654 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5655 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5656 event_watcher_enter_id = 0;
5657 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5658 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5659 event_watcher_leave_id = 0;
5664 event_watcher_toggle (void)
5666 if (event_watcher_enter_id)
5667 event_watcher_down ();
5672 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5673 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5674 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5675 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5680 create_event_watcher (GtkWidget *widget)
5682 GtkWidget *action_area, *content_area;
5687 dialog_window = gtk_dialog_new ();
5688 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5689 gtk_widget_get_screen (widget));
5691 g_signal_connect (dialog_window, "destroy",
5692 G_CALLBACK (gtk_widget_destroyed),
5694 g_signal_connect (dialog_window, "destroy",
5695 G_CALLBACK (event_watcher_down),
5698 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5699 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5701 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5702 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5703 gtk_widget_set_size_request (dialog_window, 200, 110);
5705 button = gtk_toggle_button_new_with_label ("Activate Watch");
5706 g_signal_connect (button, "clicked",
5707 G_CALLBACK (event_watcher_toggle),
5709 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5710 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5711 gtk_widget_show (button);
5713 button = gtk_button_new_with_label ("Close");
5714 g_signal_connect_swapped (button, "clicked",
5715 G_CALLBACK (gtk_widget_destroy),
5717 gtk_widget_set_can_default (button, TRUE);
5718 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5719 gtk_widget_grab_default (button);
5720 gtk_widget_show (button);
5723 if (!gtk_widget_get_visible (dialog_window))
5724 gtk_widget_show (dialog_window);
5726 gtk_widget_destroy (dialog_window);
5734 reformat_value (GtkScale *scale,
5737 return g_strdup_printf ("-->%0.*g<--",
5738 gtk_scale_get_digits (scale), value);
5742 create_range_controls (GtkWidget *widget)
5744 static GtkWidget *window = NULL;
5748 GtkWidget *scrollbar;
5750 GtkWidget *separator;
5751 GtkAdjustment *adjustment;
5756 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5758 gtk_window_set_screen (GTK_WINDOW (window),
5759 gtk_widget_get_screen (widget));
5761 g_signal_connect (window, "destroy",
5762 G_CALLBACK (gtk_widget_destroyed),
5765 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5766 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5769 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5770 gtk_container_add (GTK_CONTAINER (window), box1);
5771 gtk_widget_show (box1);
5774 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5775 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5776 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5777 gtk_widget_show (box2);
5780 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5782 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5783 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5784 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5785 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5786 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5787 gtk_widget_show (scale);
5789 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5790 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5791 gtk_widget_show (scrollbar);
5793 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5794 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5795 g_signal_connect (scale,
5797 G_CALLBACK (reformat_value),
5799 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5800 gtk_widget_show (scale);
5802 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5804 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5805 gtk_widget_set_size_request (scale, -1, 200);
5806 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5807 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5808 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5809 gtk_widget_show (scale);
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_range_set_inverted (GTK_RANGE (scale), TRUE);
5816 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5817 gtk_widget_show (scale);
5819 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5820 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5821 g_signal_connect (scale,
5823 G_CALLBACK (reformat_value),
5825 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5826 gtk_widget_show (scale);
5829 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5830 gtk_widget_show (hbox);
5832 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5833 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5834 gtk_widget_show (separator);
5837 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5838 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5839 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5840 gtk_widget_show (box2);
5843 button = gtk_button_new_with_label ("close");
5844 g_signal_connect_swapped (button, "clicked",
5845 G_CALLBACK (gtk_widget_destroy),
5847 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5848 gtk_widget_set_can_default (button, TRUE);
5849 gtk_widget_grab_default (button);
5850 gtk_widget_show (button);
5853 if (!gtk_widget_get_visible (window))
5854 gtk_widget_show (window);
5856 gtk_widget_destroy (window);
5863 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5864 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5865 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5866 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5867 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5868 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5869 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5870 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5873 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5879 static const char * book_open_xpm[] = {
5902 static const char * book_closed_xpm[] = {
5927 GdkPixbuf *book_open;
5928 GdkPixbuf *book_closed;
5929 GtkWidget *sample_notebook;
5932 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
5934 GtkWidget *page_widget;
5937 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
5939 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
5940 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5942 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
5943 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5947 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
5949 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
5950 gint old_page_num = gtk_notebook_get_current_page (notebook);
5952 if (page_num == old_page_num)
5955 set_page_image (notebook, page_num, book_open);
5957 if (old_page_num != -1)
5958 set_page_image (notebook, old_page_num, book_closed);
5962 tab_fill (GtkToggleButton *button, GtkWidget *child)
5964 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5965 "tab-fill", gtk_toggle_button_get_active (button),
5970 tab_expand (GtkToggleButton *button, GtkWidget *child)
5972 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5973 "tab-expand", gtk_toggle_button_get_active (button),
5978 create_pages (GtkNotebook *notebook, gint start, gint end)
5980 GtkWidget *child = NULL;
5985 GtkWidget *label_box;
5986 GtkWidget *menu_box;
5990 char accel_buffer[32];
5992 for (i = start; i <= end; i++)
5994 sprintf (buffer, "Page %d", i);
5995 sprintf (accel_buffer, "Page _%d", i);
5997 child = gtk_frame_new (buffer);
5998 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6000 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6001 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6002 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6003 gtk_container_add (GTK_CONTAINER (child), vbox);
6005 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6006 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6007 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6009 button = gtk_check_button_new_with_label ("Fill Tab");
6010 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6011 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6012 g_signal_connect (button, "toggled",
6013 G_CALLBACK (tab_fill), child);
6015 button = gtk_check_button_new_with_label ("Expand Tab");
6016 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6017 g_signal_connect (button, "toggled",
6018 G_CALLBACK (tab_expand), child);
6020 button = gtk_button_new_with_label ("Hide Page");
6021 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6022 g_signal_connect_swapped (button, "clicked",
6023 G_CALLBACK (gtk_widget_hide),
6026 gtk_widget_show_all (child);
6028 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6029 pixwid = gtk_image_new_from_pixbuf (book_closed);
6030 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6032 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6033 gtk_widget_set_margin_left (pixwid, 3);
6034 gtk_widget_set_margin_right (pixwid, 3);
6035 gtk_widget_set_margin_bottom (pixwid, 1);
6036 gtk_widget_set_margin_top (pixwid, 1);
6037 label = gtk_label_new_with_mnemonic (accel_buffer);
6038 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6039 gtk_widget_show_all (label_box);
6042 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6043 pixwid = gtk_image_new_from_pixbuf (book_closed);
6044 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6046 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6047 gtk_widget_set_margin_left (pixwid, 3);
6048 gtk_widget_set_margin_right (pixwid, 3);
6049 gtk_widget_set_margin_bottom (pixwid, 1);
6050 gtk_widget_set_margin_top (pixwid, 1);
6051 label = gtk_label_new (buffer);
6052 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6053 gtk_widget_show_all (menu_box);
6055 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6060 rotate_notebook (GtkButton *button,
6061 GtkNotebook *notebook)
6063 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6067 show_all_pages (GtkButton *button,
6068 GtkNotebook *notebook)
6070 gtk_container_foreach (GTK_CONTAINER (notebook),
6071 (GtkCallback) gtk_widget_show, NULL);
6075 notebook_type_changed (GtkWidget *optionmenu,
6078 GtkNotebook *notebook;
6088 notebook = GTK_NOTEBOOK (data);
6090 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6095 /* standard notebook */
6096 gtk_notebook_set_show_tabs (notebook, TRUE);
6097 gtk_notebook_set_show_border (notebook, TRUE);
6098 gtk_notebook_set_scrollable (notebook, FALSE);
6102 /* notabs notebook */
6103 gtk_notebook_set_show_tabs (notebook, FALSE);
6104 gtk_notebook_set_show_border (notebook, TRUE);
6109 gtk_notebook_set_show_tabs (notebook, FALSE);
6110 gtk_notebook_set_show_border (notebook, FALSE);
6115 gtk_notebook_set_show_tabs (notebook, TRUE);
6116 gtk_notebook_set_show_border (notebook, TRUE);
6117 gtk_notebook_set_scrollable (notebook, TRUE);
6118 if (gtk_notebook_get_n_pages (notebook) == 5)
6119 create_pages (notebook, 6, 15);
6125 if (gtk_notebook_get_n_pages (notebook) == 15)
6126 for (i = 0; i < 10; i++)
6127 gtk_notebook_remove_page (notebook, 5);
6131 notebook_popup (GtkToggleButton *button,
6132 GtkNotebook *notebook)
6134 if (gtk_toggle_button_get_active (button))
6135 gtk_notebook_popup_enable (notebook);
6137 gtk_notebook_popup_disable (notebook);
6141 create_notebook (GtkWidget *widget)
6143 static GtkWidget *window = NULL;
6147 GtkWidget *separator;
6151 static gchar *items[] =
6161 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6162 gtk_window_set_screen (GTK_WINDOW (window),
6163 gtk_widget_get_screen (widget));
6165 g_signal_connect (window, "destroy",
6166 G_CALLBACK (gtk_widget_destroyed),
6169 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6170 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6172 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6173 gtk_container_add (GTK_CONTAINER (window), box1);
6175 sample_notebook = gtk_notebook_new ();
6176 g_signal_connect (sample_notebook, "switch_page",
6177 G_CALLBACK (page_switch), NULL);
6178 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6179 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6180 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6182 gtk_widget_realize (sample_notebook);
6185 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6188 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6190 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6192 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6193 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6195 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6196 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6197 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6199 button = gtk_check_button_new_with_label ("popup menu");
6200 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6201 g_signal_connect (button, "clicked",
6202 G_CALLBACK (notebook_popup),
6205 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6206 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6207 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6209 label = gtk_label_new ("Notebook Style :");
6210 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6212 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6213 notebook_type_changed,
6215 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6217 button = gtk_button_new_with_label ("Show all Pages");
6218 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6219 g_signal_connect (button, "clicked",
6220 G_CALLBACK (show_all_pages), sample_notebook);
6222 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6223 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6224 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6225 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6227 button = gtk_button_new_with_label ("prev");
6228 g_signal_connect_swapped (button, "clicked",
6229 G_CALLBACK (gtk_notebook_prev_page),
6231 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6233 button = gtk_button_new_with_label ("next");
6234 g_signal_connect_swapped (button, "clicked",
6235 G_CALLBACK (gtk_notebook_next_page),
6237 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6239 button = gtk_button_new_with_label ("rotate");
6240 g_signal_connect (button, "clicked",
6241 G_CALLBACK (rotate_notebook), sample_notebook);
6242 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6244 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6245 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6247 button = gtk_button_new_with_label ("close");
6248 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6249 g_signal_connect_swapped (button, "clicked",
6250 G_CALLBACK (gtk_widget_destroy),
6252 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6253 gtk_widget_set_can_default (button, TRUE);
6254 gtk_widget_grab_default (button);
6257 if (!gtk_widget_get_visible (window))
6258 gtk_widget_show_all (window);
6260 gtk_widget_destroy (window);
6268 toggle_resize (GtkWidget *widget, GtkWidget *child)
6270 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6271 GValue value = { 0, };
6272 g_value_init (&value, G_TYPE_BOOLEAN);
6273 gtk_container_child_get_property (container, child, "resize", &value);
6274 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6275 gtk_container_child_set_property (container, child, "resize", &value);
6279 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6281 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6282 GValue value = { 0, };
6283 g_value_init (&value, G_TYPE_BOOLEAN);
6284 gtk_container_child_get_property (container, child, "shrink", &value);
6285 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6286 gtk_container_child_set_property (container, child, "shrink", &value);
6290 paned_props_clicked (GtkWidget *button,
6293 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6295 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6299 create_pane_options (GtkPaned *paned,
6300 const gchar *frame_label,
6301 const gchar *label1,
6302 const gchar *label2)
6304 GtkWidget *child1, *child2;
6309 GtkWidget *check_button;
6311 child1 = gtk_paned_get_child1 (paned);
6312 child2 = gtk_paned_get_child2 (paned);
6314 frame = gtk_frame_new (frame_label);
6315 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6317 table = gtk_table_new (4, 2, 4);
6318 gtk_container_add (GTK_CONTAINER (frame), table);
6320 label = gtk_label_new (label1);
6321 gtk_table_attach_defaults (GTK_TABLE (table), label,
6324 check_button = gtk_check_button_new_with_label ("Resize");
6325 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6327 g_signal_connect (check_button, "toggled",
6328 G_CALLBACK (toggle_resize),
6331 check_button = gtk_check_button_new_with_label ("Shrink");
6332 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6334 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6336 g_signal_connect (check_button, "toggled",
6337 G_CALLBACK (toggle_shrink),
6340 label = gtk_label_new (label2);
6341 gtk_table_attach_defaults (GTK_TABLE (table), label,
6344 check_button = gtk_check_button_new_with_label ("Resize");
6345 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6347 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6349 g_signal_connect (check_button, "toggled",
6350 G_CALLBACK (toggle_resize),
6353 check_button = gtk_check_button_new_with_label ("Shrink");
6354 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6356 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6358 g_signal_connect (check_button, "toggled",
6359 G_CALLBACK (toggle_shrink),
6362 button = gtk_button_new_with_mnemonic ("_Properties");
6363 gtk_table_attach_defaults (GTK_TABLE (table), button,
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 tab = gtk_table_new (7, 2, FALSE);
8321 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8323 label = gtk_label_new ("Orientation :");
8324 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8325 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
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 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8334 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8335 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8337 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8339 check = gtk_check_button_new_with_label ("Running");
8340 g_signal_connect (check, "toggled",
8341 G_CALLBACK (toggle_running),
8343 gtk_table_attach (GTK_TABLE (tab), check, 0, 2, 1, 2,
8344 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8346 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8348 check = gtk_check_button_new_with_label ("Show text");
8349 g_signal_connect (check, "clicked",
8350 G_CALLBACK (toggle_show_text),
8352 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 2, 3,
8353 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8356 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8357 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
8358 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8361 label = gtk_label_new ("Text: ");
8362 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8364 pdata->entry = gtk_entry_new ();
8365 g_signal_connect (pdata->entry, "changed",
8366 G_CALLBACK (entry_changed),
8368 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8369 gtk_widget_set_size_request (pdata->entry, 100, -1);
8371 label = gtk_label_new ("Ellipsize text :");
8372 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8373 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8375 gtk_widget_set_halign (label, GTK_ALIGN_START);
8376 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8377 pdata->elmenu = build_option_menu (ellipsize_items,
8378 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8379 2, // PANGO_ELLIPSIZE_MIDDLE
8380 progressbar_toggle_ellipsize,
8382 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8383 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8384 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8386 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8388 check = gtk_check_button_new_with_label ("Activity mode");
8389 g_signal_connect (check, "clicked",
8390 G_CALLBACK (toggle_activity_mode), pdata);
8391 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8392 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8395 button = gtk_button_new_with_label ("close");
8396 g_signal_connect_swapped (button, "clicked",
8397 G_CALLBACK (gtk_widget_destroy),
8399 gtk_widget_set_can_default (button, TRUE);
8400 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8401 gtk_widget_grab_default (button);
8404 if (!gtk_widget_get_visible (pdata->window))
8405 gtk_widget_show_all (pdata->window);
8407 gtk_widget_destroy (pdata->window);
8419 GtkWidget *res_widget;
8423 find_widget (GtkWidget *widget, FindWidgetData *data)
8425 GtkAllocation new_allocation;
8429 gtk_widget_get_allocation (widget, &new_allocation);
8431 if (data->found || !gtk_widget_get_mapped (widget))
8434 /* Note that in the following code, we only count the
8435 * position as being inside a WINDOW widget if it is inside
8436 * widget->window; points that are outside of widget->window
8437 * but within the allocation are not counted. This is consistent
8438 * with the way we highlight drag targets.
8440 if (gtk_widget_get_has_window (widget))
8442 new_allocation.x = 0;
8443 new_allocation.y = 0;
8446 if (gtk_widget_get_parent (widget) && !data->first)
8448 GdkWindow *window = gtk_widget_get_window (widget);
8449 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8451 gint tx, ty, twidth, theight;
8453 twidth = gdk_window_get_width (window);
8454 theight = gdk_window_get_height (window);
8456 if (new_allocation.x < 0)
8458 new_allocation.width += new_allocation.x;
8459 new_allocation.x = 0;
8461 if (new_allocation.y < 0)
8463 new_allocation.height += new_allocation.y;
8464 new_allocation.y = 0;
8466 if (new_allocation.x + new_allocation.width > twidth)
8467 new_allocation.width = twidth - new_allocation.x;
8468 if (new_allocation.y + new_allocation.height > theight)
8469 new_allocation.height = theight - new_allocation.y;
8471 gdk_window_get_position (window, &tx, &ty);
8472 new_allocation.x += tx;
8474 new_allocation.y += ty;
8477 window = gdk_window_get_parent (window);
8481 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8482 (data->x < new_allocation.x + new_allocation.width) &&
8483 (data->y < new_allocation.y + new_allocation.height))
8485 /* First, check if the drag is in a valid drop site in
8486 * one of our children
8488 if (GTK_IS_CONTAINER (widget))
8490 FindWidgetData new_data = *data;
8492 new_data.x -= x_offset;
8493 new_data.y -= y_offset;
8494 new_data.found = FALSE;
8495 new_data.first = FALSE;
8497 gtk_container_forall (GTK_CONTAINER (widget),
8498 (GtkCallback)find_widget,
8501 data->found = new_data.found;
8503 data->res_widget = new_data.res_widget;
8506 /* If not, and this widget is registered as a drop site, check to
8507 * emit "drag_motion" to check if we are actually in
8513 data->res_widget = widget;
8519 find_widget_at_pointer (GdkDevice *device)
8521 GtkWidget *widget = NULL;
8522 GdkWindow *pointer_window;
8524 FindWidgetData data;
8526 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8530 gpointer widget_ptr;
8532 gdk_window_get_user_data (pointer_window, &widget_ptr);
8533 widget = widget_ptr;
8538 gdk_window_get_pointer (gtk_widget_get_window (widget),
8546 find_widget (widget, &data);
8548 return data.res_widget;
8554 struct PropertiesData {
8562 destroy_properties (GtkWidget *widget,
8563 struct PropertiesData *data)
8567 *data->window = NULL;
8568 data->window = NULL;
8573 g_object_unref (data->cursor);
8574 data->cursor = NULL;
8579 g_signal_handler_disconnect (widget, data->handler);
8587 property_query_event (GtkWidget *widget,
8589 struct PropertiesData *data)
8591 GtkWidget *res_widget = NULL;
8593 if (!data->in_query)
8596 if (event->type == GDK_BUTTON_RELEASE)
8598 gtk_grab_remove (widget);
8599 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8601 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8604 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8605 gtk_widget_get_screen (widget));
8606 create_prop_editor (G_OBJECT (res_widget), 0);
8609 data->in_query = FALSE;
8616 query_properties (GtkButton *button,
8617 struct PropertiesData *data)
8619 GtkWidget *widget = GTK_WIDGET (button);
8620 GdkDisplay *display;
8621 GdkDeviceManager *device_manager;
8624 g_signal_connect (button, "event",
8625 G_CALLBACK (property_query_event), data);
8627 display = gtk_widget_get_display (widget);
8630 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8632 device_manager = gdk_display_get_device_manager (display);
8633 device = gdk_device_manager_get_client_pointer (device_manager);
8634 gdk_device_grab (device,
8635 gtk_widget_get_window (widget),
8638 GDK_BUTTON_RELEASE_MASK,
8641 gtk_grab_add (widget);
8643 data->in_query = TRUE;
8647 create_properties (GtkWidget *widget)
8649 static GtkWidget *window = NULL;
8653 struct PropertiesData *data;
8655 data = g_new (struct PropertiesData, 1);
8656 data->window = &window;
8657 data->in_query = FALSE;
8658 data->cursor = NULL;
8663 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8665 gtk_window_set_screen (GTK_WINDOW (window),
8666 gtk_widget_get_screen (widget));
8668 data->handler = g_signal_connect (window, "destroy",
8669 G_CALLBACK (destroy_properties),
8672 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8673 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8675 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8676 gtk_container_add (GTK_CONTAINER (window), vbox);
8678 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8679 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8681 button = gtk_button_new_with_label ("Query properties");
8682 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8683 g_signal_connect (button, "clicked",
8684 G_CALLBACK (query_properties),
8688 if (!gtk_widget_get_visible (window))
8689 gtk_widget_show_all (window);
8691 gtk_widget_destroy (window);
8695 struct SnapshotData {
8696 GtkWidget *toplevel_button;
8700 gboolean is_toplevel;
8705 destroy_snapshot_data (GtkWidget *widget,
8706 struct SnapshotData *data)
8709 *data->window = NULL;
8713 g_object_unref (data->cursor);
8714 data->cursor = NULL;
8719 g_signal_handler_disconnect (widget, data->handler);
8727 snapshot_widget_event (GtkWidget *widget,
8729 struct SnapshotData *data)
8731 GtkWidget *res_widget = NULL;
8733 if (!data->in_query)
8736 if (event->type == GDK_BUTTON_RELEASE)
8738 gtk_grab_remove (widget);
8739 gdk_device_ungrab (gdk_event_get_device (event),
8742 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8743 if (data->is_toplevel && res_widget)
8744 res_widget = gtk_widget_get_toplevel (res_widget);
8747 cairo_surface_t *surface;
8748 GtkWidget *window, *image;
8753 width = gtk_widget_get_allocated_width (res_widget);
8754 height = gtk_widget_get_allocated_height (res_widget);
8756 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8758 cr = cairo_create (surface);
8759 gtk_widget_draw (res_widget, cr);
8762 pixbuf = gdk_pixbuf_get_from_surface (surface,
8765 cairo_surface_destroy (surface);
8767 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8768 image = gtk_image_new_from_pixbuf (pixbuf);
8769 g_object_unref (pixbuf);
8771 gtk_container_add (GTK_CONTAINER (window), image);
8772 gtk_widget_show_all (window);
8775 data->in_query = FALSE;
8782 snapshot_widget (GtkButton *button,
8783 struct SnapshotData *data)
8785 GtkWidget *widget = GTK_WIDGET (button);
8788 device = gtk_get_current_event_device ();
8792 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8793 device = gdk_device_get_associated_device (device);
8795 data->is_toplevel = widget == data->toplevel_button;
8798 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8801 gdk_device_grab (device,
8802 gtk_widget_get_window (widget),
8803 GDK_OWNERSHIP_APPLICATION,
8805 GDK_BUTTON_RELEASE_MASK,
8809 g_signal_connect (button, "event",
8810 G_CALLBACK (snapshot_widget_event), data);
8812 gtk_grab_add (widget);
8814 data->in_query = TRUE;
8818 create_snapshot (GtkWidget *widget)
8820 static GtkWidget *window = NULL;
8823 struct SnapshotData *data;
8825 data = g_new (struct SnapshotData, 1);
8826 data->window = &window;
8827 data->in_query = FALSE;
8828 data->cursor = NULL;
8833 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8835 gtk_window_set_screen (GTK_WINDOW (window),
8836 gtk_widget_get_screen (widget));
8838 data->handler = g_signal_connect (window, "destroy",
8839 G_CALLBACK (destroy_snapshot_data),
8842 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8843 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8845 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8846 gtk_container_add (GTK_CONTAINER (window), vbox);
8848 button = gtk_button_new_with_label ("Snapshot widget");
8849 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8850 g_signal_connect (button, "clicked",
8851 G_CALLBACK (snapshot_widget),
8854 button = gtk_button_new_with_label ("Snapshot toplevel");
8855 data->toplevel_button = button;
8856 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8857 g_signal_connect (button, "clicked",
8858 G_CALLBACK (snapshot_widget),
8862 if (!gtk_widget_get_visible (window))
8863 gtk_widget_show_all (window);
8865 gtk_widget_destroy (window);
8874 selection_test_received (GtkWidget *tree_view,
8875 GtkSelectionData *selection_data)
8877 GtkTreeModel *model;
8878 GtkListStore *store;
8882 if (gtk_selection_data_get_length (selection_data) < 0)
8884 g_print ("Selection retrieval failed\n");
8887 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8889 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8893 /* Clear out any current list items */
8895 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8896 store = GTK_LIST_STORE (model);
8897 gtk_list_store_clear (store);
8899 /* Add new items to list */
8901 gtk_selection_data_get_targets (selection_data,
8904 for (i = 0; i < l; i++)
8909 name = gdk_atom_name (atoms[i]);
8912 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
8916 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
8923 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
8925 static GdkAtom targets_atom = GDK_NONE;
8927 if (targets_atom == GDK_NONE)
8928 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
8930 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
8935 create_selection_test (GtkWidget *widget)
8937 static GtkWidget *window = NULL;
8938 GtkWidget *action_area, *content_area;
8941 GtkWidget *scrolled_win;
8942 GtkListStore* store;
8943 GtkWidget *tree_view;
8944 GtkTreeViewColumn *column;
8945 GtkCellRenderer *renderer;
8950 window = gtk_dialog_new ();
8952 gtk_window_set_screen (GTK_WINDOW (window),
8953 gtk_widget_get_screen (widget));
8955 g_signal_connect (window, "destroy",
8956 G_CALLBACK (gtk_widget_destroyed),
8959 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8960 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
8962 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
8963 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8965 /* Create the list */
8967 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8968 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8969 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
8971 label = gtk_label_new ("Gets available targets for current selection");
8972 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8974 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
8975 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
8976 GTK_POLICY_AUTOMATIC,
8977 GTK_POLICY_AUTOMATIC);
8978 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
8979 gtk_widget_set_size_request (scrolled_win, 100, 200);
8981 store = gtk_list_store_new (1, G_TYPE_STRING);
8982 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
8983 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
8985 renderer = gtk_cell_renderer_text_new ();
8986 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
8988 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
8990 g_signal_connect (tree_view, "selection_received",
8991 G_CALLBACK (selection_test_received), NULL);
8993 /* .. And create some buttons */
8994 button = gtk_button_new_with_label ("Get Targets");
8995 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8997 g_signal_connect (button, "clicked",
8998 G_CALLBACK (selection_test_get_targets), tree_view);
9000 button = gtk_button_new_with_label ("Quit");
9001 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9003 g_signal_connect_swapped (button, "clicked",
9004 G_CALLBACK (gtk_widget_destroy),
9008 if (!gtk_widget_get_visible (window))
9009 gtk_widget_show_all (window);
9011 gtk_widget_destroy (window);
9018 static int scroll_test_pos = 0.0;
9021 scroll_test_draw (GtkWidget *widget,
9023 GtkAdjustment *adjustment)
9026 gint imin, imax, jmin, jmax;
9029 gdk_cairo_get_clip_rectangle (cr, &clip);
9031 imin = (clip.x) / 10;
9032 imax = (clip.x + clip.width + 9) / 10;
9034 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
9035 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
9037 for (i=imin; i<imax; i++)
9038 for (j=jmin; j<jmax; j++)
9040 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
9048 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9049 GtkAdjustment *adjustment)
9051 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
9052 -gtk_adjustment_get_page_increment (adjustment) / 2:
9053 gtk_adjustment_get_page_increment (adjustment) / 2);
9054 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
9055 gtk_adjustment_set_value (adjustment, new_value);
9061 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9062 GtkAdjustment *adjustment)
9064 GtkAllocation allocation;
9066 gtk_widget_get_allocation (widget, &allocation);
9067 gtk_adjustment_configure (adjustment,
9068 gtk_adjustment_get_value (adjustment),
9069 gtk_adjustment_get_lower (adjustment),
9070 gtk_adjustment_get_upper (adjustment),
9071 0.1 * allocation.height,
9072 0.9 * allocation.height,
9077 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
9082 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
9083 scroll_test_pos = gtk_adjustment_get_value (adjustment);
9085 if (!gtk_widget_is_drawable (widget))
9088 window = gtk_widget_get_window (widget);
9089 gdk_window_scroll (window, 0, dy);
9090 gdk_window_process_updates (window, FALSE);
9095 create_scroll_test (GtkWidget *widget)
9097 static GtkWidget *window = NULL;
9098 GtkWidget *action_area, *content_area;
9100 GtkWidget *drawing_area;
9101 GtkWidget *scrollbar;
9103 GtkAdjustment *adjustment;
9104 GdkGeometry geometry;
9105 GdkWindowHints geometry_mask;
9109 window = gtk_dialog_new ();
9111 gtk_window_set_screen (GTK_WINDOW (window),
9112 gtk_widget_get_screen (widget));
9114 g_signal_connect (window, "destroy",
9115 G_CALLBACK (gtk_widget_destroyed),
9118 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9119 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9121 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9122 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9124 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9125 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9126 gtk_widget_show (hbox);
9128 drawing_area = gtk_drawing_area_new ();
9129 gtk_widget_set_size_request (drawing_area, 200, 200);
9130 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9131 gtk_widget_show (drawing_area);
9133 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9135 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9136 scroll_test_pos = 0.0;
9138 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
9139 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9140 gtk_widget_show (scrollbar);
9142 g_signal_connect (drawing_area, "draw",
9143 G_CALLBACK (scroll_test_draw), adjustment);
9144 g_signal_connect (drawing_area, "configure_event",
9145 G_CALLBACK (scroll_test_configure), adjustment);
9146 g_signal_connect (drawing_area, "scroll_event",
9147 G_CALLBACK (scroll_test_scroll), adjustment);
9149 g_signal_connect (adjustment, "value_changed",
9150 G_CALLBACK (scroll_test_adjustment_changed),
9153 /* .. And create some buttons */
9155 button = gtk_button_new_with_label ("Quit");
9156 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9158 g_signal_connect_swapped (button, "clicked",
9159 G_CALLBACK (gtk_widget_destroy),
9161 gtk_widget_show (button);
9163 /* Set up gridded geometry */
9165 geometry_mask = GDK_HINT_MIN_SIZE |
9166 GDK_HINT_BASE_SIZE |
9167 GDK_HINT_RESIZE_INC;
9169 geometry.min_width = 20;
9170 geometry.min_height = 20;
9171 geometry.base_width = 0;
9172 geometry.base_height = 0;
9173 geometry.width_inc = 10;
9174 geometry.height_inc = 10;
9176 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9177 drawing_area, &geometry, geometry_mask);
9180 if (!gtk_widget_get_visible (window))
9181 gtk_widget_show (window);
9183 gtk_widget_destroy (window);
9190 static int timer = 0;
9193 timeout_test (GtkWidget *label)
9195 static int count = 0;
9196 static char buffer[32];
9198 sprintf (buffer, "count: %d", ++count);
9199 gtk_label_set_text (GTK_LABEL (label), buffer);
9205 start_timeout_test (GtkWidget *widget,
9210 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9215 stop_timeout_test (GtkWidget *widget,
9220 g_source_remove (timer);
9226 destroy_timeout_test (GtkWidget *widget,
9229 stop_timeout_test (NULL, NULL);
9235 create_timeout_test (GtkWidget *widget)
9237 static GtkWidget *window = NULL;
9238 GtkWidget *action_area, *content_area;
9244 window = gtk_dialog_new ();
9246 gtk_window_set_screen (GTK_WINDOW (window),
9247 gtk_widget_get_screen (widget));
9249 g_signal_connect (window, "destroy",
9250 G_CALLBACK (destroy_timeout_test),
9253 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9254 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9256 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9257 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9259 label = gtk_label_new ("count: 0");
9260 g_object_set (label, "margin", 10, NULL);
9261 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9262 gtk_widget_show (label);
9264 button = gtk_button_new_with_label ("close");
9265 g_signal_connect_swapped (button, "clicked",
9266 G_CALLBACK (gtk_widget_destroy),
9268 gtk_widget_set_can_default (button, TRUE);
9269 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9270 gtk_widget_grab_default (button);
9271 gtk_widget_show (button);
9273 button = gtk_button_new_with_label ("start");
9274 g_signal_connect (button, "clicked",
9275 G_CALLBACK(start_timeout_test),
9277 gtk_widget_set_can_default (button, TRUE);
9278 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9279 gtk_widget_show (button);
9281 button = gtk_button_new_with_label ("stop");
9282 g_signal_connect (button, "clicked",
9283 G_CALLBACK (stop_timeout_test),
9285 gtk_widget_set_can_default (button, TRUE);
9286 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9287 gtk_widget_show (button);
9290 if (!gtk_widget_get_visible (window))
9291 gtk_widget_show (window);
9293 gtk_widget_destroy (window);
9300 static int idle_id = 0;
9303 idle_test (GtkWidget *label)
9305 static int count = 0;
9306 static char buffer[32];
9308 sprintf (buffer, "count: %d", ++count);
9309 gtk_label_set_text (GTK_LABEL (label), buffer);
9315 start_idle_test (GtkWidget *widget,
9320 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9325 stop_idle_test (GtkWidget *widget,
9330 g_source_remove (idle_id);
9336 destroy_idle_test (GtkWidget *widget,
9339 stop_idle_test (NULL, NULL);
9345 toggle_idle_container (GObject *button,
9346 GtkContainer *container)
9348 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9352 create_idle_test (GtkWidget *widget)
9354 static GtkWidget *window = NULL;
9357 GtkWidget *container;
9361 GtkWidget *action_area, *content_area;
9366 window = gtk_dialog_new ();
9368 gtk_window_set_screen (GTK_WINDOW (window),
9369 gtk_widget_get_screen (widget));
9371 g_signal_connect (window, "destroy",
9372 G_CALLBACK (destroy_idle_test),
9375 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9376 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9378 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9379 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9381 label = gtk_label_new ("count: 0");
9382 g_object_set (label, "margin", 10, NULL);
9383 gtk_widget_show (label);
9386 g_object_new (GTK_TYPE_BOX,
9388 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9389 * "GtkWidget::visible", TRUE,
9394 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9397 g_object_new (GTK_TYPE_FRAME,
9399 "label", "Label Container",
9401 "parent", content_area,
9404 g_object_new (GTK_TYPE_BOX,
9407 "orientation", GTK_ORIENTATION_VERTICAL,
9410 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9411 "label", "Resize-Parent",
9412 "user_data", (void*)GTK_RESIZE_PARENT,
9416 "signal::clicked", toggle_idle_container, container,
9418 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9419 "label", "Resize-Queue",
9420 "user_data", (void*)GTK_RESIZE_QUEUE,
9425 g_object_connect (button,
9426 "signal::clicked", toggle_idle_container, container,
9428 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9429 "label", "Resize-Immediate",
9430 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9432 g_object_connect (button2,
9433 "signal::clicked", toggle_idle_container, container,
9435 g_object_set (button2,
9441 button = gtk_button_new_with_label ("close");
9442 g_signal_connect_swapped (button, "clicked",
9443 G_CALLBACK (gtk_widget_destroy),
9445 gtk_widget_set_can_default (button, TRUE);
9446 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9447 gtk_widget_grab_default (button);
9448 gtk_widget_show (button);
9450 button = gtk_button_new_with_label ("start");
9451 g_signal_connect (button, "clicked",
9452 G_CALLBACK (start_idle_test),
9454 gtk_widget_set_can_default (button, TRUE);
9455 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9456 gtk_widget_show (button);
9458 button = gtk_button_new_with_label ("stop");
9459 g_signal_connect (button, "clicked",
9460 G_CALLBACK (stop_idle_test),
9462 gtk_widget_set_can_default (button, TRUE);
9463 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9464 gtk_widget_show (button);
9467 if (!gtk_widget_get_visible (window))
9468 gtk_widget_show (window);
9470 gtk_widget_destroy (window);
9478 create_rc_file (GtkWidget *widget)
9480 static GtkWidget *window = NULL;
9481 GtkWidget *action_area, *content_area;
9489 window = gtk_dialog_new ();
9491 gtk_window_set_screen (GTK_WINDOW (window),
9492 gtk_widget_get_screen (widget));
9494 g_signal_connect (window, "destroy",
9495 G_CALLBACK (gtk_widget_destroyed),
9498 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9499 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9501 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9502 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9504 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9505 gtk_container_add (GTK_CONTAINER (frame), vbox);
9507 label = gtk_label_new ("This label should be red");
9508 gtk_widget_set_name (label, "testgtk-red-label");
9509 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9511 label = gtk_label_new ("This label should be green");
9512 gtk_widget_set_name (label, "testgtk-green-label");
9513 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9515 label = gtk_label_new ("This label should be blue");
9516 gtk_widget_set_name (label, "testgtk-blue-label");
9517 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9519 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9520 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9522 button = gtk_button_new_with_label ("Reload");
9523 g_signal_connect_swapped (button, "clicked",
9524 G_CALLBACK (gtk_style_context_reset_widgets),
9525 gtk_widget_get_screen (button));
9526 gtk_widget_set_can_default (button, TRUE);
9527 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9528 gtk_widget_grab_default (button);
9530 button = gtk_button_new_with_label ("Close");
9531 g_signal_connect_swapped (button, "clicked",
9532 G_CALLBACK (gtk_widget_destroy),
9534 gtk_widget_set_can_default (button, TRUE);
9535 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9538 if (!gtk_widget_get_visible (window))
9539 gtk_widget_show_all (window);
9541 gtk_widget_destroy (window);
9545 * Test of recursive mainloop
9549 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9556 create_mainloop (GtkWidget *widget)
9558 static GtkWidget *window = NULL;
9559 GtkWidget *action_area, *content_area;
9565 window = gtk_dialog_new ();
9567 gtk_window_set_screen (GTK_WINDOW (window),
9568 gtk_widget_get_screen (widget));
9570 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9572 g_signal_connect (window, "destroy",
9573 G_CALLBACK (mainloop_destroyed),
9576 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9577 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9579 label = gtk_label_new ("In recursive main loop...");
9580 g_object_set (label, "margin", 20, NULL);
9582 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9583 gtk_widget_show (label);
9585 button = gtk_button_new_with_label ("Leave");
9586 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9588 g_signal_connect_swapped (button, "clicked",
9589 G_CALLBACK (gtk_widget_destroy),
9592 gtk_widget_set_can_default (button, TRUE);
9593 gtk_widget_grab_default (button);
9595 gtk_widget_show (button);
9598 if (!gtk_widget_get_visible (window))
9600 gtk_widget_show (window);
9602 g_print ("create_mainloop: start\n");
9604 g_print ("create_mainloop: done\n");
9607 gtk_widget_destroy (window);
9611 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9614 GdkWindow *bin_window;
9617 gint imin, imax, jmin, jmax;
9619 layout = GTK_LAYOUT (widget);
9620 bin_window = gtk_layout_get_bin_window (layout);
9622 if (!gtk_cairo_should_draw_window (cr, bin_window))
9625 gdk_window_get_position (bin_window, &x, &y);
9626 cairo_translate (cr, x, y);
9628 gdk_cairo_get_clip_rectangle (cr, &clip);
9630 imin = (clip.x) / 10;
9631 imax = (clip.x + clip.width + 9) / 10;
9633 jmin = (clip.y) / 10;
9634 jmax = (clip.y + clip.height + 9) / 10;
9636 for (i=imin; i<imax; i++)
9637 for (j=jmin; j<jmax; j++)
9639 cairo_rectangle (cr,
9648 void create_layout (GtkWidget *widget)
9650 GtkAdjustment *hadjustment, *vadjustment;
9652 static GtkWidget *window = NULL;
9653 GtkWidget *layout_widget;
9654 GtkWidget *scrolledwindow;
9663 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9664 gtk_window_set_screen (GTK_WINDOW (window),
9665 gtk_widget_get_screen (widget));
9667 g_signal_connect (window, "destroy",
9668 G_CALLBACK (gtk_widget_destroyed),
9671 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9672 gtk_widget_set_size_request (window, 200, 200);
9674 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9675 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9677 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9678 GTK_CORNER_TOP_RIGHT);
9680 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9682 layout_widget = gtk_layout_new (NULL, NULL);
9683 layout = GTK_LAYOUT (layout_widget);
9684 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9686 /* We set step sizes here since GtkLayout does not set
9689 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9690 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9691 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9692 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9693 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9694 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9696 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9697 g_signal_connect (layout, "draw",
9698 G_CALLBACK (layout_draw_handler), NULL);
9700 gtk_layout_set_size (layout, 1600, 128000);
9702 for (i=0 ; i < 16 ; i++)
9703 for (j=0 ; j < 16 ; j++)
9705 sprintf(buf, "Button %d, %d", i, j);
9707 button = gtk_button_new_with_label (buf);
9709 button = gtk_label_new (buf);
9711 gtk_layout_put (layout, button, j*100, i*100);
9714 for (i=16; i < 1280; i++)
9716 sprintf(buf, "Button %d, %d", i, 0);
9718 button = gtk_button_new_with_label (buf);
9720 button = gtk_label_new (buf);
9722 gtk_layout_put (layout, button, 0, i*100);
9726 if (!gtk_widget_get_visible (window))
9727 gtk_widget_show_all (window);
9729 gtk_widget_destroy (window);
9733 /* FIXME: need to completely redo this for GtkStyleContext */
9735 create_styles (GtkWidget *widget)
9737 static GtkWidget *window = NULL;
9738 GtkWidget *content_area, *action_area;
9743 static GdkRGBA red = { 1,0,0,1 };
9744 static GdkRGBA green = { 0,1,0,1 };
9745 static GdkRGBA blue = { 0,0,1,1 };
9746 static GdkRGBA yellow = { 1,1,0,1 };
9747 static GdkRGBA cyan = { 0,1,1,1 };
9748 PangoFontDescription *font_desc;
9750 GtkRcStyle *rc_style;
9754 window = gtk_dialog_new ();
9755 gtk_window_set_screen (GTK_WINDOW (window),
9756 gtk_widget_get_screen (widget));
9758 g_signal_connect (window, "destroy",
9759 G_CALLBACK (gtk_widget_destroyed),
9762 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9763 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9765 button = gtk_button_new_with_label ("Close");
9766 g_signal_connect_swapped (button, "clicked",
9767 G_CALLBACK (gtk_widget_destroy),
9769 gtk_widget_set_can_default (button, TRUE);
9770 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9771 gtk_widget_show (button);
9773 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9774 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9775 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9777 label = gtk_label_new ("Font:");
9778 gtk_widget_set_halign (label, GTK_ALIGN_START);
9779 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9780 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9782 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9784 button = gtk_button_new_with_label ("Some Text");
9785 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9786 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9788 label = gtk_label_new ("Foreground:");
9789 gtk_widget_set_halign (label, GTK_ALIGN_START);
9790 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9791 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9793 button = gtk_button_new_with_label ("Some Text");
9794 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9795 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9797 label = gtk_label_new ("Background:");
9798 gtk_widget_set_halign (label, GTK_ALIGN_START);
9799 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9800 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9802 button = gtk_button_new_with_label ("Some Text");
9803 gtk_widget_override_background_color (button, 0, &green);
9804 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9806 label = gtk_label_new ("Text:");
9807 gtk_widget_set_halign (label, GTK_ALIGN_START);
9808 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9809 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9811 entry = gtk_entry_new ();
9812 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9813 gtk_widget_override_color (entry, 0, &blue);
9814 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9816 label = gtk_label_new ("Base:");
9817 gtk_widget_set_halign (label, GTK_ALIGN_START);
9818 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9819 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9821 entry = gtk_entry_new ();
9822 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9823 gtk_widget_override_background_color (entry, 0, &yellow);
9824 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9826 label = gtk_label_new ("Cursor:");
9827 gtk_widget_set_halign (label, GTK_ALIGN_START);
9828 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9829 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9831 entry = gtk_entry_new ();
9832 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9833 gtk_widget_modify_cursor (entry, &red, &red);
9834 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9836 label = gtk_label_new ("Multiple:");
9837 gtk_widget_set_halign (label, GTK_ALIGN_START);
9838 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9839 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9841 button = gtk_button_new_with_label ("Some Text");
9843 rc_style = gtk_rc_style_new ();
9845 rc_style->font_desc = pango_font_description_copy (font_desc);
9846 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9847 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9848 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9849 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9850 rc_style->bg[GTK_STATE_NORMAL] = blue;
9851 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9852 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9853 rc_style->fg[GTK_STATE_ACTIVE] = red;
9854 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9855 rc_style->xthickness = 5;
9856 rc_style->ythickness = 5;
9858 gtk_widget_modify_style (button, rc_style);
9859 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9861 g_object_unref (rc_style);
9863 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9866 if (!gtk_widget_get_visible (window))
9867 gtk_widget_show_all (window);
9869 gtk_widget_destroy (window);
9874 * Main Window and Exit
9878 do_exit (GtkWidget *widget, GtkWidget *window)
9880 gtk_widget_destroy (window);
9886 void (*func) (GtkWidget *widget);
9887 gboolean do_not_benchmark;
9890 { "alpha window", create_alpha_window },
9891 { "big windows", create_big_windows },
9892 { "button box", create_button_box },
9893 { "buttons", create_buttons },
9894 { "check buttons", create_check_buttons },
9895 { "color selection", create_color_selection },
9896 { "composited window", create_composited_window },
9897 { "cursors", create_cursors },
9898 { "dialog", create_dialog },
9899 { "display & screen", create_display_screen, TRUE },
9900 { "entry", create_entry },
9901 { "event box", create_event_box },
9902 { "event watcher", create_event_watcher },
9903 { "expander", create_expander },
9904 { "flipping", create_flipping },
9905 { "focus", create_focus },
9906 { "font selection", create_font_selection },
9907 { "handle box", create_handle_box },
9908 { "image", create_image },
9909 { "key lookup", create_key_lookup },
9910 { "labels", create_labels },
9911 { "layout", create_layout },
9912 { "menus", create_menus },
9913 { "message dialog", create_message_dialog },
9914 { "modal window", create_modal_window, TRUE },
9915 { "notebook", create_notebook },
9916 { "panes", create_panes },
9917 { "paned keyboard", create_paned_keyboard_navigation },
9918 { "pixbuf", create_pixbuf },
9919 { "progress bar", create_progress_bar },
9920 { "properties", create_properties },
9921 { "radio buttons", create_radio_buttons },
9922 { "range controls", create_range_controls },
9923 { "rc file", create_rc_file },
9924 { "reparent", create_reparent },
9925 { "resize grips", create_resize_grips },
9926 { "rotated label", create_rotated_label },
9927 { "rotated text", create_rotated_text },
9928 { "saved position", create_saved_position },
9929 { "scrolled windows", create_scrolled_windows },
9930 { "shapes", create_shapes },
9931 { "size groups", create_size_groups },
9932 { "snapshot", create_snapshot },
9933 { "spinbutton", create_spins },
9934 { "statusbar", create_statusbar },
9936 { "styles", create_styles },
9938 { "test idle", create_idle_test },
9939 { "test mainloop", create_mainloop, TRUE },
9940 { "test scrolling", create_scroll_test },
9941 { "test selection", create_selection_test },
9942 { "test timeout", create_timeout_test },
9943 { "toggle buttons", create_toggle_buttons },
9944 { "toolbar", create_toolbar },
9945 { "tooltips", create_tooltips },
9946 { "WM hints", create_wmhints },
9947 { "window sizing", create_window_sizing },
9948 { "window states", create_window_states }
9950 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
9953 create_main_window (void)
9958 GtkWidget *scrolled_window;
9962 GtkWidget *separator;
9963 GdkGeometry geometry;
9966 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9967 gtk_widget_set_name (window, "main_window");
9968 gtk_window_move (GTK_WINDOW (window), 50, 20);
9969 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
9971 geometry.min_width = -1;
9972 geometry.min_height = -1;
9973 geometry.max_width = -1;
9974 geometry.max_height = G_MAXSHORT;
9975 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
9977 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
9979 g_signal_connect (window, "destroy",
9980 G_CALLBACK (gtk_main_quit),
9982 g_signal_connect (window, "delete-event",
9983 G_CALLBACK (gtk_false),
9986 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9987 gtk_container_add (GTK_CONTAINER (window), box1);
9989 if (gtk_micro_version > 0)
9992 gtk_get_major_version (),
9993 gtk_get_minor_version (),
9994 gtk_get_micro_version ());
9998 gtk_get_major_version (),
9999 gtk_get_minor_version ());
10001 label = gtk_label_new (buffer);
10002 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10003 gtk_widget_set_name (label, "testgtk-version-label");
10005 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10006 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10007 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10009 GTK_POLICY_AUTOMATIC);
10010 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10012 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10013 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10014 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10015 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10016 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10017 gtk_widget_show (box2);
10019 for (i = 0; i < nbuttons; i++)
10021 button = gtk_button_new_with_label (buttons[i].label);
10022 if (buttons[i].func)
10023 g_signal_connect (button,
10025 G_CALLBACK(buttons[i].func),
10028 gtk_widget_set_sensitive (button, FALSE);
10029 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10032 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10033 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10035 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10036 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10037 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10039 button = gtk_button_new_with_mnemonic ("_Close");
10040 g_signal_connect (button, "clicked",
10041 G_CALLBACK (do_exit),
10043 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10044 gtk_widget_set_can_default (button, TRUE);
10045 gtk_widget_grab_default (button);
10047 gtk_widget_show_all (window);
10053 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
10054 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10058 pad (const char *str, int to)
10060 static char buf[256];
10061 int len = strlen (str);
10064 for (i = 0; i < to; i++)
10069 memcpy (buf, str, len);
10075 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10077 fn (widget); /* on */
10078 while (g_main_context_iteration (NULL, FALSE));
10079 fn (widget); /* off */
10080 while (g_main_context_iteration (NULL, FALSE));
10084 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10090 static gboolean printed_headers = FALSE;
10092 if (!printed_headers) {
10093 g_print ("Test Iters First Other\n");
10094 g_print ("-------------------- ----- ---------- ----------\n");
10095 printed_headers = TRUE;
10098 g_get_current_time (&tv0);
10099 bench_iteration (widget, fn);
10100 g_get_current_time (&tv1);
10102 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10103 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10105 g_get_current_time (&tv0);
10106 for (n = 0; n < num - 1; n++)
10107 bench_iteration (widget, fn);
10108 g_get_current_time (&tv1);
10109 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10110 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10112 g_print ("%s %5d ", pad (name, 20), num);
10114 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10116 g_print ("%10.1f\n", dt_first);
10120 do_bench (char* what, int num)
10124 void (* fn) (GtkWidget *widget);
10126 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10128 if (g_ascii_strcasecmp (what, "ALL") == 0)
10130 for (i = 0; i < nbuttons; i++)
10132 if (!buttons[i].do_not_benchmark)
10133 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10140 for (i = 0; i < nbuttons; i++)
10142 if (strcmp (buttons[i].label, what) == 0)
10144 fn = buttons[i].func;
10150 g_print ("Can't bench: \"%s\" not found.\n", what);
10152 do_real_bench (widget, fn, buttons[i].label, num);
10159 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10164 main (int argc, char *argv[])
10166 GtkCssProvider *provider, *memory_provider;
10167 GdkDisplay *display;
10169 GtkBindingSet *binding_set;
10171 gboolean done_benchmarks = FALSE;
10173 srand (time (NULL));
10177 g_set_application_name ("GTK+ Test Program");
10179 gtk_init (&argc, &argv);
10181 provider = gtk_css_provider_new ();
10183 /* Check to see if we are being run from the correct
10186 if (file_exists ("testgtk.css"))
10187 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10188 else if (file_exists ("tests/testgtk.css"))
10189 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10191 g_warning ("Couldn't find file \"testgtk.css\".");
10193 display = gdk_display_get_default ();
10194 screen = gdk_display_get_default_screen (display);
10196 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10197 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10198 g_object_unref (provider);
10200 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10209 for (i = 1; i < argc; i++)
10211 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10218 nextarg = strchr (argv[i], '=');
10229 count = strchr (nextarg, ':');
10232 what = g_strndup (nextarg, count - nextarg);
10234 num = atoi (count);
10239 what = g_strdup (nextarg);
10241 do_bench (what, num ? num : 1);
10242 done_benchmarks = TRUE;
10247 if (done_benchmarks)
10252 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10253 gtk_binding_entry_add_signal (binding_set,
10254 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10257 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10259 memory_provider = gtk_css_provider_new ();
10260 gtk_css_provider_load_from_data (memory_provider,
10261 "#testgtk-version-label {\n"
10263 " font: Sans 18;\n"
10266 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10267 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10269 create_main_window ();
10275 while (g_main_context_pending (NULL))
10276 g_main_context_iteration (NULL, FALSE);
10279 while (g_main_context_pending (NULL))
10280 g_main_context_iteration (NULL, FALSE);