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 table = gtk_table_new (3, 3, FALSE);
662 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
663 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
664 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
665 gtk_box_pack_start (GTK_BOX (box1), table, 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]);
683 gtk_table_attach (GTK_TABLE (table), button[i],
684 button_x[i], button_x[i] + 1,
685 button_y[i], button_y[i] + 1,
686 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
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 table = gtk_table_new (FALSE, 3, 3);
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_table_attach (GTK_TABLE (table), widget,
840 create_check_buttons (GtkWidget *widget)
842 static GtkWidget *window = NULL;
846 GtkWidget *separator;
851 window = gtk_dialog_new_with_buttons ("Check Buttons",
857 gtk_window_set_screen (GTK_WINDOW (window),
858 gtk_widget_get_screen (widget));
860 g_signal_connect (window, "destroy",
861 G_CALLBACK (gtk_widget_destroyed),
863 g_signal_connect (window, "response",
864 G_CALLBACK (gtk_widget_destroy),
867 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
869 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
870 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
871 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
873 button = gtk_check_button_new_with_mnemonic ("_button1");
874 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
876 button = gtk_check_button_new_with_label ("button2");
877 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
879 button = gtk_check_button_new_with_label ("button3");
880 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
882 button = gtk_check_button_new_with_label ("inconsistent");
883 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
884 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
886 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
887 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
889 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
890 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
891 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
894 if (!gtk_widget_get_visible (window))
895 gtk_widget_show_all (window);
897 gtk_widget_destroy (window);
905 create_radio_buttons (GtkWidget *widget)
907 static GtkWidget *window = NULL;
911 GtkWidget *separator;
916 window = gtk_dialog_new_with_buttons ("Radio Buttons",
922 gtk_window_set_screen (GTK_WINDOW (window),
923 gtk_widget_get_screen (widget));
925 g_signal_connect (window, "destroy",
926 G_CALLBACK (gtk_widget_destroyed),
928 g_signal_connect (window, "response",
929 G_CALLBACK (gtk_widget_destroy),
932 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
934 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
935 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
936 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
938 button = gtk_radio_button_new_with_label (NULL, "button1");
939 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
941 button = gtk_radio_button_new_with_label (
942 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
944 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
945 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
947 button = gtk_radio_button_new_with_label (
948 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
950 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
952 button = gtk_radio_button_new_with_label (
953 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
955 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
956 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
958 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
959 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
961 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
962 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
963 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
965 button = gtk_radio_button_new_with_label (NULL, "button4");
966 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
967 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
969 button = gtk_radio_button_new_with_label (
970 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
972 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
973 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
974 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
976 button = gtk_radio_button_new_with_label (
977 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
979 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
980 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
982 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
983 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
985 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
986 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
987 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
990 if (!gtk_widget_get_visible (window))
991 gtk_widget_show_all (window);
993 gtk_widget_destroy (window);
1001 create_bbox (gint horizontal,
1012 frame = gtk_frame_new (title);
1015 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1017 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1019 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1020 gtk_container_add (GTK_CONTAINER (frame), bbox);
1022 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1023 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1025 button = gtk_button_new_with_label ("OK");
1026 gtk_container_add (GTK_CONTAINER (bbox), button);
1028 button = gtk_button_new_with_label ("Cancel");
1029 gtk_container_add (GTK_CONTAINER (bbox), button);
1031 button = gtk_button_new_with_label ("Help");
1032 gtk_container_add (GTK_CONTAINER (bbox), button);
1038 create_button_box (GtkWidget *widget)
1040 static GtkWidget* window = NULL;
1041 GtkWidget *main_vbox;
1044 GtkWidget *frame_horz;
1045 GtkWidget *frame_vert;
1049 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1050 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1051 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1053 g_signal_connect (window, "destroy",
1054 G_CALLBACK (gtk_widget_destroyed),
1057 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1059 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1060 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1062 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1063 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1065 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1066 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1067 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1069 gtk_box_pack_start (GTK_BOX (vbox),
1070 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1073 gtk_box_pack_start (GTK_BOX (vbox),
1074 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1077 gtk_box_pack_start (GTK_BOX (vbox),
1078 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1081 gtk_box_pack_start (GTK_BOX (vbox),
1082 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1085 gtk_box_pack_start (GTK_BOX (vbox),
1086 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1089 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1090 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1092 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1093 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1094 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1096 gtk_box_pack_start (GTK_BOX (hbox),
1097 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1100 gtk_box_pack_start (GTK_BOX (hbox),
1101 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1104 gtk_box_pack_start (GTK_BOX (hbox),
1105 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1108 gtk_box_pack_start (GTK_BOX (hbox),
1109 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1112 gtk_box_pack_start (GTK_BOX (hbox),
1113 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1117 if (!gtk_widget_get_visible (window))
1118 gtk_widget_show_all (window);
1120 gtk_widget_destroy (window);
1128 new_pixbuf (char *filename,
1134 if (strcmp (filename, "test.xpm") == 0)
1137 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1140 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1142 widget = gtk_image_new_from_pixbuf (pixbuf);
1144 g_object_unref (pixbuf);
1151 set_toolbar_small_stock (GtkWidget *widget,
1154 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1158 set_toolbar_large_stock (GtkWidget *widget,
1161 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1165 set_toolbar_horizontal (GtkWidget *widget,
1168 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1172 set_toolbar_vertical (GtkWidget *widget,
1175 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1179 set_toolbar_icons (GtkWidget *widget,
1182 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1186 set_toolbar_text (GtkWidget *widget,
1189 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1193 set_toolbar_both (GtkWidget *widget,
1196 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1200 set_toolbar_both_horiz (GtkWidget *widget,
1203 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1207 set_toolbar_enable (GtkWidget *widget,
1210 GtkSettings *settings = gtk_widget_get_settings (widget);
1211 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1215 set_toolbar_disable (GtkWidget *widget,
1218 GtkSettings *settings = gtk_widget_get_settings (widget);
1219 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1222 static GtkActionEntry create_toolbar_items[] = {
1223 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1224 G_CALLBACK (set_toolbar_small_stock) },
1225 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1226 G_CALLBACK (set_toolbar_large_stock) },
1227 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1228 G_CALLBACK (set_toolbar_horizontal) },
1229 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1230 G_CALLBACK (set_toolbar_vertical) },
1232 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1233 G_CALLBACK (set_toolbar_icons) },
1234 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1235 G_CALLBACK (set_toolbar_text) },
1236 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1237 G_CALLBACK (set_toolbar_both) },
1238 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1239 G_CALLBACK (set_toolbar_both_horiz) },
1241 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1245 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1246 G_CALLBACK (set_toolbar_enable) },
1247 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1248 G_CALLBACK (set_toolbar_disable) },
1250 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1252 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1255 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1257 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1262 create_toolbar (GtkWidget *widget)
1264 static GtkWidget *window = NULL;
1271 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1272 gtk_window_set_screen (GTK_WINDOW (window),
1273 gtk_widget_get_screen (widget));
1275 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1277 g_signal_connect (window, "destroy",
1278 G_CALLBACK (gtk_widget_destroyed),
1281 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1282 gtk_widget_realize (window);
1284 toolbar = gtk_toolbar_new ();
1285 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1287 GtkToolItem *toolitem;
1289 if (create_toolbar_items[i].tooltip == NULL)
1290 toolitem = gtk_separator_tool_item_new ();
1291 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1295 toolitem = gtk_tool_item_new ();
1296 entry = gtk_entry_new ();
1297 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1299 else if (create_toolbar_items[i].stock_id)
1300 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1305 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1306 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1308 if (create_toolbar_items[i].callback)
1309 g_signal_connect (toolitem, "clicked",
1310 create_toolbar_items[i].callback, toolbar);
1311 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1312 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1315 gtk_container_add (GTK_CONTAINER (window), toolbar);
1317 gtk_widget_set_size_request (toolbar, 200, -1);
1320 if (!gtk_widget_get_visible (window))
1321 gtk_widget_show_all (window);
1323 gtk_widget_destroy (window);
1326 static GtkActionEntry make_toolbar_items[] = {
1327 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1328 G_CALLBACK (set_toolbar_horizontal) },
1329 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1330 G_CALLBACK (set_toolbar_vertical) },
1332 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1333 G_CALLBACK (set_toolbar_icons) },
1334 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1335 G_CALLBACK (set_toolbar_text) },
1336 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1337 G_CALLBACK (set_toolbar_both) },
1339 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1341 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1344 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1345 G_CALLBACK (set_toolbar_enable) },
1346 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1347 G_CALLBACK (set_toolbar_disable) },
1349 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1351 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1356 make_toolbar (GtkWidget *window)
1361 if (!gtk_widget_get_realized (window))
1362 gtk_widget_realize (window);
1364 toolbar = gtk_toolbar_new ();
1365 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1368 GtkToolItem *toolitem;
1370 if (make_toolbar_items[i].label == NULL)
1372 toolitem = gtk_separator_tool_item_new ();
1376 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1377 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1378 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1379 if (make_toolbar_items[i].callback != NULL)
1380 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1382 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1392 static guint statusbar_counter = 1;
1395 statusbar_push (GtkWidget *button,
1396 GtkStatusbar *statusbar)
1400 sprintf (text, "something %d", statusbar_counter++);
1402 gtk_statusbar_push (statusbar, 1, text);
1406 statusbar_push_long (GtkWidget *button,
1407 GtkStatusbar *statusbar)
1411 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\").");
1413 gtk_statusbar_push (statusbar, 1, text);
1417 statusbar_pop (GtkWidget *button,
1418 GtkStatusbar *statusbar)
1420 gtk_statusbar_pop (statusbar, 1);
1424 statusbar_steal (GtkWidget *button,
1425 GtkStatusbar *statusbar)
1427 gtk_statusbar_remove (statusbar, 1, 4);
1431 statusbar_popped (GtkStatusbar *statusbar,
1436 statusbar_counter = 1;
1440 statusbar_contexts (GtkStatusbar *statusbar)
1444 string = "any context";
1445 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1447 gtk_statusbar_get_context_id (statusbar, string));
1449 string = "idle messages";
1450 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1452 gtk_statusbar_get_context_id (statusbar, string));
1454 string = "some text";
1455 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1457 gtk_statusbar_get_context_id (statusbar, string));
1459 string = "hit the mouse";
1460 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1462 gtk_statusbar_get_context_id (statusbar, string));
1464 string = "hit the mouse2";
1465 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1467 gtk_statusbar_get_context_id (statusbar, string));
1471 create_statusbar (GtkWidget *widget)
1473 static GtkWidget *window = NULL;
1477 GtkWidget *separator;
1478 GtkWidget *statusbar;
1482 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1483 gtk_window_set_screen (GTK_WINDOW (window),
1484 gtk_widget_get_screen (widget));
1486 g_signal_connect (window, "destroy",
1487 G_CALLBACK (gtk_widget_destroyed),
1490 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1491 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1493 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1494 gtk_container_add (GTK_CONTAINER (window), box1);
1496 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1497 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1498 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1500 statusbar = gtk_statusbar_new ();
1501 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1502 g_signal_connect (statusbar,
1504 G_CALLBACK (statusbar_popped),
1507 button = g_object_new (gtk_button_get_type (),
1508 "label", "push something",
1512 g_object_connect (button,
1513 "signal::clicked", statusbar_push, statusbar,
1516 button = g_object_connect (g_object_new (gtk_button_get_type (),
1521 "signal_after::clicked", statusbar_pop, statusbar,
1524 button = g_object_connect (g_object_new (gtk_button_get_type (),
1525 "label", "steal #4",
1529 "signal_after::clicked", statusbar_steal, statusbar,
1532 button = g_object_connect (g_object_new (gtk_button_get_type (),
1533 "label", "test contexts",
1537 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1540 button = g_object_connect (g_object_new (gtk_button_get_type (),
1541 "label", "push something long",
1545 "signal_after::clicked", statusbar_push_long, statusbar,
1548 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1549 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1551 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1552 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1553 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1555 button = gtk_button_new_with_label ("close");
1556 g_signal_connect_swapped (button, "clicked",
1557 G_CALLBACK (gtk_widget_destroy),
1559 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1560 gtk_widget_set_can_default (button, TRUE);
1561 gtk_widget_grab_default (button);
1564 if (!gtk_widget_get_visible (window))
1565 gtk_widget_show_all (window);
1567 gtk_widget_destroy (window);
1575 handle_box_child_signal (GtkHandleBox *hb,
1577 const gchar *action)
1579 printf ("%s: child <%s> %sed\n",
1580 g_type_name (G_OBJECT_TYPE (hb)),
1581 g_type_name (G_OBJECT_TYPE (child)),
1586 create_handle_box (GtkWidget *widget)
1588 static GtkWidget* window = NULL;
1589 GtkWidget *handle_box;
1590 GtkWidget *handle_box2;
1595 GtkWidget *separator;
1599 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1601 gtk_window_set_screen (GTK_WINDOW (window),
1602 gtk_widget_get_screen (widget));
1603 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1604 gtk_window_set_title (GTK_WINDOW (window),
1606 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1608 g_signal_connect (window, "destroy",
1609 G_CALLBACK (gtk_widget_destroyed),
1612 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1614 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1615 gtk_container_add (GTK_CONTAINER (window), vbox);
1616 gtk_widget_show (vbox);
1618 label = gtk_label_new ("Above");
1619 gtk_container_add (GTK_CONTAINER (vbox), label);
1620 gtk_widget_show (label);
1622 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1623 gtk_container_add (GTK_CONTAINER (vbox), separator);
1624 gtk_widget_show (separator);
1626 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
1627 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1628 gtk_widget_show (hbox);
1630 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1631 gtk_container_add (GTK_CONTAINER (vbox), separator);
1632 gtk_widget_show (separator);
1634 label = gtk_label_new ("Below");
1635 gtk_container_add (GTK_CONTAINER (vbox), label);
1636 gtk_widget_show (label);
1638 handle_box = gtk_handle_box_new ();
1639 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1640 g_signal_connect (handle_box,
1642 G_CALLBACK (handle_box_child_signal),
1644 g_signal_connect (handle_box,
1646 G_CALLBACK (handle_box_child_signal),
1648 gtk_widget_show (handle_box);
1650 toolbar = make_toolbar (window);
1652 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1653 gtk_widget_show (toolbar);
1655 handle_box = gtk_handle_box_new ();
1656 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1657 g_signal_connect (handle_box,
1659 G_CALLBACK (handle_box_child_signal),
1661 g_signal_connect (handle_box,
1663 G_CALLBACK (handle_box_child_signal),
1665 gtk_widget_show (handle_box);
1667 handle_box2 = gtk_handle_box_new ();
1668 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1669 g_signal_connect (handle_box2,
1671 G_CALLBACK (handle_box_child_signal),
1673 g_signal_connect (handle_box2,
1675 G_CALLBACK (handle_box_child_signal),
1677 gtk_widget_show (handle_box2);
1679 hbox = g_object_new (GTK_TYPE_BOX, "visible", 1, "parent", handle_box2, NULL);
1680 label = gtk_label_new ("Fooo!");
1681 gtk_container_add (GTK_CONTAINER (hbox), label);
1682 gtk_widget_show (label);
1683 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1686 if (!gtk_widget_get_visible (window))
1687 gtk_widget_show (window);
1689 gtk_widget_destroy (window);
1696 sensitivity_toggled (GtkWidget *toggle,
1699 gtk_widget_set_sensitive (widget,
1700 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1704 create_sensitivity_control (GtkWidget *widget)
1708 button = gtk_toggle_button_new_with_label ("Sensitive");
1710 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1711 gtk_widget_is_sensitive (widget));
1713 g_signal_connect (button,
1715 G_CALLBACK (sensitivity_toggled),
1718 gtk_widget_show_all (button);
1724 set_selectable_recursive (GtkWidget *widget,
1727 if (GTK_IS_CONTAINER (widget))
1732 children = gtk_container_get_children (GTK_CONTAINER (widget));
1736 set_selectable_recursive (tmp->data, setting);
1740 g_list_free (children);
1742 else if (GTK_IS_LABEL (widget))
1744 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1749 selectable_toggled (GtkWidget *toggle,
1752 set_selectable_recursive (widget,
1753 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1757 create_selectable_control (GtkWidget *widget)
1761 button = gtk_toggle_button_new_with_label ("Selectable");
1763 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1766 g_signal_connect (button,
1768 G_CALLBACK (selectable_toggled),
1771 gtk_widget_show_all (button);
1777 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1781 gtk_widget_destroy (dialog);
1783 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1784 "as hyperlinks, which can be clicked\n"
1785 "or activated via <a href=\"keynav\">keynav</a>.\n"
1786 "The links remain the same.";
1787 gtk_label_set_markup (label, text);
1791 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1793 if (g_strcmp0 (uri, "keynav") == 0)
1797 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1798 GTK_DIALOG_DESTROY_WITH_PARENT,
1801 "The term <i>keynav</i> is a shorthand for "
1802 "keyboard navigation and refers to the process of using a program "
1803 "(exclusively) via keyboard input.");
1805 gtk_window_present (GTK_WINDOW (dialog));
1807 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1815 void create_labels (GtkWidget *widget)
1817 static GtkWidget *window = NULL;
1826 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1828 gtk_window_set_screen (GTK_WINDOW (window),
1829 gtk_widget_get_screen (widget));
1831 g_signal_connect (window, "destroy",
1832 G_CALLBACK (gtk_widget_destroyed),
1835 gtk_window_set_title (GTK_WINDOW (window), "Label");
1837 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1839 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1840 gtk_container_add (GTK_CONTAINER (window), vbox);
1842 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1844 button = create_sensitivity_control (hbox);
1846 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1848 button = create_selectable_control (hbox);
1850 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1852 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1854 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1855 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1857 frame = gtk_frame_new ("Normal Label");
1858 label = gtk_label_new ("This is a Normal label");
1859 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1860 gtk_container_add (GTK_CONTAINER (frame), label);
1861 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1863 frame = gtk_frame_new ("Multi-line Label");
1864 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1865 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1866 gtk_container_add (GTK_CONTAINER (frame), label);
1867 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1869 frame = gtk_frame_new ("Left Justified Label");
1870 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1871 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1872 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1873 gtk_container_add (GTK_CONTAINER (frame), label);
1874 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1876 frame = gtk_frame_new ("Right Justified Label");
1877 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1878 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1879 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1880 gtk_container_add (GTK_CONTAINER (frame), label);
1881 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1883 frame = gtk_frame_new ("Internationalized Label");
1884 label = gtk_label_new (NULL);
1885 gtk_label_set_markup (GTK_LABEL (label),
1886 "French (Fran\303\247ais) Bonjour, Salut\n"
1887 "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"
1888 "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"
1889 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1890 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1891 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1892 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1893 gtk_container_add (GTK_CONTAINER (frame), label);
1894 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1896 frame = gtk_frame_new ("Bidirection Label");
1897 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"
1898 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1899 gtk_container_add (GTK_CONTAINER (frame), label);
1900 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1902 frame = gtk_frame_new ("Links in a label");
1903 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1904 "as hyperlinks, which can be clicked\n"
1905 "or activated via <a href=\"keynav\">keynav</a>");
1906 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1907 gtk_container_add (GTK_CONTAINER (frame), label);
1908 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1909 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1911 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1912 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1913 frame = gtk_frame_new ("Line wrapped label");
1914 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1915 "up the entire "/* big space to test spacing */\
1916 "width allocated to it, but automatically wraps the words to fit. "\
1917 "The time has come, for all good men, to come to the aid of their party. "\
1918 "The sixth sheik's six sheep's sick.\n"\
1919 " It supports multiple paragraphs correctly, and correctly adds "\
1920 "many extra spaces. ");
1922 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1923 gtk_container_add (GTK_CONTAINER (frame), label);
1924 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1926 frame = gtk_frame_new ("Filled, wrapped label");
1927 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
1928 "up the entire width allocated to it. Here is a seneance to prove "\
1929 "my point. Here is another sentence. "\
1930 "Here comes the sun, do de do de do.\n"\
1931 " This is a new paragraph.\n"\
1932 " This is another newer, longer, better paragraph. It is coming to an end, "\
1934 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
1935 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1936 gtk_container_add (GTK_CONTAINER (frame), label);
1937 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1939 frame = gtk_frame_new ("Underlined label");
1940 label = gtk_label_new ("This label is underlined!\n"
1941 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
1942 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1943 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
1944 gtk_container_add (GTK_CONTAINER (frame), label);
1945 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1947 frame = gtk_frame_new ("Markup label");
1948 label = gtk_label_new (NULL);
1950 /* There's also a gtk_label_set_markup() without accel if you
1951 * don't have an accelerator key
1953 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
1954 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
1955 "<b>markup</b> _such as "
1956 "<big><i>Big Italics</i></big>\n"
1957 "<tt>Monospace font</tt>\n"
1958 "<u>Underline!</u>\n"
1960 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
1961 "and nothing on this line,\n"
1964 "or even on this one\n"
1965 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
1966 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
1967 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
1969 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
1971 gtk_container_add (GTK_CONTAINER (frame), label);
1972 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1975 if (!gtk_widget_get_visible (window))
1976 gtk_widget_show_all (window);
1978 gtk_widget_destroy (window);
1982 on_angle_scale_changed (GtkRange *range,
1985 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
1989 create_rotated_label (GtkWidget *widget)
1991 static GtkWidget *window = NULL;
1992 GtkWidget *content_area;
1996 GtkWidget *scale_label;
1997 GtkWidget *scale_hbox;
2001 window = gtk_dialog_new_with_buttons ("Rotated Label",
2002 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2003 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2006 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2008 gtk_window_set_screen (GTK_WINDOW (window),
2009 gtk_widget_get_screen (widget));
2011 g_signal_connect (window, "response",
2012 G_CALLBACK (gtk_widget_destroy), NULL);
2013 g_signal_connect (window, "destroy",
2014 G_CALLBACK (gtk_widget_destroyed), &window);
2016 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2018 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2019 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2020 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2022 label = gtk_label_new (NULL);
2023 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2024 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2026 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2027 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2029 scale_label = gtk_label_new (NULL);
2030 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2031 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2033 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2035 g_signal_connect (hscale, "value-changed",
2036 G_CALLBACK (on_angle_scale_changed), label);
2038 gtk_range_set_value (GTK_RANGE (hscale), 45);
2039 gtk_widget_set_size_request (hscale, 200, -1);
2040 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2043 if (!gtk_widget_get_visible (window))
2044 gtk_widget_show_all (window);
2046 gtk_widget_destroy (window);
2049 #define DEFAULT_TEXT_RADIUS 200
2052 on_rotated_text_unrealize (GtkWidget *widget)
2054 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2058 on_rotated_text_draw (GtkWidget *widget,
2060 GdkPixbuf *tile_pixbuf)
2062 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2063 "had", "10,000", "men" };
2068 PangoLayout *layout;
2069 PangoContext *context;
2070 PangoFontDescription *desc;
2074 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2075 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2078 cairo_set_source_rgb (cr, 0, 0, 0);
2080 width = gtk_widget_get_allocated_width (widget);
2081 height = gtk_widget_get_allocated_height (widget);
2082 radius = MIN (width, height) / 2.;
2084 cairo_translate (cr,
2085 radius + (width - 2 * radius) / 2,
2086 radius + (height - 2 * radius) / 2);
2087 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2089 context = gtk_widget_get_pango_context (widget);
2090 layout = pango_layout_new (context);
2091 desc = pango_font_description_from_string ("Sans Bold 30");
2092 pango_layout_set_font_description (layout, desc);
2093 pango_font_description_free (desc);
2095 n_words = G_N_ELEMENTS (words);
2096 for (i = 0; i < n_words; i++)
2102 cairo_rotate (cr, 2 * G_PI * i / n_words);
2103 pango_cairo_update_layout (cr, layout);
2105 pango_layout_set_text (layout, words[i], -1);
2106 pango_layout_get_size (layout, &width, &height);
2108 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2109 pango_cairo_show_layout (cr, layout);
2114 g_object_unref (layout);
2120 create_rotated_text (GtkWidget *widget)
2122 static GtkWidget *window = NULL;
2126 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
2127 GtkRequisition requisition;
2128 GtkWidget *content_area;
2129 GtkWidget *drawing_area;
2130 GdkPixbuf *tile_pixbuf;
2132 window = gtk_dialog_new_with_buttons ("Rotated Text",
2133 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2134 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2137 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2139 gtk_window_set_screen (GTK_WINDOW (window),
2140 gtk_widget_get_screen (widget));
2142 g_signal_connect (window, "response",
2143 G_CALLBACK (gtk_widget_destroy), NULL);
2144 g_signal_connect (window, "destroy",
2145 G_CALLBACK (gtk_widget_destroyed), &window);
2147 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2149 drawing_area = gtk_drawing_area_new ();
2150 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2151 gtk_widget_override_background_color (drawing_area, 0, &white);
2153 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2155 g_signal_connect (drawing_area, "draw",
2156 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2157 g_signal_connect (drawing_area, "unrealize",
2158 G_CALLBACK (on_rotated_text_unrealize), NULL);
2160 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2162 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2163 gtk_widget_get_preferred_size ( (window),
2164 &requisition, NULL);
2165 gtk_widget_set_size_request (drawing_area, -1, -1);
2166 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2169 if (!gtk_widget_get_visible (window))
2170 gtk_widget_show (window);
2172 gtk_widget_destroy (window);
2180 reparent_label (GtkWidget *widget,
2181 GtkWidget *new_parent)
2185 label = g_object_get_data (G_OBJECT (widget), "user_data");
2187 gtk_widget_reparent (label, new_parent);
2191 set_parent_signal (GtkWidget *child,
2192 GtkWidget *old_parent,
2197 parent = gtk_widget_get_parent (child);
2198 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2199 g_type_name (G_OBJECT_TYPE (child)),
2200 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2201 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2202 GPOINTER_TO_INT (func_data));
2206 create_reparent (GtkWidget *widget)
2208 static GtkWidget *window = NULL;
2215 GtkWidget *separator;
2216 GtkWidget *event_box;
2220 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2222 gtk_window_set_screen (GTK_WINDOW (window),
2223 gtk_widget_get_screen (widget));
2225 g_signal_connect (window, "destroy",
2226 G_CALLBACK (gtk_widget_destroyed),
2229 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2230 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2232 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2233 gtk_container_add (GTK_CONTAINER (window), box1);
2235 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2236 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2237 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2239 label = gtk_label_new ("Hello World");
2241 frame = gtk_frame_new ("Frame 1");
2242 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2244 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2245 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2246 gtk_container_add (GTK_CONTAINER (frame), box3);
2248 button = gtk_button_new_with_label ("switch");
2249 g_object_set_data (G_OBJECT (button), "user_data", label);
2250 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2252 event_box = gtk_event_box_new ();
2253 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2254 gtk_container_add (GTK_CONTAINER (event_box), label);
2256 g_signal_connect (button, "clicked",
2257 G_CALLBACK (reparent_label),
2260 g_signal_connect (label, "parent_set",
2261 G_CALLBACK (set_parent_signal),
2262 GINT_TO_POINTER (42));
2264 frame = gtk_frame_new ("Frame 2");
2265 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2267 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2268 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2269 gtk_container_add (GTK_CONTAINER (frame), box3);
2271 button = gtk_button_new_with_label ("switch");
2272 g_object_set_data (G_OBJECT (button), "user_data", label);
2273 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2275 event_box = gtk_event_box_new ();
2276 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2278 g_signal_connect (button, "clicked",
2279 G_CALLBACK (reparent_label),
2282 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2283 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2285 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2286 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2287 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2289 button = gtk_button_new_with_label ("close");
2290 g_signal_connect_swapped (button, "clicked",
2291 G_CALLBACK (gtk_widget_destroy), window);
2292 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2293 gtk_widget_set_can_default (button, TRUE);
2294 gtk_widget_grab_default (button);
2297 if (!gtk_widget_get_visible (window))
2298 gtk_widget_show_all (window);
2300 gtk_widget_destroy (window);
2307 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2309 if (event->type == GDK_BUTTON_PRESS)
2311 if (event->button == 1)
2312 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2313 event->button, event->x_root, event->y_root,
2315 else if (event->button == 2)
2316 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2317 event->button, event->x_root, event->y_root,
2324 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2326 GtkStyleContext *context;
2327 GtkJunctionSides sides;
2331 case GDK_WINDOW_EDGE_NORTH_WEST:
2332 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2334 case GDK_WINDOW_EDGE_NORTH:
2335 sides = GTK_JUNCTION_TOP;
2337 case GDK_WINDOW_EDGE_NORTH_EAST:
2338 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2340 case GDK_WINDOW_EDGE_WEST:
2341 sides = GTK_JUNCTION_LEFT;
2343 case GDK_WINDOW_EDGE_EAST:
2344 sides = GTK_JUNCTION_RIGHT;
2346 case GDK_WINDOW_EDGE_SOUTH_WEST:
2347 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2349 case GDK_WINDOW_EDGE_SOUTH:
2350 sides = GTK_JUNCTION_BOTTOM;
2352 case GDK_WINDOW_EDGE_SOUTH_EAST:
2353 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2356 g_assert_not_reached();
2359 context = gtk_widget_get_style_context (area);
2360 gtk_style_context_save (context);
2361 gtk_style_context_add_class (context, "grip");
2362 gtk_style_context_set_junction_sides (context, sides);
2363 gtk_render_handle (context, cr,
2365 gtk_widget_get_allocated_width (area),
2366 gtk_widget_get_allocated_height (area));
2368 gtk_style_context_restore (context);
2374 create_resize_grips (GtkWidget *widget)
2376 static GtkWidget *window = NULL;
2378 GtkWidget *hbox, *vbox;
2381 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2383 gtk_window_set_screen (GTK_WINDOW (window),
2384 gtk_widget_get_screen (widget));
2386 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2388 g_signal_connect (window, "destroy",
2389 G_CALLBACK (gtk_widget_destroyed),
2392 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2393 gtk_container_add (GTK_CONTAINER (window), vbox);
2395 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2396 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2399 area = gtk_drawing_area_new ();
2400 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2401 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2402 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2403 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2404 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2405 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2408 area = gtk_drawing_area_new ();
2409 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2410 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2411 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2412 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2413 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2414 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2417 area = gtk_drawing_area_new ();
2418 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2419 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2420 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2421 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2422 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2423 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2425 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2426 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2429 area = gtk_drawing_area_new ();
2430 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2431 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2432 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2433 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2434 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2435 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2438 area = gtk_drawing_area_new ();
2439 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2442 area = gtk_drawing_area_new ();
2443 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2444 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2445 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2446 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2447 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2448 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2451 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2452 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2455 area = gtk_drawing_area_new ();
2456 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2457 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2458 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2459 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2460 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2461 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2463 area = gtk_drawing_area_new ();
2464 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2465 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2466 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2467 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2468 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2469 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2472 area = gtk_drawing_area_new ();
2473 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2474 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2475 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2476 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2477 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2478 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2481 if (!gtk_widget_get_visible (window))
2482 gtk_widget_show_all (window);
2484 gtk_widget_destroy (window);
2490 gint upositionx = 0;
2491 gint upositiony = 0;
2494 uposition_configure (GtkWidget *window)
2500 lx = g_object_get_data (G_OBJECT (window), "x");
2501 ly = g_object_get_data (G_OBJECT (window), "y");
2503 gdk_window_get_root_origin (gtk_widget_get_window (window),
2504 &upositionx, &upositiony);
2505 sprintf (buffer, "%d", upositionx);
2506 gtk_label_set_text (lx, buffer);
2507 sprintf (buffer, "%d", upositiony);
2508 gtk_label_set_text (ly, buffer);
2514 uposition_stop_configure (GtkToggleButton *toggle,
2517 if (gtk_toggle_button_get_active (toggle))
2518 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2520 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2524 create_saved_position (GtkWidget *widget)
2526 static GtkWidget *window = NULL;
2531 GtkWidget *main_vbox;
2539 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2540 "type", GTK_WINDOW_TOPLEVEL,
2541 "title", "Saved Position",
2543 "signal::configure_event", uposition_configure, NULL,
2546 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2548 gtk_window_set_screen (GTK_WINDOW (window),
2549 gtk_widget_get_screen (widget));
2552 g_signal_connect (window, "destroy",
2553 G_CALLBACK (gtk_widget_destroyed),
2556 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2557 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2558 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2561 g_object_new (GTK_TYPE_BOX,
2562 "orientation", GTK_ORIENTATION_VERTICAL,
2563 "GtkBox::homogeneous", FALSE,
2564 "GtkBox::spacing", 5,
2565 "GtkContainer::border_width", 10,
2566 "GtkWidget::parent", main_vbox,
2567 "GtkWidget::visible", TRUE,
2568 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2569 "label", "Stop Events",
2573 "signal::clicked", uposition_stop_configure, window,
2577 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2578 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2579 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2581 label = gtk_label_new ("X Origin : ");
2582 gtk_widget_set_halign (label, GTK_ALIGN_START);
2583 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2584 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2586 x_label = gtk_label_new ("");
2587 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2588 g_object_set_data (G_OBJECT (window), "x", x_label);
2590 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2591 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2592 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2594 label = gtk_label_new ("Y Origin : ");
2595 gtk_widget_set_halign (label, GTK_ALIGN_START);
2596 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2597 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2599 y_label = gtk_label_new ("");
2600 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2601 g_object_set_data (G_OBJECT (window), "y", y_label);
2604 g_object_new (gtk_separator_get_type (),
2605 "GtkWidget::visible", TRUE,
2607 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2609 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2610 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2611 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2613 button = gtk_button_new_with_label ("Close");
2614 g_signal_connect_swapped (button, "clicked",
2615 G_CALLBACK (gtk_widget_destroy),
2617 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2618 gtk_widget_set_can_default (button, TRUE);
2619 gtk_widget_grab_default (button);
2621 gtk_widget_show_all (window);
2624 gtk_widget_destroy (window);
2632 create_pixbuf (GtkWidget *widget)
2634 static GtkWidget *window = NULL;
2640 GtkWidget *separator;
2641 GtkWidget *pixbufwid;
2642 GdkWindow *gdk_window;
2646 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2648 gtk_window_set_screen (GTK_WINDOW (window),
2649 gtk_widget_get_screen (widget));
2651 g_signal_connect (window, "destroy",
2652 G_CALLBACK (gtk_widget_destroyed),
2655 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2656 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2657 gtk_widget_realize(window);
2659 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2660 gtk_container_add (GTK_CONTAINER (window), box1);
2662 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2663 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2664 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2666 button = gtk_button_new ();
2667 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2669 gdk_window = gtk_widget_get_window (window);
2671 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2673 label = gtk_label_new ("Pixbuf\ntest");
2674 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2675 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2676 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2677 gtk_container_add (GTK_CONTAINER (box3), label);
2678 gtk_container_add (GTK_CONTAINER (button), box3);
2680 button = gtk_button_new ();
2681 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2683 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2685 label = gtk_label_new ("Pixbuf\ntest");
2686 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2687 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2688 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2689 gtk_container_add (GTK_CONTAINER (box3), label);
2690 gtk_container_add (GTK_CONTAINER (button), box3);
2692 gtk_widget_set_sensitive (button, FALSE);
2694 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2695 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2697 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2698 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2699 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2701 button = gtk_button_new_with_label ("close");
2702 g_signal_connect_swapped (button, "clicked",
2703 G_CALLBACK (gtk_widget_destroy),
2705 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2706 gtk_widget_set_can_default (button, TRUE);
2707 gtk_widget_grab_default (button);
2710 if (!gtk_widget_get_visible (window))
2711 gtk_widget_show_all (window);
2713 gtk_widget_destroy (window);
2717 create_tooltips (GtkWidget *widget)
2719 static GtkWidget *window = NULL;
2726 GtkWidget *separator;
2731 g_object_new (gtk_window_get_type (),
2732 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2733 "GtkContainer::border_width", 0,
2734 "GtkWindow::title", "Tooltips",
2735 "GtkWindow::resizable", FALSE,
2738 gtk_window_set_screen (GTK_WINDOW (window),
2739 gtk_widget_get_screen (widget));
2741 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2742 gtk_container_add (GTK_CONTAINER (window), box1);
2744 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2745 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2746 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2748 button = gtk_toggle_button_new_with_label ("button1");
2749 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2751 gtk_widget_set_tooltip_text (button, "This is button 1");
2753 button = gtk_toggle_button_new_with_label ("button2");
2754 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2756 gtk_widget_set_tooltip_text (button,
2757 "This is button 2. This is also a really long tooltip which probably "
2758 "won't fit on a single line and will therefore need to be wrapped. "
2759 "Hopefully the wrapping will work correctly.");
2761 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2762 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2764 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2767 g_object_new (GTK_TYPE_BOX,
2768 "orientation", GTK_ORIENTATION_VERTICAL,
2769 "homogeneous", FALSE,
2776 g_object_new (gtk_button_get_type (),
2781 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2782 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2784 frame = g_object_new (gtk_frame_get_type (),
2785 "label", "ToolTips Inspector",
2786 "label_xalign", (double) 0.5,
2792 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2794 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2795 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2797 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2798 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2799 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2801 button = gtk_button_new_with_label ("close");
2802 g_signal_connect_swapped (button, "clicked",
2803 G_CALLBACK (gtk_widget_destroy),
2805 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2806 gtk_widget_set_can_default (button, TRUE);
2807 gtk_widget_grab_default (button);
2809 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2812 if (!gtk_widget_get_visible (window))
2813 gtk_widget_show_all (window);
2815 gtk_widget_destroy (window);
2823 pack_image (GtkWidget *box,
2827 gtk_box_pack_start (GTK_BOX (box),
2828 gtk_label_new (text),
2831 gtk_box_pack_start (GTK_BOX (box),
2837 create_image (GtkWidget *widget)
2839 static GtkWidget *window = NULL;
2846 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2848 gtk_window_set_screen (GTK_WINDOW (window),
2849 gtk_widget_get_screen (widget));
2851 /* this is bogus for testing drawing when allocation < request,
2852 * don't copy into real code
2854 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2856 g_signal_connect (window, "destroy",
2857 G_CALLBACK (gtk_widget_destroyed),
2860 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2862 gtk_container_add (GTK_CONTAINER (window), vbox);
2864 pack_image (vbox, "Stock Warning Dialog",
2865 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2866 GTK_ICON_SIZE_DIALOG));
2868 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2870 pack_image (vbox, "Pixbuf",
2871 gtk_image_new_from_pixbuf (pixbuf));
2873 g_object_unref (pixbuf);
2876 if (!gtk_widget_get_visible (window))
2877 gtk_widget_show_all (window);
2879 gtk_widget_destroy (window);
2887 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2890 GtkWidget *menuitem;
2899 menu = gtk_menu_new ();
2900 gtk_menu_set_screen (GTK_MENU (menu), screen);
2906 menuitem = gtk_tearoff_menu_item_new ();
2907 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2908 gtk_widget_show (menuitem);
2911 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2912 GTK_ICON_SIZE_MENU);
2913 gtk_widget_show (image);
2914 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2915 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2916 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2917 gtk_widget_show (menuitem);
2919 for (i = 0, j = 1; i < length; i++, j++)
2921 sprintf (buf, "item %2d - %d", depth, j);
2923 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2924 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2926 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2927 gtk_widget_show (menuitem);
2929 gtk_widget_set_sensitive (menuitem, FALSE);
2932 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
2936 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
2937 create_menu (screen, depth - 1, 5, TRUE));
2944 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
2947 GtkWidget *menuitem;
2953 menu = gtk_menu_new ();
2954 gtk_menu_set_screen (GTK_MENU (menu), screen);
2959 menuitem = gtk_tearoff_menu_item_new ();
2960 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
2961 gtk_widget_show (menuitem);
2965 menuitem = gtk_menu_item_new_with_label ("items");
2966 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
2968 submenu = gtk_menu_new ();
2969 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2970 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2971 gtk_widget_show (menuitem);
2974 /* now fill the items submenu */
2975 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2976 GTK_ICON_SIZE_MENU);
2977 gtk_widget_show (image);
2978 menuitem = gtk_image_menu_item_new_with_label ("Image");
2979 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2980 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
2981 gtk_widget_show (menuitem);
2983 menuitem = gtk_menu_item_new_with_label ("x");
2984 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
2985 gtk_widget_show (menuitem);
2987 menuitem = gtk_menu_item_new_with_label ("x");
2988 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
2989 gtk_widget_show (menuitem);
2991 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2992 GTK_ICON_SIZE_MENU);
2993 gtk_widget_show (image);
2994 menuitem = gtk_image_menu_item_new_with_label ("Image");
2995 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2996 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
2997 gtk_widget_show (menuitem);
2999 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3000 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3001 gtk_widget_show (menuitem);
3003 menuitem = gtk_menu_item_new_with_label ("x");
3004 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3005 gtk_widget_show (menuitem);
3007 menuitem = gtk_menu_item_new_with_label ("x");
3008 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3009 gtk_widget_show (menuitem);
3011 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3012 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3013 gtk_widget_show (menuitem);
3015 menuitem = gtk_check_menu_item_new_with_label ("Check");
3016 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3017 gtk_widget_show (menuitem);
3019 menuitem = gtk_menu_item_new_with_label ("x");
3020 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3021 gtk_widget_show (menuitem);
3023 menuitem = gtk_menu_item_new_with_label ("x");
3024 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3025 gtk_widget_show (menuitem);
3027 menuitem = gtk_check_menu_item_new_with_label ("Check");
3028 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3029 gtk_widget_show (menuitem);
3031 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3032 gtk_widget_show (menuitem);
3033 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3035 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3036 gtk_widget_show (menuitem);
3037 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3039 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3040 gtk_widget_show (menuitem);
3041 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3043 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3044 gtk_widget_show (menuitem);
3045 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3047 /* end of items submenu */
3049 menuitem = gtk_menu_item_new_with_label ("spanning");
3050 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3052 submenu = gtk_menu_new ();
3053 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3054 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3055 gtk_widget_show (menuitem);
3058 /* now fill the spanning submenu */
3059 menuitem = gtk_menu_item_new_with_label ("a");
3060 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3061 gtk_widget_show (menuitem);
3063 menuitem = gtk_menu_item_new_with_label ("b");
3064 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3065 gtk_widget_show (menuitem);
3067 menuitem = gtk_menu_item_new_with_label ("c");
3068 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3069 gtk_widget_show (menuitem);
3071 menuitem = gtk_menu_item_new_with_label ("d");
3072 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3073 gtk_widget_show (menuitem);
3075 menuitem = gtk_menu_item_new_with_label ("e");
3076 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3077 gtk_widget_show (menuitem);
3078 /* end of spanning submenu */
3080 menuitem = gtk_menu_item_new_with_label ("left");
3081 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3082 submenu = gtk_menu_new ();
3083 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3084 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3085 gtk_widget_show (menuitem);
3087 menuitem = gtk_menu_item_new_with_label ("Empty");
3088 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3089 submenu = gtk_menu_new ();
3090 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3091 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3092 gtk_widget_show (menuitem);
3094 menuitem = gtk_menu_item_new_with_label ("right");
3095 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3096 submenu = gtk_menu_new ();
3097 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3098 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3099 gtk_widget_show (menuitem);
3101 menuitem = gtk_menu_item_new_with_label ("Empty");
3102 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3103 gtk_widget_show (menuitem);
3107 for (; j < rows; j++)
3108 for (i = 0; i < cols; i++)
3110 sprintf (buf, "(%d %d)", i, j);
3111 menuitem = gtk_menu_item_new_with_label (buf);
3112 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3113 gtk_widget_show (menuitem);
3116 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3117 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3118 gtk_widget_show (menuitem);
3119 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3120 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3121 gtk_widget_show (menuitem);
3122 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3123 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3124 gtk_widget_show (menuitem);
3125 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3126 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3127 gtk_widget_show (menuitem);
3133 create_menus (GtkWidget *widget)
3135 static GtkWidget *window = NULL;
3139 GtkWidget *optionmenu;
3140 GtkWidget *separator;
3146 GtkWidget *menuitem;
3147 GtkAccelGroup *accel_group;
3149 GdkScreen *screen = gtk_widget_get_screen (widget);
3151 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3153 gtk_window_set_screen (GTK_WINDOW (window), screen);
3155 g_signal_connect (window, "destroy",
3156 G_CALLBACK (gtk_widget_destroyed),
3158 g_signal_connect (window, "delete-event",
3159 G_CALLBACK (gtk_true),
3162 accel_group = gtk_accel_group_new ();
3163 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3165 gtk_window_set_title (GTK_WINDOW (window), "menus");
3166 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3169 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3170 gtk_container_add (GTK_CONTAINER (window), box1);
3171 gtk_widget_show (box1);
3173 menubar = gtk_menu_bar_new ();
3174 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3175 gtk_widget_show (menubar);
3177 menu = create_menu (screen, 2, 50, TRUE);
3179 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3180 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3181 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3182 gtk_widget_show (menuitem);
3184 menu = create_table_menu (screen, 2, 50, TRUE);
3186 menuitem = gtk_menu_item_new_with_label ("table");
3187 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3188 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3189 gtk_widget_show (menuitem);
3191 menuitem = gtk_menu_item_new_with_label ("foo");
3192 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3193 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3194 gtk_widget_show (menuitem);
3196 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3197 GTK_ICON_SIZE_MENU);
3198 gtk_widget_show (image);
3199 menuitem = gtk_image_menu_item_new_with_label ("Help");
3200 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3201 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3202 gtk_widget_set_hexpand (menuitem, TRUE);
3203 gtk_widget_set_halign (menuitem, GTK_ALIGN_END);
3204 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3205 gtk_widget_show (menuitem);
3207 menubar = gtk_menu_bar_new ();
3208 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3209 gtk_widget_show (menubar);
3211 menu = create_menu (screen, 2, 10, TRUE);
3213 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3214 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3215 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3216 gtk_widget_show (menuitem);
3218 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3219 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3220 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3221 gtk_widget_show (box2);
3223 menu = create_menu (screen, 1, 5, FALSE);
3224 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3226 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3227 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3228 gtk_widget_show (menuitem);
3230 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3231 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3232 gtk_widget_show (menuitem);
3233 gtk_widget_add_accelerator (menuitem,
3239 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3240 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3241 gtk_widget_show (menuitem);
3242 gtk_widget_add_accelerator (menuitem,
3247 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3248 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3249 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3250 gtk_widget_show (menuitem);
3251 gtk_widget_add_accelerator (menuitem,
3257 gtk_widget_add_accelerator (menuitem,
3264 optionmenu = gtk_combo_box_text_new ();
3265 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3266 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3267 gtk_widget_show (optionmenu);
3269 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3270 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3271 gtk_widget_show (separator);
3273 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3274 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3275 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3276 gtk_widget_show (box2);
3278 button = gtk_button_new_with_label ("close");
3279 g_signal_connect_swapped (button, "clicked",
3280 G_CALLBACK (gtk_widget_destroy),
3282 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3283 gtk_widget_set_can_default (button, TRUE);
3284 gtk_widget_grab_default (button);
3285 gtk_widget_show (button);
3288 if (!gtk_widget_get_visible (window))
3289 gtk_widget_show (window);
3291 gtk_widget_destroy (window);
3294 /* GdkPixbuf RGBA C-Source image dump */
3296 static const guint8 apple[] =
3298 /* Pixbuf magic (0x47646b50) */
3300 /* length: header (24) + pixel_data (2304) */
3302 /* pixdata_type (0x1010002) */
3304 /* rowstride (96) */
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\0\0"
3315 "\0\0\0\0\0\0\0\0\0\0\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\0"
3317 "\0\0\0\0\0\0\0\0\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"
3318 "\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"
3319 "\0\0\0\0\0\0\0\0\0\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"
3320 "[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"
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\0\0\0\0\0\0\0\0\0\0\0`l[Blza\373s\202d\354w\206g\372p~c"
3323 "\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"
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\0\0"
3325 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3326 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3327 "\0\0\0\0\0\0\0\0\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"
3328 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3329 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3330 "\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["
3331 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3332 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3333 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3334 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3335 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3336 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3337 "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"
3338 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3339 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3340 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3341 "\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"
3342 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3343 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3344 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3345 "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"
3346 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3347 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3348 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3349 "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"
3350 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3351 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3352 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3353 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3354 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3355 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3356 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3357 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3358 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3359 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3360 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3361 "\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>"
3362 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3363 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3364 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3365 "\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"
3366 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3367 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3368 "\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"
3369 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3370 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3371 "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"
3372 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3373 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3374 "\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"
3375 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3376 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3377 "\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"
3378 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3379 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3380 "\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"
3381 "\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"
3382 "\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"
3383 "\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"
3384 "\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"
3385 "\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"
3386 "\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"
3387 "\0\0\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"
3388 "\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"
3389 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3393 accel_button_new (GtkAccelGroup *accel_group,
3398 GdkModifierType modifiers;
3402 gtk_accelerator_parse (accel, &keyval, &modifiers);
3405 button = gtk_button_new ();
3406 gtk_widget_add_accelerator (button, "activate", accel_group,
3407 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3409 label = gtk_accel_label_new (text);
3410 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3411 gtk_widget_show (label);
3413 gtk_container_add (GTK_CONTAINER (button), label);
3419 create_key_lookup (GtkWidget *widget)
3421 static GtkWidget *window = NULL;
3422 gpointer window_ptr;
3426 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3428 GtkWidget *content_area;
3430 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3431 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3434 gtk_window_set_screen (GTK_WINDOW (window),
3435 gtk_widget_get_screen (widget));
3437 /* We have to expand it so the accel labels will draw their labels
3439 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3441 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3443 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3445 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3446 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3447 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3448 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3449 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3450 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3451 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3452 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3453 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3454 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3455 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3456 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3457 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3458 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3459 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3460 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3461 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3462 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3463 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3464 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3465 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3466 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3467 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3468 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3469 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3470 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3471 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3472 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3474 window_ptr = &window;
3475 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3476 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3478 gtk_widget_show_all (window);
3481 gtk_widget_destroy (window);
3490 cmw_destroy_cb(GtkWidget *widget)
3492 /* This is needed to get out of gtk_main */
3499 cmw_color (GtkWidget *widget, GtkWidget *parent)
3502 GtkWidget *colorsel;
3503 GtkWidget *ok_button, *cancel_button;
3505 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3507 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3509 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3510 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3514 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3516 /* And mark it as a transient dialog */
3517 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3519 g_signal_connect (csd, "destroy",
3520 G_CALLBACK (cmw_destroy_cb), NULL);
3523 "ok-button", &ok_button,
3524 "cancel-button", &cancel_button,
3527 g_signal_connect_swapped (ok_button,
3528 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3529 g_signal_connect_swapped (cancel_button,
3530 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3532 /* wait until destroy calls gtk_main_quit */
3533 gtk_widget_show (csd);
3538 cmw_file (GtkWidget *widget, GtkWidget *parent)
3542 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3543 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3544 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3545 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3547 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3548 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3550 g_signal_connect (fs, "destroy",
3551 G_CALLBACK (cmw_destroy_cb), NULL);
3552 g_signal_connect_swapped (fs, "response",
3553 G_CALLBACK (gtk_widget_destroy), fs);
3555 /* wait until destroy calls gtk_main_quit */
3556 gtk_widget_show (fs);
3562 create_modal_window (GtkWidget *widget)
3564 GtkWidget *window = NULL;
3565 GtkWidget *box1,*box2;
3567 GtkWidget *btnColor,*btnFile,*btnClose;
3569 /* Create modal window (Here you can use any window descendent )*/
3570 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3571 gtk_window_set_screen (GTK_WINDOW (window),
3572 gtk_widget_get_screen (widget));
3574 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3576 /* Set window as modal */
3577 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3579 /* Create widgets */
3580 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3581 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3582 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3583 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3584 btnColor = gtk_button_new_with_label ("Color");
3585 btnFile = gtk_button_new_with_label ("File Selection");
3586 btnClose = gtk_button_new_with_label ("Close");
3589 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3590 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3593 gtk_container_add (GTK_CONTAINER (window), box1);
3594 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3595 gtk_container_add (GTK_CONTAINER (frame1), box2);
3596 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3597 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3598 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3599 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3601 /* connect signals */
3602 g_signal_connect_swapped (btnClose, "clicked",
3603 G_CALLBACK (gtk_widget_destroy), window);
3605 g_signal_connect (window, "destroy",
3606 G_CALLBACK (cmw_destroy_cb), NULL);
3608 g_signal_connect (btnColor, "clicked",
3609 G_CALLBACK (cmw_color), window);
3610 g_signal_connect (btnFile, "clicked",
3611 G_CALLBACK (cmw_file), window);
3614 gtk_widget_show_all (window);
3616 /* wait until dialog get destroyed */
3625 make_message_dialog (GdkScreen *screen,
3627 GtkMessageType type,
3628 GtkButtonsType buttons,
3629 guint default_response)
3633 gtk_widget_destroy (*dialog);
3638 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3639 "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.)");
3641 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3643 g_signal_connect_swapped (*dialog,
3645 G_CALLBACK (gtk_widget_destroy),
3648 g_signal_connect (*dialog,
3650 G_CALLBACK (gtk_widget_destroyed),
3653 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3655 gtk_widget_show (*dialog);
3659 create_message_dialog (GtkWidget *widget)
3661 static GtkWidget *info = NULL;
3662 static GtkWidget *warning = NULL;
3663 static GtkWidget *error = NULL;
3664 static GtkWidget *question = NULL;
3665 GdkScreen *screen = gtk_widget_get_screen (widget);
3667 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3668 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3669 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3670 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3677 static GtkWidget *sw_parent = NULL;
3678 static GtkWidget *sw_float_parent;
3679 static gulong sw_destroyed_handler = 0;
3682 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3684 gtk_widget_reparent (scrollwin, sw_parent);
3686 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3687 sw_float_parent = NULL;
3689 sw_destroyed_handler = 0;
3695 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3697 gtk_widget_destroy (sw_float_parent);
3699 sw_float_parent = NULL;
3701 sw_destroyed_handler = 0;
3705 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3709 gtk_widget_reparent (scrollwin, sw_parent);
3710 gtk_widget_destroy (sw_float_parent);
3712 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3713 sw_float_parent = NULL;
3715 sw_destroyed_handler = 0;
3719 sw_parent = gtk_widget_get_parent (scrollwin);
3720 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3721 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3722 gtk_widget_get_screen (widget));
3724 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3726 gtk_widget_reparent (scrollwin, sw_float_parent);
3727 gtk_widget_show (sw_float_parent);
3729 sw_destroyed_handler =
3730 g_signal_connect (sw_parent, "destroy",
3731 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3732 g_signal_connect (sw_float_parent, "delete_event",
3733 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3738 create_scrolled_windows (GtkWidget *widget)
3740 static GtkWidget *window;
3741 GtkWidget *content_area, *action_area;
3742 GtkWidget *scrolled_window;
3750 window = gtk_dialog_new ();
3752 gtk_window_set_screen (GTK_WINDOW (window),
3753 gtk_widget_get_screen (widget));
3755 g_signal_connect (window, "destroy",
3756 G_CALLBACK (gtk_widget_destroyed),
3759 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3760 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3762 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3763 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3765 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3766 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3767 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3768 GTK_POLICY_AUTOMATIC,
3769 GTK_POLICY_AUTOMATIC);
3770 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3771 gtk_widget_show (scrolled_window);
3773 table = gtk_table_new (20, 20, FALSE);
3774 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
3775 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
3776 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
3777 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
3778 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3779 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
3780 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3781 gtk_widget_show (table);
3783 for (i = 0; i < 20; i++)
3784 for (j = 0; j < 20; j++)
3786 sprintf (buffer, "button (%d,%d)\n", i, j);
3787 button = gtk_toggle_button_new_with_label (buffer);
3788 gtk_table_attach_defaults (GTK_TABLE (table), button,
3790 gtk_widget_show (button);
3794 button = gtk_button_new_with_label ("Close");
3795 g_signal_connect_swapped (button, "clicked",
3796 G_CALLBACK (gtk_widget_destroy),
3798 gtk_widget_set_can_default (button, TRUE);
3799 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3800 gtk_widget_grab_default (button);
3801 gtk_widget_show (button);
3803 button = gtk_button_new_with_label ("Reparent Out");
3804 g_signal_connect (button, "clicked",
3805 G_CALLBACK (scrolled_windows_remove),
3807 gtk_widget_set_can_default (button, TRUE);
3808 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3809 gtk_widget_grab_default (button);
3810 gtk_widget_show (button);
3812 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3815 if (!gtk_widget_get_visible (window))
3816 gtk_widget_show (window);
3818 gtk_widget_destroy (window);
3826 entry_toggle_frame (GtkWidget *checkbutton,
3829 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3830 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3834 entry_toggle_sensitive (GtkWidget *checkbutton,
3837 gtk_widget_set_sensitive (entry,
3838 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3842 entry_progress_timeout (gpointer data)
3844 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3846 gtk_entry_progress_pulse (GTK_ENTRY (data));
3852 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3855 if (fraction > 1.0001)
3858 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3865 entry_remove_timeout (gpointer data)
3867 g_source_remove (GPOINTER_TO_UINT (data));
3871 entry_toggle_progress (GtkWidget *checkbutton,
3874 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3876 guint timeout = gdk_threads_add_timeout (100,
3877 entry_progress_timeout,
3879 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3880 GUINT_TO_POINTER (timeout),
3881 entry_remove_timeout);
3885 g_object_set_data (G_OBJECT (entry), "timeout-id",
3886 GUINT_TO_POINTER (0));
3888 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3893 entry_toggle_pulse (GtkWidget *checkbutton,
3896 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3897 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3901 props_clicked (GtkWidget *button,
3904 GtkWidget *window = create_prop_editor (object, 0);
3906 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3910 create_entry (GtkWidget *widget)
3912 static GtkWidget *window = NULL;
3916 GtkWidget *has_frame_check;
3917 GtkWidget *sensitive_check;
3918 GtkWidget *progress_check;
3920 GtkComboBoxText *cb;
3921 GtkWidget *cb_entry;
3923 GtkWidget *separator;
3927 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3928 gtk_window_set_screen (GTK_WINDOW (window),
3929 gtk_widget_get_screen (widget));
3931 g_signal_connect (window, "destroy",
3932 G_CALLBACK (gtk_widget_destroyed),
3935 gtk_window_set_title (GTK_WINDOW (window), "entry");
3936 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3939 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3940 gtk_container_add (GTK_CONTAINER (window), box1);
3943 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3944 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3945 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3947 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
3948 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
3950 entry = gtk_entry_new ();
3951 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");
3952 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
3953 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
3955 button = gtk_button_new_with_mnemonic ("_Props");
3956 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
3957 g_signal_connect (button, "clicked",
3958 G_CALLBACK (props_clicked),
3961 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
3963 gtk_combo_box_text_append_text (cb, "item0");
3964 gtk_combo_box_text_append_text (cb, "item0");
3965 gtk_combo_box_text_append_text (cb, "item1 item1");
3966 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
3967 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
3968 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
3969 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
3970 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
3971 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
3972 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
3973 gtk_combo_box_text_append_text (cb, "item9 item9");
3975 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
3976 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
3977 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
3978 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
3980 sensitive_check = gtk_check_button_new_with_label("Sensitive");
3981 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
3982 g_signal_connect (sensitive_check, "toggled",
3983 G_CALLBACK (entry_toggle_sensitive), entry);
3984 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
3986 has_frame_check = gtk_check_button_new_with_label("Has Frame");
3987 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
3988 g_signal_connect (has_frame_check, "toggled",
3989 G_CALLBACK (entry_toggle_frame), entry);
3990 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
3992 progress_check = gtk_check_button_new_with_label("Show Progress");
3993 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
3994 g_signal_connect (progress_check, "toggled",
3995 G_CALLBACK (entry_toggle_progress), entry);
3997 progress_check = gtk_check_button_new_with_label("Pulse Progress");
3998 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
3999 g_signal_connect (progress_check, "toggled",
4000 G_CALLBACK (entry_toggle_pulse), entry);
4002 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4003 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4005 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4006 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4007 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4009 button = gtk_button_new_with_label ("close");
4010 g_signal_connect_swapped (button, "clicked",
4011 G_CALLBACK (gtk_widget_destroy),
4013 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4014 gtk_widget_set_can_default (button, TRUE);
4015 gtk_widget_grab_default (button);
4018 if (!gtk_widget_get_visible (window))
4019 gtk_widget_show_all (window);
4021 gtk_widget_destroy (window);
4025 create_expander (GtkWidget *widget)
4028 GtkWidget *expander;
4030 static GtkWidget *window = NULL;
4034 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4035 gtk_window_set_screen (GTK_WINDOW (window),
4036 gtk_widget_get_screen (widget));
4038 g_signal_connect (window, "destroy",
4039 G_CALLBACK (gtk_widget_destroyed),
4042 gtk_window_set_title (GTK_WINDOW (window), "expander");
4043 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4045 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4046 gtk_container_add (GTK_CONTAINER (window), box1);
4048 expander = gtk_expander_new ("The Hidden");
4050 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4052 hidden = gtk_label_new ("Revealed!");
4054 gtk_container_add (GTK_CONTAINER (expander), hidden);
4057 if (!gtk_widget_get_visible (window))
4058 gtk_widget_show_all (window);
4060 gtk_widget_destroy (window);
4068 event_box_label_pressed (GtkWidget *widget,
4069 GdkEventButton *event,
4072 g_print ("clicked on event box\n");
4076 event_box_button_clicked (GtkWidget *widget,
4080 g_print ("pushed button\n");
4084 event_box_toggle_visible_window (GtkWidget *checkbutton,
4085 GtkEventBox *event_box)
4087 gtk_event_box_set_visible_window (event_box,
4088 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4092 event_box_toggle_above_child (GtkWidget *checkbutton,
4093 GtkEventBox *event_box)
4095 gtk_event_box_set_above_child (event_box,
4096 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4100 create_event_box (GtkWidget *widget)
4102 static GtkWidget *window = NULL;
4108 GtkWidget *separator;
4109 GtkWidget *event_box;
4111 GtkWidget *visible_window_check;
4112 GtkWidget *above_child_check;
4122 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4123 gtk_window_set_screen (GTK_WINDOW (window),
4124 gtk_widget_get_screen (widget));
4126 g_signal_connect (window, "destroy",
4127 G_CALLBACK (gtk_widget_destroyed),
4130 gtk_window_set_title (GTK_WINDOW (window), "event box");
4131 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4133 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4134 gtk_container_add (GTK_CONTAINER (window), box1);
4135 gtk_widget_override_background_color (window, 0, &color);
4137 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4138 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4140 event_box = gtk_event_box_new ();
4141 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4143 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4144 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4145 g_signal_connect (event_box, "button_press_event",
4146 G_CALLBACK (event_box_label_pressed),
4149 label = gtk_label_new ("Click on this label");
4150 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4152 button = gtk_button_new_with_label ("button in eventbox");
4153 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4154 g_signal_connect (button, "clicked",
4155 G_CALLBACK (event_box_button_clicked),
4159 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4160 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4161 g_signal_connect (visible_window_check, "toggled",
4162 G_CALLBACK (event_box_toggle_visible_window), event_box);
4163 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4165 above_child_check = gtk_check_button_new_with_label("Above Child");
4166 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4167 g_signal_connect (above_child_check, "toggled",
4168 G_CALLBACK (event_box_toggle_above_child), event_box);
4169 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4171 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4172 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4174 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4175 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4176 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4178 button = gtk_button_new_with_label ("close");
4179 g_signal_connect_swapped (button, "clicked",
4180 G_CALLBACK (gtk_widget_destroy),
4182 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4183 gtk_widget_set_can_default (button, TRUE);
4184 gtk_widget_grab_default (button);
4187 if (!gtk_widget_get_visible (window))
4188 gtk_widget_show_all (window);
4190 gtk_widget_destroy (window);
4198 #define SIZE_GROUP_INITIAL_SIZE 50
4201 size_group_hsize_changed (GtkSpinButton *spin_button,
4204 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4205 gtk_spin_button_get_value_as_int (spin_button),
4210 size_group_vsize_changed (GtkSpinButton *spin_button,
4213 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4215 gtk_spin_button_get_value_as_int (spin_button));
4219 create_size_group_window (GdkScreen *screen,
4220 GtkSizeGroup *master_size_group)
4222 GtkWidget *content_area;
4225 GtkWidget *main_button;
4227 GtkWidget *spin_button;
4229 GtkSizeGroup *hgroup1;
4230 GtkSizeGroup *hgroup2;
4231 GtkSizeGroup *vgroup1;
4232 GtkSizeGroup *vgroup2;
4234 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4240 gtk_window_set_screen (GTK_WINDOW (window), screen);
4242 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4244 g_signal_connect (window, "response",
4245 G_CALLBACK (gtk_widget_destroy),
4248 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4250 table = gtk_table_new (2, 2, FALSE);
4251 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4253 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4254 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4255 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4256 gtk_widget_set_size_request (table, 250, 250);
4258 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4259 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4260 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4261 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4263 main_button = gtk_button_new_with_label ("X");
4265 gtk_table_attach (GTK_TABLE (table), main_button,
4267 GTK_EXPAND, GTK_EXPAND,
4269 gtk_size_group_add_widget (master_size_group, main_button);
4270 gtk_size_group_add_widget (hgroup1, main_button);
4271 gtk_size_group_add_widget (vgroup1, main_button);
4272 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4273 SIZE_GROUP_INITIAL_SIZE,
4274 SIZE_GROUP_INITIAL_SIZE);
4276 button = gtk_button_new ();
4277 gtk_table_attach (GTK_TABLE (table), button,
4279 GTK_EXPAND, GTK_EXPAND,
4281 gtk_size_group_add_widget (vgroup1, button);
4282 gtk_size_group_add_widget (vgroup2, button);
4284 button = gtk_button_new ();
4285 gtk_table_attach (GTK_TABLE (table), button,
4287 GTK_EXPAND, GTK_EXPAND,
4289 gtk_size_group_add_widget (hgroup1, button);
4290 gtk_size_group_add_widget (hgroup2, button);
4292 button = gtk_button_new ();
4293 gtk_table_attach (GTK_TABLE (table), button,
4295 GTK_EXPAND, GTK_EXPAND,
4297 gtk_size_group_add_widget (hgroup2, button);
4298 gtk_size_group_add_widget (vgroup2, button);
4300 g_object_unref (hgroup1);
4301 g_object_unref (hgroup2);
4302 g_object_unref (vgroup1);
4303 g_object_unref (vgroup2);
4305 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4306 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4308 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4309 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4310 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4311 g_signal_connect (spin_button, "value_changed",
4312 G_CALLBACK (size_group_hsize_changed), main_button);
4314 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4315 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4316 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4317 g_signal_connect (spin_button, "value_changed",
4318 G_CALLBACK (size_group_vsize_changed), main_button);
4324 create_size_groups (GtkWidget *widget)
4326 static GtkWidget *window1 = NULL;
4327 static GtkWidget *window2 = NULL;
4328 static GtkSizeGroup *master_size_group;
4330 if (!master_size_group)
4331 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4335 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4338 g_signal_connect (window1, "destroy",
4339 G_CALLBACK (gtk_widget_destroyed),
4345 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4348 g_signal_connect (window2, "destroy",
4349 G_CALLBACK (gtk_widget_destroyed),
4353 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4355 gtk_widget_destroy (window1);
4356 gtk_widget_destroy (window2);
4360 if (!gtk_widget_get_visible (window1))
4361 gtk_widget_show_all (window1);
4362 if (!gtk_widget_get_visible (window2))
4363 gtk_widget_show_all (window2);
4371 static GtkWidget *spinner1;
4374 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4376 gtk_spin_button_set_snap_to_ticks (spin,
4377 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4381 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4383 gtk_spin_button_set_numeric (spin,
4384 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4388 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4390 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4391 gtk_spin_button_get_value_as_int (spin));
4395 get_value (GtkWidget *widget, gpointer data)
4399 GtkSpinButton *spin;
4401 spin = GTK_SPIN_BUTTON (spinner1);
4402 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4403 if (GPOINTER_TO_INT (data) == 1)
4404 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4406 sprintf (buf, "%0.*f",
4407 gtk_spin_button_get_digits (spin),
4408 gtk_spin_button_get_value (spin));
4410 gtk_label_set_text (label, buf);
4414 get_spin_value (GtkWidget *widget, gpointer data)
4418 GtkSpinButton *spin;
4420 spin = GTK_SPIN_BUTTON (widget);
4421 label = GTK_LABEL (data);
4423 buffer = g_strdup_printf ("%0.*f",
4424 gtk_spin_button_get_digits (spin),
4425 gtk_spin_button_get_value (spin));
4426 gtk_label_set_text (label, buffer);
4432 spin_button_time_output_func (GtkSpinButton *spin_button)
4434 GtkAdjustment *adjustment;
4435 static gchar buf[6];
4439 adjustment = gtk_spin_button_get_adjustment (spin_button);
4440 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4441 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4442 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4443 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4444 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4449 spin_button_month_input_func (GtkSpinButton *spin_button,
4453 static gchar *month[12] = { "January", "February", "March", "April",
4454 "May", "June", "July", "August",
4455 "September", "October", "November", "December" };
4457 gboolean found = FALSE;
4459 for (i = 1; i <= 12; i++)
4461 tmp1 = g_ascii_strup (month[i - 1], -1);
4462 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4463 if (strstr (tmp1, tmp2) == tmp1)
4473 return GTK_INPUT_ERROR;
4475 *new_val = (gdouble) i;
4480 spin_button_month_output_func (GtkSpinButton *spin_button)
4482 GtkAdjustment *adjustment;
4485 static gchar *month[12] = { "January", "February", "March", "April",
4486 "May", "June", "July", "August", "September",
4487 "October", "November", "December" };
4489 adjustment = gtk_spin_button_get_adjustment (spin_button);
4490 value = gtk_adjustment_get_value (adjustment);
4491 for (i = 1; i <= 12; i++)
4492 if (fabs (value - (double)i) < 1e-5)
4494 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4495 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4501 spin_button_hex_input_func (GtkSpinButton *spin_button,
4508 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4509 res = strtol(buf, &err, 16);
4512 return GTK_INPUT_ERROR;
4518 spin_button_hex_output_func (GtkSpinButton *spin_button)
4520 GtkAdjustment *adjustment;
4521 static gchar buf[7];
4524 adjustment = gtk_spin_button_get_adjustment (spin_button);
4525 val = (gint) gtk_adjustment_get_value (adjustment);
4526 if (fabs (val) < 1e-5)
4527 sprintf (buf, "0x00");
4529 sprintf (buf, "0x%.2X", val);
4530 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4531 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4536 create_spins (GtkWidget *widget)
4538 static GtkWidget *window = NULL;
4541 GtkWidget *main_vbox;
4544 GtkWidget *spinner2;
4548 GtkWidget *val_label;
4549 GtkAdjustment *adjustment;
4553 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4554 gtk_window_set_screen (GTK_WINDOW (window),
4555 gtk_widget_get_screen (widget));
4557 g_signal_connect (window, "destroy",
4558 G_CALLBACK (gtk_widget_destroyed),
4561 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4563 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4564 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4565 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4567 frame = gtk_frame_new ("Not accelerated");
4568 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4570 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4571 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4572 gtk_container_add (GTK_CONTAINER (frame), vbox);
4574 /* Time, month, hex spinners */
4576 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4577 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4579 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4580 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4582 label = gtk_label_new ("Time :");
4583 gtk_widget_set_halign (label, GTK_ALIGN_START);
4584 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4585 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4587 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4588 spinner = gtk_spin_button_new (adjustment, 0, 0);
4589 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4590 g_signal_connect (spinner,
4592 G_CALLBACK (spin_button_time_output_func),
4594 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4595 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4596 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4598 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4599 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4601 label = gtk_label_new ("Month :");
4602 gtk_widget_set_halign (label, GTK_ALIGN_START);
4603 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4604 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4606 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4608 spinner = gtk_spin_button_new (adjustment, 0, 0);
4609 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4610 GTK_UPDATE_IF_VALID);
4611 g_signal_connect (spinner,
4613 G_CALLBACK (spin_button_month_input_func),
4615 g_signal_connect (spinner,
4617 G_CALLBACK (spin_button_month_output_func),
4619 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4620 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4621 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4623 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4624 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4626 label = gtk_label_new ("Hex :");
4627 gtk_widget_set_halign (label, GTK_ALIGN_START);
4628 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4629 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4631 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4632 spinner = gtk_spin_button_new (adjustment, 0, 0);
4633 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4634 g_signal_connect (spinner,
4636 G_CALLBACK (spin_button_hex_input_func),
4638 g_signal_connect (spinner,
4640 G_CALLBACK (spin_button_hex_output_func),
4642 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4643 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4644 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4646 frame = gtk_frame_new ("Accelerated");
4647 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4649 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4650 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4651 gtk_container_add (GTK_CONTAINER (frame), vbox);
4653 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4654 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4656 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4657 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4659 label = gtk_label_new ("Value :");
4660 gtk_widget_set_halign (label, GTK_ALIGN_START);
4661 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4662 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4664 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4666 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4667 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4668 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4670 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4671 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4673 label = gtk_label_new ("Digits :");
4674 gtk_widget_set_halign (label, GTK_ALIGN_START);
4675 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4676 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4678 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4679 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4680 g_signal_connect (adjustment, "value_changed",
4681 G_CALLBACK (change_digits),
4683 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4685 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4686 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4688 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4689 g_signal_connect (button, "clicked",
4690 G_CALLBACK (toggle_snap),
4692 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4693 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4695 button = gtk_check_button_new_with_label ("Numeric only input mode");
4696 g_signal_connect (button, "clicked",
4697 G_CALLBACK (toggle_numeric),
4699 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4700 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4702 val_label = gtk_label_new ("");
4704 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4705 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4707 button = gtk_button_new_with_label ("Value as Int");
4708 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4709 g_signal_connect (button, "clicked",
4710 G_CALLBACK (get_value),
4711 GINT_TO_POINTER (1));
4712 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4714 button = gtk_button_new_with_label ("Value as Float");
4715 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4716 g_signal_connect (button, "clicked",
4717 G_CALLBACK (get_value),
4718 GINT_TO_POINTER (2));
4719 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4721 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4722 gtk_label_set_text (GTK_LABEL (val_label), "0");
4724 frame = gtk_frame_new ("Using Convenience Constructor");
4725 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4727 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4728 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4729 gtk_container_add (GTK_CONTAINER (frame), hbox);
4731 val_label = gtk_label_new ("0.0");
4733 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4734 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4735 g_signal_connect (spinner, "value_changed",
4736 G_CALLBACK (get_spin_value), val_label);
4737 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4738 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4740 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4741 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4743 button = gtk_button_new_with_label ("Close");
4744 g_signal_connect_swapped (button, "clicked",
4745 G_CALLBACK (gtk_widget_destroy),
4747 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4750 if (!gtk_widget_get_visible (window))
4751 gtk_widget_show_all (window);
4753 gtk_widget_destroy (window);
4762 cursor_draw (GtkWidget *widget,
4767 GtkStyleContext *context;
4770 width = gtk_widget_get_allocated_width (widget);
4771 height = gtk_widget_get_allocated_height (widget);
4773 cairo_set_source_rgb (cr, 1, 1, 1);
4774 cairo_rectangle (cr, 0, 0, width, height / 2);
4777 cairo_set_source_rgb (cr, 0, 0, 0);
4778 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4781 context = gtk_widget_get_style_context (widget);
4782 gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
4783 gdk_cairo_set_source_rgba (cr, &bg);
4784 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4791 set_cursor (GtkWidget *spinner,
4800 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4803 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4805 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4806 vals = class->values;
4808 while (vals && vals->value != c)
4811 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4813 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4815 g_type_class_unref (class);
4817 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4818 gdk_window_set_cursor (gtk_widget_get_window (widget),
4820 g_object_unref (cursor);
4824 cursor_event (GtkWidget *widget,
4826 GtkSpinButton *spinner)
4828 if ((event->type == GDK_BUTTON_PRESS) &&
4829 ((event->button.button == 1) ||
4830 (event->button.button == 3)))
4832 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4833 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4840 #ifdef GDK_WINDOWING_X11
4841 #include "x11/gdkx.h"
4844 change_cursor_theme (GtkWidget *widget,
4851 children = gtk_container_get_children (GTK_CONTAINER (data));
4853 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4854 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4856 g_list_free (children);
4858 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4865 create_cursors (GtkWidget *widget)
4867 static GtkWidget *window = NULL;
4870 GtkWidget *main_vbox;
4877 GtkAdjustment *adjustment;
4883 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4884 gtk_window_set_screen (GTK_WINDOW (window),
4885 gtk_widget_get_screen (widget));
4887 g_signal_connect (window, "destroy",
4888 G_CALLBACK (gtk_widget_destroyed),
4891 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4893 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4894 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4895 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4898 g_object_new (GTK_TYPE_BOX,
4899 "orientation", GTK_ORIENTATION_VERTICAL,
4900 "GtkBox::homogeneous", FALSE,
4901 "GtkBox::spacing", 5,
4902 "GtkContainer::border_width", 10,
4903 "GtkWidget::parent", main_vbox,
4904 "GtkWidget::visible", TRUE,
4907 #ifdef GDK_WINDOWING_X11
4908 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4909 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4910 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4912 label = gtk_label_new ("Cursor Theme : ");
4913 gtk_widget_set_halign (label, GTK_ALIGN_START);
4914 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4915 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4917 entry = gtk_entry_new ();
4918 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4919 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4921 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4922 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4923 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4925 g_signal_connect (entry, "changed",
4926 G_CALLBACK (change_cursor_theme), hbox);
4927 g_signal_connect (size, "changed",
4928 G_CALLBACK (change_cursor_theme), hbox);
4931 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4932 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4933 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4935 label = gtk_label_new ("Cursor Value : ");
4936 gtk_widget_set_halign (label, GTK_ALIGN_START);
4937 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4938 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4940 adjustment = gtk_adjustment_new (0,
4944 spinner = gtk_spin_button_new (adjustment, 0, 0);
4945 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
4948 g_object_new (gtk_frame_get_type (),
4949 "GtkFrame::label_xalign", 0.5,
4950 "GtkFrame::label", "Cursor Area",
4951 "GtkContainer::border_width", 10,
4952 "GtkWidget::parent", vbox,
4953 "GtkWidget::visible", TRUE,
4956 darea = gtk_drawing_area_new ();
4957 gtk_widget_set_size_request (darea, 80, 80);
4958 gtk_container_add (GTK_CONTAINER (frame), darea);
4959 g_signal_connect (darea,
4961 G_CALLBACK (cursor_draw),
4963 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
4964 g_signal_connect (darea,
4965 "button_press_event",
4966 G_CALLBACK (cursor_event),
4968 gtk_widget_show (darea);
4970 g_signal_connect (spinner, "changed",
4971 G_CALLBACK (set_cursor),
4974 label = g_object_new (GTK_TYPE_LABEL,
4979 gtk_container_child_set (GTK_CONTAINER (vbox), label,
4982 g_object_set_data (G_OBJECT (spinner), "user_data", label);
4984 any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4985 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
4987 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4988 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
4989 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4991 button = gtk_button_new_with_label ("Close");
4992 g_signal_connect_swapped (button, "clicked",
4993 G_CALLBACK (gtk_widget_destroy),
4995 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4997 gtk_widget_show_all (window);
4999 set_cursor (spinner, darea);
5002 gtk_widget_destroy (window);
5010 color_selection_ok (GtkWidget *w,
5011 GtkColorSelectionDialog *cs)
5013 GtkWidget *colorsel;
5016 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5018 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5019 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5023 color_selection_changed (GtkWidget *w,
5024 GtkColorSelectionDialog *cs)
5026 GtkWidget *colorsel;
5029 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5030 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5031 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5036 opacity_toggled_cb (GtkWidget *w,
5037 GtkColorSelectionDialog *cs)
5039 GtkColorSelection *colorsel;
5041 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5042 gtk_color_selection_set_has_opacity_control (colorsel,
5043 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5047 palette_toggled_cb (GtkWidget *w,
5048 GtkColorSelectionDialog *cs)
5050 GtkColorSelection *colorsel;
5052 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5053 gtk_color_selection_set_has_palette (colorsel,
5054 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5059 create_color_selection (GtkWidget *widget)
5061 static GtkWidget *window = NULL;
5070 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5071 gtk_window_set_screen (GTK_WINDOW (window),
5072 gtk_widget_get_screen (widget));
5074 g_signal_connect (window, "destroy",
5075 G_CALLBACK (gtk_widget_destroyed),
5078 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5079 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5081 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5082 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5083 gtk_container_add (GTK_CONTAINER (window), hbox);
5085 label = gtk_label_new ("Pick a color");
5086 gtk_container_add (GTK_CONTAINER (hbox), label);
5088 picker = gtk_color_button_new ();
5089 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5090 gtk_container_add (GTK_CONTAINER (hbox), picker);
5092 button = gtk_button_new_with_mnemonic ("_Props");
5093 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5094 g_signal_connect (button, "clicked",
5095 G_CALLBACK (props_clicked),
5099 if (!gtk_widget_get_visible (window))
5100 gtk_widget_show_all (window);
5102 gtk_widget_destroy (window);
5106 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5108 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5109 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5111 gtk_widget_set_default_direction (new_direction);
5115 orientable_toggle_orientation (GtkOrientable *orientable)
5117 GtkOrientation orientation;
5119 orientation = gtk_orientable_get_orientation (orientable);
5120 gtk_orientable_set_orientation (orientable,
5121 orientation == GTK_ORIENTATION_HORIZONTAL ?
5122 GTK_ORIENTATION_VERTICAL :
5123 GTK_ORIENTATION_HORIZONTAL);
5125 if (GTK_IS_CONTAINER (orientable))
5130 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5132 for (child = children; child; child = child->next)
5134 if (GTK_IS_ORIENTABLE (child->data))
5135 orientable_toggle_orientation (child->data);
5138 g_list_free (children);
5143 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5145 GtkWidget *content_area;
5146 GtkWidget *toplevel;
5148 toplevel = gtk_widget_get_toplevel (widget);
5149 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5150 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5154 set_direction_recurse (GtkWidget *widget,
5157 GtkTextDirection *dir = data;
5159 gtk_widget_set_direction (widget, *dir);
5160 if (GTK_IS_CONTAINER (widget))
5161 gtk_container_foreach (GTK_CONTAINER (widget),
5162 set_direction_recurse,
5167 create_forward_back (const char *title,
5168 GtkTextDirection text_dir)
5170 GtkWidget *frame = gtk_frame_new (title);
5171 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5172 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5173 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5175 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5177 gtk_container_add (GTK_CONTAINER (frame), bbox);
5178 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5179 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5181 set_direction_recurse (frame, &text_dir);
5187 create_flipping (GtkWidget *widget)
5189 static GtkWidget *window = NULL;
5190 GtkWidget *check_button, *button;
5191 GtkWidget *action_area, *content_area;
5195 window = gtk_dialog_new ();
5197 gtk_window_set_screen (GTK_WINDOW (window),
5198 gtk_widget_get_screen (widget));
5200 g_signal_connect (window, "destroy",
5201 G_CALLBACK (gtk_widget_destroyed),
5204 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5205 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5207 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5209 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5210 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5211 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5213 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5214 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5216 g_signal_connect (check_button, "toggled",
5217 G_CALLBACK (flipping_toggled_cb), NULL);
5219 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5220 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5221 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5223 g_signal_connect (check_button, "toggled",
5224 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5226 gtk_box_pack_start (GTK_BOX (content_area),
5227 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5230 gtk_box_pack_start (GTK_BOX (content_area),
5231 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5234 gtk_box_pack_start (GTK_BOX (content_area),
5235 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5238 button = gtk_button_new_with_label ("Close");
5239 g_signal_connect_swapped (button, "clicked",
5240 G_CALLBACK (gtk_widget_destroy), window);
5241 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5244 if (!gtk_widget_get_visible (window))
5245 gtk_widget_show_all (window);
5247 gtk_widget_destroy (window);
5255 make_focus_table (GList **list)
5260 table = gtk_table_new (5, 5, FALSE);
5273 widget = gtk_entry_new ();
5275 widget = gtk_button_new_with_label ("Foo");
5277 *list = g_list_prepend (*list, widget);
5279 gtk_table_attach (GTK_TABLE (table),
5283 GTK_EXPAND | GTK_FILL,
5284 GTK_EXPAND | GTK_FILL,
5293 *list = g_list_reverse (*list);
5299 create_focus (GtkWidget *widget)
5301 static GtkWidget *window = NULL;
5305 GtkWidget *content_area;
5310 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5316 gtk_window_set_screen (GTK_WINDOW (window),
5317 gtk_widget_get_screen (widget));
5319 g_signal_connect (window, "destroy",
5320 G_CALLBACK (gtk_widget_destroyed),
5323 g_signal_connect (window, "response",
5324 G_CALLBACK (gtk_widget_destroy),
5327 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5329 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5331 frame = gtk_frame_new ("Weird tab focus chain");
5333 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5335 table = make_focus_table (&list);
5337 gtk_container_add (GTK_CONTAINER (frame), table);
5339 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5344 frame = gtk_frame_new ("Default tab focus chain");
5346 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5349 table = make_focus_table (&list);
5353 gtk_container_add (GTK_CONTAINER (frame), table);
5356 if (!gtk_widget_get_visible (window))
5357 gtk_widget_show_all (window);
5359 gtk_widget_destroy (window);
5367 create_font_selection (GtkWidget *widget)
5369 static GtkWidget *window = NULL;
5377 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5378 gtk_window_set_screen (GTK_WINDOW (window),
5379 gtk_widget_get_screen (widget));
5381 g_signal_connect (window, "destroy",
5382 G_CALLBACK (gtk_widget_destroyed),
5385 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5386 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5388 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5389 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5390 gtk_container_add (GTK_CONTAINER (window), hbox);
5392 label = gtk_label_new ("Pick a font");
5393 gtk_container_add (GTK_CONTAINER (hbox), label);
5395 picker = gtk_font_button_new ();
5396 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5397 gtk_container_add (GTK_CONTAINER (hbox), picker);
5400 if (!gtk_widget_get_visible (window))
5401 gtk_widget_show_all (window);
5403 gtk_widget_destroy (window);
5410 static GtkWidget *dialog_window = NULL;
5413 label_toggle (GtkWidget *widget,
5418 *label = gtk_label_new ("Dialog Test");
5419 g_signal_connect (*label,
5421 G_CALLBACK (gtk_widget_destroyed),
5423 g_object_set (*label, "margin", 10, NULL);
5424 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5425 *label, TRUE, TRUE, 0);
5426 gtk_widget_show (*label);
5429 gtk_widget_destroy (*label);
5433 create_dialog (GtkWidget *widget)
5435 static GtkWidget *label;
5436 GtkWidget *action_area;
5441 /* This is a terrible example; it's much simpler to create
5442 * dialogs than this. Don't use testgtk for example code,
5446 dialog_window = gtk_dialog_new ();
5447 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5448 gtk_widget_get_screen (widget));
5450 g_signal_connect (dialog_window, "destroy",
5451 G_CALLBACK (gtk_widget_destroyed),
5454 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5456 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5457 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5459 button = gtk_button_new_with_label ("OK");
5460 gtk_widget_set_can_default (button, TRUE);
5461 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5462 gtk_widget_grab_default (button);
5463 gtk_widget_show (button);
5465 button = gtk_button_new_with_label ("Toggle");
5466 g_signal_connect (button, "clicked",
5467 G_CALLBACK (label_toggle),
5469 gtk_widget_set_can_default (button, TRUE);
5470 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5471 gtk_widget_show (button);
5476 if (!gtk_widget_get_visible (dialog_window))
5477 gtk_widget_show (dialog_window);
5479 gtk_widget_destroy (dialog_window);
5482 /* Display & Screen test
5489 GtkWidget *radio_dpy;
5490 GtkWidget *toplevel;
5491 GtkWidget *dialog_window;
5492 } ScreenDisplaySelection;
5495 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5497 const gchar *display_name;
5498 GdkDisplay *display = gtk_widget_get_display (widget);
5500 GdkScreen *new_screen = NULL;
5501 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5503 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5505 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5506 display = gdk_display_open (display_name);
5510 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5511 GTK_DIALOG_DESTROY_WITH_PARENT,
5514 "The display :\n%s\ncannot be opened",
5516 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5517 gtk_widget_show (dialog);
5518 g_signal_connect (dialog, "response",
5519 G_CALLBACK (gtk_widget_destroy),
5524 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5527 gboolean found = FALSE;
5528 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5531 gtk_tree_model_get (model, &iter, 0, &name, -1);
5532 found = !g_ascii_strcasecmp (display_name, name);
5539 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5540 new_screen = gdk_display_get_default_screen (display);
5545 gint number_of_screens = gdk_display_get_n_screens (display);
5546 gint screen_num = gdk_screen_get_number (current_screen);
5547 if ((screen_num +1) < number_of_screens)
5548 new_screen = gdk_display_get_screen (display, screen_num + 1);
5550 new_screen = gdk_display_get_screen (display, 0);
5555 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5556 gtk_widget_destroy (data->dialog_window);
5561 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5563 gtk_widget_destroy (data);
5567 create_display_screen (GtkWidget *widget)
5569 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5570 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5572 ScreenDisplaySelection *scr_dpy_data;
5573 GdkScreen *screen = gtk_widget_get_screen (widget);
5574 GdkDisplay *display = gdk_screen_get_display (screen);
5576 window = g_object_new (gtk_window_get_type (),
5579 "type", GTK_WINDOW_TOPLEVEL,
5581 "Screen or Display selection",
5582 "border_width", 10, NULL);
5583 g_signal_connect (window, "destroy",
5584 G_CALLBACK (gtk_widget_destroy), NULL);
5586 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5587 gtk_container_add (GTK_CONTAINER (window), vbox);
5589 frame = gtk_frame_new ("Select screen or display");
5590 gtk_container_add (GTK_CONTAINER (vbox), frame);
5592 table = gtk_table_new (2, 2, TRUE);
5593 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5594 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5596 gtk_container_add (GTK_CONTAINER (frame), table);
5598 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5599 if (gdk_display_get_n_screens(display) > 1)
5600 radio_scr = gtk_radio_button_new_with_label
5601 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5604 radio_scr = gtk_radio_button_new_with_label
5605 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5606 "only one screen on the current display");
5607 gtk_widget_set_sensitive (radio_scr, FALSE);
5609 combo_dpy = gtk_combo_box_text_new_with_entry ();
5610 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5611 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5612 "<hostname>:<X Server Num>.<Screen Num>");
5614 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5615 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5616 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5618 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5619 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5620 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5622 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5624 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5625 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5627 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5629 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5630 scr_dpy_data->radio_dpy = radio_dpy;
5631 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5632 scr_dpy_data->dialog_window = window;
5634 g_signal_connect (cancelb, "clicked",
5635 G_CALLBACK (screen_display_destroy_diag), window);
5636 g_signal_connect (applyb, "clicked",
5637 G_CALLBACK (screen_display_check), scr_dpy_data);
5638 gtk_widget_show_all (window);
5643 static gulong event_watcher_enter_id = 0;
5644 static gulong event_watcher_leave_id = 0;
5647 event_watcher (GSignalInvocationHint *ihint,
5648 guint n_param_values,
5649 const GValue *param_values,
5652 g_print ("Watch: \"%s\" emitted for %s\n",
5653 g_signal_name (ihint->signal_id),
5654 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5660 event_watcher_down (void)
5662 if (event_watcher_enter_id)
5666 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5667 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5668 event_watcher_enter_id = 0;
5669 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5670 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5671 event_watcher_leave_id = 0;
5676 event_watcher_toggle (void)
5678 if (event_watcher_enter_id)
5679 event_watcher_down ();
5684 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5685 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5686 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5687 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5692 create_event_watcher (GtkWidget *widget)
5694 GtkWidget *action_area, *content_area;
5699 dialog_window = gtk_dialog_new ();
5700 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5701 gtk_widget_get_screen (widget));
5703 g_signal_connect (dialog_window, "destroy",
5704 G_CALLBACK (gtk_widget_destroyed),
5706 g_signal_connect (dialog_window, "destroy",
5707 G_CALLBACK (event_watcher_down),
5710 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5711 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5713 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5714 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5715 gtk_widget_set_size_request (dialog_window, 200, 110);
5717 button = gtk_toggle_button_new_with_label ("Activate Watch");
5718 g_signal_connect (button, "clicked",
5719 G_CALLBACK (event_watcher_toggle),
5721 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5722 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5723 gtk_widget_show (button);
5725 button = gtk_button_new_with_label ("Close");
5726 g_signal_connect_swapped (button, "clicked",
5727 G_CALLBACK (gtk_widget_destroy),
5729 gtk_widget_set_can_default (button, TRUE);
5730 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5731 gtk_widget_grab_default (button);
5732 gtk_widget_show (button);
5735 if (!gtk_widget_get_visible (dialog_window))
5736 gtk_widget_show (dialog_window);
5738 gtk_widget_destroy (dialog_window);
5746 reformat_value (GtkScale *scale,
5749 return g_strdup_printf ("-->%0.*g<--",
5750 gtk_scale_get_digits (scale), value);
5754 create_range_controls (GtkWidget *widget)
5756 static GtkWidget *window = NULL;
5760 GtkWidget *scrollbar;
5762 GtkWidget *separator;
5763 GtkAdjustment *adjustment;
5768 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5770 gtk_window_set_screen (GTK_WINDOW (window),
5771 gtk_widget_get_screen (widget));
5773 g_signal_connect (window, "destroy",
5774 G_CALLBACK (gtk_widget_destroyed),
5777 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5778 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5781 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5782 gtk_container_add (GTK_CONTAINER (window), box1);
5783 gtk_widget_show (box1);
5786 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5787 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5788 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5789 gtk_widget_show (box2);
5792 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5794 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5795 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5796 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5797 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5798 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5799 gtk_widget_show (scale);
5801 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5802 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5803 gtk_widget_show (scrollbar);
5805 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5806 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5807 g_signal_connect (scale,
5809 G_CALLBACK (reformat_value),
5811 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5812 gtk_widget_show (scale);
5814 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5816 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5817 gtk_widget_set_size_request (scale, -1, 200);
5818 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5819 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5820 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5821 gtk_widget_show (scale);
5823 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5824 gtk_widget_set_size_request (scale, -1, 200);
5825 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5826 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5827 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5828 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5829 gtk_widget_show (scale);
5831 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5832 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5833 g_signal_connect (scale,
5835 G_CALLBACK (reformat_value),
5837 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5838 gtk_widget_show (scale);
5841 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5842 gtk_widget_show (hbox);
5844 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5845 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5846 gtk_widget_show (separator);
5849 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5850 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5851 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5852 gtk_widget_show (box2);
5855 button = gtk_button_new_with_label ("close");
5856 g_signal_connect_swapped (button, "clicked",
5857 G_CALLBACK (gtk_widget_destroy),
5859 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5860 gtk_widget_set_can_default (button, TRUE);
5861 gtk_widget_grab_default (button);
5862 gtk_widget_show (button);
5865 if (!gtk_widget_get_visible (window))
5866 gtk_widget_show (window);
5868 gtk_widget_destroy (window);
5875 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5876 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5877 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5878 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5879 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5880 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5881 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5882 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5885 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5891 static const char * book_open_xpm[] = {
5914 static const char * book_closed_xpm[] = {
5939 GdkPixbuf *book_open;
5940 GdkPixbuf *book_closed;
5941 GtkWidget *sample_notebook;
5944 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
5946 GtkWidget *page_widget;
5949 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
5951 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
5952 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5954 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
5955 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5959 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
5961 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
5962 gint old_page_num = gtk_notebook_get_current_page (notebook);
5964 if (page_num == old_page_num)
5967 set_page_image (notebook, page_num, book_open);
5969 if (old_page_num != -1)
5970 set_page_image (notebook, old_page_num, book_closed);
5974 tab_fill (GtkToggleButton *button, GtkWidget *child)
5976 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5977 "tab-fill", gtk_toggle_button_get_active (button),
5982 tab_expand (GtkToggleButton *button, GtkWidget *child)
5984 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5985 "tab-expand", gtk_toggle_button_get_active (button),
5990 create_pages (GtkNotebook *notebook, gint start, gint end)
5992 GtkWidget *child = NULL;
5997 GtkWidget *label_box;
5998 GtkWidget *menu_box;
6002 char accel_buffer[32];
6004 for (i = start; i <= end; i++)
6006 sprintf (buffer, "Page %d", i);
6007 sprintf (accel_buffer, "Page _%d", i);
6009 child = gtk_frame_new (buffer);
6010 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6012 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6013 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6014 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6015 gtk_container_add (GTK_CONTAINER (child), vbox);
6017 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6018 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6019 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6021 button = gtk_check_button_new_with_label ("Fill Tab");
6022 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6023 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6024 g_signal_connect (button, "toggled",
6025 G_CALLBACK (tab_fill), child);
6027 button = gtk_check_button_new_with_label ("Expand Tab");
6028 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6029 g_signal_connect (button, "toggled",
6030 G_CALLBACK (tab_expand), child);
6032 button = gtk_button_new_with_label ("Hide Page");
6033 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6034 g_signal_connect_swapped (button, "clicked",
6035 G_CALLBACK (gtk_widget_hide),
6038 gtk_widget_show_all (child);
6040 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6041 pixwid = gtk_image_new_from_pixbuf (book_closed);
6042 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6044 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6045 gtk_widget_set_margin_left (pixwid, 3);
6046 gtk_widget_set_margin_right (pixwid, 3);
6047 gtk_widget_set_margin_bottom (pixwid, 1);
6048 gtk_widget_set_margin_top (pixwid, 1);
6049 label = gtk_label_new_with_mnemonic (accel_buffer);
6050 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6051 gtk_widget_show_all (label_box);
6054 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6055 pixwid = gtk_image_new_from_pixbuf (book_closed);
6056 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6058 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6059 gtk_widget_set_margin_left (pixwid, 3);
6060 gtk_widget_set_margin_right (pixwid, 3);
6061 gtk_widget_set_margin_bottom (pixwid, 1);
6062 gtk_widget_set_margin_top (pixwid, 1);
6063 label = gtk_label_new (buffer);
6064 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6065 gtk_widget_show_all (menu_box);
6067 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6072 rotate_notebook (GtkButton *button,
6073 GtkNotebook *notebook)
6075 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6079 show_all_pages (GtkButton *button,
6080 GtkNotebook *notebook)
6082 gtk_container_foreach (GTK_CONTAINER (notebook),
6083 (GtkCallback) gtk_widget_show, NULL);
6087 notebook_type_changed (GtkWidget *optionmenu,
6090 GtkNotebook *notebook;
6100 notebook = GTK_NOTEBOOK (data);
6102 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6107 /* standard notebook */
6108 gtk_notebook_set_show_tabs (notebook, TRUE);
6109 gtk_notebook_set_show_border (notebook, TRUE);
6110 gtk_notebook_set_scrollable (notebook, FALSE);
6114 /* notabs notebook */
6115 gtk_notebook_set_show_tabs (notebook, FALSE);
6116 gtk_notebook_set_show_border (notebook, TRUE);
6121 gtk_notebook_set_show_tabs (notebook, FALSE);
6122 gtk_notebook_set_show_border (notebook, FALSE);
6127 gtk_notebook_set_show_tabs (notebook, TRUE);
6128 gtk_notebook_set_show_border (notebook, TRUE);
6129 gtk_notebook_set_scrollable (notebook, TRUE);
6130 if (gtk_notebook_get_n_pages (notebook) == 5)
6131 create_pages (notebook, 6, 15);
6137 if (gtk_notebook_get_n_pages (notebook) == 15)
6138 for (i = 0; i < 10; i++)
6139 gtk_notebook_remove_page (notebook, 5);
6143 notebook_popup (GtkToggleButton *button,
6144 GtkNotebook *notebook)
6146 if (gtk_toggle_button_get_active (button))
6147 gtk_notebook_popup_enable (notebook);
6149 gtk_notebook_popup_disable (notebook);
6153 create_notebook (GtkWidget *widget)
6155 static GtkWidget *window = NULL;
6159 GtkWidget *separator;
6163 static gchar *items[] =
6173 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6174 gtk_window_set_screen (GTK_WINDOW (window),
6175 gtk_widget_get_screen (widget));
6177 g_signal_connect (window, "destroy",
6178 G_CALLBACK (gtk_widget_destroyed),
6181 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6182 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6184 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6185 gtk_container_add (GTK_CONTAINER (window), box1);
6187 sample_notebook = gtk_notebook_new ();
6188 g_signal_connect (sample_notebook, "switch_page",
6189 G_CALLBACK (page_switch), NULL);
6190 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6191 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6192 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6194 gtk_widget_realize (sample_notebook);
6197 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6200 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6202 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6204 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6205 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6207 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6208 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6209 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6211 button = gtk_check_button_new_with_label ("popup menu");
6212 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6213 g_signal_connect (button, "clicked",
6214 G_CALLBACK (notebook_popup),
6217 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6218 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6219 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6221 label = gtk_label_new ("Notebook Style :");
6222 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6224 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6225 notebook_type_changed,
6227 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6229 button = gtk_button_new_with_label ("Show all Pages");
6230 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6231 g_signal_connect (button, "clicked",
6232 G_CALLBACK (show_all_pages), sample_notebook);
6234 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6235 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6236 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6237 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6239 button = gtk_button_new_with_label ("prev");
6240 g_signal_connect_swapped (button, "clicked",
6241 G_CALLBACK (gtk_notebook_prev_page),
6243 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6245 button = gtk_button_new_with_label ("next");
6246 g_signal_connect_swapped (button, "clicked",
6247 G_CALLBACK (gtk_notebook_next_page),
6249 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6251 button = gtk_button_new_with_label ("rotate");
6252 g_signal_connect (button, "clicked",
6253 G_CALLBACK (rotate_notebook), sample_notebook);
6254 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6256 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6257 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6259 button = gtk_button_new_with_label ("close");
6260 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6261 g_signal_connect_swapped (button, "clicked",
6262 G_CALLBACK (gtk_widget_destroy),
6264 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6265 gtk_widget_set_can_default (button, TRUE);
6266 gtk_widget_grab_default (button);
6269 if (!gtk_widget_get_visible (window))
6270 gtk_widget_show_all (window);
6272 gtk_widget_destroy (window);
6280 toggle_resize (GtkWidget *widget, GtkWidget *child)
6282 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6283 GValue value = { 0, };
6284 g_value_init (&value, G_TYPE_BOOLEAN);
6285 gtk_container_child_get_property (container, child, "resize", &value);
6286 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6287 gtk_container_child_set_property (container, child, "resize", &value);
6291 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6293 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6294 GValue value = { 0, };
6295 g_value_init (&value, G_TYPE_BOOLEAN);
6296 gtk_container_child_get_property (container, child, "shrink", &value);
6297 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6298 gtk_container_child_set_property (container, child, "shrink", &value);
6302 paned_props_clicked (GtkWidget *button,
6305 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6307 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6311 create_pane_options (GtkPaned *paned,
6312 const gchar *frame_label,
6313 const gchar *label1,
6314 const gchar *label2)
6316 GtkWidget *child1, *child2;
6321 GtkWidget *check_button;
6323 child1 = gtk_paned_get_child1 (paned);
6324 child2 = gtk_paned_get_child2 (paned);
6326 frame = gtk_frame_new (frame_label);
6327 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6329 table = gtk_table_new (4, 2, 4);
6330 gtk_container_add (GTK_CONTAINER (frame), table);
6332 label = gtk_label_new (label1);
6333 gtk_table_attach_defaults (GTK_TABLE (table), label,
6336 check_button = gtk_check_button_new_with_label ("Resize");
6337 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6339 g_signal_connect (check_button, "toggled",
6340 G_CALLBACK (toggle_resize),
6343 check_button = gtk_check_button_new_with_label ("Shrink");
6344 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6346 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6348 g_signal_connect (check_button, "toggled",
6349 G_CALLBACK (toggle_shrink),
6352 label = gtk_label_new (label2);
6353 gtk_table_attach_defaults (GTK_TABLE (table), label,
6356 check_button = gtk_check_button_new_with_label ("Resize");
6357 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6359 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6361 g_signal_connect (check_button, "toggled",
6362 G_CALLBACK (toggle_resize),
6365 check_button = gtk_check_button_new_with_label ("Shrink");
6366 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6368 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6370 g_signal_connect (check_button, "toggled",
6371 G_CALLBACK (toggle_shrink),
6374 button = gtk_button_new_with_mnemonic ("_Properties");
6375 gtk_table_attach_defaults (GTK_TABLE (table), button,
6377 g_signal_connect (button, "clicked",
6378 G_CALLBACK (paned_props_clicked),
6385 create_panes (GtkWidget *widget)
6387 static GtkWidget *window = NULL;
6396 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6398 gtk_window_set_screen (GTK_WINDOW (window),
6399 gtk_widget_get_screen (widget));
6401 g_signal_connect (window, "destroy",
6402 G_CALLBACK (gtk_widget_destroyed),
6405 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6406 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6408 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6409 gtk_container_add (GTK_CONTAINER (window), vbox);
6411 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6412 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6413 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6415 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6416 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6418 frame = gtk_frame_new (NULL);
6419 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6420 gtk_widget_set_size_request (frame, 60, 60);
6421 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6423 button = gtk_button_new_with_label ("Hi there");
6424 gtk_container_add (GTK_CONTAINER(frame), button);
6426 frame = gtk_frame_new (NULL);
6427 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6428 gtk_widget_set_size_request (frame, 80, 60);
6429 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6431 frame = gtk_frame_new (NULL);
6432 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6433 gtk_widget_set_size_request (frame, 60, 80);
6434 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6436 /* Now create toggle buttons to control sizing */
6438 gtk_box_pack_start (GTK_BOX (vbox),
6439 create_pane_options (GTK_PANED (hpaned),
6445 gtk_box_pack_start (GTK_BOX (vbox),
6446 create_pane_options (GTK_PANED (vpaned),
6452 gtk_widget_show_all (vbox);
6455 if (!gtk_widget_get_visible (window))
6456 gtk_widget_show (window);
6458 gtk_widget_destroy (window);
6462 * Paned keyboard navigation
6466 paned_keyboard_window1 (GtkWidget *widget)
6489 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6490 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6491 gtk_window_set_screen (GTK_WINDOW (window1),
6492 gtk_widget_get_screen (widget));
6494 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6495 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6497 frame1 = gtk_frame_new (NULL);
6498 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6499 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6501 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6502 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6504 button7 = gtk_button_new_with_label ("button7");
6505 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6507 button8 = gtk_button_new_with_label ("button8");
6508 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6510 button9 = gtk_button_new_with_label ("button9");
6511 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6513 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6514 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6516 frame2 = gtk_frame_new (NULL);
6517 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6518 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6520 frame5 = gtk_frame_new (NULL);
6521 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6523 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6524 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6526 button5 = gtk_button_new_with_label ("button5");
6527 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6529 button6 = gtk_button_new_with_label ("button6");
6530 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6532 frame3 = gtk_frame_new (NULL);
6533 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6534 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6536 frame4 = gtk_frame_new ("Buttons");
6537 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6538 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6540 table1 = gtk_table_new (2, 2, FALSE);
6541 gtk_container_add (GTK_CONTAINER (frame4), table1);
6542 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6544 button1 = gtk_button_new_with_label ("button1");
6545 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6546 (GtkAttachOptions) (GTK_FILL),
6547 (GtkAttachOptions) (0), 0, 0);
6549 button2 = gtk_button_new_with_label ("button2");
6550 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6551 (GtkAttachOptions) (GTK_FILL),
6552 (GtkAttachOptions) (0), 0, 0);
6554 button3 = gtk_button_new_with_label ("button3");
6555 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6556 (GtkAttachOptions) (GTK_FILL),
6557 (GtkAttachOptions) (0), 0, 0);
6559 button4 = gtk_button_new_with_label ("button4");
6560 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6561 (GtkAttachOptions) (GTK_FILL),
6562 (GtkAttachOptions) (0), 0, 0);
6568 paned_keyboard_window2 (GtkWidget *widget)
6573 GtkWidget *button13;
6577 GtkWidget *button12;
6579 GtkWidget *button11;
6580 GtkWidget *button10;
6582 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6583 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6585 gtk_window_set_screen (GTK_WINDOW (window2),
6586 gtk_widget_get_screen (widget));
6588 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6589 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6591 frame6 = gtk_frame_new (NULL);
6592 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6593 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6595 button13 = gtk_button_new_with_label ("button13");
6596 gtk_container_add (GTK_CONTAINER (frame6), button13);
6598 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6599 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6601 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6602 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6604 frame7 = gtk_frame_new (NULL);
6605 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6606 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6608 button12 = gtk_button_new_with_label ("button12");
6609 gtk_container_add (GTK_CONTAINER (frame7), button12);
6611 frame8 = gtk_frame_new (NULL);
6612 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6613 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6615 button11 = gtk_button_new_with_label ("button11");
6616 gtk_container_add (GTK_CONTAINER (frame8), button11);
6618 button10 = gtk_button_new_with_label ("button10");
6619 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6625 paned_keyboard_window3 (GtkWidget *widget)
6632 GtkWidget *button14;
6635 GtkWidget *button15;
6638 GtkWidget *button16;
6640 GtkWidget *button17;
6642 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6643 g_object_set_data (G_OBJECT (window3), "window3", window3);
6644 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6646 gtk_window_set_screen (GTK_WINDOW (window3),
6647 gtk_widget_get_screen (widget));
6650 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6651 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6653 label1 = gtk_label_new ("Three panes nested inside each other");
6654 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6656 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6657 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6659 frame9 = gtk_frame_new (NULL);
6660 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6661 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6663 button14 = gtk_button_new_with_label ("button14");
6664 gtk_container_add (GTK_CONTAINER (frame9), button14);
6666 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6667 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6669 frame10 = gtk_frame_new (NULL);
6670 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6671 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6673 button15 = gtk_button_new_with_label ("button15");
6674 gtk_container_add (GTK_CONTAINER (frame10), button15);
6676 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6677 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6679 frame11 = gtk_frame_new (NULL);
6680 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6681 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6683 button16 = gtk_button_new_with_label ("button16");
6684 gtk_container_add (GTK_CONTAINER (frame11), button16);
6686 frame12 = gtk_frame_new (NULL);
6687 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6688 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6690 button17 = gtk_button_new_with_label ("button17");
6691 gtk_container_add (GTK_CONTAINER (frame12), button17);
6697 paned_keyboard_window4 (GtkWidget *widget)
6704 GtkWidget *button19;
6705 GtkWidget *button18;
6708 GtkWidget *button21;
6709 GtkWidget *button20;
6711 GtkWidget *button23;
6712 GtkWidget *button22;
6714 GtkWidget *button25;
6715 GtkWidget *button24;
6717 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6718 g_object_set_data (G_OBJECT (window4), "window4", window4);
6719 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6721 gtk_window_set_screen (GTK_WINDOW (window4),
6722 gtk_widget_get_screen (widget));
6724 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6725 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6727 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6728 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6729 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6731 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6732 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6734 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6735 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6737 button19 = gtk_button_new_with_label ("button19");
6738 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6740 button18 = gtk_button_new_with_label ("button18");
6741 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6743 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6744 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6746 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6747 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6749 button21 = gtk_button_new_with_label ("button21");
6750 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6752 button20 = gtk_button_new_with_label ("button20");
6753 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6755 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6756 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6758 button23 = gtk_button_new_with_label ("button23");
6759 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6761 button22 = gtk_button_new_with_label ("button22");
6762 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6764 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6765 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6767 button25 = gtk_button_new_with_label ("button25");
6768 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6770 button24 = gtk_button_new_with_label ("button24");
6771 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6777 create_paned_keyboard_navigation (GtkWidget *widget)
6779 static GtkWidget *window1 = NULL;
6780 static GtkWidget *window2 = NULL;
6781 static GtkWidget *window3 = NULL;
6782 static GtkWidget *window4 = NULL;
6785 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6787 gtk_widget_destroy (window1);
6788 gtk_widget_destroy (window2);
6789 gtk_widget_destroy (window3);
6790 gtk_widget_destroy (window4);
6795 window1 = paned_keyboard_window1 (widget);
6796 g_signal_connect (window1, "destroy",
6797 G_CALLBACK (gtk_widget_destroyed),
6803 window2 = paned_keyboard_window2 (widget);
6804 g_signal_connect (window2, "destroy",
6805 G_CALLBACK (gtk_widget_destroyed),
6811 window3 = paned_keyboard_window3 (widget);
6812 g_signal_connect (window3, "destroy",
6813 G_CALLBACK (gtk_widget_destroyed),
6819 window4 = paned_keyboard_window4 (widget);
6820 g_signal_connect (window4, "destroy",
6821 G_CALLBACK (gtk_widget_destroyed),
6825 if (gtk_widget_get_visible (window1))
6826 gtk_widget_destroy (GTK_WIDGET (window1));
6828 gtk_widget_show_all (GTK_WIDGET (window1));
6830 if (gtk_widget_get_visible (window2))
6831 gtk_widget_destroy (GTK_WIDGET (window2));
6833 gtk_widget_show_all (GTK_WIDGET (window2));
6835 if (gtk_widget_get_visible (window3))
6836 gtk_widget_destroy (GTK_WIDGET (window3));
6838 gtk_widget_show_all (GTK_WIDGET (window3));
6840 if (gtk_widget_get_visible (window4))
6841 gtk_widget_destroy (GTK_WIDGET (window4));
6843 gtk_widget_show_all (GTK_WIDGET (window4));
6851 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6854 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6858 /* ignore double and triple click */
6859 if (event->type != GDK_BUTTON_PRESS)
6862 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6863 p->x = (int) event->x;
6864 p->y = (int) event->y;
6866 gtk_grab_add (widget);
6867 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6868 gtk_widget_get_window (widget),
6871 GDK_BUTTON_RELEASE_MASK |
6872 GDK_BUTTON_MOTION_MASK |
6873 GDK_POINTER_MOTION_HINT_MASK,
6879 shape_released (GtkWidget *widget,
6880 GdkEventButton *event)
6882 gtk_grab_remove (widget);
6883 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6887 shape_motion (GtkWidget *widget,
6888 GdkEventMotion *event)
6892 GdkModifierType mask;
6894 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6897 * Can't use event->x / event->y here
6898 * because I need absolute coordinates.
6900 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6901 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6905 shape_create_icon (GdkScreen *screen,
6916 CursorOffset* icon_pos;
6917 cairo_surface_t *mask;
6918 cairo_region_t *mask_region;
6923 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
6925 window = gtk_window_new (window_type);
6926 gtk_window_set_screen (GTK_WINDOW (window), screen);
6928 fixed = gtk_fixed_new ();
6929 gtk_widget_set_size_request (fixed, 100, 100);
6930 gtk_container_add (GTK_CONTAINER (window), fixed);
6931 gtk_widget_show (fixed);
6933 gtk_widget_set_events (window,
6934 gtk_widget_get_events (window) |
6935 GDK_BUTTON_MOTION_MASK |
6936 GDK_POINTER_MOTION_HINT_MASK |
6937 GDK_BUTTON_PRESS_MASK);
6939 gtk_widget_realize (window);
6941 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
6942 g_assert (pixbuf); /* FIXME: error handling */
6944 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
6945 gdk_pixbuf_get_width (pixbuf),
6946 gdk_pixbuf_get_height (pixbuf));
6947 cr = cairo_create (mask);
6948 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
6952 mask_region = gdk_cairo_region_create_from_surface (mask);
6954 cairo_region_translate (mask_region, px, py);
6956 image = gtk_image_new_from_pixbuf (pixbuf);
6957 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
6958 gtk_widget_show (image);
6960 gtk_widget_shape_combine_region (window, mask_region);
6962 cairo_region_destroy (mask_region);
6963 cairo_surface_destroy (mask);
6964 g_object_unref (pixbuf);
6966 g_signal_connect (window, "button_press_event",
6967 G_CALLBACK (shape_pressed), NULL);
6968 g_signal_connect (window, "button_release_event",
6969 G_CALLBACK (shape_released), NULL);
6970 g_signal_connect (window, "motion_notify_event",
6971 G_CALLBACK (shape_motion), NULL);
6973 icon_pos = g_new (CursorOffset, 1);
6974 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
6976 gtk_window_move (GTK_WINDOW (window), x, y);
6977 gtk_widget_show (window);
6983 create_shapes (GtkWidget *widget)
6985 /* Variables used by the Drag/Drop and Shape Window demos */
6986 static GtkWidget *modeller = NULL;
6987 static GtkWidget *sheets = NULL;
6988 static GtkWidget *rings = NULL;
6989 static GtkWidget *with_region = NULL;
6990 GdkScreen *screen = gtk_widget_get_screen (widget);
6992 if (!(file_exists ("Modeller.xpm") &&
6993 file_exists ("FilesQueue.xpm") &&
6994 file_exists ("3DRings.xpm")))
7000 modeller = shape_create_icon (screen, "Modeller.xpm",
7001 440, 140, 0,0, GTK_WINDOW_POPUP);
7003 g_signal_connect (modeller, "destroy",
7004 G_CALLBACK (gtk_widget_destroyed),
7008 gtk_widget_destroy (modeller);
7012 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7013 580, 170, 0,0, GTK_WINDOW_POPUP);
7015 g_signal_connect (sheets, "destroy",
7016 G_CALLBACK (gtk_widget_destroyed),
7021 gtk_widget_destroy (sheets);
7025 rings = shape_create_icon (screen, "3DRings.xpm",
7026 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7028 g_signal_connect (rings, "destroy",
7029 G_CALLBACK (gtk_widget_destroyed),
7033 gtk_widget_destroy (rings);
7037 cairo_region_t *region;
7040 with_region = shape_create_icon (screen, "3DRings.xpm",
7041 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7043 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7045 g_signal_connect (with_region, "destroy",
7046 G_CALLBACK (gtk_widget_destroyed),
7049 /* reset shape from mask to a region */
7052 region = cairo_region_create ();
7064 cairo_region_union_rectangle (region, &rect);
7072 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7077 gtk_widget_destroy (with_region);
7085 create_wmhints (GtkWidget *widget)
7087 static GtkWidget *window = NULL;
7089 GtkWidget *separator;
7093 GdkWindow *gdk_window;
7099 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7101 gtk_window_set_screen (GTK_WINDOW (window),
7102 gtk_widget_get_screen (widget));
7104 g_signal_connect (window, "destroy",
7105 G_CALLBACK (gtk_widget_destroyed),
7108 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7109 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7111 gtk_widget_realize (window);
7113 gdk_window = gtk_widget_get_window (window);
7115 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7116 list = g_list_prepend (NULL, pixbuf);
7118 gdk_window_set_icon_list (gdk_window, list);
7121 g_object_unref (pixbuf);
7123 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7125 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7126 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7128 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7129 gtk_container_add (GTK_CONTAINER (window), box1);
7130 gtk_widget_show (box1);
7132 label = gtk_label_new ("Try iconizing me!");
7133 gtk_widget_set_size_request (label, 150, 50);
7134 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7135 gtk_widget_show (label);
7138 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7139 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7140 gtk_widget_show (separator);
7143 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
7144 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7145 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7146 gtk_widget_show (box2);
7149 button = gtk_button_new_with_label ("close");
7151 g_signal_connect_swapped (button, "clicked",
7152 G_CALLBACK (gtk_widget_destroy),
7155 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7156 gtk_widget_set_can_default (button, TRUE);
7157 gtk_widget_grab_default (button);
7158 gtk_widget_show (button);
7161 if (!gtk_widget_get_visible (window))
7162 gtk_widget_show (window);
7164 gtk_widget_destroy (window);
7169 * Window state tracking
7173 window_state_callback (GtkWidget *widget,
7174 GdkEventWindowState *event,
7177 GtkWidget *label = data;
7180 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7181 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7182 "withdrawn" : "not withdrawn", ", ",
7183 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7184 "iconified" : "not iconified", ", ",
7185 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7186 "sticky" : "not sticky", ", ",
7187 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7188 "maximized" : "not maximized", ", ",
7189 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7190 "fullscreen" : "not fullscreen",
7191 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7192 "above" : "not above", ", ",
7193 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7194 "below" : "not below", ", ",
7197 gtk_label_set_text (GTK_LABEL (label), msg);
7205 tracking_label (GtkWidget *window)
7211 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
7213 g_signal_connect_object (hbox,
7215 G_CALLBACK (gtk_widget_destroy),
7219 label = gtk_label_new ("<no window state events received>");
7220 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7221 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7223 g_signal_connect (window,
7224 "window_state_event",
7225 G_CALLBACK (window_state_callback),
7228 button = gtk_button_new_with_label ("Deiconify");
7229 g_signal_connect_object (button,
7231 G_CALLBACK (gtk_window_deiconify),
7234 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7236 button = gtk_button_new_with_label ("Iconify");
7237 g_signal_connect_object (button,
7239 G_CALLBACK (gtk_window_iconify),
7242 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7244 button = gtk_button_new_with_label ("Fullscreen");
7245 g_signal_connect_object (button,
7247 G_CALLBACK (gtk_window_fullscreen),
7250 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7252 button = gtk_button_new_with_label ("Unfullscreen");
7253 g_signal_connect_object (button,
7255 G_CALLBACK (gtk_window_unfullscreen),
7258 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7260 button = gtk_button_new_with_label ("Present");
7261 g_signal_connect_object (button,
7263 G_CALLBACK (gtk_window_present),
7266 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7268 button = gtk_button_new_with_label ("Show");
7269 g_signal_connect_object (button,
7271 G_CALLBACK (gtk_widget_show),
7274 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7276 gtk_widget_show_all (hbox);
7282 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7284 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7286 gtk_window_set_keep_above (GTK_WINDOW (data),
7287 gtk_toggle_button_get_active (togglebutton));
7289 if (gtk_toggle_button_get_active (togglebutton))
7290 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7294 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7296 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7298 gtk_window_set_keep_below (GTK_WINDOW (data),
7299 gtk_toggle_button_get_active (togglebutton));
7301 if (gtk_toggle_button_get_active (togglebutton))
7302 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7307 get_state_controls (GtkWidget *window)
7311 GtkWidget *button_above;
7312 GtkWidget *button_below;
7314 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7316 button = gtk_button_new_with_label ("Stick");
7317 g_signal_connect_object (button,
7319 G_CALLBACK (gtk_window_stick),
7322 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7324 button = gtk_button_new_with_label ("Unstick");
7325 g_signal_connect_object (button,
7327 G_CALLBACK (gtk_window_unstick),
7330 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7332 button = gtk_button_new_with_label ("Maximize");
7333 g_signal_connect_object (button,
7335 G_CALLBACK (gtk_window_maximize),
7338 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7340 button = gtk_button_new_with_label ("Unmaximize");
7341 g_signal_connect_object (button,
7343 G_CALLBACK (gtk_window_unmaximize),
7346 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7348 button = gtk_button_new_with_label ("Iconify");
7349 g_signal_connect_object (button,
7351 G_CALLBACK (gtk_window_iconify),
7354 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7356 button = gtk_button_new_with_label ("Fullscreen");
7357 g_signal_connect_object (button,
7359 G_CALLBACK (gtk_window_fullscreen),
7362 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7364 button = gtk_button_new_with_label ("Unfullscreen");
7365 g_signal_connect_object (button,
7367 G_CALLBACK (gtk_window_unfullscreen),
7370 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7372 button_above = gtk_toggle_button_new_with_label ("Keep above");
7373 g_signal_connect (button_above,
7375 G_CALLBACK (keep_window_above),
7377 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7379 button_below = gtk_toggle_button_new_with_label ("Keep below");
7380 g_signal_connect (button_below,
7382 G_CALLBACK (keep_window_below),
7384 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7386 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7387 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7389 button = gtk_button_new_with_label ("Hide (withdraw)");
7390 g_signal_connect_object (button,
7392 G_CALLBACK (gtk_widget_hide),
7395 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7397 gtk_widget_show_all (vbox);
7403 create_window_states (GtkWidget *widget)
7405 static GtkWidget *window = NULL;
7408 GtkWidget *iconified;
7410 GtkWidget *controls;
7414 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7415 gtk_window_set_screen (GTK_WINDOW (window),
7416 gtk_widget_get_screen (widget));
7418 g_signal_connect (window, "destroy",
7419 G_CALLBACK (gtk_widget_destroyed),
7422 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7424 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7425 gtk_container_add (GTK_CONTAINER (window), box1);
7427 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7429 gtk_window_set_screen (GTK_WINDOW (iconified),
7430 gtk_widget_get_screen (widget));
7432 g_signal_connect_object (iconified, "destroy",
7433 G_CALLBACK (gtk_widget_destroy),
7436 gtk_window_iconify (GTK_WINDOW (iconified));
7437 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7438 controls = get_state_controls (iconified);
7439 gtk_container_add (GTK_CONTAINER (iconified), controls);
7441 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7443 gtk_window_set_screen (GTK_WINDOW (normal),
7444 gtk_widget_get_screen (widget));
7446 g_signal_connect_object (normal, "destroy",
7447 G_CALLBACK (gtk_widget_destroy),
7451 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7452 controls = get_state_controls (normal);
7453 gtk_container_add (GTK_CONTAINER (normal), controls);
7455 label = tracking_label (iconified);
7456 gtk_container_add (GTK_CONTAINER (box1), label);
7458 label = tracking_label (normal);
7459 gtk_container_add (GTK_CONTAINER (box1), label);
7461 gtk_widget_show_all (iconified);
7462 gtk_widget_show_all (normal);
7463 gtk_widget_show_all (box1);
7466 if (!gtk_widget_get_visible (window))
7467 gtk_widget_show (window);
7469 gtk_widget_destroy (window);
7477 configure_event_callback (GtkWidget *widget,
7478 GdkEventConfigure *event,
7481 GtkWidget *label = data;
7485 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7487 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7489 event->x, event->y, event->width, event->height,
7492 gtk_label_set_text (GTK_LABEL (label), msg);
7500 get_ints (GtkWidget *window,
7507 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7508 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7510 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7511 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7515 set_size_callback (GtkWidget *widget,
7520 get_ints (data, &w, &h);
7522 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7526 unset_default_size_callback (GtkWidget *widget,
7529 gtk_window_set_default_size (g_object_get_data (data, "target"),
7534 set_default_size_callback (GtkWidget *widget,
7539 get_ints (data, &w, &h);
7541 gtk_window_set_default_size (g_object_get_data (data, "target"),
7546 unset_size_request_callback (GtkWidget *widget,
7549 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7554 set_size_request_callback (GtkWidget *widget,
7559 get_ints (data, &w, &h);
7561 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7566 set_location_callback (GtkWidget *widget,
7571 get_ints (data, &x, &y);
7573 gtk_window_move (g_object_get_data (data, "target"), x, y);
7577 move_to_position_callback (GtkWidget *widget,
7583 window = g_object_get_data (data, "target");
7585 gtk_window_get_position (window, &x, &y);
7587 gtk_window_move (window, x, y);
7591 set_geometry_callback (GtkWidget *entry,
7597 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7599 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7601 if (!gtk_window_parse_geometry (target, text))
7602 g_print ("Bad geometry string '%s'\n", text);
7608 resizable_callback (GtkWidget *widget,
7611 g_object_set (g_object_get_data (data, "target"),
7612 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7617 gravity_selected (GtkWidget *widget,
7620 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7621 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7625 pos_selected (GtkWidget *widget,
7628 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7629 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7633 move_gravity_window_to_current_position (GtkWidget *widget,
7639 window = GTK_WINDOW (data);
7641 gtk_window_get_position (window, &x, &y);
7643 gtk_window_move (window, x, y);
7647 get_screen_corner (GtkWindow *window,
7652 GdkScreen * screen = gtk_window_get_screen (window);
7654 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7656 switch (gtk_window_get_gravity (window))
7658 case GDK_GRAVITY_SOUTH_EAST:
7659 *x = gdk_screen_get_width (screen) - w;
7660 *y = gdk_screen_get_height (screen) - h;
7663 case GDK_GRAVITY_NORTH_EAST:
7664 *x = gdk_screen_get_width (screen) - w;
7668 case GDK_GRAVITY_SOUTH_WEST:
7670 *y = gdk_screen_get_height (screen) - h;
7673 case GDK_GRAVITY_NORTH_WEST:
7678 case GDK_GRAVITY_SOUTH:
7679 *x = (gdk_screen_get_width (screen) - w) / 2;
7680 *y = gdk_screen_get_height (screen) - h;
7683 case GDK_GRAVITY_NORTH:
7684 *x = (gdk_screen_get_width (screen) - w) / 2;
7688 case GDK_GRAVITY_WEST:
7690 *y = (gdk_screen_get_height (screen) - h) / 2;
7693 case GDK_GRAVITY_EAST:
7694 *x = gdk_screen_get_width (screen) - w;
7695 *y = (gdk_screen_get_height (screen) - h) / 2;
7698 case GDK_GRAVITY_CENTER:
7699 *x = (gdk_screen_get_width (screen) - w) / 2;
7700 *y = (gdk_screen_get_height (screen) - h) / 2;
7703 case GDK_GRAVITY_STATIC:
7704 /* pick some random numbers */
7710 g_assert_not_reached ();
7716 move_gravity_window_to_starting_position (GtkWidget *widget,
7722 window = GTK_WINDOW (data);
7724 get_screen_corner (window,
7727 gtk_window_move (window, x, y);
7731 make_gravity_window (GtkWidget *destroy_with,
7740 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7742 gtk_window_set_screen (GTK_WINDOW (window),
7743 gtk_widget_get_screen (destroy_with));
7745 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7746 gtk_widget_show (vbox);
7748 gtk_container_add (GTK_CONTAINER (window), vbox);
7749 gtk_window_set_title (GTK_WINDOW (window), title);
7750 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7752 g_signal_connect_object (destroy_with,
7754 G_CALLBACK (gtk_widget_destroy),
7759 button = gtk_button_new_with_mnemonic ("_Move to current position");
7761 g_signal_connect (button, "clicked",
7762 G_CALLBACK (move_gravity_window_to_current_position),
7765 gtk_container_add (GTK_CONTAINER (vbox), button);
7766 gtk_widget_show (button);
7768 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7770 g_signal_connect (button, "clicked",
7771 G_CALLBACK (move_gravity_window_to_starting_position),
7774 gtk_container_add (GTK_CONTAINER (vbox), button);
7775 gtk_widget_show (button);
7777 /* Pretend this is the result of --geometry.
7778 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7779 * and in that case you probably should just use gtk_window_parse_geometry().
7780 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7781 * you are parsing --geometry or equivalent.
7783 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7787 gtk_window_set_default_size (GTK_WINDOW (window),
7790 get_screen_corner (GTK_WINDOW (window), &x, &y);
7792 gtk_window_move (GTK_WINDOW (window),
7799 do_gravity_test (GtkWidget *widget,
7802 GtkWidget *destroy_with = data;
7805 /* We put a window at each gravity point on the screen. */
7806 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7808 gtk_widget_show (window);
7810 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7812 gtk_widget_show (window);
7814 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7816 gtk_widget_show (window);
7818 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7820 gtk_widget_show (window);
7822 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7824 gtk_widget_show (window);
7826 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7828 gtk_widget_show (window);
7831 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7833 gtk_widget_show (window);
7836 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7838 gtk_widget_show (window);
7840 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7842 gtk_widget_show (window);
7844 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7846 gtk_widget_show (window);
7850 window_controls (GtkWidget *window)
7852 GtkWidget *control_window;
7857 GtkAdjustment *adjustment;
7862 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7864 gtk_window_set_screen (GTK_WINDOW (control_window),
7865 gtk_widget_get_screen (window));
7867 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7869 g_object_set_data (G_OBJECT (control_window),
7873 g_signal_connect_object (control_window,
7875 G_CALLBACK (gtk_widget_destroy),
7879 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7881 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7883 label = gtk_label_new ("<no configure events>");
7884 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7886 g_signal_connect (window,
7888 G_CALLBACK (configure_event_callback),
7891 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7892 spin = gtk_spin_button_new (adjustment, 0, 0);
7894 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7896 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7898 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7899 spin = gtk_spin_button_new (adjustment, 0, 0);
7901 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7903 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7905 entry = gtk_entry_new ();
7906 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7908 g_signal_connect (entry, "changed",
7909 G_CALLBACK (set_geometry_callback),
7912 button = gtk_button_new_with_label ("Show gravity test windows");
7913 g_signal_connect_swapped (button,
7915 G_CALLBACK (do_gravity_test),
7917 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7919 button = gtk_button_new_with_label ("Reshow with initial size");
7920 g_signal_connect_object (button,
7922 G_CALLBACK (gtk_window_reshow_with_initial_size),
7925 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7927 button = gtk_button_new_with_label ("Queue resize");
7928 g_signal_connect_object (button,
7930 G_CALLBACK (gtk_widget_queue_resize),
7933 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7935 button = gtk_button_new_with_label ("Resize");
7936 g_signal_connect (button,
7938 G_CALLBACK (set_size_callback),
7940 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7942 button = gtk_button_new_with_label ("Set default size");
7943 g_signal_connect (button,
7945 G_CALLBACK (set_default_size_callback),
7947 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7949 button = gtk_button_new_with_label ("Unset default size");
7950 g_signal_connect (button,
7952 G_CALLBACK (unset_default_size_callback),
7954 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7956 button = gtk_button_new_with_label ("Set size request");
7957 g_signal_connect (button,
7959 G_CALLBACK (set_size_request_callback),
7961 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7963 button = gtk_button_new_with_label ("Unset size request");
7964 g_signal_connect (button,
7966 G_CALLBACK (unset_size_request_callback),
7968 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7970 button = gtk_button_new_with_label ("Move");
7971 g_signal_connect (button,
7973 G_CALLBACK (set_location_callback),
7975 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7977 button = gtk_button_new_with_label ("Move to current position");
7978 g_signal_connect (button,
7980 G_CALLBACK (move_to_position_callback),
7982 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7984 button = gtk_check_button_new_with_label ("Allow resize");
7985 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
7986 g_signal_connect (button,
7988 G_CALLBACK (resizable_callback),
7990 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7992 button = gtk_button_new_with_mnemonic ("_Show");
7993 g_signal_connect_object (button,
7995 G_CALLBACK (gtk_widget_show),
7998 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8000 button = gtk_button_new_with_mnemonic ("_Hide");
8001 g_signal_connect_object (button,
8003 G_CALLBACK (gtk_widget_hide),
8006 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8008 om = gtk_combo_box_text_new ();
8012 static gchar *names[] = {
8013 "GDK_GRAVITY_NORTH_WEST",
8014 "GDK_GRAVITY_NORTH",
8015 "GDK_GRAVITY_NORTH_EAST",
8017 "GDK_GRAVITY_CENTER",
8019 "GDK_GRAVITY_SOUTH_WEST",
8020 "GDK_GRAVITY_SOUTH",
8021 "GDK_GRAVITY_SOUTH_EAST",
8022 "GDK_GRAVITY_STATIC",
8026 g_assert (names[i]);
8027 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8032 g_signal_connect (om,
8034 G_CALLBACK (gravity_selected),
8037 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8040 om = gtk_combo_box_text_new ();
8044 static gchar *names[] = {
8046 "GTK_WIN_POS_CENTER",
8047 "GTK_WIN_POS_MOUSE",
8048 "GTK_WIN_POS_CENTER_ALWAYS",
8049 "GTK_WIN_POS_CENTER_ON_PARENT",
8053 g_assert (names[i]);
8054 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8059 g_signal_connect (om,
8061 G_CALLBACK (pos_selected),
8064 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8066 gtk_widget_show_all (vbox);
8068 return control_window;
8072 create_window_sizing (GtkWidget *widget)
8074 static GtkWidget *window = NULL;
8075 static GtkWidget *target_window = NULL;
8081 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8082 gtk_window_set_screen (GTK_WINDOW (target_window),
8083 gtk_widget_get_screen (widget));
8084 label = gtk_label_new (NULL);
8085 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");
8086 gtk_container_add (GTK_CONTAINER (target_window), label);
8087 gtk_widget_show (label);
8089 g_signal_connect (target_window, "destroy",
8090 G_CALLBACK (gtk_widget_destroyed),
8093 window = window_controls (target_window);
8095 g_signal_connect (window, "destroy",
8096 G_CALLBACK (gtk_widget_destroyed),
8099 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8102 /* don't show target window by default, we want to allow testing
8103 * of behavior on first show.
8106 if (!gtk_widget_get_visible (window))
8107 gtk_widget_show (window);
8109 gtk_widget_destroy (window);
8116 typedef struct _ProgressData {
8119 GtkWidget *block_spin;
8120 GtkWidget *x_align_spin;
8121 GtkWidget *y_align_spin;
8122 GtkWidget *step_spin;
8123 GtkWidget *act_blocks_spin;
8134 progress_timeout (gpointer data)
8136 ProgressData *pdata = data;
8140 if (pdata->activity)
8142 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8144 text = g_strdup_printf ("%s", "???");
8148 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8151 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8153 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8156 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8163 destroy_progress (GtkWidget *widget,
8164 ProgressData **pdata)
8166 if ((*pdata)->timer)
8168 g_source_remove ((*pdata)->timer);
8169 (*pdata)->timer = 0;
8171 (*pdata)->window = NULL;
8177 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8179 ProgressData *pdata;
8182 pdata = (ProgressData *) data;
8184 if (!gtk_widget_get_mapped (widget))
8187 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8189 if (i == 0 || i == 1)
8190 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8192 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8194 if (i == 1 || i == 2)
8195 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8197 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8201 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8205 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8206 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8210 progressbar_toggle_ellipsize (GtkWidget *widget,
8213 ProgressData *pdata = data;
8214 if (gtk_widget_is_drawable (widget))
8216 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8217 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8222 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8224 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8228 toggle_running (GtkWidget *widget, ProgressData *pdata)
8230 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
8232 if (pdata->timer == 0)
8233 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8237 if (pdata->timer != 0)
8239 g_source_remove (pdata->timer);
8246 entry_changed (GtkWidget *widget, ProgressData *pdata)
8248 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8249 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8253 create_progress_bar (GtkWidget *widget)
8255 GtkWidget *action_area, *content_area;
8265 static ProgressData *pdata = NULL;
8267 static gchar *items1[] =
8275 static char *ellipsize_items[] = {
8276 "None", // PANGO_ELLIPSIZE_NONE,
8277 "Start", // PANGO_ELLIPSIZE_START,
8278 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8279 "End", // PANGO_ELLIPSIZE_END
8283 pdata = g_new0 (ProgressData, 1);
8287 pdata->window = gtk_dialog_new ();
8289 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8290 gtk_widget_get_screen (widget));
8292 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8294 g_signal_connect (pdata->window, "destroy",
8295 G_CALLBACK (destroy_progress),
8299 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8300 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8302 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8303 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8305 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8306 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8307 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8309 frame = gtk_frame_new ("Progress");
8310 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8312 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8313 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8315 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8316 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8318 pdata->pbar = gtk_progress_bar_new ();
8319 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8320 PANGO_ELLIPSIZE_MIDDLE);
8322 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8324 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8325 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8327 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8328 gtk_container_add (GTK_CONTAINER (align), hbox);
8329 label = gtk_label_new ("Label updated by user :");
8330 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8331 pdata->label = gtk_label_new ("");
8332 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8334 frame = gtk_frame_new ("Options");
8335 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8337 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8338 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8340 tab = gtk_table_new (7, 2, FALSE);
8341 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8343 label = gtk_label_new ("Orientation :");
8344 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8345 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8347 gtk_widget_set_halign (label, GTK_ALIGN_START);
8348 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8350 pdata->omenu1 = build_option_menu (items1, 4, 0,
8351 progressbar_toggle_orientation,
8353 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8354 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8355 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8357 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8359 check = gtk_check_button_new_with_label ("Running");
8360 g_signal_connect (check, "toggled",
8361 G_CALLBACK (toggle_running),
8363 gtk_table_attach (GTK_TABLE (tab), check, 0, 2, 1, 2,
8364 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8366 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8368 check = gtk_check_button_new_with_label ("Show text");
8369 g_signal_connect (check, "clicked",
8370 G_CALLBACK (toggle_show_text),
8372 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 2, 3,
8373 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8376 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8377 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
8378 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8381 label = gtk_label_new ("Text: ");
8382 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8384 pdata->entry = gtk_entry_new ();
8385 g_signal_connect (pdata->entry, "changed",
8386 G_CALLBACK (entry_changed),
8388 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8389 gtk_widget_set_size_request (pdata->entry, 100, -1);
8391 label = gtk_label_new ("Ellipsize text :");
8392 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8393 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8395 gtk_widget_set_halign (label, GTK_ALIGN_START);
8396 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8397 pdata->elmenu = build_option_menu (ellipsize_items,
8398 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8399 2, // PANGO_ELLIPSIZE_MIDDLE
8400 progressbar_toggle_ellipsize,
8402 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8403 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8404 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8406 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8408 check = gtk_check_button_new_with_label ("Activity mode");
8409 g_signal_connect (check, "clicked",
8410 G_CALLBACK (toggle_activity_mode), pdata);
8411 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8412 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8415 button = gtk_button_new_with_label ("close");
8416 g_signal_connect_swapped (button, "clicked",
8417 G_CALLBACK (gtk_widget_destroy),
8419 gtk_widget_set_can_default (button, TRUE);
8420 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8421 gtk_widget_grab_default (button);
8424 if (!gtk_widget_get_visible (pdata->window))
8425 gtk_widget_show_all (pdata->window);
8427 gtk_widget_destroy (pdata->window);
8439 GtkWidget *res_widget;
8443 find_widget (GtkWidget *widget, FindWidgetData *data)
8445 GtkAllocation new_allocation;
8449 gtk_widget_get_allocation (widget, &new_allocation);
8451 if (data->found || !gtk_widget_get_mapped (widget))
8454 /* Note that in the following code, we only count the
8455 * position as being inside a WINDOW widget if it is inside
8456 * widget->window; points that are outside of widget->window
8457 * but within the allocation are not counted. This is consistent
8458 * with the way we highlight drag targets.
8460 if (gtk_widget_get_has_window (widget))
8462 new_allocation.x = 0;
8463 new_allocation.y = 0;
8466 if (gtk_widget_get_parent (widget) && !data->first)
8468 GdkWindow *window = gtk_widget_get_window (widget);
8469 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8471 gint tx, ty, twidth, theight;
8473 twidth = gdk_window_get_width (window);
8474 theight = gdk_window_get_height (window);
8476 if (new_allocation.x < 0)
8478 new_allocation.width += new_allocation.x;
8479 new_allocation.x = 0;
8481 if (new_allocation.y < 0)
8483 new_allocation.height += new_allocation.y;
8484 new_allocation.y = 0;
8486 if (new_allocation.x + new_allocation.width > twidth)
8487 new_allocation.width = twidth - new_allocation.x;
8488 if (new_allocation.y + new_allocation.height > theight)
8489 new_allocation.height = theight - new_allocation.y;
8491 gdk_window_get_position (window, &tx, &ty);
8492 new_allocation.x += tx;
8494 new_allocation.y += ty;
8497 window = gdk_window_get_parent (window);
8501 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8502 (data->x < new_allocation.x + new_allocation.width) &&
8503 (data->y < new_allocation.y + new_allocation.height))
8505 /* First, check if the drag is in a valid drop site in
8506 * one of our children
8508 if (GTK_IS_CONTAINER (widget))
8510 FindWidgetData new_data = *data;
8512 new_data.x -= x_offset;
8513 new_data.y -= y_offset;
8514 new_data.found = FALSE;
8515 new_data.first = FALSE;
8517 gtk_container_forall (GTK_CONTAINER (widget),
8518 (GtkCallback)find_widget,
8521 data->found = new_data.found;
8523 data->res_widget = new_data.res_widget;
8526 /* If not, and this widget is registered as a drop site, check to
8527 * emit "drag_motion" to check if we are actually in
8533 data->res_widget = widget;
8539 find_widget_at_pointer (GdkDevice *device)
8541 GtkWidget *widget = NULL;
8542 GdkWindow *pointer_window;
8544 FindWidgetData data;
8546 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8550 gpointer widget_ptr;
8552 gdk_window_get_user_data (pointer_window, &widget_ptr);
8553 widget = widget_ptr;
8558 gdk_window_get_pointer (gtk_widget_get_window (widget),
8566 find_widget (widget, &data);
8568 return data.res_widget;
8574 struct PropertiesData {
8582 destroy_properties (GtkWidget *widget,
8583 struct PropertiesData *data)
8587 *data->window = NULL;
8588 data->window = NULL;
8593 g_object_unref (data->cursor);
8594 data->cursor = NULL;
8599 g_signal_handler_disconnect (widget, data->handler);
8607 property_query_event (GtkWidget *widget,
8609 struct PropertiesData *data)
8611 GtkWidget *res_widget = NULL;
8613 if (!data->in_query)
8616 if (event->type == GDK_BUTTON_RELEASE)
8618 gtk_grab_remove (widget);
8619 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8621 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8624 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8625 gtk_widget_get_screen (widget));
8626 create_prop_editor (G_OBJECT (res_widget), 0);
8629 data->in_query = FALSE;
8636 query_properties (GtkButton *button,
8637 struct PropertiesData *data)
8639 GtkWidget *widget = GTK_WIDGET (button);
8640 GdkDisplay *display;
8641 GdkDeviceManager *device_manager;
8644 g_signal_connect (button, "event",
8645 G_CALLBACK (property_query_event), data);
8647 display = gtk_widget_get_display (widget);
8650 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8652 device_manager = gdk_display_get_device_manager (display);
8653 device = gdk_device_manager_get_client_pointer (device_manager);
8654 gdk_device_grab (device,
8655 gtk_widget_get_window (widget),
8658 GDK_BUTTON_RELEASE_MASK,
8661 gtk_grab_add (widget);
8663 data->in_query = TRUE;
8667 create_properties (GtkWidget *widget)
8669 static GtkWidget *window = NULL;
8673 struct PropertiesData *data;
8675 data = g_new (struct PropertiesData, 1);
8676 data->window = &window;
8677 data->in_query = FALSE;
8678 data->cursor = NULL;
8683 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8685 gtk_window_set_screen (GTK_WINDOW (window),
8686 gtk_widget_get_screen (widget));
8688 data->handler = g_signal_connect (window, "destroy",
8689 G_CALLBACK (destroy_properties),
8692 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8693 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8695 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8696 gtk_container_add (GTK_CONTAINER (window), vbox);
8698 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8699 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8701 button = gtk_button_new_with_label ("Query properties");
8702 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8703 g_signal_connect (button, "clicked",
8704 G_CALLBACK (query_properties),
8708 if (!gtk_widget_get_visible (window))
8709 gtk_widget_show_all (window);
8711 gtk_widget_destroy (window);
8715 struct SnapshotData {
8716 GtkWidget *toplevel_button;
8720 gboolean is_toplevel;
8725 destroy_snapshot_data (GtkWidget *widget,
8726 struct SnapshotData *data)
8729 *data->window = NULL;
8733 g_object_unref (data->cursor);
8734 data->cursor = NULL;
8739 g_signal_handler_disconnect (widget, data->handler);
8747 snapshot_widget_event (GtkWidget *widget,
8749 struct SnapshotData *data)
8751 GtkWidget *res_widget = NULL;
8753 if (!data->in_query)
8756 if (event->type == GDK_BUTTON_RELEASE)
8758 gtk_grab_remove (widget);
8759 gdk_device_ungrab (gdk_event_get_device (event),
8762 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8763 if (data->is_toplevel && res_widget)
8764 res_widget = gtk_widget_get_toplevel (res_widget);
8767 cairo_surface_t *surface;
8768 GtkWidget *window, *image;
8773 width = gtk_widget_get_allocated_width (res_widget);
8774 height = gtk_widget_get_allocated_height (res_widget);
8776 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8778 cr = cairo_create (surface);
8779 gtk_widget_draw (res_widget, cr);
8782 pixbuf = gdk_pixbuf_get_from_surface (surface,
8785 cairo_surface_destroy (surface);
8787 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8788 image = gtk_image_new_from_pixbuf (pixbuf);
8789 g_object_unref (pixbuf);
8791 gtk_container_add (GTK_CONTAINER (window), image);
8792 gtk_widget_show_all (window);
8795 data->in_query = FALSE;
8802 snapshot_widget (GtkButton *button,
8803 struct SnapshotData *data)
8805 GtkWidget *widget = GTK_WIDGET (button);
8808 device = gtk_get_current_event_device ();
8812 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8813 device = gdk_device_get_associated_device (device);
8815 data->is_toplevel = widget == data->toplevel_button;
8818 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8821 gdk_device_grab (device,
8822 gtk_widget_get_window (widget),
8823 GDK_OWNERSHIP_APPLICATION,
8825 GDK_BUTTON_RELEASE_MASK,
8829 g_signal_connect (button, "event",
8830 G_CALLBACK (snapshot_widget_event), data);
8832 gtk_grab_add (widget);
8834 data->in_query = TRUE;
8838 create_snapshot (GtkWidget *widget)
8840 static GtkWidget *window = NULL;
8843 struct SnapshotData *data;
8845 data = g_new (struct SnapshotData, 1);
8846 data->window = &window;
8847 data->in_query = FALSE;
8848 data->cursor = NULL;
8853 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8855 gtk_window_set_screen (GTK_WINDOW (window),
8856 gtk_widget_get_screen (widget));
8858 data->handler = g_signal_connect (window, "destroy",
8859 G_CALLBACK (destroy_snapshot_data),
8862 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8863 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8865 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8866 gtk_container_add (GTK_CONTAINER (window), vbox);
8868 button = gtk_button_new_with_label ("Snapshot widget");
8869 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8870 g_signal_connect (button, "clicked",
8871 G_CALLBACK (snapshot_widget),
8874 button = gtk_button_new_with_label ("Snapshot toplevel");
8875 data->toplevel_button = button;
8876 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8877 g_signal_connect (button, "clicked",
8878 G_CALLBACK (snapshot_widget),
8882 if (!gtk_widget_get_visible (window))
8883 gtk_widget_show_all (window);
8885 gtk_widget_destroy (window);
8894 selection_test_received (GtkWidget *tree_view,
8895 GtkSelectionData *selection_data)
8897 GtkTreeModel *model;
8898 GtkListStore *store;
8902 if (gtk_selection_data_get_length (selection_data) < 0)
8904 g_print ("Selection retrieval failed\n");
8907 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8909 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8913 /* Clear out any current list items */
8915 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8916 store = GTK_LIST_STORE (model);
8917 gtk_list_store_clear (store);
8919 /* Add new items to list */
8921 gtk_selection_data_get_targets (selection_data,
8924 for (i = 0; i < l; i++)
8929 name = gdk_atom_name (atoms[i]);
8932 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
8936 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
8943 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
8945 static GdkAtom targets_atom = GDK_NONE;
8947 if (targets_atom == GDK_NONE)
8948 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
8950 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
8955 create_selection_test (GtkWidget *widget)
8957 static GtkWidget *window = NULL;
8958 GtkWidget *action_area, *content_area;
8961 GtkWidget *scrolled_win;
8962 GtkListStore* store;
8963 GtkWidget *tree_view;
8964 GtkTreeViewColumn *column;
8965 GtkCellRenderer *renderer;
8970 window = gtk_dialog_new ();
8972 gtk_window_set_screen (GTK_WINDOW (window),
8973 gtk_widget_get_screen (widget));
8975 g_signal_connect (window, "destroy",
8976 G_CALLBACK (gtk_widget_destroyed),
8979 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8980 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
8982 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
8983 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8985 /* Create the list */
8987 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8988 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8989 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
8991 label = gtk_label_new ("Gets available targets for current selection");
8992 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8994 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
8995 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
8996 GTK_POLICY_AUTOMATIC,
8997 GTK_POLICY_AUTOMATIC);
8998 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
8999 gtk_widget_set_size_request (scrolled_win, 100, 200);
9001 store = gtk_list_store_new (1, G_TYPE_STRING);
9002 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9003 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9005 renderer = gtk_cell_renderer_text_new ();
9006 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9008 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9010 g_signal_connect (tree_view, "selection_received",
9011 G_CALLBACK (selection_test_received), NULL);
9013 /* .. And create some buttons */
9014 button = gtk_button_new_with_label ("Get Targets");
9015 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9017 g_signal_connect (button, "clicked",
9018 G_CALLBACK (selection_test_get_targets), tree_view);
9020 button = gtk_button_new_with_label ("Quit");
9021 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9023 g_signal_connect_swapped (button, "clicked",
9024 G_CALLBACK (gtk_widget_destroy),
9028 if (!gtk_widget_get_visible (window))
9029 gtk_widget_show_all (window);
9031 gtk_widget_destroy (window);
9038 static int scroll_test_pos = 0.0;
9041 scroll_test_draw (GtkWidget *widget,
9043 GtkAdjustment *adjustment)
9046 gint imin, imax, jmin, jmax;
9049 gdk_cairo_get_clip_rectangle (cr, &clip);
9051 imin = (clip.x) / 10;
9052 imax = (clip.x + clip.width + 9) / 10;
9054 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
9055 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
9057 for (i=imin; i<imax; i++)
9058 for (j=jmin; j<jmax; j++)
9060 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
9068 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9069 GtkAdjustment *adjustment)
9071 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
9072 -gtk_adjustment_get_page_increment (adjustment) / 2:
9073 gtk_adjustment_get_page_increment (adjustment) / 2);
9074 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
9075 gtk_adjustment_set_value (adjustment, new_value);
9081 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9082 GtkAdjustment *adjustment)
9084 GtkAllocation allocation;
9086 gtk_widget_get_allocation (widget, &allocation);
9087 gtk_adjustment_configure (adjustment,
9088 gtk_adjustment_get_value (adjustment),
9089 gtk_adjustment_get_lower (adjustment),
9090 gtk_adjustment_get_upper (adjustment),
9091 0.1 * allocation.height,
9092 0.9 * allocation.height,
9097 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
9102 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
9103 scroll_test_pos = gtk_adjustment_get_value (adjustment);
9105 if (!gtk_widget_is_drawable (widget))
9108 window = gtk_widget_get_window (widget);
9109 gdk_window_scroll (window, 0, dy);
9110 gdk_window_process_updates (window, FALSE);
9115 create_scroll_test (GtkWidget *widget)
9117 static GtkWidget *window = NULL;
9118 GtkWidget *action_area, *content_area;
9120 GtkWidget *drawing_area;
9121 GtkWidget *scrollbar;
9123 GtkAdjustment *adjustment;
9124 GdkGeometry geometry;
9125 GdkWindowHints geometry_mask;
9129 window = gtk_dialog_new ();
9131 gtk_window_set_screen (GTK_WINDOW (window),
9132 gtk_widget_get_screen (widget));
9134 g_signal_connect (window, "destroy",
9135 G_CALLBACK (gtk_widget_destroyed),
9138 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9139 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9141 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9142 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9144 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9145 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9146 gtk_widget_show (hbox);
9148 drawing_area = gtk_drawing_area_new ();
9149 gtk_widget_set_size_request (drawing_area, 200, 200);
9150 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9151 gtk_widget_show (drawing_area);
9153 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9155 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9156 scroll_test_pos = 0.0;
9158 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
9159 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9160 gtk_widget_show (scrollbar);
9162 g_signal_connect (drawing_area, "draw",
9163 G_CALLBACK (scroll_test_draw), adjustment);
9164 g_signal_connect (drawing_area, "configure_event",
9165 G_CALLBACK (scroll_test_configure), adjustment);
9166 g_signal_connect (drawing_area, "scroll_event",
9167 G_CALLBACK (scroll_test_scroll), adjustment);
9169 g_signal_connect (adjustment, "value_changed",
9170 G_CALLBACK (scroll_test_adjustment_changed),
9173 /* .. And create some buttons */
9175 button = gtk_button_new_with_label ("Quit");
9176 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9178 g_signal_connect_swapped (button, "clicked",
9179 G_CALLBACK (gtk_widget_destroy),
9181 gtk_widget_show (button);
9183 /* Set up gridded geometry */
9185 geometry_mask = GDK_HINT_MIN_SIZE |
9186 GDK_HINT_BASE_SIZE |
9187 GDK_HINT_RESIZE_INC;
9189 geometry.min_width = 20;
9190 geometry.min_height = 20;
9191 geometry.base_width = 0;
9192 geometry.base_height = 0;
9193 geometry.width_inc = 10;
9194 geometry.height_inc = 10;
9196 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9197 drawing_area, &geometry, geometry_mask);
9200 if (!gtk_widget_get_visible (window))
9201 gtk_widget_show (window);
9203 gtk_widget_destroy (window);
9210 static int timer = 0;
9213 timeout_test (GtkWidget *label)
9215 static int count = 0;
9216 static char buffer[32];
9218 sprintf (buffer, "count: %d", ++count);
9219 gtk_label_set_text (GTK_LABEL (label), buffer);
9225 start_timeout_test (GtkWidget *widget,
9230 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9235 stop_timeout_test (GtkWidget *widget,
9240 g_source_remove (timer);
9246 destroy_timeout_test (GtkWidget *widget,
9249 stop_timeout_test (NULL, NULL);
9255 create_timeout_test (GtkWidget *widget)
9257 static GtkWidget *window = NULL;
9258 GtkWidget *action_area, *content_area;
9264 window = gtk_dialog_new ();
9266 gtk_window_set_screen (GTK_WINDOW (window),
9267 gtk_widget_get_screen (widget));
9269 g_signal_connect (window, "destroy",
9270 G_CALLBACK (destroy_timeout_test),
9273 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9274 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9276 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9277 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9279 label = gtk_label_new ("count: 0");
9280 g_object_set (label, "margin", 10, NULL);
9281 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9282 gtk_widget_show (label);
9284 button = gtk_button_new_with_label ("close");
9285 g_signal_connect_swapped (button, "clicked",
9286 G_CALLBACK (gtk_widget_destroy),
9288 gtk_widget_set_can_default (button, TRUE);
9289 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9290 gtk_widget_grab_default (button);
9291 gtk_widget_show (button);
9293 button = gtk_button_new_with_label ("start");
9294 g_signal_connect (button, "clicked",
9295 G_CALLBACK(start_timeout_test),
9297 gtk_widget_set_can_default (button, TRUE);
9298 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9299 gtk_widget_show (button);
9301 button = gtk_button_new_with_label ("stop");
9302 g_signal_connect (button, "clicked",
9303 G_CALLBACK (stop_timeout_test),
9305 gtk_widget_set_can_default (button, TRUE);
9306 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9307 gtk_widget_show (button);
9310 if (!gtk_widget_get_visible (window))
9311 gtk_widget_show (window);
9313 gtk_widget_destroy (window);
9320 static int idle_id = 0;
9323 idle_test (GtkWidget *label)
9325 static int count = 0;
9326 static char buffer[32];
9328 sprintf (buffer, "count: %d", ++count);
9329 gtk_label_set_text (GTK_LABEL (label), buffer);
9335 start_idle_test (GtkWidget *widget,
9340 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9345 stop_idle_test (GtkWidget *widget,
9350 g_source_remove (idle_id);
9356 destroy_idle_test (GtkWidget *widget,
9359 stop_idle_test (NULL, NULL);
9365 toggle_idle_container (GObject *button,
9366 GtkContainer *container)
9368 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9372 create_idle_test (GtkWidget *widget)
9374 static GtkWidget *window = NULL;
9377 GtkWidget *container;
9381 GtkWidget *action_area, *content_area;
9386 window = gtk_dialog_new ();
9388 gtk_window_set_screen (GTK_WINDOW (window),
9389 gtk_widget_get_screen (widget));
9391 g_signal_connect (window, "destroy",
9392 G_CALLBACK (destroy_idle_test),
9395 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9396 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9398 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9399 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9401 label = gtk_label_new ("count: 0");
9402 g_object_set (label, "margin", 10, NULL);
9403 gtk_widget_show (label);
9406 g_object_new (GTK_TYPE_BOX,
9408 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9409 * "GtkWidget::visible", TRUE,
9414 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9417 g_object_new (GTK_TYPE_FRAME,
9419 "label", "Label Container",
9421 "parent", content_area,
9424 g_object_new (GTK_TYPE_BOX,
9427 "orientation", GTK_ORIENTATION_VERTICAL,
9430 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9431 "label", "Resize-Parent",
9432 "user_data", (void*)GTK_RESIZE_PARENT,
9436 "signal::clicked", toggle_idle_container, container,
9438 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9439 "label", "Resize-Queue",
9440 "user_data", (void*)GTK_RESIZE_QUEUE,
9445 g_object_connect (button,
9446 "signal::clicked", toggle_idle_container, container,
9448 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9449 "label", "Resize-Immediate",
9450 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9452 g_object_connect (button2,
9453 "signal::clicked", toggle_idle_container, container,
9455 g_object_set (button2,
9461 button = gtk_button_new_with_label ("close");
9462 g_signal_connect_swapped (button, "clicked",
9463 G_CALLBACK (gtk_widget_destroy),
9465 gtk_widget_set_can_default (button, TRUE);
9466 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9467 gtk_widget_grab_default (button);
9468 gtk_widget_show (button);
9470 button = gtk_button_new_with_label ("start");
9471 g_signal_connect (button, "clicked",
9472 G_CALLBACK (start_idle_test),
9474 gtk_widget_set_can_default (button, TRUE);
9475 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9476 gtk_widget_show (button);
9478 button = gtk_button_new_with_label ("stop");
9479 g_signal_connect (button, "clicked",
9480 G_CALLBACK (stop_idle_test),
9482 gtk_widget_set_can_default (button, TRUE);
9483 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9484 gtk_widget_show (button);
9487 if (!gtk_widget_get_visible (window))
9488 gtk_widget_show (window);
9490 gtk_widget_destroy (window);
9498 create_rc_file (GtkWidget *widget)
9500 static GtkWidget *window = NULL;
9501 GtkWidget *action_area, *content_area;
9509 window = gtk_dialog_new ();
9511 gtk_window_set_screen (GTK_WINDOW (window),
9512 gtk_widget_get_screen (widget));
9514 g_signal_connect (window, "destroy",
9515 G_CALLBACK (gtk_widget_destroyed),
9518 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9519 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9521 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9522 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9524 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9525 gtk_container_add (GTK_CONTAINER (frame), vbox);
9527 label = gtk_label_new ("This label should be red");
9528 gtk_widget_set_name (label, "testgtk-red-label");
9529 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9531 label = gtk_label_new ("This label should be green");
9532 gtk_widget_set_name (label, "testgtk-green-label");
9533 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9535 label = gtk_label_new ("This label should be blue");
9536 gtk_widget_set_name (label, "testgtk-blue-label");
9537 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9539 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9540 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9542 button = gtk_button_new_with_label ("Reload");
9543 g_signal_connect_swapped (button, "clicked",
9544 G_CALLBACK (gtk_style_context_reset_widgets),
9545 gtk_widget_get_screen (button));
9546 gtk_widget_set_can_default (button, TRUE);
9547 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9548 gtk_widget_grab_default (button);
9550 button = gtk_button_new_with_label ("Close");
9551 g_signal_connect_swapped (button, "clicked",
9552 G_CALLBACK (gtk_widget_destroy),
9554 gtk_widget_set_can_default (button, TRUE);
9555 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9558 if (!gtk_widget_get_visible (window))
9559 gtk_widget_show_all (window);
9561 gtk_widget_destroy (window);
9565 * Test of recursive mainloop
9569 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9576 create_mainloop (GtkWidget *widget)
9578 static GtkWidget *window = NULL;
9579 GtkWidget *action_area, *content_area;
9585 window = gtk_dialog_new ();
9587 gtk_window_set_screen (GTK_WINDOW (window),
9588 gtk_widget_get_screen (widget));
9590 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9592 g_signal_connect (window, "destroy",
9593 G_CALLBACK (mainloop_destroyed),
9596 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9597 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9599 label = gtk_label_new ("In recursive main loop...");
9600 g_object_set (label, "margin", 20, NULL);
9602 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9603 gtk_widget_show (label);
9605 button = gtk_button_new_with_label ("Leave");
9606 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9608 g_signal_connect_swapped (button, "clicked",
9609 G_CALLBACK (gtk_widget_destroy),
9612 gtk_widget_set_can_default (button, TRUE);
9613 gtk_widget_grab_default (button);
9615 gtk_widget_show (button);
9618 if (!gtk_widget_get_visible (window))
9620 gtk_widget_show (window);
9622 g_print ("create_mainloop: start\n");
9624 g_print ("create_mainloop: done\n");
9627 gtk_widget_destroy (window);
9631 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9634 GdkWindow *bin_window;
9637 gint imin, imax, jmin, jmax;
9639 layout = GTK_LAYOUT (widget);
9640 bin_window = gtk_layout_get_bin_window (layout);
9642 if (!gtk_cairo_should_draw_window (cr, bin_window))
9645 gdk_window_get_position (bin_window, &x, &y);
9646 cairo_translate (cr, x, y);
9648 gdk_cairo_get_clip_rectangle (cr, &clip);
9650 imin = (clip.x) / 10;
9651 imax = (clip.x + clip.width + 9) / 10;
9653 jmin = (clip.y) / 10;
9654 jmax = (clip.y + clip.height + 9) / 10;
9656 for (i=imin; i<imax; i++)
9657 for (j=jmin; j<jmax; j++)
9659 cairo_rectangle (cr,
9668 void create_layout (GtkWidget *widget)
9670 GtkAdjustment *hadjustment, *vadjustment;
9672 static GtkWidget *window = NULL;
9673 GtkWidget *layout_widget;
9674 GtkWidget *scrolledwindow;
9683 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9684 gtk_window_set_screen (GTK_WINDOW (window),
9685 gtk_widget_get_screen (widget));
9687 g_signal_connect (window, "destroy",
9688 G_CALLBACK (gtk_widget_destroyed),
9691 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9692 gtk_widget_set_size_request (window, 200, 200);
9694 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9695 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9697 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9698 GTK_CORNER_TOP_RIGHT);
9700 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9702 layout_widget = gtk_layout_new (NULL, NULL);
9703 layout = GTK_LAYOUT (layout_widget);
9704 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9706 /* We set step sizes here since GtkLayout does not set
9709 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9710 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9711 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9712 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9713 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9714 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9716 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9717 g_signal_connect (layout, "draw",
9718 G_CALLBACK (layout_draw_handler), NULL);
9720 gtk_layout_set_size (layout, 1600, 128000);
9722 for (i=0 ; i < 16 ; i++)
9723 for (j=0 ; j < 16 ; j++)
9725 sprintf(buf, "Button %d, %d", i, j);
9727 button = gtk_button_new_with_label (buf);
9729 button = gtk_label_new (buf);
9731 gtk_layout_put (layout, button, j*100, i*100);
9734 for (i=16; i < 1280; i++)
9736 sprintf(buf, "Button %d, %d", i, 0);
9738 button = gtk_button_new_with_label (buf);
9740 button = gtk_label_new (buf);
9742 gtk_layout_put (layout, button, 0, i*100);
9746 if (!gtk_widget_get_visible (window))
9747 gtk_widget_show_all (window);
9749 gtk_widget_destroy (window);
9753 /* FIXME: need to completely redo this for GtkStyleContext */
9755 create_styles (GtkWidget *widget)
9757 static GtkWidget *window = NULL;
9758 GtkWidget *content_area, *action_area;
9763 static GdkRGBA red = { 1,0,0,1 };
9764 static GdkRGBA green = { 0,1,0,1 };
9765 static GdkRGBA blue = { 0,0,1,1 };
9766 static GdkRGBA yellow = { 1,1,0,1 };
9767 static GdkRGBA cyan = { 0,1,1,1 };
9768 PangoFontDescription *font_desc;
9770 GtkRcStyle *rc_style;
9774 window = gtk_dialog_new ();
9775 gtk_window_set_screen (GTK_WINDOW (window),
9776 gtk_widget_get_screen (widget));
9778 g_signal_connect (window, "destroy",
9779 G_CALLBACK (gtk_widget_destroyed),
9782 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9783 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9785 button = gtk_button_new_with_label ("Close");
9786 g_signal_connect_swapped (button, "clicked",
9787 G_CALLBACK (gtk_widget_destroy),
9789 gtk_widget_set_can_default (button, TRUE);
9790 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9791 gtk_widget_show (button);
9793 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9794 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9795 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9797 label = gtk_label_new ("Font:");
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 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9804 button = gtk_button_new_with_label ("Some Text");
9805 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9806 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9808 label = gtk_label_new ("Foreground:");
9809 gtk_widget_set_halign (label, GTK_ALIGN_START);
9810 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9811 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9813 button = gtk_button_new_with_label ("Some Text");
9814 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9815 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9817 label = gtk_label_new ("Background:");
9818 gtk_widget_set_halign (label, GTK_ALIGN_START);
9819 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9820 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9822 button = gtk_button_new_with_label ("Some Text");
9823 gtk_widget_override_background_color (button, 0, &green);
9824 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9826 label = gtk_label_new ("Text:");
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_override_color (entry, 0, &blue);
9834 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9836 label = gtk_label_new ("Base:");
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 entry = gtk_entry_new ();
9842 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9843 gtk_widget_override_background_color (entry, 0, &yellow);
9844 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9846 label = gtk_label_new ("Cursor:");
9847 gtk_widget_set_halign (label, GTK_ALIGN_START);
9848 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9849 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9851 entry = gtk_entry_new ();
9852 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9853 gtk_widget_modify_cursor (entry, &red, &red);
9854 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9856 label = gtk_label_new ("Multiple:");
9857 gtk_widget_set_halign (label, GTK_ALIGN_START);
9858 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9859 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9861 button = gtk_button_new_with_label ("Some Text");
9863 rc_style = gtk_rc_style_new ();
9865 rc_style->font_desc = pango_font_description_copy (font_desc);
9866 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9867 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9868 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9869 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9870 rc_style->bg[GTK_STATE_NORMAL] = blue;
9871 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9872 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9873 rc_style->fg[GTK_STATE_ACTIVE] = red;
9874 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9875 rc_style->xthickness = 5;
9876 rc_style->ythickness = 5;
9878 gtk_widget_modify_style (button, rc_style);
9879 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9881 g_object_unref (rc_style);
9883 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9886 if (!gtk_widget_get_visible (window))
9887 gtk_widget_show_all (window);
9889 gtk_widget_destroy (window);
9894 * Main Window and Exit
9898 do_exit (GtkWidget *widget, GtkWidget *window)
9900 gtk_widget_destroy (window);
9906 void (*func) (GtkWidget *widget);
9907 gboolean do_not_benchmark;
9910 { "alpha window", create_alpha_window },
9911 { "big windows", create_big_windows },
9912 { "button box", create_button_box },
9913 { "buttons", create_buttons },
9914 { "check buttons", create_check_buttons },
9915 { "color selection", create_color_selection },
9916 { "composited window", create_composited_window },
9917 { "cursors", create_cursors },
9918 { "dialog", create_dialog },
9919 { "display & screen", create_display_screen, TRUE },
9920 { "entry", create_entry },
9921 { "event box", create_event_box },
9922 { "event watcher", create_event_watcher },
9923 { "expander", create_expander },
9924 { "flipping", create_flipping },
9925 { "focus", create_focus },
9926 { "font selection", create_font_selection },
9927 { "handle box", create_handle_box },
9928 { "image", create_image },
9929 { "key lookup", create_key_lookup },
9930 { "labels", create_labels },
9931 { "layout", create_layout },
9932 { "menus", create_menus },
9933 { "message dialog", create_message_dialog },
9934 { "modal window", create_modal_window, TRUE },
9935 { "notebook", create_notebook },
9936 { "panes", create_panes },
9937 { "paned keyboard", create_paned_keyboard_navigation },
9938 { "pixbuf", create_pixbuf },
9939 { "progress bar", create_progress_bar },
9940 { "properties", create_properties },
9941 { "radio buttons", create_radio_buttons },
9942 { "range controls", create_range_controls },
9943 { "rc file", create_rc_file },
9944 { "reparent", create_reparent },
9945 { "resize grips", create_resize_grips },
9946 { "rotated label", create_rotated_label },
9947 { "rotated text", create_rotated_text },
9948 { "saved position", create_saved_position },
9949 { "scrolled windows", create_scrolled_windows },
9950 { "shapes", create_shapes },
9951 { "size groups", create_size_groups },
9952 { "snapshot", create_snapshot },
9953 { "spinbutton", create_spins },
9954 { "statusbar", create_statusbar },
9956 { "styles", create_styles },
9958 { "test idle", create_idle_test },
9959 { "test mainloop", create_mainloop, TRUE },
9960 { "test scrolling", create_scroll_test },
9961 { "test selection", create_selection_test },
9962 { "test timeout", create_timeout_test },
9963 { "toggle buttons", create_toggle_buttons },
9964 { "toolbar", create_toolbar },
9965 { "tooltips", create_tooltips },
9966 { "WM hints", create_wmhints },
9967 { "window sizing", create_window_sizing },
9968 { "window states", create_window_states }
9970 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
9973 create_main_window (void)
9978 GtkWidget *scrolled_window;
9982 GtkWidget *separator;
9983 GdkGeometry geometry;
9986 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9987 gtk_widget_set_name (window, "main_window");
9988 gtk_window_move (GTK_WINDOW (window), 50, 20);
9989 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
9991 geometry.min_width = -1;
9992 geometry.min_height = -1;
9993 geometry.max_width = -1;
9994 geometry.max_height = G_MAXSHORT;
9995 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
9997 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
9999 g_signal_connect (window, "destroy",
10000 G_CALLBACK (gtk_main_quit),
10002 g_signal_connect (window, "delete-event",
10003 G_CALLBACK (gtk_false),
10006 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10007 gtk_container_add (GTK_CONTAINER (window), box1);
10009 if (gtk_micro_version > 0)
10012 gtk_get_major_version (),
10013 gtk_get_minor_version (),
10014 gtk_get_micro_version ());
10018 gtk_get_major_version (),
10019 gtk_get_minor_version ());
10021 label = gtk_label_new (buffer);
10022 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10023 gtk_widget_set_name (label, "testgtk-version-label");
10025 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10026 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10027 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10029 GTK_POLICY_AUTOMATIC);
10030 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10032 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10033 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10034 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10035 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10036 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10037 gtk_widget_show (box2);
10039 for (i = 0; i < nbuttons; i++)
10041 button = gtk_button_new_with_label (buttons[i].label);
10042 if (buttons[i].func)
10043 g_signal_connect (button,
10045 G_CALLBACK(buttons[i].func),
10048 gtk_widget_set_sensitive (button, FALSE);
10049 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10052 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10053 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10055 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10056 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10057 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10059 button = gtk_button_new_with_mnemonic ("_Close");
10060 g_signal_connect (button, "clicked",
10061 G_CALLBACK (do_exit),
10063 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10064 gtk_widget_set_can_default (button, TRUE);
10065 gtk_widget_grab_default (button);
10067 gtk_widget_show_all (window);
10073 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
10074 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10078 pad (const char *str, int to)
10080 static char buf[256];
10081 int len = strlen (str);
10084 for (i = 0; i < to; i++)
10089 memcpy (buf, str, len);
10095 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10097 fn (widget); /* on */
10098 while (g_main_context_iteration (NULL, FALSE));
10099 fn (widget); /* off */
10100 while (g_main_context_iteration (NULL, FALSE));
10104 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10110 static gboolean printed_headers = FALSE;
10112 if (!printed_headers) {
10113 g_print ("Test Iters First Other\n");
10114 g_print ("-------------------- ----- ---------- ----------\n");
10115 printed_headers = TRUE;
10118 g_get_current_time (&tv0);
10119 bench_iteration (widget, fn);
10120 g_get_current_time (&tv1);
10122 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10123 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10125 g_get_current_time (&tv0);
10126 for (n = 0; n < num - 1; n++)
10127 bench_iteration (widget, fn);
10128 g_get_current_time (&tv1);
10129 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10130 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10132 g_print ("%s %5d ", pad (name, 20), num);
10134 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10136 g_print ("%10.1f\n", dt_first);
10140 do_bench (char* what, int num)
10144 void (* fn) (GtkWidget *widget);
10146 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10148 if (g_ascii_strcasecmp (what, "ALL") == 0)
10150 for (i = 0; i < nbuttons; i++)
10152 if (!buttons[i].do_not_benchmark)
10153 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10160 for (i = 0; i < nbuttons; i++)
10162 if (strcmp (buttons[i].label, what) == 0)
10164 fn = buttons[i].func;
10170 g_print ("Can't bench: \"%s\" not found.\n", what);
10172 do_real_bench (widget, fn, buttons[i].label, num);
10179 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10184 main (int argc, char *argv[])
10186 GtkCssProvider *provider, *memory_provider;
10187 GdkDisplay *display;
10189 GtkBindingSet *binding_set;
10191 gboolean done_benchmarks = FALSE;
10193 srand (time (NULL));
10197 g_set_application_name ("GTK+ Test Program");
10199 gtk_init (&argc, &argv);
10201 provider = gtk_css_provider_new ();
10203 /* Check to see if we are being run from the correct
10206 if (file_exists ("testgtk.css"))
10207 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10208 else if (file_exists ("tests/testgtk.css"))
10209 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10211 g_warning ("Couldn't find file \"testgtk.css\".");
10213 display = gdk_display_get_default ();
10214 screen = gdk_display_get_default_screen (display);
10216 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10217 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10218 g_object_unref (provider);
10220 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10229 for (i = 1; i < argc; i++)
10231 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10238 nextarg = strchr (argv[i], '=');
10249 count = strchr (nextarg, ':');
10252 what = g_strndup (nextarg, count - nextarg);
10254 num = atoi (count);
10259 what = g_strdup (nextarg);
10261 do_bench (what, num ? num : 1);
10262 done_benchmarks = TRUE;
10267 if (done_benchmarks)
10272 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10273 gtk_binding_entry_add_signal (binding_set,
10274 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10277 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10279 memory_provider = gtk_css_provider_new ();
10280 gtk_css_provider_load_from_data (memory_provider,
10281 "#testgtk-version-label {\n"
10283 " font: Sans 18;\n"
10286 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10287 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10289 create_main_window ();
10295 while (g_main_context_pending (NULL))
10296 g_main_context_iteration (NULL, FALSE);
10299 while (g_main_context_pending (NULL))
10300 g_main_context_iteration (NULL, FALSE);