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, see <http://www.gnu.org/licenses/>.
19 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
20 * file for a list of people on the GTK+ Team. See the ChangeLog
21 * files for a list of changes. These files are distributed with
22 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
42 #include "gdk/gdkkeysyms.h"
45 #define sleep(n) _sleep(n)
48 #include "prop-editor.h"
53 file_exists (const char *filename)
57 return stat (filename, &statbuf) == 0;
61 shape_create_icon (GdkScreen *screen,
70 build_option_menu (gchar *items[],
73 void (*func) (GtkWidget *widget, gpointer data),
76 /* macro, structure and variables used by tree window demos */
77 #define DEFAULT_NUMBER_OF_ITEM 3
78 #define DEFAULT_RECURSION_LEVEL 3
81 GSList* selection_mode_group;
82 GtkWidget* single_button;
83 GtkWidget* browse_button;
84 GtkWidget* multiple_button;
85 GtkWidget* draw_line_button;
86 GtkWidget* view_line_button;
87 GtkWidget* no_root_item_button;
88 GtkWidget* nb_item_spinner;
89 GtkWidget* recursion_spinner;
90 } sTreeSampleSelection;
92 typedef struct sTreeButtons {
94 GtkWidget* add_button;
95 GtkWidget* remove_button;
96 GtkWidget* subtree_button;
98 /* end of tree section */
101 build_option_menu (gchar *items[],
104 void (*func)(GtkWidget *widget, gpointer data),
110 omenu = gtk_combo_box_text_new ();
111 g_signal_connect (omenu, "changed",
112 G_CALLBACK (func), data);
114 for (i = 0; i < num_items; i++)
115 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), items[i]);
117 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
123 * Windows with an alpha channel
128 on_alpha_window_draw (GtkWidget *widget,
131 cairo_pattern_t *pattern;
132 int radius, width, height;
134 width = gtk_widget_get_allocated_width (widget);
135 height = gtk_widget_get_allocated_height (widget);
136 radius = MIN (width, height) / 2;
137 pattern = cairo_pattern_create_radial (width / 2,
144 if (gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)) &&
145 gtk_widget_is_composited (widget))
146 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
148 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
150 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
153 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
154 1.0, 0.75, 0.0, 1.0); /* solid orange */
155 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
156 1.0, 0.75, 0.0, 0.0); /* transparent orange */
158 cairo_set_source (cr, pattern);
159 cairo_pattern_destroy (pattern);
161 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
168 build_alpha_widgets (void)
171 GtkWidget *radio_button;
172 GtkWidget *check_button;
177 grid = gtk_grid_new ();
179 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
180 gtk_widget_set_hexpand (radio_button, TRUE);
181 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 0, 1, 1);
183 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
184 gtk_widget_set_hexpand (radio_button, TRUE);
185 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 1, 1, 1);
187 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
188 gtk_widget_set_hexpand (radio_button, TRUE);
189 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 2, 1, 1);
191 check_button = gtk_check_button_new_with_label ("Sedentary"),
192 gtk_widget_set_hexpand (check_button, TRUE);
193 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 0, 1, 1);
195 check_button = gtk_check_button_new_with_label ("Nocturnal"),
196 gtk_widget_set_hexpand (check_button, TRUE);
197 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 1, 1, 1);
199 check_button = gtk_check_button_new_with_label ("Compulsive"),
200 gtk_widget_set_hexpand (check_button, TRUE);
201 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 2, 1, 1);
203 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
204 label = gtk_label_new (NULL);
205 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
206 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
207 entry = gtk_entry_new ();
208 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
209 gtk_widget_set_hexpand (hbox, TRUE);
210 gtk_grid_attach (GTK_GRID (grid), hbox, 0, 3, 2, 1);
216 on_alpha_screen_changed (GtkWindow *window,
217 GdkScreen *old_screen,
220 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window));
221 GdkVisual *visual = gdk_screen_get_rgba_visual (screen);
225 visual = gdk_screen_get_system_visual (screen);
226 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
230 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
233 gtk_widget_set_visual (GTK_WIDGET (window), visual);
237 on_composited_changed (GtkWidget *window,
240 gboolean is_composited = gtk_widget_is_composited (window);
243 gtk_label_set_text (label, "Composited");
245 gtk_label_set_text (label, "Not composited");
249 create_alpha_window (GtkWidget *widget)
251 static GtkWidget *window;
255 GtkWidget *content_area;
259 window = gtk_dialog_new_with_buttons ("Alpha Window",
260 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
264 gtk_widget_set_app_paintable (window, TRUE);
265 g_signal_connect (window, "draw",
266 G_CALLBACK (on_alpha_window_draw), NULL);
268 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
270 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
271 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
272 gtk_box_pack_start (GTK_BOX (content_area), vbox,
275 label = gtk_label_new (NULL);
276 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
277 on_alpha_screen_changed (GTK_WINDOW (window), NULL, label);
278 g_signal_connect (window, "screen-changed",
279 G_CALLBACK (on_alpha_screen_changed), label);
281 label = gtk_label_new (NULL);
282 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
283 on_composited_changed (window, GTK_LABEL (label));
284 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
286 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
288 g_signal_connect (window, "destroy",
289 G_CALLBACK (gtk_widget_destroyed),
292 g_signal_connect (window, "response",
293 G_CALLBACK (gtk_widget_destroy),
297 if (!gtk_widget_get_visible (window))
298 gtk_widget_show_all (window);
300 gtk_widget_destroy (window);
304 * Composited non-toplevel window
307 /* The draw event handler for the event box.
309 * This function simply draws a transparency onto a widget on the area
310 * for which it receives expose events. This is intended to give the
311 * event box a "transparent" background.
313 * In order for this to work properly, the widget must have an RGBA
314 * colourmap. The widget should also be set as app-paintable since it
315 * doesn't make sense for GTK to draw a background if we are drawing it
316 * (and because GTK might actually replace our transparency with its
317 * default background colour).
320 transparent_draw (GtkWidget *widget,
323 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
329 /* The expose event handler for the window.
331 * This function performs the actual compositing of the event box onto
332 * the already-existing background of the window at 50% normal opacity.
334 * In this case we do not want app-paintable to be set on the widget
335 * since we want it to draw its own (red) background. Because of this,
336 * however, we must ensure that we use g_signal_register_after so that
337 * this handler is called after the red has been drawn. If it was
338 * called before then GTK would just blindly paint over our work.
341 window_draw (GtkWidget *widget,
344 GtkAllocation allocation;
347 /* get our child (in this case, the event box) */
348 child = gtk_bin_get_child (GTK_BIN (widget));
350 gtk_widget_get_allocation (child, &allocation);
352 /* the source data is the (composited) event box */
353 gdk_cairo_set_source_window (cr, gtk_widget_get_window (child),
357 /* composite, with a 50% opacity */
358 cairo_paint_with_alpha (cr, 0.5);
364 create_composited_window (GtkWidget *widget)
366 static GtkWidget *window;
370 GtkWidget *event, *button;
373 /* make the widgets */
374 button = gtk_button_new_with_label ("A Button");
375 event = gtk_event_box_new ();
376 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
378 g_signal_connect (window, "destroy",
379 G_CALLBACK (gtk_widget_destroyed),
382 /* put a red background on the window */
383 gdk_rgba_parse (&red, "red");
384 gtk_widget_override_background_color (window, 0, &red);
386 /* set our event box to have a fully-transparent background
387 * drawn on it. currently there is no way to simply tell gtk
388 * that "transparency" is the background colour for a widget.
390 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
391 g_signal_connect (event, "draw",
392 G_CALLBACK (transparent_draw), NULL);
394 /* put them inside one another */
395 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
396 gtk_container_add (GTK_CONTAINER (window), event);
397 gtk_container_add (GTK_CONTAINER (event), button);
399 /* realise and show everything */
400 gtk_widget_realize (button);
402 /* set the event box GdkWindow to be composited.
403 * obviously must be performed after event box is realised.
405 gdk_window_set_composited (gtk_widget_get_window (event),
408 /* set up the compositing handler.
409 * note that we do _after so that the normal (red) background is drawn
410 * by gtk before our compositing occurs.
412 g_signal_connect_after (window, "draw",
413 G_CALLBACK (window_draw), NULL);
416 if (!gtk_widget_get_visible (window))
417 gtk_widget_show_all (window);
419 gtk_widget_destroy (window);
423 * Big windows and guffaw scrolling
427 pattern_set_bg (GtkWidget *widget,
431 static GdkRGBA colors[] = {
432 { 0.27, 0.27, 1.0, 1.0 },
433 { 0.53, 0.53, 1.0, 1.0},
434 { 0.67, 0.67, 1.0, 1.0 }
437 gdk_window_set_user_data (child, widget);
438 gdk_window_set_background_rgba (child, &colors[level]);
442 create_pattern (GtkWidget *widget,
453 while (2 * h <= height)
458 while (2 * w <= width)
460 if ((i + j) % 2 == 0)
465 GdkWindowAttr attributes;
467 attributes.window_type = GDK_WINDOW_CHILD;
470 attributes.width = w;
471 attributes.height = h;
472 attributes.wclass = GDK_INPUT_OUTPUT;
473 attributes.event_mask = GDK_EXPOSURE_MASK;
474 attributes.visual = gtk_widget_get_visual (widget);
476 child = gdk_window_new (parent, &attributes,
477 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
479 pattern_set_bg (widget, child, level);
482 create_pattern (widget, child, level + 1, w, h);
484 gdk_window_show (child);
494 #define PATTERN_SIZE (1 << 18)
497 pattern_hadj_changed (GtkAdjustment *adjustment,
500 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
501 gint new_value = gtk_adjustment_get_value (adjustment);
503 if (gtk_widget_get_realized (darea))
505 gdk_window_scroll (gtk_widget_get_window (darea),
506 *old_value - new_value, 0);
507 *old_value = new_value;
512 pattern_vadj_changed (GtkAdjustment *adjustment,
515 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
516 gint new_value = gtk_adjustment_get_value (adjustment);
518 if (gtk_widget_get_realized (darea))
520 gdk_window_scroll (gtk_widget_get_window (darea),
521 0, *old_value - new_value);
522 *old_value = new_value;
527 pattern_realize (GtkWidget *widget,
532 window = gtk_widget_get_window (widget);
533 pattern_set_bg (widget, window, 0);
534 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
538 create_big_windows (GtkWidget *widget)
540 static GtkWidget *window = NULL;
541 GtkWidget *content_area;
542 GtkWidget *darea, *grid, *scrollbar;
544 GtkAdjustment *hadjustment;
545 GtkAdjustment *vadjustment;
546 static gint current_x;
547 static gint current_y;
554 window = gtk_dialog_new_with_buttons ("Big Windows",
560 gtk_window_set_screen (GTK_WINDOW (window),
561 gtk_widget_get_screen (widget));
563 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
565 g_signal_connect (window, "destroy",
566 G_CALLBACK (gtk_widget_destroyed),
569 g_signal_connect (window, "response",
570 G_CALLBACK (gtk_widget_destroy),
573 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
575 grid = gtk_grid_new ();
576 gtk_box_pack_start (GTK_BOX (content_area), grid, TRUE, TRUE, 0);
578 darea = gtk_drawing_area_new ();
580 hadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
581 g_signal_connect (hadjustment, "value_changed",
582 G_CALLBACK (pattern_hadj_changed), darea);
583 g_object_set_data (G_OBJECT (hadjustment), "old-value", ¤t_x);
585 vadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
586 g_signal_connect (vadjustment, "value_changed",
587 G_CALLBACK (pattern_vadj_changed), darea);
588 g_object_set_data (G_OBJECT (vadjustment), "old-value", ¤t_y);
590 g_signal_connect (darea, "realize",
591 G_CALLBACK (pattern_realize),
594 eventbox = gtk_event_box_new ();
595 gtk_widget_set_hexpand (eventbox, TRUE);
596 gtk_widget_set_vexpand (eventbox, TRUE);
597 gtk_grid_attach (GTK_GRID (grid), eventbox, 0, 0, 1, 1);
599 gtk_container_add (GTK_CONTAINER (eventbox), darea);
601 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
602 gtk_widget_set_hexpand (scrollbar, TRUE);
603 gtk_grid_attach (GTK_GRID (grid), scrollbar, 0, 1, 1, 1);
605 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
606 gtk_widget_set_vexpand (scrollbar, TRUE);
607 gtk_grid_attach (GTK_GRID (grid), scrollbar, 1, 0, 1, 1);
610 if (!gtk_widget_get_visible (window))
611 gtk_widget_show_all (window);
613 gtk_widget_hide (window);
621 button_window (GtkWidget *widget,
624 if (!gtk_widget_get_visible (button))
625 gtk_widget_show (button);
627 gtk_widget_hide (button);
631 create_buttons (GtkWidget *widget)
633 static GtkWidget *window = NULL;
637 GtkWidget *separator;
638 GtkWidget *button[10];
639 int button_x[9] = { 0, 1, 2, 0, 2, 1, 1, 2, 0 };
640 int button_y[9] = { 0, 1, 2, 2, 0, 2, 0, 1, 1 };
645 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
646 gtk_window_set_screen (GTK_WINDOW (window),
647 gtk_widget_get_screen (widget));
649 g_signal_connect (window, "destroy",
650 G_CALLBACK (gtk_widget_destroyed),
653 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
654 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
656 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
657 gtk_container_add (GTK_CONTAINER (window), box1);
659 grid = gtk_grid_new ();
660 gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
661 gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
662 gtk_container_set_border_width (GTK_CONTAINER (grid), 10);
663 gtk_box_pack_start (GTK_BOX (box1), grid, TRUE, TRUE, 0);
665 button[0] = gtk_button_new_with_label ("button1");
666 button[1] = gtk_button_new_with_mnemonic ("_button2");
667 button[2] = gtk_button_new_with_mnemonic ("_button3");
668 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
669 button[4] = gtk_button_new_with_label ("button5");
670 button[5] = gtk_button_new_with_label ("button6");
671 button[6] = gtk_button_new_with_label ("button7");
672 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
673 button[8] = gtk_button_new_with_label ("button9");
675 for (i = 0; i < 9; i++)
677 g_signal_connect (button[i], "clicked",
678 G_CALLBACK (button_window),
679 button[(i + 1) % 9]);
680 gtk_widget_set_hexpand (button[i], TRUE);
681 gtk_widget_set_vexpand (button[i], TRUE);
683 gtk_grid_attach (GTK_GRID (grid), button[i],
684 button_x[i], button_y[i] + 1, 1, 1);
687 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
688 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
690 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
691 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
692 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
694 button[9] = gtk_button_new_with_label ("close");
695 g_signal_connect_swapped (button[9], "clicked",
696 G_CALLBACK (gtk_widget_destroy),
698 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
699 gtk_widget_set_can_default (button[9], TRUE);
700 gtk_widget_grab_default (button[9]);
703 if (!gtk_widget_get_visible (window))
704 gtk_widget_show_all (window);
706 gtk_widget_destroy (window);
714 create_toggle_buttons (GtkWidget *widget)
716 static GtkWidget *window = NULL;
720 GtkWidget *separator;
724 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
725 gtk_window_set_screen (GTK_WINDOW (window),
726 gtk_widget_get_screen (widget));
728 g_signal_connect (window, "destroy",
729 G_CALLBACK (gtk_widget_destroyed),
732 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
733 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
735 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
736 gtk_container_add (GTK_CONTAINER (window), box1);
738 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
739 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
740 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
742 button = gtk_toggle_button_new_with_label ("button1");
743 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
745 button = gtk_toggle_button_new_with_label ("button2");
746 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
748 button = gtk_toggle_button_new_with_label ("button3");
749 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
751 button = gtk_toggle_button_new_with_label ("inconsistent");
752 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
753 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
755 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
756 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
758 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
759 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
760 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
762 button = gtk_button_new_with_label ("close");
763 g_signal_connect_swapped (button, "clicked",
764 G_CALLBACK (gtk_widget_destroy),
766 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
767 gtk_widget_set_can_default (button, TRUE);
768 gtk_widget_grab_default (button);
771 if (!gtk_widget_get_visible (window))
772 gtk_widget_show_all (window);
774 gtk_widget_destroy (window);
778 create_widget_grid (GType widget_type)
781 GtkWidget *group_widget = NULL;
784 grid = gtk_grid_new ();
786 for (i = 0; i < 5; i++)
788 for (j = 0; j < 5; j++)
793 if (i == 0 && j == 0)
799 tmp = g_strdup_printf ("%d", j);
800 widget = gtk_label_new (tmp);
805 tmp = g_strdup_printf ("%c", 'A' + i - 1);
806 widget = gtk_label_new (tmp);
811 widget = g_object_new (widget_type, NULL);
813 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
816 group_widget = widget;
818 g_object_set (widget, "group", group_widget, NULL);
823 gtk_grid_attach (GTK_GRID (grid), widget, i, j, 1, 1);
835 create_check_buttons (GtkWidget *widget)
837 static GtkWidget *window = NULL;
841 GtkWidget *separator;
846 window = gtk_dialog_new_with_buttons ("Check Buttons",
852 gtk_window_set_screen (GTK_WINDOW (window),
853 gtk_widget_get_screen (widget));
855 g_signal_connect (window, "destroy",
856 G_CALLBACK (gtk_widget_destroyed),
858 g_signal_connect (window, "response",
859 G_CALLBACK (gtk_widget_destroy),
862 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
864 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
865 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
866 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
868 button = gtk_check_button_new_with_mnemonic ("_button1");
869 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
871 button = gtk_check_button_new_with_label ("button2");
872 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
874 button = gtk_check_button_new_with_label ("button3");
875 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
877 button = gtk_check_button_new_with_label ("inconsistent");
878 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
879 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
881 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
882 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
884 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
885 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
886 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
889 if (!gtk_widget_get_visible (window))
890 gtk_widget_show_all (window);
892 gtk_widget_destroy (window);
900 create_radio_buttons (GtkWidget *widget)
902 static GtkWidget *window = NULL;
906 GtkWidget *separator;
911 window = gtk_dialog_new_with_buttons ("Radio Buttons",
917 gtk_window_set_screen (GTK_WINDOW (window),
918 gtk_widget_get_screen (widget));
920 g_signal_connect (window, "destroy",
921 G_CALLBACK (gtk_widget_destroyed),
923 g_signal_connect (window, "response",
924 G_CALLBACK (gtk_widget_destroy),
927 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
929 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
930 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
931 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
933 button = gtk_radio_button_new_with_label (NULL, "button1");
934 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
936 button = gtk_radio_button_new_with_label (
937 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
939 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
940 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
942 button = gtk_radio_button_new_with_label (
943 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
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_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
951 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
953 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
954 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
956 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
957 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
958 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
960 button = gtk_radio_button_new_with_label (NULL, "button4");
961 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
962 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
964 button = gtk_radio_button_new_with_label (
965 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
967 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
968 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
969 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
971 button = gtk_radio_button_new_with_label (
972 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
974 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
975 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
977 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
978 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
980 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
981 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
982 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
985 if (!gtk_widget_get_visible (window))
986 gtk_widget_show_all (window);
988 gtk_widget_destroy (window);
996 create_bbox (gint horizontal,
1007 frame = gtk_frame_new (title);
1010 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1012 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1014 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1015 gtk_container_add (GTK_CONTAINER (frame), bbox);
1017 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1018 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1020 button = gtk_button_new_with_label ("OK");
1021 gtk_container_add (GTK_CONTAINER (bbox), button);
1023 button = gtk_button_new_with_label ("Cancel");
1024 gtk_container_add (GTK_CONTAINER (bbox), button);
1026 button = gtk_button_new_with_label ("Help");
1027 gtk_container_add (GTK_CONTAINER (bbox), button);
1033 create_button_box (GtkWidget *widget)
1035 static GtkWidget* window = NULL;
1036 GtkWidget *main_vbox;
1039 GtkWidget *frame_horz;
1040 GtkWidget *frame_vert;
1044 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1045 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1046 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1048 g_signal_connect (window, "destroy",
1049 G_CALLBACK (gtk_widget_destroyed),
1052 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1054 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1055 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1057 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1058 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1060 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1061 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1062 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1064 gtk_box_pack_start (GTK_BOX (vbox),
1065 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1068 gtk_box_pack_start (GTK_BOX (vbox),
1069 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1072 gtk_box_pack_start (GTK_BOX (vbox),
1073 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1076 gtk_box_pack_start (GTK_BOX (vbox),
1077 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1080 gtk_box_pack_start (GTK_BOX (vbox),
1081 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1084 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1085 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1087 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1088 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1089 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1091 gtk_box_pack_start (GTK_BOX (hbox),
1092 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1095 gtk_box_pack_start (GTK_BOX (hbox),
1096 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1099 gtk_box_pack_start (GTK_BOX (hbox),
1100 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1103 gtk_box_pack_start (GTK_BOX (hbox),
1104 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1107 gtk_box_pack_start (GTK_BOX (hbox),
1108 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1112 if (!gtk_widget_get_visible (window))
1113 gtk_widget_show_all (window);
1115 gtk_widget_destroy (window);
1123 new_pixbuf (char *filename,
1129 if (strcmp (filename, "test.xpm") == 0)
1132 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1135 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1137 widget = gtk_image_new_from_pixbuf (pixbuf);
1139 g_object_unref (pixbuf);
1146 set_toolbar_small_stock (GtkWidget *widget,
1149 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1153 set_toolbar_large_stock (GtkWidget *widget,
1156 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1160 set_toolbar_horizontal (GtkWidget *widget,
1163 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1167 set_toolbar_vertical (GtkWidget *widget,
1170 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1174 set_toolbar_icons (GtkWidget *widget,
1177 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1181 set_toolbar_text (GtkWidget *widget,
1184 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1188 set_toolbar_both (GtkWidget *widget,
1191 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1195 set_toolbar_both_horiz (GtkWidget *widget,
1198 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1202 set_toolbar_enable (GtkWidget *widget,
1205 GtkSettings *settings = gtk_widget_get_settings (widget);
1206 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1210 set_toolbar_disable (GtkWidget *widget,
1213 GtkSettings *settings = gtk_widget_get_settings (widget);
1214 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1217 static GtkActionEntry create_toolbar_items[] = {
1218 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1219 G_CALLBACK (set_toolbar_small_stock) },
1220 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1221 G_CALLBACK (set_toolbar_large_stock) },
1222 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1223 G_CALLBACK (set_toolbar_horizontal) },
1224 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1225 G_CALLBACK (set_toolbar_vertical) },
1227 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1228 G_CALLBACK (set_toolbar_icons) },
1229 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1230 G_CALLBACK (set_toolbar_text) },
1231 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1232 G_CALLBACK (set_toolbar_both) },
1233 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1234 G_CALLBACK (set_toolbar_both_horiz) },
1236 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1240 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1241 G_CALLBACK (set_toolbar_enable) },
1242 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1243 G_CALLBACK (set_toolbar_disable) },
1245 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1247 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1250 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1252 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1257 create_toolbar (GtkWidget *widget)
1259 static GtkWidget *window = NULL;
1266 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1267 gtk_window_set_screen (GTK_WINDOW (window),
1268 gtk_widget_get_screen (widget));
1270 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1272 g_signal_connect (window, "destroy",
1273 G_CALLBACK (gtk_widget_destroyed),
1276 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1277 gtk_widget_realize (window);
1279 toolbar = gtk_toolbar_new ();
1280 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1282 GtkToolItem *toolitem;
1284 if (create_toolbar_items[i].tooltip == NULL)
1285 toolitem = gtk_separator_tool_item_new ();
1286 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1290 toolitem = gtk_tool_item_new ();
1291 entry = gtk_entry_new ();
1292 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1294 else if (create_toolbar_items[i].stock_id)
1295 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1300 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1301 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1303 if (create_toolbar_items[i].callback)
1304 g_signal_connect (toolitem, "clicked",
1305 create_toolbar_items[i].callback, toolbar);
1306 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1307 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1310 gtk_container_add (GTK_CONTAINER (window), toolbar);
1312 gtk_widget_set_size_request (toolbar, 200, -1);
1315 if (!gtk_widget_get_visible (window))
1316 gtk_widget_show_all (window);
1318 gtk_widget_destroy (window);
1325 static guint statusbar_counter = 1;
1328 statusbar_push (GtkWidget *button,
1329 GtkStatusbar *statusbar)
1333 sprintf (text, "something %d", statusbar_counter++);
1335 gtk_statusbar_push (statusbar, 1, text);
1339 statusbar_push_long (GtkWidget *button,
1340 GtkStatusbar *statusbar)
1344 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\").");
1346 gtk_statusbar_push (statusbar, 1, text);
1350 statusbar_pop (GtkWidget *button,
1351 GtkStatusbar *statusbar)
1353 gtk_statusbar_pop (statusbar, 1);
1357 statusbar_steal (GtkWidget *button,
1358 GtkStatusbar *statusbar)
1360 gtk_statusbar_remove (statusbar, 1, 4);
1364 statusbar_popped (GtkStatusbar *statusbar,
1369 statusbar_counter = 1;
1373 statusbar_contexts (GtkStatusbar *statusbar)
1377 string = "any context";
1378 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1380 gtk_statusbar_get_context_id (statusbar, string));
1382 string = "idle messages";
1383 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1385 gtk_statusbar_get_context_id (statusbar, string));
1387 string = "some text";
1388 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1390 gtk_statusbar_get_context_id (statusbar, string));
1392 string = "hit the mouse";
1393 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1395 gtk_statusbar_get_context_id (statusbar, string));
1397 string = "hit the mouse2";
1398 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1400 gtk_statusbar_get_context_id (statusbar, string));
1404 create_statusbar (GtkWidget *widget)
1406 static GtkWidget *window = NULL;
1410 GtkWidget *separator;
1411 GtkWidget *statusbar;
1415 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1416 gtk_window_set_screen (GTK_WINDOW (window),
1417 gtk_widget_get_screen (widget));
1419 g_signal_connect (window, "destroy",
1420 G_CALLBACK (gtk_widget_destroyed),
1423 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1424 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1426 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1427 gtk_container_add (GTK_CONTAINER (window), box1);
1429 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1430 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1431 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1433 statusbar = gtk_statusbar_new ();
1434 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1435 g_signal_connect (statusbar,
1437 G_CALLBACK (statusbar_popped),
1440 button = g_object_new (gtk_button_get_type (),
1441 "label", "push something",
1445 g_object_connect (button,
1446 "signal::clicked", statusbar_push, statusbar,
1449 button = g_object_connect (g_object_new (gtk_button_get_type (),
1454 "signal_after::clicked", statusbar_pop, statusbar,
1457 button = g_object_connect (g_object_new (gtk_button_get_type (),
1458 "label", "steal #4",
1462 "signal_after::clicked", statusbar_steal, statusbar,
1465 button = g_object_connect (g_object_new (gtk_button_get_type (),
1466 "label", "test contexts",
1470 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1473 button = g_object_connect (g_object_new (gtk_button_get_type (),
1474 "label", "push something long",
1478 "signal_after::clicked", statusbar_push_long, statusbar,
1481 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1482 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1484 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1485 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1486 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1488 button = gtk_button_new_with_label ("close");
1489 g_signal_connect_swapped (button, "clicked",
1490 G_CALLBACK (gtk_widget_destroy),
1492 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1493 gtk_widget_set_can_default (button, TRUE);
1494 gtk_widget_grab_default (button);
1497 if (!gtk_widget_get_visible (window))
1498 gtk_widget_show_all (window);
1500 gtk_widget_destroy (window);
1507 sensitivity_toggled (GtkWidget *toggle,
1510 gtk_widget_set_sensitive (widget,
1511 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1515 create_sensitivity_control (GtkWidget *widget)
1519 button = gtk_toggle_button_new_with_label ("Sensitive");
1521 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1522 gtk_widget_is_sensitive (widget));
1524 g_signal_connect (button,
1526 G_CALLBACK (sensitivity_toggled),
1529 gtk_widget_show_all (button);
1535 set_selectable_recursive (GtkWidget *widget,
1538 if (GTK_IS_CONTAINER (widget))
1543 children = gtk_container_get_children (GTK_CONTAINER (widget));
1547 set_selectable_recursive (tmp->data, setting);
1551 g_list_free (children);
1553 else if (GTK_IS_LABEL (widget))
1555 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1560 selectable_toggled (GtkWidget *toggle,
1563 set_selectable_recursive (widget,
1564 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1568 create_selectable_control (GtkWidget *widget)
1572 button = gtk_toggle_button_new_with_label ("Selectable");
1574 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1577 g_signal_connect (button,
1579 G_CALLBACK (selectable_toggled),
1582 gtk_widget_show_all (button);
1588 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1592 gtk_widget_destroy (dialog);
1594 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1595 "as hyperlinks, which can be clicked\n"
1596 "or activated via <a href=\"keynav\">keynav</a>.\n"
1597 "The links remain the same.";
1598 gtk_label_set_markup (label, text);
1602 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1604 if (g_strcmp0 (uri, "keynav") == 0)
1608 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1609 GTK_DIALOG_DESTROY_WITH_PARENT,
1612 "The term <i>keynav</i> is a shorthand for "
1613 "keyboard navigation and refers to the process of using a program "
1614 "(exclusively) via keyboard input.");
1616 gtk_window_present (GTK_WINDOW (dialog));
1618 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1626 void create_labels (GtkWidget *widget)
1628 static GtkWidget *window = NULL;
1637 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1639 gtk_window_set_screen (GTK_WINDOW (window),
1640 gtk_widget_get_screen (widget));
1642 g_signal_connect (window, "destroy",
1643 G_CALLBACK (gtk_widget_destroyed),
1646 gtk_window_set_title (GTK_WINDOW (window), "Label");
1648 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1650 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1651 gtk_container_add (GTK_CONTAINER (window), vbox);
1653 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1655 button = create_sensitivity_control (hbox);
1657 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1659 button = create_selectable_control (hbox);
1661 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1663 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1665 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1666 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1668 frame = gtk_frame_new ("Normal Label");
1669 label = gtk_label_new ("This is a Normal label");
1670 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1671 gtk_container_add (GTK_CONTAINER (frame), label);
1672 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1674 frame = gtk_frame_new ("Multi-line Label");
1675 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1676 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1677 gtk_container_add (GTK_CONTAINER (frame), label);
1678 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1680 frame = gtk_frame_new ("Left Justified Label");
1681 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1682 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1683 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1684 gtk_container_add (GTK_CONTAINER (frame), label);
1685 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1687 frame = gtk_frame_new ("Right Justified Label");
1688 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1689 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1690 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1691 gtk_container_add (GTK_CONTAINER (frame), label);
1692 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1694 frame = gtk_frame_new ("Internationalized Label");
1695 label = gtk_label_new (NULL);
1696 gtk_label_set_markup (GTK_LABEL (label),
1697 "French (Fran\303\247ais) Bonjour, Salut\n"
1698 "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"
1699 "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"
1700 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1701 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1702 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1703 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1704 gtk_container_add (GTK_CONTAINER (frame), label);
1705 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1707 frame = gtk_frame_new ("Bidirection Label");
1708 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"
1709 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1710 gtk_container_add (GTK_CONTAINER (frame), label);
1711 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1713 frame = gtk_frame_new ("Links in a label");
1714 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1715 "as hyperlinks, which can be clicked\n"
1716 "or activated via <a href=\"keynav\">keynav</a>");
1717 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1718 gtk_container_add (GTK_CONTAINER (frame), label);
1719 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1720 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1722 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1723 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1724 frame = gtk_frame_new ("Line wrapped label");
1725 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1726 "up the entire "/* big space to test spacing */\
1727 "width allocated to it, but automatically wraps the words to fit. "\
1728 "The time has come, for all good men, to come to the aid of their party. "\
1729 "The sixth sheik's six sheep's sick.\n"\
1730 " It supports multiple paragraphs correctly, and correctly adds "\
1731 "many extra spaces. ");
1733 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1734 gtk_container_add (GTK_CONTAINER (frame), label);
1735 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1737 frame = gtk_frame_new ("Filled, wrapped label");
1738 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
1739 "up the entire width allocated to it. Here is a seneance to prove "\
1740 "my point. Here is another sentence. "\
1741 "Here comes the sun, do de do de do.\n"\
1742 " This is a new paragraph.\n"\
1743 " This is another newer, longer, better paragraph. It is coming to an end, "\
1745 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
1746 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1747 gtk_container_add (GTK_CONTAINER (frame), label);
1748 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1750 frame = gtk_frame_new ("Underlined label");
1751 label = gtk_label_new ("This label is underlined!\n"
1752 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
1753 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1754 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
1755 gtk_container_add (GTK_CONTAINER (frame), label);
1756 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1758 frame = gtk_frame_new ("Markup label");
1759 label = gtk_label_new (NULL);
1761 /* There's also a gtk_label_set_markup() without accel if you
1762 * don't have an accelerator key
1764 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
1765 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
1766 "<b>markup</b> _such as "
1767 "<big><i>Big Italics</i></big>\n"
1768 "<tt>Monospace font</tt>\n"
1769 "<u>Underline!</u>\n"
1771 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
1772 "and nothing on this line,\n"
1775 "or even on this one\n"
1776 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
1777 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
1778 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
1780 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
1782 gtk_container_add (GTK_CONTAINER (frame), label);
1783 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1786 if (!gtk_widget_get_visible (window))
1787 gtk_widget_show_all (window);
1789 gtk_widget_destroy (window);
1793 on_angle_scale_changed (GtkRange *range,
1796 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
1800 create_rotated_label (GtkWidget *widget)
1802 static GtkWidget *window = NULL;
1803 GtkWidget *content_area;
1807 GtkWidget *scale_label;
1808 GtkWidget *scale_hbox;
1812 window = gtk_dialog_new_with_buttons ("Rotated Label",
1813 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
1814 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
1817 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1819 gtk_window_set_screen (GTK_WINDOW (window),
1820 gtk_widget_get_screen (widget));
1822 g_signal_connect (window, "response",
1823 G_CALLBACK (gtk_widget_destroy), NULL);
1824 g_signal_connect (window, "destroy",
1825 G_CALLBACK (gtk_widget_destroyed), &window);
1827 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1829 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1830 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
1831 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1833 label = gtk_label_new (NULL);
1834 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
1835 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
1837 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1838 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
1840 scale_label = gtk_label_new (NULL);
1841 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
1842 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
1844 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
1846 g_signal_connect (hscale, "value-changed",
1847 G_CALLBACK (on_angle_scale_changed), label);
1849 gtk_range_set_value (GTK_RANGE (hscale), 45);
1850 gtk_widget_set_size_request (hscale, 200, -1);
1851 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
1854 if (!gtk_widget_get_visible (window))
1855 gtk_widget_show_all (window);
1857 gtk_widget_destroy (window);
1860 #define DEFAULT_TEXT_RADIUS 200
1863 on_rotated_text_unrealize (GtkWidget *widget)
1865 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
1869 on_rotated_text_draw (GtkWidget *widget,
1871 GdkPixbuf *tile_pixbuf)
1873 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
1874 "had", "10,000", "men" };
1879 PangoLayout *layout;
1880 PangoContext *context;
1881 PangoFontDescription *desc;
1885 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
1886 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
1889 cairo_set_source_rgb (cr, 0, 0, 0);
1891 width = gtk_widget_get_allocated_width (widget);
1892 height = gtk_widget_get_allocated_height (widget);
1893 radius = MIN (width, height) / 2.;
1895 cairo_translate (cr,
1896 radius + (width - 2 * radius) / 2,
1897 radius + (height - 2 * radius) / 2);
1898 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
1900 context = gtk_widget_get_pango_context (widget);
1901 layout = pango_layout_new (context);
1902 desc = pango_font_description_from_string ("Sans Bold 30");
1903 pango_layout_set_font_description (layout, desc);
1904 pango_font_description_free (desc);
1906 n_words = G_N_ELEMENTS (words);
1907 for (i = 0; i < n_words; i++)
1913 cairo_rotate (cr, 2 * G_PI * i / n_words);
1914 pango_cairo_update_layout (cr, layout);
1916 pango_layout_set_text (layout, words[i], -1);
1917 pango_layout_get_size (layout, &width, &height);
1919 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
1920 pango_cairo_show_layout (cr, layout);
1925 g_object_unref (layout);
1931 create_rotated_text (GtkWidget *widget)
1933 static GtkWidget *window = NULL;
1937 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
1938 GtkRequisition requisition;
1939 GtkWidget *content_area;
1940 GtkWidget *drawing_area;
1941 GdkPixbuf *tile_pixbuf;
1943 window = gtk_dialog_new_with_buttons ("Rotated Text",
1944 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
1945 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
1948 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1950 gtk_window_set_screen (GTK_WINDOW (window),
1951 gtk_widget_get_screen (widget));
1953 g_signal_connect (window, "response",
1954 G_CALLBACK (gtk_widget_destroy), NULL);
1955 g_signal_connect (window, "destroy",
1956 G_CALLBACK (gtk_widget_destroyed), &window);
1958 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1960 drawing_area = gtk_drawing_area_new ();
1961 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
1962 gtk_widget_override_background_color (drawing_area, 0, &white);
1964 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
1966 g_signal_connect (drawing_area, "draw",
1967 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
1968 g_signal_connect (drawing_area, "unrealize",
1969 G_CALLBACK (on_rotated_text_unrealize), NULL);
1971 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
1973 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
1974 gtk_widget_get_preferred_size ( (window),
1975 &requisition, NULL);
1976 gtk_widget_set_size_request (drawing_area, -1, -1);
1977 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
1980 if (!gtk_widget_get_visible (window))
1981 gtk_widget_show (window);
1983 gtk_widget_destroy (window);
1991 reparent_label (GtkWidget *widget,
1992 GtkWidget *new_parent)
1996 label = g_object_get_data (G_OBJECT (widget), "user_data");
1998 gtk_widget_reparent (label, new_parent);
2002 set_parent_signal (GtkWidget *child,
2003 GtkWidget *old_parent,
2008 parent = gtk_widget_get_parent (child);
2009 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2010 g_type_name (G_OBJECT_TYPE (child)),
2011 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2012 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2013 GPOINTER_TO_INT (func_data));
2017 create_reparent (GtkWidget *widget)
2019 static GtkWidget *window = NULL;
2026 GtkWidget *separator;
2027 GtkWidget *event_box;
2031 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2033 gtk_window_set_screen (GTK_WINDOW (window),
2034 gtk_widget_get_screen (widget));
2036 g_signal_connect (window, "destroy",
2037 G_CALLBACK (gtk_widget_destroyed),
2040 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2041 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2043 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2044 gtk_container_add (GTK_CONTAINER (window), box1);
2046 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2047 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2048 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2050 label = gtk_label_new ("Hello World");
2052 frame = gtk_frame_new ("Frame 1");
2053 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2055 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2056 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2057 gtk_container_add (GTK_CONTAINER (frame), box3);
2059 button = gtk_button_new_with_label ("switch");
2060 g_object_set_data (G_OBJECT (button), "user_data", label);
2061 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2063 event_box = gtk_event_box_new ();
2064 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2065 gtk_container_add (GTK_CONTAINER (event_box), label);
2067 g_signal_connect (button, "clicked",
2068 G_CALLBACK (reparent_label),
2071 g_signal_connect (label, "parent_set",
2072 G_CALLBACK (set_parent_signal),
2073 GINT_TO_POINTER (42));
2075 frame = gtk_frame_new ("Frame 2");
2076 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2078 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2079 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2080 gtk_container_add (GTK_CONTAINER (frame), box3);
2082 button = gtk_button_new_with_label ("switch");
2083 g_object_set_data (G_OBJECT (button), "user_data", label);
2084 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2086 event_box = gtk_event_box_new ();
2087 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2089 g_signal_connect (button, "clicked",
2090 G_CALLBACK (reparent_label),
2093 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2094 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2096 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2097 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2098 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2100 button = gtk_button_new_with_label ("close");
2101 g_signal_connect_swapped (button, "clicked",
2102 G_CALLBACK (gtk_widget_destroy), window);
2103 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2104 gtk_widget_set_can_default (button, TRUE);
2105 gtk_widget_grab_default (button);
2108 if (!gtk_widget_get_visible (window))
2109 gtk_widget_show_all (window);
2111 gtk_widget_destroy (window);
2118 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2120 if (event->type == GDK_BUTTON_PRESS)
2122 if (event->button == 1)
2123 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2124 event->button, event->x_root, event->y_root,
2126 else if (event->button == 2)
2127 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2128 event->button, event->x_root, event->y_root,
2135 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2137 GtkStyleContext *context;
2138 GtkJunctionSides sides;
2142 case GDK_WINDOW_EDGE_NORTH_WEST:
2143 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2145 case GDK_WINDOW_EDGE_NORTH:
2146 sides = GTK_JUNCTION_TOP;
2148 case GDK_WINDOW_EDGE_NORTH_EAST:
2149 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2151 case GDK_WINDOW_EDGE_WEST:
2152 sides = GTK_JUNCTION_LEFT;
2154 case GDK_WINDOW_EDGE_EAST:
2155 sides = GTK_JUNCTION_RIGHT;
2157 case GDK_WINDOW_EDGE_SOUTH_WEST:
2158 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2160 case GDK_WINDOW_EDGE_SOUTH:
2161 sides = GTK_JUNCTION_BOTTOM;
2163 case GDK_WINDOW_EDGE_SOUTH_EAST:
2164 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2167 g_assert_not_reached();
2170 context = gtk_widget_get_style_context (area);
2171 gtk_style_context_save (context);
2172 gtk_style_context_add_class (context, "grip");
2173 gtk_style_context_set_junction_sides (context, sides);
2174 gtk_render_handle (context, cr,
2176 gtk_widget_get_allocated_width (area),
2177 gtk_widget_get_allocated_height (area));
2179 gtk_style_context_restore (context);
2185 create_resize_grips (GtkWidget *widget)
2187 static GtkWidget *window = NULL;
2189 GtkWidget *hbox, *vbox;
2192 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2194 gtk_window_set_screen (GTK_WINDOW (window),
2195 gtk_widget_get_screen (widget));
2197 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2199 g_signal_connect (window, "destroy",
2200 G_CALLBACK (gtk_widget_destroyed),
2203 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2204 gtk_container_add (GTK_CONTAINER (window), vbox);
2206 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2207 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2210 area = gtk_drawing_area_new ();
2211 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2212 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2213 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2214 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2215 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2216 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2219 area = gtk_drawing_area_new ();
2220 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2221 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2222 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2223 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2224 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2225 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2228 area = gtk_drawing_area_new ();
2229 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2230 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2231 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2232 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2233 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2234 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2236 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2237 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2240 area = gtk_drawing_area_new ();
2241 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2242 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2243 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2244 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2245 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2246 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2249 area = gtk_drawing_area_new ();
2250 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2253 area = gtk_drawing_area_new ();
2254 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2255 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2256 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2257 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2258 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2259 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2262 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2263 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2266 area = gtk_drawing_area_new ();
2267 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2268 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2269 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2270 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2271 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2272 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2274 area = gtk_drawing_area_new ();
2275 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2276 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2277 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2278 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2279 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2280 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2283 area = gtk_drawing_area_new ();
2284 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2285 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2286 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2287 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2288 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2289 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2292 if (!gtk_widget_get_visible (window))
2293 gtk_widget_show_all (window);
2295 gtk_widget_destroy (window);
2301 gint upositionx = 0;
2302 gint upositiony = 0;
2305 uposition_configure (GtkWidget *window)
2311 lx = g_object_get_data (G_OBJECT (window), "x");
2312 ly = g_object_get_data (G_OBJECT (window), "y");
2314 gdk_window_get_root_origin (gtk_widget_get_window (window),
2315 &upositionx, &upositiony);
2316 sprintf (buffer, "%d", upositionx);
2317 gtk_label_set_text (lx, buffer);
2318 sprintf (buffer, "%d", upositiony);
2319 gtk_label_set_text (ly, buffer);
2325 uposition_stop_configure (GtkToggleButton *toggle,
2328 if (gtk_toggle_button_get_active (toggle))
2329 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2331 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2335 create_saved_position (GtkWidget *widget)
2337 static GtkWidget *window = NULL;
2342 GtkWidget *main_vbox;
2350 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2351 "type", GTK_WINDOW_TOPLEVEL,
2352 "title", "Saved Position",
2354 "signal::configure_event", uposition_configure, NULL,
2357 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2359 gtk_window_set_screen (GTK_WINDOW (window),
2360 gtk_widget_get_screen (widget));
2363 g_signal_connect (window, "destroy",
2364 G_CALLBACK (gtk_widget_destroyed),
2367 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2368 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2369 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2372 g_object_new (GTK_TYPE_BOX,
2373 "orientation", GTK_ORIENTATION_VERTICAL,
2374 "GtkBox::homogeneous", FALSE,
2375 "GtkBox::spacing", 5,
2376 "GtkContainer::border_width", 10,
2377 "GtkWidget::parent", main_vbox,
2378 "GtkWidget::visible", TRUE,
2379 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2380 "label", "Stop Events",
2384 "signal::clicked", uposition_stop_configure, window,
2388 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2389 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2390 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2392 label = gtk_label_new ("X Origin : ");
2393 gtk_widget_set_halign (label, GTK_ALIGN_START);
2394 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2395 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2397 x_label = gtk_label_new ("");
2398 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2399 g_object_set_data (G_OBJECT (window), "x", x_label);
2401 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2402 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2403 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2405 label = gtk_label_new ("Y Origin : ");
2406 gtk_widget_set_halign (label, GTK_ALIGN_START);
2407 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2408 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2410 y_label = gtk_label_new ("");
2411 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2412 g_object_set_data (G_OBJECT (window), "y", y_label);
2415 g_object_new (gtk_separator_get_type (),
2416 "GtkWidget::visible", TRUE,
2418 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2420 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2421 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2422 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2424 button = gtk_button_new_with_label ("Close");
2425 g_signal_connect_swapped (button, "clicked",
2426 G_CALLBACK (gtk_widget_destroy),
2428 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2429 gtk_widget_set_can_default (button, TRUE);
2430 gtk_widget_grab_default (button);
2432 gtk_widget_show_all (window);
2435 gtk_widget_destroy (window);
2443 create_pixbuf (GtkWidget *widget)
2445 static GtkWidget *window = NULL;
2451 GtkWidget *separator;
2452 GtkWidget *pixbufwid;
2453 GdkWindow *gdk_window;
2457 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2459 gtk_window_set_screen (GTK_WINDOW (window),
2460 gtk_widget_get_screen (widget));
2462 g_signal_connect (window, "destroy",
2463 G_CALLBACK (gtk_widget_destroyed),
2466 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2467 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2468 gtk_widget_realize(window);
2470 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2471 gtk_container_add (GTK_CONTAINER (window), box1);
2473 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2474 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2475 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2477 button = gtk_button_new ();
2478 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2480 gdk_window = gtk_widget_get_window (window);
2482 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2484 label = gtk_label_new ("Pixbuf\ntest");
2485 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2486 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2487 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2488 gtk_container_add (GTK_CONTAINER (box3), label);
2489 gtk_container_add (GTK_CONTAINER (button), box3);
2491 button = gtk_button_new ();
2492 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2494 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2496 label = gtk_label_new ("Pixbuf\ntest");
2497 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2498 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2499 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2500 gtk_container_add (GTK_CONTAINER (box3), label);
2501 gtk_container_add (GTK_CONTAINER (button), box3);
2503 gtk_widget_set_sensitive (button, FALSE);
2505 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2506 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2508 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2509 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2510 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2512 button = gtk_button_new_with_label ("close");
2513 g_signal_connect_swapped (button, "clicked",
2514 G_CALLBACK (gtk_widget_destroy),
2516 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2517 gtk_widget_set_can_default (button, TRUE);
2518 gtk_widget_grab_default (button);
2521 if (!gtk_widget_get_visible (window))
2522 gtk_widget_show_all (window);
2524 gtk_widget_destroy (window);
2528 create_tooltips (GtkWidget *widget)
2530 static GtkWidget *window = NULL;
2537 GtkWidget *separator;
2542 g_object_new (gtk_window_get_type (),
2543 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2544 "GtkContainer::border_width", 0,
2545 "GtkWindow::title", "Tooltips",
2546 "GtkWindow::resizable", FALSE,
2549 gtk_window_set_screen (GTK_WINDOW (window),
2550 gtk_widget_get_screen (widget));
2552 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2553 gtk_container_add (GTK_CONTAINER (window), box1);
2555 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2556 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2557 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2559 button = gtk_toggle_button_new_with_label ("button1");
2560 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2562 gtk_widget_set_tooltip_text (button, "This is button 1");
2564 button = gtk_toggle_button_new_with_label ("button2");
2565 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2567 gtk_widget_set_tooltip_text (button,
2568 "This is button 2. This is also a really long tooltip which probably "
2569 "won't fit on a single line and will therefore need to be wrapped. "
2570 "Hopefully the wrapping will work correctly.");
2572 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2573 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2575 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2578 g_object_new (GTK_TYPE_BOX,
2579 "orientation", GTK_ORIENTATION_VERTICAL,
2580 "homogeneous", FALSE,
2587 g_object_new (gtk_button_get_type (),
2592 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2593 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2595 frame = g_object_new (gtk_frame_get_type (),
2596 "label", "ToolTips Inspector",
2597 "label_xalign", (double) 0.5,
2603 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2605 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2606 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2608 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2609 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2610 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2612 button = gtk_button_new_with_label ("close");
2613 g_signal_connect_swapped (button, "clicked",
2614 G_CALLBACK (gtk_widget_destroy),
2616 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2617 gtk_widget_set_can_default (button, TRUE);
2618 gtk_widget_grab_default (button);
2620 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2623 if (!gtk_widget_get_visible (window))
2624 gtk_widget_show_all (window);
2626 gtk_widget_destroy (window);
2634 pack_image (GtkWidget *box,
2638 gtk_box_pack_start (GTK_BOX (box),
2639 gtk_label_new (text),
2642 gtk_box_pack_start (GTK_BOX (box),
2648 create_image (GtkWidget *widget)
2650 static GtkWidget *window = NULL;
2657 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2659 gtk_window_set_screen (GTK_WINDOW (window),
2660 gtk_widget_get_screen (widget));
2662 /* this is bogus for testing drawing when allocation < request,
2663 * don't copy into real code
2665 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2667 g_signal_connect (window, "destroy",
2668 G_CALLBACK (gtk_widget_destroyed),
2671 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2673 gtk_container_add (GTK_CONTAINER (window), vbox);
2675 pack_image (vbox, "Stock Warning Dialog",
2676 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2677 GTK_ICON_SIZE_DIALOG));
2679 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2681 pack_image (vbox, "Pixbuf",
2682 gtk_image_new_from_pixbuf (pixbuf));
2684 g_object_unref (pixbuf);
2687 if (!gtk_widget_get_visible (window))
2688 gtk_widget_show_all (window);
2690 gtk_widget_destroy (window);
2698 create_menu (GdkScreen *screen, gint depth, gint length)
2701 GtkWidget *menuitem;
2710 menu = gtk_menu_new ();
2711 gtk_menu_set_screen (GTK_MENU (menu), screen);
2715 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2716 GTK_ICON_SIZE_MENU);
2717 gtk_widget_show (image);
2718 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2719 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2720 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2721 gtk_widget_show (menuitem);
2723 for (i = 0, j = 1; i < length; i++, j++)
2725 sprintf (buf, "item %2d - %d", depth, j);
2727 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2728 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2730 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2731 gtk_widget_show (menuitem);
2733 gtk_widget_set_sensitive (menuitem, FALSE);
2736 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
2740 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
2741 create_menu (screen, depth - 1, 5));
2748 create_table_menu (GdkScreen *screen, gint cols, gint rows)
2751 GtkWidget *menuitem;
2757 menu = gtk_menu_new ();
2758 gtk_menu_set_screen (GTK_MENU (menu), screen);
2762 menuitem = gtk_menu_item_new_with_label ("items");
2763 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
2765 submenu = gtk_menu_new ();
2766 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2767 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2768 gtk_widget_show (menuitem);
2771 /* now fill the items submenu */
2772 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2773 GTK_ICON_SIZE_MENU);
2774 gtk_widget_show (image);
2775 menuitem = gtk_image_menu_item_new_with_label ("Image");
2776 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2777 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
2778 gtk_widget_show (menuitem);
2780 menuitem = gtk_menu_item_new_with_label ("x");
2781 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
2782 gtk_widget_show (menuitem);
2784 menuitem = gtk_menu_item_new_with_label ("x");
2785 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
2786 gtk_widget_show (menuitem);
2788 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2789 GTK_ICON_SIZE_MENU);
2790 gtk_widget_show (image);
2791 menuitem = gtk_image_menu_item_new_with_label ("Image");
2792 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2793 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
2794 gtk_widget_show (menuitem);
2796 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
2797 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
2798 gtk_widget_show (menuitem);
2800 menuitem = gtk_menu_item_new_with_label ("x");
2801 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
2802 gtk_widget_show (menuitem);
2804 menuitem = gtk_menu_item_new_with_label ("x");
2805 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
2806 gtk_widget_show (menuitem);
2808 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
2809 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
2810 gtk_widget_show (menuitem);
2812 menuitem = gtk_check_menu_item_new_with_label ("Check");
2813 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
2814 gtk_widget_show (menuitem);
2816 menuitem = gtk_menu_item_new_with_label ("x");
2817 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
2818 gtk_widget_show (menuitem);
2820 menuitem = gtk_menu_item_new_with_label ("x");
2821 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
2822 gtk_widget_show (menuitem);
2824 menuitem = gtk_check_menu_item_new_with_label ("Check");
2825 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
2826 gtk_widget_show (menuitem);
2828 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
2829 gtk_widget_show (menuitem);
2830 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
2832 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
2833 gtk_widget_show (menuitem);
2834 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
2836 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
2837 gtk_widget_show (menuitem);
2838 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
2840 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
2841 gtk_widget_show (menuitem);
2842 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
2844 /* end of items submenu */
2846 menuitem = gtk_menu_item_new_with_label ("spanning");
2847 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
2849 submenu = gtk_menu_new ();
2850 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2851 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2852 gtk_widget_show (menuitem);
2855 /* now fill the spanning submenu */
2856 menuitem = gtk_menu_item_new_with_label ("a");
2857 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
2858 gtk_widget_show (menuitem);
2860 menuitem = gtk_menu_item_new_with_label ("b");
2861 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
2862 gtk_widget_show (menuitem);
2864 menuitem = gtk_menu_item_new_with_label ("c");
2865 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
2866 gtk_widget_show (menuitem);
2868 menuitem = gtk_menu_item_new_with_label ("d");
2869 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
2870 gtk_widget_show (menuitem);
2872 menuitem = gtk_menu_item_new_with_label ("e");
2873 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
2874 gtk_widget_show (menuitem);
2875 /* end of spanning submenu */
2877 menuitem = gtk_menu_item_new_with_label ("left");
2878 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
2879 submenu = gtk_menu_new ();
2880 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2881 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2882 gtk_widget_show (menuitem);
2884 menuitem = gtk_menu_item_new_with_label ("Empty");
2885 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
2886 submenu = gtk_menu_new ();
2887 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2888 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2889 gtk_widget_show (menuitem);
2891 menuitem = gtk_menu_item_new_with_label ("right");
2892 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
2893 submenu = gtk_menu_new ();
2894 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2895 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2896 gtk_widget_show (menuitem);
2898 menuitem = gtk_menu_item_new_with_label ("Empty");
2899 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
2900 gtk_widget_show (menuitem);
2904 for (; j < rows; j++)
2905 for (i = 0; i < cols; i++)
2907 sprintf (buf, "(%d %d)", i, j);
2908 menuitem = gtk_menu_item_new_with_label (buf);
2909 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
2910 gtk_widget_show (menuitem);
2913 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
2914 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
2915 gtk_widget_show (menuitem);
2916 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
2917 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
2918 gtk_widget_show (menuitem);
2919 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
2920 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
2921 gtk_widget_show (menuitem);
2922 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
2923 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
2924 gtk_widget_show (menuitem);
2930 create_menus (GtkWidget *widget)
2932 static GtkWidget *window = NULL;
2936 GtkWidget *optionmenu;
2937 GtkWidget *separator;
2943 GtkWidget *menuitem;
2944 GtkAccelGroup *accel_group;
2946 GdkScreen *screen = gtk_widget_get_screen (widget);
2948 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2950 gtk_window_set_screen (GTK_WINDOW (window), screen);
2952 g_signal_connect (window, "destroy",
2953 G_CALLBACK (gtk_widget_destroyed),
2955 g_signal_connect (window, "delete-event",
2956 G_CALLBACK (gtk_true),
2959 accel_group = gtk_accel_group_new ();
2960 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
2962 gtk_window_set_title (GTK_WINDOW (window), "menus");
2963 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2966 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2967 gtk_container_add (GTK_CONTAINER (window), box1);
2968 gtk_widget_show (box1);
2970 menubar = gtk_menu_bar_new ();
2971 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
2972 gtk_widget_show (menubar);
2974 menu = create_menu (screen, 2, 50);
2976 menuitem = gtk_menu_item_new_with_label ("test\nline2");
2977 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
2978 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
2979 gtk_widget_show (menuitem);
2981 menu = create_table_menu (screen, 2, 50);
2983 menuitem = gtk_menu_item_new_with_label ("table");
2984 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
2985 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
2986 gtk_widget_show (menuitem);
2988 menuitem = gtk_menu_item_new_with_label ("foo");
2989 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5));
2990 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
2991 gtk_widget_show (menuitem);
2993 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2994 GTK_ICON_SIZE_MENU);
2995 gtk_widget_show (image);
2996 menuitem = gtk_image_menu_item_new_with_label ("Help");
2997 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2998 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5));
2999 gtk_widget_set_hexpand (menuitem, TRUE);
3000 gtk_widget_set_halign (menuitem, GTK_ALIGN_END);
3001 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3002 gtk_widget_show (menuitem);
3004 menubar = gtk_menu_bar_new ();
3005 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3006 gtk_widget_show (menubar);
3008 menu = create_menu (screen, 2, 10);
3010 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3011 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3012 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3013 gtk_widget_show (menuitem);
3015 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3016 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3017 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3018 gtk_widget_show (box2);
3020 menu = create_menu (screen, 1, 5);
3021 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3023 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3024 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3025 gtk_widget_show (menuitem);
3027 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3028 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3029 gtk_widget_show (menuitem);
3030 gtk_widget_add_accelerator (menuitem,
3036 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3037 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3038 gtk_widget_show (menuitem);
3039 gtk_widget_add_accelerator (menuitem,
3044 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3045 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3046 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3047 gtk_widget_show (menuitem);
3048 gtk_widget_add_accelerator (menuitem,
3054 gtk_widget_add_accelerator (menuitem,
3061 optionmenu = gtk_combo_box_text_new ();
3062 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3063 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3064 gtk_widget_show (optionmenu);
3066 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3067 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3068 gtk_widget_show (separator);
3070 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3071 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3072 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3073 gtk_widget_show (box2);
3075 button = gtk_button_new_with_label ("close");
3076 g_signal_connect_swapped (button, "clicked",
3077 G_CALLBACK (gtk_widget_destroy),
3079 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3080 gtk_widget_set_can_default (button, TRUE);
3081 gtk_widget_grab_default (button);
3082 gtk_widget_show (button);
3085 if (!gtk_widget_get_visible (window))
3086 gtk_widget_show (window);
3088 gtk_widget_destroy (window);
3091 /* GdkPixbuf RGBA C-Source image dump */
3093 static const guint8 apple[] =
3095 /* Pixbuf magic (0x47646b50) */
3097 /* length: header (24) + pixel_data (2304) */
3099 /* pixdata_type (0x1010002) */
3101 /* rowstride (96) */
3108 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3109 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3110 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3111 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3112 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3113 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3114 "\0\0\0\0\0\0\0\0\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"
3115 "\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"
3116 "\0\0\0\0\0\0\0\0\0\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"
3117 "[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"
3118 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3119 "\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"
3120 "\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"
3121 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3122 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3123 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3124 "\0\0\0\0\0\0\0\0\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"
3125 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3126 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3127 "\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["
3128 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3129 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3130 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3131 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3132 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3133 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3134 "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"
3135 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3136 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3137 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3138 "\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"
3139 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3140 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3141 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3142 "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"
3143 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3144 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3145 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3146 "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"
3147 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3148 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3149 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3150 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3151 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3152 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3153 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3154 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3155 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3156 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3157 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3158 "\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>"
3159 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3160 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3161 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3162 "\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"
3163 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3164 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3165 "\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"
3166 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3167 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3168 "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"
3169 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3170 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3171 "\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"
3172 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3173 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3174 "\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"
3175 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3176 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3177 "\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"
3178 "\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"
3179 "\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"
3180 "\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"
3181 "\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"
3182 "\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"
3183 "\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"
3184 "\0\0\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"
3185 "\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"
3186 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3190 accel_button_new (GtkAccelGroup *accel_group,
3195 GdkModifierType modifiers;
3199 gtk_accelerator_parse (accel, &keyval, &modifiers);
3202 button = gtk_button_new ();
3203 gtk_widget_add_accelerator (button, "activate", accel_group,
3204 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3206 label = gtk_accel_label_new (text);
3207 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3208 gtk_widget_show (label);
3210 gtk_container_add (GTK_CONTAINER (button), label);
3216 create_key_lookup (GtkWidget *widget)
3218 static GtkWidget *window = NULL;
3219 gpointer window_ptr;
3223 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3225 GtkWidget *content_area;
3227 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3228 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3231 gtk_window_set_screen (GTK_WINDOW (window),
3232 gtk_widget_get_screen (widget));
3234 /* We have to expand it so the accel labels will draw their labels
3236 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3238 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3240 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3242 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3243 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3244 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3245 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3246 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3247 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3248 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3249 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3250 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3251 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3252 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3253 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3254 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3255 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3256 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3257 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3258 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3259 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3260 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3261 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3262 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3263 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3264 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3265 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3266 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3267 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3268 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3269 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3271 window_ptr = &window;
3272 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3273 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3275 gtk_widget_show_all (window);
3278 gtk_widget_destroy (window);
3287 cmw_destroy_cb(GtkWidget *widget)
3289 /* This is needed to get out of gtk_main */
3296 cmw_color (GtkWidget *widget, GtkWidget *parent)
3299 GtkWidget *ok_button, *cancel_button;
3301 csd = gtk_color_chooser_dialog_new ("This is a modal color selection dialog", GTK_WINDOW (parent));
3304 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3306 g_signal_connect (csd, "destroy",
3307 G_CALLBACK (cmw_destroy_cb), NULL);
3308 g_signal_connect (csd, "response",
3309 G_CALLBACK (gtk_widget_destroy), NULL);
3311 /* wait until destroy calls gtk_main_quit */
3312 gtk_widget_show (csd);
3317 cmw_file (GtkWidget *widget, GtkWidget *parent)
3321 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3322 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3323 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3324 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3326 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3327 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3329 g_signal_connect (fs, "destroy",
3330 G_CALLBACK (cmw_destroy_cb), NULL);
3331 g_signal_connect_swapped (fs, "response",
3332 G_CALLBACK (gtk_widget_destroy), fs);
3334 /* wait until destroy calls gtk_main_quit */
3335 gtk_widget_show (fs);
3341 create_modal_window (GtkWidget *widget)
3343 GtkWidget *window = NULL;
3344 GtkWidget *box1,*box2;
3346 GtkWidget *btnColor,*btnFile,*btnClose;
3348 /* Create modal window (Here you can use any window descendent )*/
3349 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3350 gtk_window_set_screen (GTK_WINDOW (window),
3351 gtk_widget_get_screen (widget));
3353 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3355 /* Set window as modal */
3356 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3358 /* Create widgets */
3359 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3360 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3361 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3362 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3363 btnColor = gtk_button_new_with_label ("Color");
3364 btnFile = gtk_button_new_with_label ("File Selection");
3365 btnClose = gtk_button_new_with_label ("Close");
3368 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3369 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3372 gtk_container_add (GTK_CONTAINER (window), box1);
3373 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3374 gtk_container_add (GTK_CONTAINER (frame1), box2);
3375 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3376 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3377 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3378 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3380 /* connect signals */
3381 g_signal_connect_swapped (btnClose, "clicked",
3382 G_CALLBACK (gtk_widget_destroy), window);
3384 g_signal_connect (window, "destroy",
3385 G_CALLBACK (cmw_destroy_cb), NULL);
3387 g_signal_connect (btnColor, "clicked",
3388 G_CALLBACK (cmw_color), window);
3389 g_signal_connect (btnFile, "clicked",
3390 G_CALLBACK (cmw_file), window);
3393 gtk_widget_show_all (window);
3395 /* wait until dialog get destroyed */
3404 make_message_dialog (GdkScreen *screen,
3406 GtkMessageType type,
3407 GtkButtonsType buttons,
3408 guint default_response)
3412 gtk_widget_destroy (*dialog);
3417 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3418 "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.)");
3420 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3422 g_signal_connect_swapped (*dialog,
3424 G_CALLBACK (gtk_widget_destroy),
3427 g_signal_connect (*dialog,
3429 G_CALLBACK (gtk_widget_destroyed),
3432 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3434 gtk_widget_show (*dialog);
3438 create_message_dialog (GtkWidget *widget)
3440 static GtkWidget *info = NULL;
3441 static GtkWidget *warning = NULL;
3442 static GtkWidget *error = NULL;
3443 static GtkWidget *question = NULL;
3444 GdkScreen *screen = gtk_widget_get_screen (widget);
3446 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3447 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3448 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3449 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3456 static GtkWidget *sw_parent = NULL;
3457 static GtkWidget *sw_float_parent;
3458 static gulong sw_destroyed_handler = 0;
3461 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3463 gtk_widget_reparent (scrollwin, sw_parent);
3465 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3466 sw_float_parent = NULL;
3468 sw_destroyed_handler = 0;
3474 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3476 gtk_widget_destroy (sw_float_parent);
3478 sw_float_parent = NULL;
3480 sw_destroyed_handler = 0;
3484 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3488 gtk_widget_reparent (scrollwin, sw_parent);
3489 gtk_widget_destroy (sw_float_parent);
3491 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3492 sw_float_parent = NULL;
3494 sw_destroyed_handler = 0;
3498 sw_parent = gtk_widget_get_parent (scrollwin);
3499 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3500 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3501 gtk_widget_get_screen (widget));
3503 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3505 gtk_widget_reparent (scrollwin, sw_float_parent);
3506 gtk_widget_show (sw_float_parent);
3508 sw_destroyed_handler =
3509 g_signal_connect (sw_parent, "destroy",
3510 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3511 g_signal_connect (sw_float_parent, "delete_event",
3512 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3517 create_scrolled_windows (GtkWidget *widget)
3519 static GtkWidget *window;
3520 GtkWidget *content_area, *action_area;
3521 GtkWidget *scrolled_window;
3529 window = gtk_dialog_new ();
3531 gtk_window_set_screen (GTK_WINDOW (window),
3532 gtk_widget_get_screen (widget));
3534 g_signal_connect (window, "destroy",
3535 G_CALLBACK (gtk_widget_destroyed),
3538 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3539 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3541 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3542 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3544 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3545 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3546 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3547 GTK_POLICY_AUTOMATIC,
3548 GTK_POLICY_AUTOMATIC);
3549 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3550 gtk_widget_show (scrolled_window);
3552 grid = gtk_grid_new ();
3553 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
3554 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
3555 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), grid);
3556 gtk_container_set_focus_hadjustment (GTK_CONTAINER (grid),
3557 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3558 gtk_container_set_focus_vadjustment (GTK_CONTAINER (grid),
3559 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3560 gtk_widget_show (grid);
3562 for (i = 0; i < 20; i++)
3563 for (j = 0; j < 20; j++)
3565 sprintf (buffer, "button (%d,%d)\n", i, j);
3566 button = gtk_toggle_button_new_with_label (buffer);
3567 gtk_grid_attach (GTK_GRID (grid), button, i, j, 1, 1);
3568 gtk_widget_show (button);
3572 button = gtk_button_new_with_label ("Close");
3573 g_signal_connect_swapped (button, "clicked",
3574 G_CALLBACK (gtk_widget_destroy),
3576 gtk_widget_set_can_default (button, TRUE);
3577 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3578 gtk_widget_grab_default (button);
3579 gtk_widget_show (button);
3581 button = gtk_button_new_with_label ("Reparent Out");
3582 g_signal_connect (button, "clicked",
3583 G_CALLBACK (scrolled_windows_remove),
3585 gtk_widget_set_can_default (button, TRUE);
3586 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3587 gtk_widget_grab_default (button);
3588 gtk_widget_show (button);
3590 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3593 if (!gtk_widget_get_visible (window))
3594 gtk_widget_show (window);
3596 gtk_widget_destroy (window);
3604 entry_toggle_frame (GtkWidget *checkbutton,
3607 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3608 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3612 entry_toggle_sensitive (GtkWidget *checkbutton,
3615 gtk_widget_set_sensitive (entry,
3616 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3620 entry_progress_timeout (gpointer data)
3622 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3624 gtk_entry_progress_pulse (GTK_ENTRY (data));
3630 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3633 if (fraction > 1.0001)
3636 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3639 return G_SOURCE_CONTINUE;
3643 entry_remove_timeout (gpointer data)
3645 g_source_remove (GPOINTER_TO_UINT (data));
3649 entry_toggle_progress (GtkWidget *checkbutton,
3652 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3654 guint timeout = gdk_threads_add_timeout (100,
3655 entry_progress_timeout,
3657 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3658 GUINT_TO_POINTER (timeout),
3659 entry_remove_timeout);
3663 g_object_set_data (G_OBJECT (entry), "timeout-id",
3664 GUINT_TO_POINTER (0));
3666 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3671 entry_toggle_pulse (GtkWidget *checkbutton,
3674 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3675 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3679 props_clicked (GtkWidget *button,
3682 GtkWidget *window = create_prop_editor (object, 0);
3684 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3688 create_entry (GtkWidget *widget)
3690 static GtkWidget *window = NULL;
3694 GtkWidget *has_frame_check;
3695 GtkWidget *sensitive_check;
3696 GtkWidget *progress_check;
3698 GtkComboBoxText *cb;
3699 GtkWidget *cb_entry;
3701 GtkWidget *separator;
3705 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3706 gtk_window_set_screen (GTK_WINDOW (window),
3707 gtk_widget_get_screen (widget));
3709 g_signal_connect (window, "destroy",
3710 G_CALLBACK (gtk_widget_destroyed),
3713 gtk_window_set_title (GTK_WINDOW (window), "entry");
3714 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3717 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3718 gtk_container_add (GTK_CONTAINER (window), box1);
3721 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3722 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3723 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3725 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
3726 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
3728 entry = gtk_entry_new ();
3729 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");
3730 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
3731 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
3733 button = gtk_button_new_with_mnemonic ("_Props");
3734 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
3735 g_signal_connect (button, "clicked",
3736 G_CALLBACK (props_clicked),
3739 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
3741 gtk_combo_box_text_append_text (cb, "item0");
3742 gtk_combo_box_text_append_text (cb, "item0");
3743 gtk_combo_box_text_append_text (cb, "item1 item1");
3744 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
3745 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
3746 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
3747 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
3748 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
3749 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
3750 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
3751 gtk_combo_box_text_append_text (cb, "item9 item9");
3753 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
3754 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
3755 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
3756 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
3758 sensitive_check = gtk_check_button_new_with_label("Sensitive");
3759 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
3760 g_signal_connect (sensitive_check, "toggled",
3761 G_CALLBACK (entry_toggle_sensitive), entry);
3762 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
3764 has_frame_check = gtk_check_button_new_with_label("Has Frame");
3765 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
3766 g_signal_connect (has_frame_check, "toggled",
3767 G_CALLBACK (entry_toggle_frame), entry);
3768 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
3770 progress_check = gtk_check_button_new_with_label("Show Progress");
3771 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
3772 g_signal_connect (progress_check, "toggled",
3773 G_CALLBACK (entry_toggle_progress), entry);
3775 progress_check = gtk_check_button_new_with_label("Pulse Progress");
3776 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
3777 g_signal_connect (progress_check, "toggled",
3778 G_CALLBACK (entry_toggle_pulse), entry);
3780 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3781 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3783 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3784 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3785 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3787 button = gtk_button_new_with_label ("close");
3788 g_signal_connect_swapped (button, "clicked",
3789 G_CALLBACK (gtk_widget_destroy),
3791 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3792 gtk_widget_set_can_default (button, TRUE);
3793 gtk_widget_grab_default (button);
3796 if (!gtk_widget_get_visible (window))
3797 gtk_widget_show_all (window);
3799 gtk_widget_destroy (window);
3803 create_expander (GtkWidget *widget)
3806 GtkWidget *expander;
3808 static GtkWidget *window = NULL;
3812 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3813 gtk_window_set_screen (GTK_WINDOW (window),
3814 gtk_widget_get_screen (widget));
3816 g_signal_connect (window, "destroy",
3817 G_CALLBACK (gtk_widget_destroyed),
3820 gtk_window_set_title (GTK_WINDOW (window), "expander");
3821 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3823 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3824 gtk_container_add (GTK_CONTAINER (window), box1);
3826 expander = gtk_expander_new ("The Hidden");
3828 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
3830 hidden = gtk_label_new ("Revealed!");
3832 gtk_container_add (GTK_CONTAINER (expander), hidden);
3835 if (!gtk_widget_get_visible (window))
3836 gtk_widget_show_all (window);
3838 gtk_widget_destroy (window);
3846 event_box_label_pressed (GtkWidget *widget,
3847 GdkEventButton *event,
3850 g_print ("clicked on event box\n");
3854 event_box_button_clicked (GtkWidget *widget,
3858 g_print ("pushed button\n");
3862 event_box_toggle_visible_window (GtkWidget *checkbutton,
3863 GtkEventBox *event_box)
3865 gtk_event_box_set_visible_window (event_box,
3866 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3870 event_box_toggle_above_child (GtkWidget *checkbutton,
3871 GtkEventBox *event_box)
3873 gtk_event_box_set_above_child (event_box,
3874 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3878 create_event_box (GtkWidget *widget)
3880 static GtkWidget *window = NULL;
3886 GtkWidget *separator;
3887 GtkWidget *event_box;
3889 GtkWidget *visible_window_check;
3890 GtkWidget *above_child_check;
3900 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3901 gtk_window_set_screen (GTK_WINDOW (window),
3902 gtk_widget_get_screen (widget));
3904 g_signal_connect (window, "destroy",
3905 G_CALLBACK (gtk_widget_destroyed),
3908 gtk_window_set_title (GTK_WINDOW (window), "event box");
3909 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3911 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3912 gtk_container_add (GTK_CONTAINER (window), box1);
3913 gtk_widget_override_background_color (window, 0, &color);
3915 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
3916 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
3918 event_box = gtk_event_box_new ();
3919 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
3921 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3922 gtk_container_add (GTK_CONTAINER (event_box), vbox);
3923 g_signal_connect (event_box, "button_press_event",
3924 G_CALLBACK (event_box_label_pressed),
3927 label = gtk_label_new ("Click on this label");
3928 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
3930 button = gtk_button_new_with_label ("button in eventbox");
3931 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
3932 g_signal_connect (button, "clicked",
3933 G_CALLBACK (event_box_button_clicked),
3937 visible_window_check = gtk_check_button_new_with_label("Visible Window");
3938 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
3939 g_signal_connect (visible_window_check, "toggled",
3940 G_CALLBACK (event_box_toggle_visible_window), event_box);
3941 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
3943 above_child_check = gtk_check_button_new_with_label("Above Child");
3944 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
3945 g_signal_connect (above_child_check, "toggled",
3946 G_CALLBACK (event_box_toggle_above_child), event_box);
3947 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
3949 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3950 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3952 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3953 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3954 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3956 button = gtk_button_new_with_label ("close");
3957 g_signal_connect_swapped (button, "clicked",
3958 G_CALLBACK (gtk_widget_destroy),
3960 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3961 gtk_widget_set_can_default (button, TRUE);
3962 gtk_widget_grab_default (button);
3965 if (!gtk_widget_get_visible (window))
3966 gtk_widget_show_all (window);
3968 gtk_widget_destroy (window);
3976 #define SIZE_GROUP_INITIAL_SIZE 50
3979 size_group_hsize_changed (GtkSpinButton *spin_button,
3982 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
3983 gtk_spin_button_get_value_as_int (spin_button),
3988 size_group_vsize_changed (GtkSpinButton *spin_button,
3991 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
3993 gtk_spin_button_get_value_as_int (spin_button));
3997 create_size_group_window (GdkScreen *screen,
3998 GtkSizeGroup *master_size_group)
4000 GtkWidget *content_area;
4003 GtkWidget *main_button;
4005 GtkWidget *spin_button;
4007 GtkSizeGroup *hgroup1;
4008 GtkSizeGroup *hgroup2;
4009 GtkSizeGroup *vgroup1;
4010 GtkSizeGroup *vgroup2;
4012 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4018 gtk_window_set_screen (GTK_WINDOW (window), screen);
4020 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4022 g_signal_connect (window, "response",
4023 G_CALLBACK (gtk_widget_destroy),
4026 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4028 grid = gtk_grid_new ();
4029 gtk_box_pack_start (GTK_BOX (content_area), grid, TRUE, TRUE, 0);
4031 gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
4032 gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
4033 gtk_container_set_border_width (GTK_CONTAINER (grid), 5);
4034 gtk_widget_set_size_request (grid, 250, 250);
4036 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4037 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4038 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4039 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4041 main_button = gtk_button_new_with_label ("X");
4042 gtk_widget_set_hexpand (main_button, TRUE);
4043 gtk_widget_set_vexpand (main_button, TRUE);
4044 gtk_widget_set_halign (main_button, GTK_ALIGN_CENTER);
4045 gtk_widget_set_valign (main_button, GTK_ALIGN_CENTER);
4046 gtk_grid_attach (GTK_GRID (grid), main_button, 0, 0, 1, 1);
4048 gtk_size_group_add_widget (master_size_group, main_button);
4049 gtk_size_group_add_widget (hgroup1, main_button);
4050 gtk_size_group_add_widget (vgroup1, main_button);
4051 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4052 SIZE_GROUP_INITIAL_SIZE,
4053 SIZE_GROUP_INITIAL_SIZE);
4055 button = gtk_button_new ();
4056 gtk_widget_set_hexpand (button, TRUE);
4057 gtk_widget_set_vexpand (button, TRUE);
4058 gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
4059 gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
4060 gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 1);
4062 gtk_size_group_add_widget (vgroup1, button);
4063 gtk_size_group_add_widget (vgroup2, button);
4065 button = gtk_button_new ();
4066 gtk_widget_set_hexpand (button, TRUE);
4067 gtk_widget_set_vexpand (button, TRUE);
4068 gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
4069 gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
4070 gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 1, 1);
4072 gtk_size_group_add_widget (hgroup1, button);
4073 gtk_size_group_add_widget (hgroup2, button);
4075 button = gtk_button_new ();
4076 gtk_widget_set_hexpand (button, TRUE);
4077 gtk_widget_set_vexpand (button, TRUE);
4078 gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
4079 gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
4080 gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1);
4082 gtk_size_group_add_widget (hgroup2, button);
4083 gtk_size_group_add_widget (vgroup2, button);
4085 g_object_unref (hgroup1);
4086 g_object_unref (hgroup2);
4087 g_object_unref (vgroup1);
4088 g_object_unref (vgroup2);
4090 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4091 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4093 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4094 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4095 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4096 g_signal_connect (spin_button, "value_changed",
4097 G_CALLBACK (size_group_hsize_changed), main_button);
4099 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4100 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4101 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4102 g_signal_connect (spin_button, "value_changed",
4103 G_CALLBACK (size_group_vsize_changed), main_button);
4109 create_size_groups (GtkWidget *widget)
4111 static GtkWidget *window1 = NULL;
4112 static GtkWidget *window2 = NULL;
4113 static GtkSizeGroup *master_size_group;
4115 if (!master_size_group)
4116 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4120 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4123 g_signal_connect (window1, "destroy",
4124 G_CALLBACK (gtk_widget_destroyed),
4130 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4133 g_signal_connect (window2, "destroy",
4134 G_CALLBACK (gtk_widget_destroyed),
4138 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4140 gtk_widget_destroy (window1);
4141 gtk_widget_destroy (window2);
4145 if (!gtk_widget_get_visible (window1))
4146 gtk_widget_show_all (window1);
4147 if (!gtk_widget_get_visible (window2))
4148 gtk_widget_show_all (window2);
4156 static GtkWidget *spinner1;
4159 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4161 gtk_spin_button_set_snap_to_ticks (spin,
4162 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4166 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4168 gtk_spin_button_set_numeric (spin,
4169 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4173 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4175 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4176 gtk_spin_button_get_value_as_int (spin));
4180 get_value (GtkWidget *widget, gpointer data)
4184 GtkSpinButton *spin;
4186 spin = GTK_SPIN_BUTTON (spinner1);
4187 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4188 if (GPOINTER_TO_INT (data) == 1)
4189 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4191 sprintf (buf, "%0.*f",
4192 gtk_spin_button_get_digits (spin),
4193 gtk_spin_button_get_value (spin));
4195 gtk_label_set_text (label, buf);
4199 get_spin_value (GtkWidget *widget, gpointer data)
4203 GtkSpinButton *spin;
4205 spin = GTK_SPIN_BUTTON (widget);
4206 label = GTK_LABEL (data);
4208 buffer = g_strdup_printf ("%0.*f",
4209 gtk_spin_button_get_digits (spin),
4210 gtk_spin_button_get_value (spin));
4211 gtk_label_set_text (label, buffer);
4217 spin_button_time_output_func (GtkSpinButton *spin_button)
4219 GtkAdjustment *adjustment;
4220 static gchar buf[6];
4224 adjustment = gtk_spin_button_get_adjustment (spin_button);
4225 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4226 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4227 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4228 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4229 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4234 spin_button_month_input_func (GtkSpinButton *spin_button,
4238 static gchar *month[12] = { "January", "February", "March", "April",
4239 "May", "June", "July", "August",
4240 "September", "October", "November", "December" };
4242 gboolean found = FALSE;
4244 for (i = 1; i <= 12; i++)
4246 tmp1 = g_ascii_strup (month[i - 1], -1);
4247 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4248 if (strstr (tmp1, tmp2) == tmp1)
4258 return GTK_INPUT_ERROR;
4260 *new_val = (gdouble) i;
4265 spin_button_month_output_func (GtkSpinButton *spin_button)
4267 GtkAdjustment *adjustment;
4270 static gchar *month[12] = { "January", "February", "March", "April",
4271 "May", "June", "July", "August", "September",
4272 "October", "November", "December" };
4274 adjustment = gtk_spin_button_get_adjustment (spin_button);
4275 value = gtk_adjustment_get_value (adjustment);
4276 for (i = 1; i <= 12; i++)
4277 if (fabs (value - (double)i) < 1e-5)
4279 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4280 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4286 spin_button_hex_input_func (GtkSpinButton *spin_button,
4293 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4294 res = strtol(buf, &err, 16);
4297 return GTK_INPUT_ERROR;
4303 spin_button_hex_output_func (GtkSpinButton *spin_button)
4305 GtkAdjustment *adjustment;
4306 static gchar buf[7];
4309 adjustment = gtk_spin_button_get_adjustment (spin_button);
4310 val = (gint) gtk_adjustment_get_value (adjustment);
4311 if (fabs (val) < 1e-5)
4312 sprintf (buf, "0x00");
4314 sprintf (buf, "0x%.2X", val);
4315 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4316 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4321 create_spins (GtkWidget *widget)
4323 static GtkWidget *window = NULL;
4326 GtkWidget *main_vbox;
4329 GtkWidget *spinner2;
4333 GtkWidget *val_label;
4334 GtkAdjustment *adjustment;
4338 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4339 gtk_window_set_screen (GTK_WINDOW (window),
4340 gtk_widget_get_screen (widget));
4342 g_signal_connect (window, "destroy",
4343 G_CALLBACK (gtk_widget_destroyed),
4346 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4348 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4349 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4350 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4352 frame = gtk_frame_new ("Not accelerated");
4353 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4355 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4356 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4357 gtk_container_add (GTK_CONTAINER (frame), vbox);
4359 /* Time, month, hex spinners */
4361 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4362 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4364 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4365 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4367 label = gtk_label_new ("Time :");
4368 gtk_widget_set_halign (label, GTK_ALIGN_START);
4369 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4370 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4372 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4373 spinner = gtk_spin_button_new (adjustment, 0, 0);
4374 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4375 g_signal_connect (spinner,
4377 G_CALLBACK (spin_button_time_output_func),
4379 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4380 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4381 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4383 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4384 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4386 label = gtk_label_new ("Month :");
4387 gtk_widget_set_halign (label, GTK_ALIGN_START);
4388 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4389 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4391 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4393 spinner = gtk_spin_button_new (adjustment, 0, 0);
4394 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4395 GTK_UPDATE_IF_VALID);
4396 g_signal_connect (spinner,
4398 G_CALLBACK (spin_button_month_input_func),
4400 g_signal_connect (spinner,
4402 G_CALLBACK (spin_button_month_output_func),
4404 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4405 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4406 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4408 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4409 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4411 label = gtk_label_new ("Hex :");
4412 gtk_widget_set_halign (label, GTK_ALIGN_START);
4413 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4414 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4416 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4417 spinner = gtk_spin_button_new (adjustment, 0, 0);
4418 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4419 g_signal_connect (spinner,
4421 G_CALLBACK (spin_button_hex_input_func),
4423 g_signal_connect (spinner,
4425 G_CALLBACK (spin_button_hex_output_func),
4427 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4428 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4429 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4431 frame = gtk_frame_new ("Accelerated");
4432 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4434 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4435 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4436 gtk_container_add (GTK_CONTAINER (frame), vbox);
4438 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4439 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4441 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4442 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4444 label = gtk_label_new ("Value :");
4445 gtk_widget_set_halign (label, GTK_ALIGN_START);
4446 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4447 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4449 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4451 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4452 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4453 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4455 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4456 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4458 label = gtk_label_new ("Digits :");
4459 gtk_widget_set_halign (label, GTK_ALIGN_START);
4460 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4461 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4463 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4464 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4465 g_signal_connect (adjustment, "value_changed",
4466 G_CALLBACK (change_digits),
4468 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4470 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4471 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4473 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4474 g_signal_connect (button, "clicked",
4475 G_CALLBACK (toggle_snap),
4477 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4478 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4480 button = gtk_check_button_new_with_label ("Numeric only input mode");
4481 g_signal_connect (button, "clicked",
4482 G_CALLBACK (toggle_numeric),
4484 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4485 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4487 val_label = gtk_label_new ("");
4489 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4490 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4492 button = gtk_button_new_with_label ("Value as Int");
4493 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4494 g_signal_connect (button, "clicked",
4495 G_CALLBACK (get_value),
4496 GINT_TO_POINTER (1));
4497 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4499 button = gtk_button_new_with_label ("Value as Float");
4500 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4501 g_signal_connect (button, "clicked",
4502 G_CALLBACK (get_value),
4503 GINT_TO_POINTER (2));
4504 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4506 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4507 gtk_label_set_text (GTK_LABEL (val_label), "0");
4509 frame = gtk_frame_new ("Using Convenience Constructor");
4510 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4512 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4513 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4514 gtk_container_add (GTK_CONTAINER (frame), hbox);
4516 val_label = gtk_label_new ("0.0");
4518 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4519 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4520 g_signal_connect (spinner, "value_changed",
4521 G_CALLBACK (get_spin_value), val_label);
4522 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4523 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4525 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4526 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4528 button = gtk_button_new_with_label ("Close");
4529 g_signal_connect_swapped (button, "clicked",
4530 G_CALLBACK (gtk_widget_destroy),
4532 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4535 if (!gtk_widget_get_visible (window))
4536 gtk_widget_show_all (window);
4538 gtk_widget_destroy (window);
4547 cursor_draw (GtkWidget *widget,
4552 GtkStyleContext *context;
4555 width = gtk_widget_get_allocated_width (widget);
4556 height = gtk_widget_get_allocated_height (widget);
4558 cairo_set_source_rgb (cr, 1, 1, 1);
4559 cairo_rectangle (cr, 0, 0, width, height / 2);
4562 cairo_set_source_rgb (cr, 0, 0, 0);
4563 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4566 context = gtk_widget_get_style_context (widget);
4567 gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
4568 gdk_cairo_set_source_rgba (cr, &bg);
4569 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4576 set_cursor (GtkWidget *spinner,
4585 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4588 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4590 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4591 vals = class->values;
4593 while (vals && vals->value != c)
4596 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4598 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4600 g_type_class_unref (class);
4602 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4603 gdk_window_set_cursor (gtk_widget_get_window (widget),
4605 g_object_unref (cursor);
4609 cursor_event (GtkWidget *widget,
4611 GtkSpinButton *spinner)
4613 if ((event->type == GDK_BUTTON_PRESS) &&
4614 ((event->button.button == GDK_BUTTON_PRIMARY) ||
4615 (event->button.button == GDK_BUTTON_SECONDARY)))
4617 gtk_spin_button_spin (spinner, event->button.button == GDK_BUTTON_PRIMARY ?
4618 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4625 #ifdef GDK_WINDOWING_X11
4626 #include "x11/gdkx.h"
4629 change_cursor_theme (GtkWidget *widget,
4636 children = gtk_container_get_children (GTK_CONTAINER (data));
4638 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4639 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4641 g_list_free (children);
4643 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4650 create_cursors (GtkWidget *widget)
4652 static GtkWidget *window = NULL;
4655 GtkWidget *main_vbox;
4662 GtkAdjustment *adjustment;
4668 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4669 gtk_window_set_screen (GTK_WINDOW (window),
4670 gtk_widget_get_screen (widget));
4672 g_signal_connect (window, "destroy",
4673 G_CALLBACK (gtk_widget_destroyed),
4676 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4678 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4679 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4680 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4683 g_object_new (GTK_TYPE_BOX,
4684 "orientation", GTK_ORIENTATION_VERTICAL,
4685 "GtkBox::homogeneous", FALSE,
4686 "GtkBox::spacing", 5,
4687 "GtkContainer::border_width", 10,
4688 "GtkWidget::parent", main_vbox,
4689 "GtkWidget::visible", TRUE,
4692 #ifdef GDK_WINDOWING_X11
4693 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4694 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4695 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4697 label = gtk_label_new ("Cursor Theme : ");
4698 gtk_widget_set_halign (label, GTK_ALIGN_START);
4699 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4700 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4702 entry = gtk_entry_new ();
4703 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4704 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4706 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4707 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4708 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4710 g_signal_connect (entry, "changed",
4711 G_CALLBACK (change_cursor_theme), hbox);
4712 g_signal_connect (size, "changed",
4713 G_CALLBACK (change_cursor_theme), hbox);
4716 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4717 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4718 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4720 label = gtk_label_new ("Cursor Value : ");
4721 gtk_widget_set_halign (label, GTK_ALIGN_START);
4722 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4723 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4725 adjustment = gtk_adjustment_new (0,
4729 spinner = gtk_spin_button_new (adjustment, 0, 0);
4730 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
4733 g_object_new (gtk_frame_get_type (),
4734 "GtkFrame::label_xalign", 0.5,
4735 "GtkFrame::label", "Cursor Area",
4736 "GtkContainer::border_width", 10,
4737 "GtkWidget::parent", vbox,
4738 "GtkWidget::visible", TRUE,
4741 darea = gtk_drawing_area_new ();
4742 gtk_widget_set_size_request (darea, 80, 80);
4743 gtk_container_add (GTK_CONTAINER (frame), darea);
4744 g_signal_connect (darea,
4746 G_CALLBACK (cursor_draw),
4748 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
4749 g_signal_connect (darea,
4750 "button_press_event",
4751 G_CALLBACK (cursor_event),
4753 gtk_widget_show (darea);
4755 g_signal_connect (spinner, "changed",
4756 G_CALLBACK (set_cursor),
4759 label = g_object_new (GTK_TYPE_LABEL,
4764 gtk_container_child_set (GTK_CONTAINER (vbox), label,
4767 g_object_set_data (G_OBJECT (spinner), "user_data", label);
4769 any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4770 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
4772 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4773 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
4774 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4776 button = gtk_button_new_with_label ("Close");
4777 g_signal_connect_swapped (button, "clicked",
4778 G_CALLBACK (gtk_widget_destroy),
4780 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4782 gtk_widget_show_all (window);
4784 set_cursor (spinner, darea);
4787 gtk_widget_destroy (window);
4795 create_color_selection (GtkWidget *widget)
4797 static GtkWidget *window = NULL;
4806 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4807 gtk_window_set_screen (GTK_WINDOW (window),
4808 gtk_widget_get_screen (widget));
4810 g_signal_connect (window, "destroy",
4811 G_CALLBACK (gtk_widget_destroyed),
4814 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
4815 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4817 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
4818 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
4819 gtk_container_add (GTK_CONTAINER (window), hbox);
4821 label = gtk_label_new ("Pick a color");
4822 gtk_container_add (GTK_CONTAINER (hbox), label);
4824 picker = gtk_color_button_new ();
4825 gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (picker), TRUE);
4826 gtk_container_add (GTK_CONTAINER (hbox), picker);
4828 button = gtk_button_new_with_mnemonic ("_Props");
4829 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4830 g_signal_connect (button, "clicked",
4831 G_CALLBACK (props_clicked),
4835 if (!gtk_widget_get_visible (window))
4836 gtk_widget_show_all (window);
4838 gtk_widget_destroy (window);
4842 flipping_toggled_cb (GtkWidget *widget, gpointer data)
4844 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
4845 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
4847 gtk_widget_set_default_direction (new_direction);
4851 orientable_toggle_orientation (GtkOrientable *orientable)
4853 GtkOrientation orientation;
4855 orientation = gtk_orientable_get_orientation (orientable);
4856 gtk_orientable_set_orientation (orientable,
4857 orientation == GTK_ORIENTATION_HORIZONTAL ?
4858 GTK_ORIENTATION_VERTICAL :
4859 GTK_ORIENTATION_HORIZONTAL);
4861 if (GTK_IS_CONTAINER (orientable))
4866 children = gtk_container_get_children (GTK_CONTAINER (orientable));
4868 for (child = children; child; child = child->next)
4870 if (GTK_IS_ORIENTABLE (child->data))
4871 orientable_toggle_orientation (child->data);
4874 g_list_free (children);
4879 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
4881 GtkWidget *content_area;
4882 GtkWidget *toplevel;
4884 toplevel = gtk_widget_get_toplevel (widget);
4885 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
4886 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
4890 set_direction_recurse (GtkWidget *widget,
4893 GtkTextDirection *dir = data;
4895 gtk_widget_set_direction (widget, *dir);
4896 if (GTK_IS_CONTAINER (widget))
4897 gtk_container_foreach (GTK_CONTAINER (widget),
4898 set_direction_recurse,
4903 create_forward_back (const char *title,
4904 GtkTextDirection text_dir)
4906 GtkWidget *frame = gtk_frame_new (title);
4907 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
4908 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
4909 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
4911 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
4913 gtk_container_add (GTK_CONTAINER (frame), bbox);
4914 gtk_container_add (GTK_CONTAINER (bbox), back_button);
4915 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
4917 set_direction_recurse (frame, &text_dir);
4923 create_flipping (GtkWidget *widget)
4925 static GtkWidget *window = NULL;
4926 GtkWidget *check_button, *button;
4927 GtkWidget *action_area, *content_area;
4931 window = gtk_dialog_new ();
4933 gtk_window_set_screen (GTK_WINDOW (window),
4934 gtk_widget_get_screen (widget));
4936 g_signal_connect (window, "destroy",
4937 G_CALLBACK (gtk_widget_destroyed),
4940 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4941 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
4943 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
4945 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
4946 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
4947 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
4949 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
4950 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
4952 g_signal_connect (check_button, "toggled",
4953 G_CALLBACK (flipping_toggled_cb), NULL);
4955 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
4956 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
4957 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
4959 g_signal_connect (check_button, "toggled",
4960 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
4962 gtk_box_pack_start (GTK_BOX (content_area),
4963 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
4966 gtk_box_pack_start (GTK_BOX (content_area),
4967 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
4970 gtk_box_pack_start (GTK_BOX (content_area),
4971 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
4974 button = gtk_button_new_with_label ("Close");
4975 g_signal_connect_swapped (button, "clicked",
4976 G_CALLBACK (gtk_widget_destroy), window);
4977 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4980 if (!gtk_widget_get_visible (window))
4981 gtk_widget_show_all (window);
4983 gtk_widget_destroy (window);
4991 make_focus_table (GList **list)
4996 grid = gtk_grid_new ();
4998 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
4999 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
5001 for (i = 0; i < 5; i++)
5003 for (j = 0; j < 5; j++)
5008 widget = gtk_entry_new ();
5010 widget = gtk_button_new_with_label ("Foo");
5012 *list = g_list_prepend (*list, widget);
5014 gtk_widget_set_hexpand (widget, TRUE);
5015 gtk_widget_set_vexpand (widget, TRUE);
5017 gtk_grid_attach (GTK_GRID (grid), widget, i, j, 1, 1);
5021 *list = g_list_reverse (*list);
5027 create_focus (GtkWidget *widget)
5029 static GtkWidget *window = NULL;
5033 GtkWidget *content_area;
5038 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5044 gtk_window_set_screen (GTK_WINDOW (window),
5045 gtk_widget_get_screen (widget));
5047 g_signal_connect (window, "destroy",
5048 G_CALLBACK (gtk_widget_destroyed),
5051 g_signal_connect (window, "response",
5052 G_CALLBACK (gtk_widget_destroy),
5055 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5057 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5059 frame = gtk_frame_new ("Weird tab focus chain");
5061 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5063 table = make_focus_table (&list);
5065 gtk_container_add (GTK_CONTAINER (frame), table);
5067 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5072 frame = gtk_frame_new ("Default tab focus chain");
5074 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5077 table = make_focus_table (&list);
5081 gtk_container_add (GTK_CONTAINER (frame), table);
5084 if (!gtk_widget_get_visible (window))
5085 gtk_widget_show_all (window);
5087 gtk_widget_destroy (window);
5095 create_font_selection (GtkWidget *widget)
5097 static GtkWidget *window = NULL;
5105 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5106 gtk_window_set_screen (GTK_WINDOW (window),
5107 gtk_widget_get_screen (widget));
5109 g_signal_connect (window, "destroy",
5110 G_CALLBACK (gtk_widget_destroyed),
5113 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5114 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5116 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5117 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5118 gtk_container_add (GTK_CONTAINER (window), hbox);
5120 label = gtk_label_new ("Pick a font");
5121 gtk_container_add (GTK_CONTAINER (hbox), label);
5123 picker = gtk_font_button_new ();
5124 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5125 gtk_container_add (GTK_CONTAINER (hbox), picker);
5128 if (!gtk_widget_get_visible (window))
5129 gtk_widget_show_all (window);
5131 gtk_widget_destroy (window);
5138 static GtkWidget *dialog_window = NULL;
5141 label_toggle (GtkWidget *widget,
5146 *label = gtk_label_new ("Dialog Test");
5147 g_signal_connect (*label,
5149 G_CALLBACK (gtk_widget_destroyed),
5151 g_object_set (*label, "margin", 10, NULL);
5152 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5153 *label, TRUE, TRUE, 0);
5154 gtk_widget_show (*label);
5157 gtk_widget_destroy (*label);
5161 create_dialog (GtkWidget *widget)
5163 static GtkWidget *label;
5164 GtkWidget *action_area;
5169 /* This is a terrible example; it's much simpler to create
5170 * dialogs than this. Don't use testgtk for example code,
5174 dialog_window = gtk_dialog_new ();
5175 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5176 gtk_widget_get_screen (widget));
5178 g_signal_connect (dialog_window, "destroy",
5179 G_CALLBACK (gtk_widget_destroyed),
5182 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5184 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5185 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5187 button = gtk_button_new_with_label ("OK");
5188 gtk_widget_set_can_default (button, TRUE);
5189 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5190 gtk_widget_grab_default (button);
5191 gtk_widget_show (button);
5193 button = gtk_button_new_with_label ("Toggle");
5194 g_signal_connect (button, "clicked",
5195 G_CALLBACK (label_toggle),
5197 gtk_widget_set_can_default (button, TRUE);
5198 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5199 gtk_widget_show (button);
5204 if (!gtk_widget_get_visible (dialog_window))
5205 gtk_widget_show (dialog_window);
5207 gtk_widget_destroy (dialog_window);
5210 /* Display & Screen test
5217 GtkWidget *radio_dpy;
5218 GtkWidget *toplevel;
5219 GtkWidget *dialog_window;
5220 } ScreenDisplaySelection;
5223 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5225 const gchar *display_name;
5226 GdkDisplay *display = gtk_widget_get_display (widget);
5228 GdkScreen *new_screen = NULL;
5229 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5231 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5233 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5234 display = gdk_display_open (display_name);
5238 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5239 GTK_DIALOG_DESTROY_WITH_PARENT,
5242 "The display :\n%s\ncannot be opened",
5244 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5245 gtk_widget_show (dialog);
5246 g_signal_connect (dialog, "response",
5247 G_CALLBACK (gtk_widget_destroy),
5252 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5255 gboolean found = FALSE;
5256 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5259 gtk_tree_model_get (model, &iter, 0, &name, -1);
5260 found = !g_ascii_strcasecmp (display_name, name);
5267 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5268 new_screen = gdk_display_get_default_screen (display);
5273 gint number_of_screens = gdk_display_get_n_screens (display);
5274 gint screen_num = gdk_screen_get_number (current_screen);
5275 if ((screen_num +1) < number_of_screens)
5276 new_screen = gdk_display_get_screen (display, screen_num + 1);
5278 new_screen = gdk_display_get_screen (display, 0);
5283 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5284 gtk_widget_destroy (data->dialog_window);
5289 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5291 gtk_widget_destroy (data);
5295 create_display_screen (GtkWidget *widget)
5297 GtkWidget *grid, *frame, *window, *combo_dpy, *vbox;
5298 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5300 ScreenDisplaySelection *scr_dpy_data;
5301 GdkScreen *screen = gtk_widget_get_screen (widget);
5302 GdkDisplay *display = gdk_screen_get_display (screen);
5304 window = g_object_new (gtk_window_get_type (),
5306 "type", GTK_WINDOW_TOPLEVEL,
5307 "title", "Screen or Display selection",
5310 g_signal_connect (window, "destroy",
5311 G_CALLBACK (gtk_widget_destroy), NULL);
5313 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5314 gtk_container_add (GTK_CONTAINER (window), vbox);
5316 frame = gtk_frame_new ("Select screen or display");
5317 gtk_container_add (GTK_CONTAINER (vbox), frame);
5319 grid = gtk_grid_new ();
5320 gtk_grid_set_row_spacing (GTK_GRID (grid), 3);
5321 gtk_grid_set_column_spacing (GTK_GRID (grid), 3);
5323 gtk_container_add (GTK_CONTAINER (frame), grid);
5325 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5326 if (gdk_display_get_n_screens(display) > 1)
5327 radio_scr = gtk_radio_button_new_with_label
5328 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5331 radio_scr = gtk_radio_button_new_with_label
5332 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5333 "only one screen on the current display");
5334 gtk_widget_set_sensitive (radio_scr, FALSE);
5336 combo_dpy = gtk_combo_box_text_new_with_entry ();
5337 gtk_widget_set_hexpand (combo_dpy, TRUE);
5338 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5339 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5340 "<hostname>:<X Server Num>.<Screen Num>");
5342 gtk_grid_attach (GTK_GRID (grid), radio_dpy, 0, 0, 1, 1);
5343 gtk_grid_attach (GTK_GRID (grid), radio_scr, 0, 1, 1, 1);
5344 gtk_grid_attach (GTK_GRID (grid), combo_dpy, 1, 0, 1, 1);
5346 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5347 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5348 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5350 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5352 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5353 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5355 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5357 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5358 scr_dpy_data->radio_dpy = radio_dpy;
5359 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5360 scr_dpy_data->dialog_window = window;
5362 g_signal_connect (cancelb, "clicked",
5363 G_CALLBACK (screen_display_destroy_diag), window);
5364 g_signal_connect (applyb, "clicked",
5365 G_CALLBACK (screen_display_check), scr_dpy_data);
5366 gtk_widget_show_all (window);
5371 static gulong event_watcher_enter_id = 0;
5372 static gulong event_watcher_leave_id = 0;
5375 event_watcher (GSignalInvocationHint *ihint,
5376 guint n_param_values,
5377 const GValue *param_values,
5380 g_print ("Watch: \"%s\" emitted for %s\n",
5381 g_signal_name (ihint->signal_id),
5382 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5388 event_watcher_down (void)
5390 if (event_watcher_enter_id)
5394 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5395 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5396 event_watcher_enter_id = 0;
5397 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5398 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5399 event_watcher_leave_id = 0;
5404 event_watcher_toggle (void)
5406 if (event_watcher_enter_id)
5407 event_watcher_down ();
5412 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5413 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5414 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5415 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5420 create_event_watcher (GtkWidget *widget)
5422 GtkWidget *action_area, *content_area;
5427 dialog_window = gtk_dialog_new ();
5428 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5429 gtk_widget_get_screen (widget));
5431 g_signal_connect (dialog_window, "destroy",
5432 G_CALLBACK (gtk_widget_destroyed),
5434 g_signal_connect (dialog_window, "destroy",
5435 G_CALLBACK (event_watcher_down),
5438 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5439 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5441 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5442 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5443 gtk_widget_set_size_request (dialog_window, 200, 110);
5445 button = gtk_toggle_button_new_with_label ("Activate Watch");
5446 g_signal_connect (button, "clicked",
5447 G_CALLBACK (event_watcher_toggle),
5449 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5450 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5451 gtk_widget_show (button);
5453 button = gtk_button_new_with_label ("Close");
5454 g_signal_connect_swapped (button, "clicked",
5455 G_CALLBACK (gtk_widget_destroy),
5457 gtk_widget_set_can_default (button, TRUE);
5458 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5459 gtk_widget_grab_default (button);
5460 gtk_widget_show (button);
5463 if (!gtk_widget_get_visible (dialog_window))
5464 gtk_widget_show (dialog_window);
5466 gtk_widget_destroy (dialog_window);
5474 reformat_value (GtkScale *scale,
5477 return g_strdup_printf ("-->%0.*g<--",
5478 gtk_scale_get_digits (scale), value);
5482 create_range_controls (GtkWidget *widget)
5484 static GtkWidget *window = NULL;
5488 GtkWidget *scrollbar;
5490 GtkWidget *separator;
5491 GtkAdjustment *adjustment;
5496 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5498 gtk_window_set_screen (GTK_WINDOW (window),
5499 gtk_widget_get_screen (widget));
5501 g_signal_connect (window, "destroy",
5502 G_CALLBACK (gtk_widget_destroyed),
5505 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5506 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5509 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5510 gtk_container_add (GTK_CONTAINER (window), box1);
5511 gtk_widget_show (box1);
5514 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5515 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5516 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5517 gtk_widget_show (box2);
5520 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5522 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5523 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5524 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5525 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5526 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5527 gtk_widget_show (scale);
5529 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5530 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5531 gtk_widget_show (scrollbar);
5533 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5534 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5535 g_signal_connect (scale,
5537 G_CALLBACK (reformat_value),
5539 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5540 gtk_widget_show (scale);
5542 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5544 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5545 gtk_widget_set_size_request (scale, -1, 200);
5546 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5547 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5548 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5549 gtk_widget_show (scale);
5551 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5552 gtk_widget_set_size_request (scale, -1, 200);
5553 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5554 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5555 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5556 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5557 gtk_widget_show (scale);
5559 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5560 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5561 g_signal_connect (scale,
5563 G_CALLBACK (reformat_value),
5565 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5566 gtk_widget_show (scale);
5569 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5570 gtk_widget_show (hbox);
5572 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5573 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5574 gtk_widget_show (separator);
5577 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5578 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5579 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5580 gtk_widget_show (box2);
5583 button = gtk_button_new_with_label ("close");
5584 g_signal_connect_swapped (button, "clicked",
5585 G_CALLBACK (gtk_widget_destroy),
5587 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5588 gtk_widget_set_can_default (button, TRUE);
5589 gtk_widget_grab_default (button);
5590 gtk_widget_show (button);
5593 if (!gtk_widget_get_visible (window))
5594 gtk_widget_show (window);
5596 gtk_widget_destroy (window);
5603 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5604 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5605 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5606 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5607 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5608 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5609 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5610 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5613 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5619 static const char * book_open_xpm[] = {
5642 static const char * book_closed_xpm[] = {
5667 GdkPixbuf *book_open;
5668 GdkPixbuf *book_closed;
5669 GtkWidget *sample_notebook;
5672 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
5674 GtkWidget *page_widget;
5677 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
5679 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
5680 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5682 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
5683 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5687 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
5689 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
5690 gint old_page_num = gtk_notebook_get_current_page (notebook);
5692 if (page_num == old_page_num)
5695 set_page_image (notebook, page_num, book_open);
5697 if (old_page_num != -1)
5698 set_page_image (notebook, old_page_num, book_closed);
5702 tab_fill (GtkToggleButton *button, GtkWidget *child)
5704 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5705 "tab-fill", gtk_toggle_button_get_active (button),
5710 tab_expand (GtkToggleButton *button, GtkWidget *child)
5712 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5713 "tab-expand", gtk_toggle_button_get_active (button),
5718 create_pages (GtkNotebook *notebook, gint start, gint end)
5720 GtkWidget *child = NULL;
5725 GtkWidget *label_box;
5726 GtkWidget *menu_box;
5730 char accel_buffer[32];
5732 for (i = start; i <= end; i++)
5734 sprintf (buffer, "Page %d", i);
5735 sprintf (accel_buffer, "Page _%d", i);
5737 child = gtk_frame_new (buffer);
5738 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
5740 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5741 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
5742 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
5743 gtk_container_add (GTK_CONTAINER (child), vbox);
5745 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5746 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
5747 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5749 button = gtk_check_button_new_with_label ("Fill Tab");
5750 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5751 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5752 g_signal_connect (button, "toggled",
5753 G_CALLBACK (tab_fill), child);
5755 button = gtk_check_button_new_with_label ("Expand Tab");
5756 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5757 g_signal_connect (button, "toggled",
5758 G_CALLBACK (tab_expand), child);
5760 button = gtk_button_new_with_label ("Hide Page");
5761 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
5762 g_signal_connect_swapped (button, "clicked",
5763 G_CALLBACK (gtk_widget_hide),
5766 gtk_widget_show_all (child);
5768 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5769 pixwid = gtk_image_new_from_pixbuf (book_closed);
5770 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
5772 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
5773 gtk_widget_set_margin_left (pixwid, 3);
5774 gtk_widget_set_margin_right (pixwid, 3);
5775 gtk_widget_set_margin_bottom (pixwid, 1);
5776 gtk_widget_set_margin_top (pixwid, 1);
5777 label = gtk_label_new_with_mnemonic (accel_buffer);
5778 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
5779 gtk_widget_show_all (label_box);
5782 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5783 pixwid = gtk_image_new_from_pixbuf (book_closed);
5784 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
5786 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
5787 gtk_widget_set_margin_left (pixwid, 3);
5788 gtk_widget_set_margin_right (pixwid, 3);
5789 gtk_widget_set_margin_bottom (pixwid, 1);
5790 gtk_widget_set_margin_top (pixwid, 1);
5791 label = gtk_label_new (buffer);
5792 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
5793 gtk_widget_show_all (menu_box);
5795 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
5800 rotate_notebook (GtkButton *button,
5801 GtkNotebook *notebook)
5803 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
5807 show_all_pages (GtkButton *button,
5808 GtkNotebook *notebook)
5810 gtk_container_foreach (GTK_CONTAINER (notebook),
5811 (GtkCallback) gtk_widget_show, NULL);
5815 notebook_type_changed (GtkWidget *optionmenu,
5818 GtkNotebook *notebook;
5828 notebook = GTK_NOTEBOOK (data);
5830 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
5835 /* standard notebook */
5836 gtk_notebook_set_show_tabs (notebook, TRUE);
5837 gtk_notebook_set_show_border (notebook, TRUE);
5838 gtk_notebook_set_scrollable (notebook, FALSE);
5842 /* notabs notebook */
5843 gtk_notebook_set_show_tabs (notebook, FALSE);
5844 gtk_notebook_set_show_border (notebook, TRUE);
5849 gtk_notebook_set_show_tabs (notebook, FALSE);
5850 gtk_notebook_set_show_border (notebook, FALSE);
5855 gtk_notebook_set_show_tabs (notebook, TRUE);
5856 gtk_notebook_set_show_border (notebook, TRUE);
5857 gtk_notebook_set_scrollable (notebook, TRUE);
5858 if (gtk_notebook_get_n_pages (notebook) == 5)
5859 create_pages (notebook, 6, 15);
5865 if (gtk_notebook_get_n_pages (notebook) == 15)
5866 for (i = 0; i < 10; i++)
5867 gtk_notebook_remove_page (notebook, 5);
5871 notebook_popup (GtkToggleButton *button,
5872 GtkNotebook *notebook)
5874 if (gtk_toggle_button_get_active (button))
5875 gtk_notebook_popup_enable (notebook);
5877 gtk_notebook_popup_disable (notebook);
5881 create_notebook (GtkWidget *widget)
5883 static GtkWidget *window = NULL;
5887 GtkWidget *separator;
5891 static gchar *items[] =
5901 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5902 gtk_window_set_screen (GTK_WINDOW (window),
5903 gtk_widget_get_screen (widget));
5905 g_signal_connect (window, "destroy",
5906 G_CALLBACK (gtk_widget_destroyed),
5909 gtk_window_set_title (GTK_WINDOW (window), "notebook");
5910 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5912 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5913 gtk_container_add (GTK_CONTAINER (window), box1);
5915 sample_notebook = gtk_notebook_new ();
5916 g_signal_connect (sample_notebook, "switch_page",
5917 G_CALLBACK (page_switch), NULL);
5918 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
5919 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
5920 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
5922 gtk_widget_realize (sample_notebook);
5925 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
5928 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
5930 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
5932 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5933 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
5935 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
5936 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5937 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5939 button = gtk_check_button_new_with_label ("popup menu");
5940 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
5941 g_signal_connect (button, "clicked",
5942 G_CALLBACK (notebook_popup),
5945 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
5946 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5947 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5949 label = gtk_label_new ("Notebook Style :");
5950 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
5952 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
5953 notebook_type_changed,
5955 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
5957 button = gtk_button_new_with_label ("Show all Pages");
5958 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
5959 g_signal_connect (button, "clicked",
5960 G_CALLBACK (show_all_pages), sample_notebook);
5962 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
5963 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
5964 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5965 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5967 button = gtk_button_new_with_label ("prev");
5968 g_signal_connect_swapped (button, "clicked",
5969 G_CALLBACK (gtk_notebook_prev_page),
5971 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5973 button = gtk_button_new_with_label ("next");
5974 g_signal_connect_swapped (button, "clicked",
5975 G_CALLBACK (gtk_notebook_next_page),
5977 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5979 button = gtk_button_new_with_label ("rotate");
5980 g_signal_connect (button, "clicked",
5981 G_CALLBACK (rotate_notebook), sample_notebook);
5982 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5984 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5985 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
5987 button = gtk_button_new_with_label ("close");
5988 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
5989 g_signal_connect_swapped (button, "clicked",
5990 G_CALLBACK (gtk_widget_destroy),
5992 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
5993 gtk_widget_set_can_default (button, TRUE);
5994 gtk_widget_grab_default (button);
5997 if (!gtk_widget_get_visible (window))
5998 gtk_widget_show_all (window);
6000 gtk_widget_destroy (window);
6008 toggle_resize (GtkWidget *widget, GtkWidget *child)
6010 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6011 GValue value = G_VALUE_INIT;
6012 g_value_init (&value, G_TYPE_BOOLEAN);
6013 gtk_container_child_get_property (container, child, "resize", &value);
6014 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6015 gtk_container_child_set_property (container, child, "resize", &value);
6019 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6021 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6022 GValue value = G_VALUE_INIT;
6023 g_value_init (&value, G_TYPE_BOOLEAN);
6024 gtk_container_child_get_property (container, child, "shrink", &value);
6025 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6026 gtk_container_child_set_property (container, child, "shrink", &value);
6030 paned_props_clicked (GtkWidget *button,
6033 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6035 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6039 create_pane_options (GtkPaned *paned,
6040 const gchar *frame_label,
6041 const gchar *label1,
6042 const gchar *label2)
6044 GtkWidget *child1, *child2;
6049 GtkWidget *check_button;
6051 child1 = gtk_paned_get_child1 (paned);
6052 child2 = gtk_paned_get_child2 (paned);
6054 frame = gtk_frame_new (frame_label);
6055 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6057 grid = gtk_grid_new ();
6058 gtk_container_add (GTK_CONTAINER (frame), grid);
6060 label = gtk_label_new (label1);
6061 gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
6063 check_button = gtk_check_button_new_with_label ("Resize");
6064 gtk_grid_attach (GTK_GRID (grid), check_button, 0, 1, 1, 1);
6065 g_signal_connect (check_button, "toggled",
6066 G_CALLBACK (toggle_resize),
6069 check_button = gtk_check_button_new_with_label ("Shrink");
6070 gtk_grid_attach (GTK_GRID (grid), check_button, 0, 2, 1, 1);
6071 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6073 g_signal_connect (check_button, "toggled",
6074 G_CALLBACK (toggle_shrink),
6077 label = gtk_label_new (label2);
6078 gtk_grid_attach (GTK_GRID (grid), label, 1, 0, 1, 1);
6080 check_button = gtk_check_button_new_with_label ("Resize");
6081 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 1, 1, 1);
6082 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6084 g_signal_connect (check_button, "toggled",
6085 G_CALLBACK (toggle_resize),
6088 check_button = gtk_check_button_new_with_label ("Shrink");
6089 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 2, 1, 1);
6090 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6092 g_signal_connect (check_button, "toggled",
6093 G_CALLBACK (toggle_shrink),
6096 button = gtk_button_new_with_mnemonic ("_Properties");
6097 gtk_grid_attach (GTK_GRID (grid), button, 0, 3, 2, 1);
6098 g_signal_connect (button, "clicked",
6099 G_CALLBACK (paned_props_clicked),
6106 create_panes (GtkWidget *widget)
6108 static GtkWidget *window = NULL;
6117 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6119 gtk_window_set_screen (GTK_WINDOW (window),
6120 gtk_widget_get_screen (widget));
6122 g_signal_connect (window, "destroy",
6123 G_CALLBACK (gtk_widget_destroyed),
6126 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6127 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6129 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6130 gtk_container_add (GTK_CONTAINER (window), vbox);
6132 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6133 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6134 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6136 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6137 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6139 frame = gtk_frame_new (NULL);
6140 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6141 gtk_widget_set_size_request (frame, 60, 60);
6142 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6144 button = gtk_button_new_with_label ("Hi there");
6145 gtk_container_add (GTK_CONTAINER(frame), button);
6147 frame = gtk_frame_new (NULL);
6148 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6149 gtk_widget_set_size_request (frame, 80, 60);
6150 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6152 frame = gtk_frame_new (NULL);
6153 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6154 gtk_widget_set_size_request (frame, 60, 80);
6155 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6157 /* Now create toggle buttons to control sizing */
6159 gtk_box_pack_start (GTK_BOX (vbox),
6160 create_pane_options (GTK_PANED (hpaned),
6166 gtk_box_pack_start (GTK_BOX (vbox),
6167 create_pane_options (GTK_PANED (vpaned),
6173 gtk_widget_show_all (vbox);
6176 if (!gtk_widget_get_visible (window))
6177 gtk_widget_show (window);
6179 gtk_widget_destroy (window);
6183 * Paned keyboard navigation
6187 paned_keyboard_window1 (GtkWidget *widget)
6210 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6211 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6212 gtk_window_set_screen (GTK_WINDOW (window1),
6213 gtk_widget_get_screen (widget));
6215 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6216 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6218 frame1 = gtk_frame_new (NULL);
6219 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6220 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6222 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6223 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6225 button7 = gtk_button_new_with_label ("button7");
6226 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6228 button8 = gtk_button_new_with_label ("button8");
6229 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6231 button9 = gtk_button_new_with_label ("button9");
6232 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6234 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6235 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6237 frame2 = gtk_frame_new (NULL);
6238 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6239 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6241 frame5 = gtk_frame_new (NULL);
6242 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6244 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6245 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6247 button5 = gtk_button_new_with_label ("button5");
6248 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6250 button6 = gtk_button_new_with_label ("button6");
6251 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6253 frame3 = gtk_frame_new (NULL);
6254 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6255 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6257 frame4 = gtk_frame_new ("Buttons");
6258 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6259 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6261 grid1 = gtk_grid_new ();
6262 gtk_container_add (GTK_CONTAINER (frame4), grid1);
6263 gtk_container_set_border_width (GTK_CONTAINER (grid1), 11);
6265 button1 = gtk_button_new_with_label ("button1");
6266 gtk_grid_attach (GTK_GRID (grid1), button1, 0, 0, 1, 1);
6268 button2 = gtk_button_new_with_label ("button2");
6269 gtk_grid_attach (GTK_GRID (grid1), button2, 1, 0, 1, 1);
6271 button3 = gtk_button_new_with_label ("button3");
6272 gtk_grid_attach (GTK_GRID (grid1), button3, 0, 1, 1, 1);
6274 button4 = gtk_button_new_with_label ("button4");
6275 gtk_grid_attach (GTK_GRID (grid1), button4, 1, 1, 1, 1);
6281 paned_keyboard_window2 (GtkWidget *widget)
6286 GtkWidget *button13;
6290 GtkWidget *button12;
6292 GtkWidget *button11;
6293 GtkWidget *button10;
6295 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6296 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6298 gtk_window_set_screen (GTK_WINDOW (window2),
6299 gtk_widget_get_screen (widget));
6301 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6302 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6304 frame6 = gtk_frame_new (NULL);
6305 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6306 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6308 button13 = gtk_button_new_with_label ("button13");
6309 gtk_container_add (GTK_CONTAINER (frame6), button13);
6311 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6312 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6314 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6315 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6317 frame7 = gtk_frame_new (NULL);
6318 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6319 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6321 button12 = gtk_button_new_with_label ("button12");
6322 gtk_container_add (GTK_CONTAINER (frame7), button12);
6324 frame8 = gtk_frame_new (NULL);
6325 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6326 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6328 button11 = gtk_button_new_with_label ("button11");
6329 gtk_container_add (GTK_CONTAINER (frame8), button11);
6331 button10 = gtk_button_new_with_label ("button10");
6332 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6338 paned_keyboard_window3 (GtkWidget *widget)
6345 GtkWidget *button14;
6348 GtkWidget *button15;
6351 GtkWidget *button16;
6353 GtkWidget *button17;
6355 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6356 g_object_set_data (G_OBJECT (window3), "window3", window3);
6357 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6359 gtk_window_set_screen (GTK_WINDOW (window3),
6360 gtk_widget_get_screen (widget));
6363 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6364 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6366 label1 = gtk_label_new ("Three panes nested inside each other");
6367 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6369 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6370 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6372 frame9 = gtk_frame_new (NULL);
6373 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6374 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6376 button14 = gtk_button_new_with_label ("button14");
6377 gtk_container_add (GTK_CONTAINER (frame9), button14);
6379 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6380 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6382 frame10 = gtk_frame_new (NULL);
6383 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6384 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6386 button15 = gtk_button_new_with_label ("button15");
6387 gtk_container_add (GTK_CONTAINER (frame10), button15);
6389 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6390 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6392 frame11 = gtk_frame_new (NULL);
6393 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6394 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6396 button16 = gtk_button_new_with_label ("button16");
6397 gtk_container_add (GTK_CONTAINER (frame11), button16);
6399 frame12 = gtk_frame_new (NULL);
6400 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6401 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6403 button17 = gtk_button_new_with_label ("button17");
6404 gtk_container_add (GTK_CONTAINER (frame12), button17);
6410 paned_keyboard_window4 (GtkWidget *widget)
6417 GtkWidget *button19;
6418 GtkWidget *button18;
6421 GtkWidget *button21;
6422 GtkWidget *button20;
6424 GtkWidget *button23;
6425 GtkWidget *button22;
6427 GtkWidget *button25;
6428 GtkWidget *button24;
6430 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6431 g_object_set_data (G_OBJECT (window4), "window4", window4);
6432 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6434 gtk_window_set_screen (GTK_WINDOW (window4),
6435 gtk_widget_get_screen (widget));
6437 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6438 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6440 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6441 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6442 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6444 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6445 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6447 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6448 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6450 button19 = gtk_button_new_with_label ("button19");
6451 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6453 button18 = gtk_button_new_with_label ("button18");
6454 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6456 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6457 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6459 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6460 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6462 button21 = gtk_button_new_with_label ("button21");
6463 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6465 button20 = gtk_button_new_with_label ("button20");
6466 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6468 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6469 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6471 button23 = gtk_button_new_with_label ("button23");
6472 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6474 button22 = gtk_button_new_with_label ("button22");
6475 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6477 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6478 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6480 button25 = gtk_button_new_with_label ("button25");
6481 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6483 button24 = gtk_button_new_with_label ("button24");
6484 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6490 create_paned_keyboard_navigation (GtkWidget *widget)
6492 static GtkWidget *window1 = NULL;
6493 static GtkWidget *window2 = NULL;
6494 static GtkWidget *window3 = NULL;
6495 static GtkWidget *window4 = NULL;
6498 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6500 gtk_widget_destroy (window1);
6501 gtk_widget_destroy (window2);
6502 gtk_widget_destroy (window3);
6503 gtk_widget_destroy (window4);
6508 window1 = paned_keyboard_window1 (widget);
6509 g_signal_connect (window1, "destroy",
6510 G_CALLBACK (gtk_widget_destroyed),
6516 window2 = paned_keyboard_window2 (widget);
6517 g_signal_connect (window2, "destroy",
6518 G_CALLBACK (gtk_widget_destroyed),
6524 window3 = paned_keyboard_window3 (widget);
6525 g_signal_connect (window3, "destroy",
6526 G_CALLBACK (gtk_widget_destroyed),
6532 window4 = paned_keyboard_window4 (widget);
6533 g_signal_connect (window4, "destroy",
6534 G_CALLBACK (gtk_widget_destroyed),
6538 if (gtk_widget_get_visible (window1))
6539 gtk_widget_destroy (GTK_WIDGET (window1));
6541 gtk_widget_show_all (GTK_WIDGET (window1));
6543 if (gtk_widget_get_visible (window2))
6544 gtk_widget_destroy (GTK_WIDGET (window2));
6546 gtk_widget_show_all (GTK_WIDGET (window2));
6548 if (gtk_widget_get_visible (window3))
6549 gtk_widget_destroy (GTK_WIDGET (window3));
6551 gtk_widget_show_all (GTK_WIDGET (window3));
6553 if (gtk_widget_get_visible (window4))
6554 gtk_widget_destroy (GTK_WIDGET (window4));
6556 gtk_widget_show_all (GTK_WIDGET (window4));
6564 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6567 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6571 /* ignore double and triple click */
6572 if (event->type != GDK_BUTTON_PRESS)
6575 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6576 p->x = (int) event->x;
6577 p->y = (int) event->y;
6579 gtk_grab_add (widget);
6580 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6581 gtk_widget_get_window (widget),
6584 GDK_BUTTON_RELEASE_MASK |
6585 GDK_BUTTON_MOTION_MASK |
6586 GDK_POINTER_MOTION_HINT_MASK,
6592 shape_released (GtkWidget *widget,
6593 GdkEventButton *event)
6595 gtk_grab_remove (widget);
6596 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6600 shape_motion (GtkWidget *widget,
6601 GdkEventMotion *event)
6606 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6609 * Can't use event->x / event->y here
6610 * because I need absolute coordinates.
6612 gdk_window_get_device_position (gdk_screen_get_root_window (gtk_widget_get_screen (widget)),
6613 gdk_event_get_device ((GdkEvent *) event),
6615 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6619 shape_create_icon (GdkScreen *screen,
6630 CursorOffset* icon_pos;
6631 cairo_surface_t *mask;
6632 cairo_region_t *mask_region;
6637 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
6639 window = gtk_window_new (window_type);
6640 gtk_window_set_screen (GTK_WINDOW (window), screen);
6642 fixed = gtk_fixed_new ();
6643 gtk_widget_set_size_request (fixed, 100, 100);
6644 gtk_container_add (GTK_CONTAINER (window), fixed);
6645 gtk_widget_show (fixed);
6647 gtk_widget_set_events (window,
6648 gtk_widget_get_events (window) |
6649 GDK_BUTTON_MOTION_MASK |
6650 GDK_POINTER_MOTION_HINT_MASK |
6651 GDK_BUTTON_PRESS_MASK);
6653 gtk_widget_realize (window);
6655 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
6656 g_assert (pixbuf); /* FIXME: error handling */
6658 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
6659 gdk_pixbuf_get_width (pixbuf),
6660 gdk_pixbuf_get_height (pixbuf));
6661 cr = cairo_create (mask);
6662 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
6666 mask_region = gdk_cairo_region_create_from_surface (mask);
6668 cairo_region_translate (mask_region, px, py);
6670 image = gtk_image_new_from_pixbuf (pixbuf);
6671 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
6672 gtk_widget_show (image);
6674 gtk_widget_shape_combine_region (window, mask_region);
6676 cairo_region_destroy (mask_region);
6677 cairo_surface_destroy (mask);
6678 g_object_unref (pixbuf);
6680 g_signal_connect (window, "button_press_event",
6681 G_CALLBACK (shape_pressed), NULL);
6682 g_signal_connect (window, "button_release_event",
6683 G_CALLBACK (shape_released), NULL);
6684 g_signal_connect (window, "motion_notify_event",
6685 G_CALLBACK (shape_motion), NULL);
6687 icon_pos = g_new (CursorOffset, 1);
6688 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
6690 gtk_window_move (GTK_WINDOW (window), x, y);
6691 gtk_widget_show (window);
6697 create_shapes (GtkWidget *widget)
6699 /* Variables used by the Drag/Drop and Shape Window demos */
6700 static GtkWidget *modeller = NULL;
6701 static GtkWidget *sheets = NULL;
6702 static GtkWidget *rings = NULL;
6703 static GtkWidget *with_region = NULL;
6704 GdkScreen *screen = gtk_widget_get_screen (widget);
6706 if (!(file_exists ("Modeller.xpm") &&
6707 file_exists ("FilesQueue.xpm") &&
6708 file_exists ("3DRings.xpm")))
6714 modeller = shape_create_icon (screen, "Modeller.xpm",
6715 440, 140, 0,0, GTK_WINDOW_POPUP);
6717 g_signal_connect (modeller, "destroy",
6718 G_CALLBACK (gtk_widget_destroyed),
6722 gtk_widget_destroy (modeller);
6726 sheets = shape_create_icon (screen, "FilesQueue.xpm",
6727 580, 170, 0,0, GTK_WINDOW_POPUP);
6729 g_signal_connect (sheets, "destroy",
6730 G_CALLBACK (gtk_widget_destroyed),
6735 gtk_widget_destroy (sheets);
6739 rings = shape_create_icon (screen, "3DRings.xpm",
6740 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
6742 g_signal_connect (rings, "destroy",
6743 G_CALLBACK (gtk_widget_destroyed),
6747 gtk_widget_destroy (rings);
6751 cairo_region_t *region;
6754 with_region = shape_create_icon (screen, "3DRings.xpm",
6755 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
6757 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
6759 g_signal_connect (with_region, "destroy",
6760 G_CALLBACK (gtk_widget_destroyed),
6763 /* reset shape from mask to a region */
6766 region = cairo_region_create ();
6778 cairo_region_union_rectangle (region, &rect);
6786 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
6791 gtk_widget_destroy (with_region);
6799 create_wmhints (GtkWidget *widget)
6801 static GtkWidget *window = NULL;
6803 GtkWidget *separator;
6807 GdkWindow *gdk_window;
6813 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6815 gtk_window_set_screen (GTK_WINDOW (window),
6816 gtk_widget_get_screen (widget));
6818 g_signal_connect (window, "destroy",
6819 G_CALLBACK (gtk_widget_destroyed),
6822 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
6823 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6825 gtk_widget_realize (window);
6827 gdk_window = gtk_widget_get_window (window);
6829 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
6830 list = g_list_prepend (NULL, pixbuf);
6832 gdk_window_set_icon_list (gdk_window, list);
6835 g_object_unref (pixbuf);
6837 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
6839 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
6840 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
6842 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6843 gtk_container_add (GTK_CONTAINER (window), box1);
6844 gtk_widget_show (box1);
6846 label = gtk_label_new ("Try iconizing me!");
6847 gtk_widget_set_size_request (label, 150, 50);
6848 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
6849 gtk_widget_show (label);
6852 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6853 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6854 gtk_widget_show (separator);
6857 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
6858 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6859 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6860 gtk_widget_show (box2);
6863 button = gtk_button_new_with_label ("close");
6865 g_signal_connect_swapped (button, "clicked",
6866 G_CALLBACK (gtk_widget_destroy),
6869 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6870 gtk_widget_set_can_default (button, TRUE);
6871 gtk_widget_grab_default (button);
6872 gtk_widget_show (button);
6875 if (!gtk_widget_get_visible (window))
6876 gtk_widget_show (window);
6878 gtk_widget_destroy (window);
6883 * Window state tracking
6887 window_state_callback (GtkWidget *widget,
6888 GdkEventWindowState *event,
6891 GtkWidget *label = data;
6894 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
6895 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
6896 "withdrawn" : "not withdrawn", ", ",
6897 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
6898 "iconified" : "not iconified", ", ",
6899 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
6900 "sticky" : "not sticky", ", ",
6901 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
6902 "maximized" : "not maximized", ", ",
6903 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
6904 "fullscreen" : "not fullscreen",
6905 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
6906 "above" : "not above", ", ",
6907 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
6908 "below" : "not below", ", ",
6911 gtk_label_set_text (GTK_LABEL (label), msg);
6919 tracking_label (GtkWidget *window)
6925 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6927 g_signal_connect_object (hbox,
6929 G_CALLBACK (gtk_widget_destroy),
6933 label = gtk_label_new ("<no window state events received>");
6934 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
6935 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
6937 g_signal_connect (window,
6938 "window_state_event",
6939 G_CALLBACK (window_state_callback),
6942 button = gtk_button_new_with_label ("Deiconify");
6943 g_signal_connect_object (button,
6945 G_CALLBACK (gtk_window_deiconify),
6948 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6950 button = gtk_button_new_with_label ("Iconify");
6951 g_signal_connect_object (button,
6953 G_CALLBACK (gtk_window_iconify),
6956 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6958 button = gtk_button_new_with_label ("Fullscreen");
6959 g_signal_connect_object (button,
6961 G_CALLBACK (gtk_window_fullscreen),
6964 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6966 button = gtk_button_new_with_label ("Unfullscreen");
6967 g_signal_connect_object (button,
6969 G_CALLBACK (gtk_window_unfullscreen),
6972 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6974 button = gtk_button_new_with_label ("Present");
6975 g_signal_connect_object (button,
6977 G_CALLBACK (gtk_window_present),
6980 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6982 button = gtk_button_new_with_label ("Show");
6983 g_signal_connect_object (button,
6985 G_CALLBACK (gtk_widget_show),
6988 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6990 gtk_widget_show_all (hbox);
6996 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
6998 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7000 gtk_window_set_keep_above (GTK_WINDOW (data),
7001 gtk_toggle_button_get_active (togglebutton));
7003 if (gtk_toggle_button_get_active (togglebutton))
7004 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7008 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7010 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7012 gtk_window_set_keep_below (GTK_WINDOW (data),
7013 gtk_toggle_button_get_active (togglebutton));
7015 if (gtk_toggle_button_get_active (togglebutton))
7016 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7021 get_state_controls (GtkWidget *window)
7025 GtkWidget *button_above;
7026 GtkWidget *button_below;
7028 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7030 button = gtk_button_new_with_label ("Stick");
7031 g_signal_connect_object (button,
7033 G_CALLBACK (gtk_window_stick),
7036 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7038 button = gtk_button_new_with_label ("Unstick");
7039 g_signal_connect_object (button,
7041 G_CALLBACK (gtk_window_unstick),
7044 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7046 button = gtk_button_new_with_label ("Maximize");
7047 g_signal_connect_object (button,
7049 G_CALLBACK (gtk_window_maximize),
7052 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7054 button = gtk_button_new_with_label ("Unmaximize");
7055 g_signal_connect_object (button,
7057 G_CALLBACK (gtk_window_unmaximize),
7060 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7062 button = gtk_button_new_with_label ("Iconify");
7063 g_signal_connect_object (button,
7065 G_CALLBACK (gtk_window_iconify),
7068 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7070 button = gtk_button_new_with_label ("Fullscreen");
7071 g_signal_connect_object (button,
7073 G_CALLBACK (gtk_window_fullscreen),
7076 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7078 button = gtk_button_new_with_label ("Unfullscreen");
7079 g_signal_connect_object (button,
7081 G_CALLBACK (gtk_window_unfullscreen),
7084 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7086 button_above = gtk_toggle_button_new_with_label ("Keep above");
7087 g_signal_connect (button_above,
7089 G_CALLBACK (keep_window_above),
7091 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7093 button_below = gtk_toggle_button_new_with_label ("Keep below");
7094 g_signal_connect (button_below,
7096 G_CALLBACK (keep_window_below),
7098 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7100 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7101 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7103 button = gtk_button_new_with_label ("Hide (withdraw)");
7104 g_signal_connect_object (button,
7106 G_CALLBACK (gtk_widget_hide),
7109 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7111 gtk_widget_show_all (vbox);
7117 create_window_states (GtkWidget *widget)
7119 static GtkWidget *window = NULL;
7122 GtkWidget *iconified;
7124 GtkWidget *controls;
7128 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7129 gtk_window_set_screen (GTK_WINDOW (window),
7130 gtk_widget_get_screen (widget));
7132 g_signal_connect (window, "destroy",
7133 G_CALLBACK (gtk_widget_destroyed),
7136 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7138 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7139 gtk_container_add (GTK_CONTAINER (window), box1);
7141 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7143 gtk_window_set_screen (GTK_WINDOW (iconified),
7144 gtk_widget_get_screen (widget));
7146 g_signal_connect_object (iconified, "destroy",
7147 G_CALLBACK (gtk_widget_destroy),
7150 gtk_window_iconify (GTK_WINDOW (iconified));
7151 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7152 controls = get_state_controls (iconified);
7153 gtk_container_add (GTK_CONTAINER (iconified), controls);
7155 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7157 gtk_window_set_screen (GTK_WINDOW (normal),
7158 gtk_widget_get_screen (widget));
7160 g_signal_connect_object (normal, "destroy",
7161 G_CALLBACK (gtk_widget_destroy),
7165 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7166 controls = get_state_controls (normal);
7167 gtk_container_add (GTK_CONTAINER (normal), controls);
7169 label = tracking_label (iconified);
7170 gtk_container_add (GTK_CONTAINER (box1), label);
7172 label = tracking_label (normal);
7173 gtk_container_add (GTK_CONTAINER (box1), label);
7175 gtk_widget_show_all (iconified);
7176 gtk_widget_show_all (normal);
7177 gtk_widget_show_all (box1);
7180 if (!gtk_widget_get_visible (window))
7181 gtk_widget_show (window);
7183 gtk_widget_destroy (window);
7191 configure_event_callback (GtkWidget *widget,
7192 GdkEventConfigure *event,
7195 GtkWidget *label = data;
7199 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7201 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7203 event->x, event->y, event->width, event->height,
7206 gtk_label_set_text (GTK_LABEL (label), msg);
7214 get_ints (GtkWidget *window,
7221 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7222 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7224 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7225 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7229 set_size_callback (GtkWidget *widget,
7234 get_ints (data, &w, &h);
7236 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7240 unset_default_size_callback (GtkWidget *widget,
7243 gtk_window_set_default_size (g_object_get_data (data, "target"),
7248 set_default_size_callback (GtkWidget *widget,
7253 get_ints (data, &w, &h);
7255 gtk_window_set_default_size (g_object_get_data (data, "target"),
7260 unset_size_request_callback (GtkWidget *widget,
7263 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7268 set_size_request_callback (GtkWidget *widget,
7273 get_ints (data, &w, &h);
7275 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7280 set_location_callback (GtkWidget *widget,
7285 get_ints (data, &x, &y);
7287 gtk_window_move (g_object_get_data (data, "target"), x, y);
7291 move_to_position_callback (GtkWidget *widget,
7297 window = g_object_get_data (data, "target");
7299 gtk_window_get_position (window, &x, &y);
7301 gtk_window_move (window, x, y);
7305 set_geometry_callback (GtkWidget *entry,
7311 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7313 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7315 if (!gtk_window_parse_geometry (target, text))
7316 g_print ("Bad geometry string '%s'\n", text);
7322 resizable_callback (GtkWidget *widget,
7325 g_object_set (g_object_get_data (data, "target"),
7326 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7331 gravity_selected (GtkWidget *widget,
7334 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7335 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7339 pos_selected (GtkWidget *widget,
7342 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7343 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7347 move_gravity_window_to_current_position (GtkWidget *widget,
7353 window = GTK_WINDOW (data);
7355 gtk_window_get_position (window, &x, &y);
7357 gtk_window_move (window, x, y);
7361 get_screen_corner (GtkWindow *window,
7366 GdkScreen * screen = gtk_window_get_screen (window);
7368 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7370 switch (gtk_window_get_gravity (window))
7372 case GDK_GRAVITY_SOUTH_EAST:
7373 *x = gdk_screen_get_width (screen) - w;
7374 *y = gdk_screen_get_height (screen) - h;
7377 case GDK_GRAVITY_NORTH_EAST:
7378 *x = gdk_screen_get_width (screen) - w;
7382 case GDK_GRAVITY_SOUTH_WEST:
7384 *y = gdk_screen_get_height (screen) - h;
7387 case GDK_GRAVITY_NORTH_WEST:
7392 case GDK_GRAVITY_SOUTH:
7393 *x = (gdk_screen_get_width (screen) - w) / 2;
7394 *y = gdk_screen_get_height (screen) - h;
7397 case GDK_GRAVITY_NORTH:
7398 *x = (gdk_screen_get_width (screen) - w) / 2;
7402 case GDK_GRAVITY_WEST:
7404 *y = (gdk_screen_get_height (screen) - h) / 2;
7407 case GDK_GRAVITY_EAST:
7408 *x = gdk_screen_get_width (screen) - w;
7409 *y = (gdk_screen_get_height (screen) - h) / 2;
7412 case GDK_GRAVITY_CENTER:
7413 *x = (gdk_screen_get_width (screen) - w) / 2;
7414 *y = (gdk_screen_get_height (screen) - h) / 2;
7417 case GDK_GRAVITY_STATIC:
7418 /* pick some random numbers */
7424 g_assert_not_reached ();
7430 move_gravity_window_to_starting_position (GtkWidget *widget,
7436 window = GTK_WINDOW (data);
7438 get_screen_corner (window,
7441 gtk_window_move (window, x, y);
7445 make_gravity_window (GtkWidget *destroy_with,
7454 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7456 gtk_window_set_screen (GTK_WINDOW (window),
7457 gtk_widget_get_screen (destroy_with));
7459 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7460 gtk_widget_show (vbox);
7462 gtk_container_add (GTK_CONTAINER (window), vbox);
7463 gtk_window_set_title (GTK_WINDOW (window), title);
7464 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7466 g_signal_connect_object (destroy_with,
7468 G_CALLBACK (gtk_widget_destroy),
7473 button = gtk_button_new_with_mnemonic ("_Move to current position");
7475 g_signal_connect (button, "clicked",
7476 G_CALLBACK (move_gravity_window_to_current_position),
7479 gtk_container_add (GTK_CONTAINER (vbox), button);
7480 gtk_widget_show (button);
7482 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7484 g_signal_connect (button, "clicked",
7485 G_CALLBACK (move_gravity_window_to_starting_position),
7488 gtk_container_add (GTK_CONTAINER (vbox), button);
7489 gtk_widget_show (button);
7491 /* Pretend this is the result of --geometry.
7492 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7493 * and in that case you probably should just use gtk_window_parse_geometry().
7494 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7495 * you are parsing --geometry or equivalent.
7497 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7501 gtk_window_set_default_size (GTK_WINDOW (window),
7504 get_screen_corner (GTK_WINDOW (window), &x, &y);
7506 gtk_window_move (GTK_WINDOW (window),
7513 do_gravity_test (GtkWidget *widget,
7516 GtkWidget *destroy_with = data;
7519 /* We put a window at each gravity point on the screen. */
7520 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7522 gtk_widget_show (window);
7524 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7526 gtk_widget_show (window);
7528 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7530 gtk_widget_show (window);
7532 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7534 gtk_widget_show (window);
7536 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7538 gtk_widget_show (window);
7540 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7542 gtk_widget_show (window);
7545 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7547 gtk_widget_show (window);
7550 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7552 gtk_widget_show (window);
7554 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7556 gtk_widget_show (window);
7558 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7560 gtk_widget_show (window);
7564 window_controls (GtkWidget *window)
7566 GtkWidget *control_window;
7571 GtkAdjustment *adjustment;
7576 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7578 gtk_window_set_screen (GTK_WINDOW (control_window),
7579 gtk_widget_get_screen (window));
7581 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7583 g_object_set_data (G_OBJECT (control_window),
7587 g_signal_connect_object (control_window,
7589 G_CALLBACK (gtk_widget_destroy),
7593 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7595 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7597 label = gtk_label_new ("<no configure events>");
7598 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7600 g_signal_connect (window,
7602 G_CALLBACK (configure_event_callback),
7605 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7606 spin = gtk_spin_button_new (adjustment, 0, 0);
7608 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7610 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7612 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7613 spin = gtk_spin_button_new (adjustment, 0, 0);
7615 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7617 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7619 entry = gtk_entry_new ();
7620 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7622 g_signal_connect (entry, "changed",
7623 G_CALLBACK (set_geometry_callback),
7626 button = gtk_button_new_with_label ("Show gravity test windows");
7627 g_signal_connect_swapped (button,
7629 G_CALLBACK (do_gravity_test),
7631 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7633 button = gtk_button_new_with_label ("Reshow with initial size");
7634 g_signal_connect_object (button,
7636 G_CALLBACK (gtk_window_reshow_with_initial_size),
7639 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7641 button = gtk_button_new_with_label ("Queue resize");
7642 g_signal_connect_object (button,
7644 G_CALLBACK (gtk_widget_queue_resize),
7647 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7649 button = gtk_button_new_with_label ("Resize");
7650 g_signal_connect (button,
7652 G_CALLBACK (set_size_callback),
7654 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7656 button = gtk_button_new_with_label ("Set default size");
7657 g_signal_connect (button,
7659 G_CALLBACK (set_default_size_callback),
7661 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7663 button = gtk_button_new_with_label ("Unset default size");
7664 g_signal_connect (button,
7666 G_CALLBACK (unset_default_size_callback),
7668 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7670 button = gtk_button_new_with_label ("Set size request");
7671 g_signal_connect (button,
7673 G_CALLBACK (set_size_request_callback),
7675 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7677 button = gtk_button_new_with_label ("Unset size request");
7678 g_signal_connect (button,
7680 G_CALLBACK (unset_size_request_callback),
7682 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7684 button = gtk_button_new_with_label ("Move");
7685 g_signal_connect (button,
7687 G_CALLBACK (set_location_callback),
7689 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7691 button = gtk_button_new_with_label ("Move to current position");
7692 g_signal_connect (button,
7694 G_CALLBACK (move_to_position_callback),
7696 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7698 button = gtk_check_button_new_with_label ("Allow resize");
7699 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
7700 g_signal_connect (button,
7702 G_CALLBACK (resizable_callback),
7704 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7706 button = gtk_button_new_with_mnemonic ("_Show");
7707 g_signal_connect_object (button,
7709 G_CALLBACK (gtk_widget_show),
7712 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7714 button = gtk_button_new_with_mnemonic ("_Hide");
7715 g_signal_connect_object (button,
7717 G_CALLBACK (gtk_widget_hide),
7720 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7722 om = gtk_combo_box_text_new ();
7726 static gchar *names[] = {
7727 "GDK_GRAVITY_NORTH_WEST",
7728 "GDK_GRAVITY_NORTH",
7729 "GDK_GRAVITY_NORTH_EAST",
7731 "GDK_GRAVITY_CENTER",
7733 "GDK_GRAVITY_SOUTH_WEST",
7734 "GDK_GRAVITY_SOUTH",
7735 "GDK_GRAVITY_SOUTH_EAST",
7736 "GDK_GRAVITY_STATIC",
7740 g_assert (names[i]);
7741 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
7746 g_signal_connect (om,
7748 G_CALLBACK (gravity_selected),
7751 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
7754 om = gtk_combo_box_text_new ();
7758 static gchar *names[] = {
7760 "GTK_WIN_POS_CENTER",
7761 "GTK_WIN_POS_MOUSE",
7762 "GTK_WIN_POS_CENTER_ALWAYS",
7763 "GTK_WIN_POS_CENTER_ON_PARENT",
7767 g_assert (names[i]);
7768 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
7773 g_signal_connect (om,
7775 G_CALLBACK (pos_selected),
7778 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
7780 gtk_widget_show_all (vbox);
7782 return control_window;
7786 create_window_sizing (GtkWidget *widget)
7788 static GtkWidget *window = NULL;
7789 static GtkWidget *target_window = NULL;
7795 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7796 gtk_window_set_screen (GTK_WINDOW (target_window),
7797 gtk_widget_get_screen (widget));
7798 label = gtk_label_new (NULL);
7799 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");
7800 gtk_container_add (GTK_CONTAINER (target_window), label);
7801 gtk_widget_show (label);
7803 g_signal_connect (target_window, "destroy",
7804 G_CALLBACK (gtk_widget_destroyed),
7807 window = window_controls (target_window);
7809 g_signal_connect (window, "destroy",
7810 G_CALLBACK (gtk_widget_destroyed),
7813 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
7816 /* don't show target window by default, we want to allow testing
7817 * of behavior on first show.
7820 if (!gtk_widget_get_visible (window))
7821 gtk_widget_show (window);
7823 gtk_widget_destroy (window);
7830 typedef struct _ProgressData {
7833 GtkWidget *block_spin;
7834 GtkWidget *x_align_spin;
7835 GtkWidget *y_align_spin;
7836 GtkWidget *step_spin;
7837 GtkWidget *act_blocks_spin;
7848 progress_timeout (gpointer data)
7850 ProgressData *pdata = data;
7854 if (pdata->activity)
7856 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
7858 text = g_strdup_printf ("%s", "???");
7862 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
7865 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
7867 text = g_strdup_printf ("%.0f%%", 100 * new_val);
7870 gtk_label_set_text (GTK_LABEL (pdata->label), text);
7877 destroy_progress (GtkWidget *widget,
7878 ProgressData **pdata)
7880 if ((*pdata)->timer)
7882 g_source_remove ((*pdata)->timer);
7883 (*pdata)->timer = 0;
7885 (*pdata)->window = NULL;
7891 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
7893 ProgressData *pdata;
7896 pdata = (ProgressData *) data;
7898 if (!gtk_widget_get_mapped (widget))
7901 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
7903 if (i == 0 || i == 1)
7904 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
7906 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
7908 if (i == 1 || i == 2)
7909 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
7911 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
7915 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
7919 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7920 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
7924 progressbar_toggle_ellipsize (GtkWidget *widget,
7927 ProgressData *pdata = data;
7928 if (gtk_widget_is_drawable (widget))
7930 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
7931 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
7936 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
7938 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7942 toggle_running (GtkWidget *widget, ProgressData *pdata)
7944 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
7946 if (pdata->timer == 0)
7947 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
7951 if (pdata->timer != 0)
7953 g_source_remove (pdata->timer);
7960 entry_changed (GtkWidget *widget, ProgressData *pdata)
7962 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
7963 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
7967 create_progress_bar (GtkWidget *widget)
7969 GtkWidget *action_area, *content_area;
7979 static ProgressData *pdata = NULL;
7981 static gchar *items1[] =
7989 static char *ellipsize_items[] = {
7990 "None", // PANGO_ELLIPSIZE_NONE,
7991 "Start", // PANGO_ELLIPSIZE_START,
7992 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
7993 "End", // PANGO_ELLIPSIZE_END
7997 pdata = g_new0 (ProgressData, 1);
8001 pdata->window = gtk_dialog_new ();
8003 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8004 gtk_widget_get_screen (widget));
8006 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8008 g_signal_connect (pdata->window, "destroy",
8009 G_CALLBACK (destroy_progress),
8013 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8014 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8016 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8017 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8019 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8020 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8021 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8023 frame = gtk_frame_new ("Progress");
8024 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8026 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8027 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8029 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8030 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8032 pdata->pbar = gtk_progress_bar_new ();
8033 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8034 PANGO_ELLIPSIZE_MIDDLE);
8036 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8038 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8039 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8041 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8042 gtk_container_add (GTK_CONTAINER (align), hbox);
8043 label = gtk_label_new ("Label updated by user :");
8044 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8045 pdata->label = gtk_label_new ("");
8046 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8048 frame = gtk_frame_new ("Options");
8049 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8051 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8052 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8054 grid = gtk_grid_new ();
8055 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
8056 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
8057 gtk_box_pack_start (GTK_BOX (vbox2), grid, FALSE, TRUE, 0);
8059 label = gtk_label_new ("Orientation :");
8060 gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
8061 gtk_widget_set_halign (label, GTK_ALIGN_START);
8062 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8064 pdata->omenu1 = build_option_menu (items1, 4, 0,
8065 progressbar_toggle_orientation,
8067 gtk_grid_attach (GTK_GRID (grid), pdata->omenu1, 1, 0, 1, 1);
8069 check = gtk_check_button_new_with_label ("Running");
8070 g_signal_connect (check, "toggled",
8071 G_CALLBACK (toggle_running),
8073 gtk_grid_attach (GTK_GRID (grid), check, 0, 1, 2, 1);
8074 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8076 check = gtk_check_button_new_with_label ("Show text");
8077 g_signal_connect (check, "clicked",
8078 G_CALLBACK (toggle_show_text),
8080 gtk_grid_attach (GTK_GRID (grid), check, 0, 2, 1, 1);
8082 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8083 gtk_grid_attach (GTK_GRID (grid), hbox, 1, 2, 1, 1);
8085 label = gtk_label_new ("Text: ");
8086 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8088 pdata->entry = gtk_entry_new ();
8089 gtk_widget_set_hexpand (pdata->entry, TRUE);
8090 g_signal_connect (pdata->entry, "changed",
8091 G_CALLBACK (entry_changed),
8093 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8094 gtk_widget_set_size_request (pdata->entry, 100, -1);
8096 label = gtk_label_new ("Ellipsize text :");
8097 gtk_grid_attach (GTK_GRID (grid), label, 0, 10, 1, 1);
8099 gtk_widget_set_halign (label, GTK_ALIGN_START);
8100 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8101 pdata->elmenu = build_option_menu (ellipsize_items,
8102 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8103 2, // PANGO_ELLIPSIZE_MIDDLE
8104 progressbar_toggle_ellipsize,
8106 gtk_grid_attach (GTK_GRID (grid), pdata->elmenu, 1, 10, 1, 1);
8108 check = gtk_check_button_new_with_label ("Activity mode");
8109 g_signal_connect (check, "clicked",
8110 G_CALLBACK (toggle_activity_mode), pdata);
8111 gtk_grid_attach (GTK_GRID (grid), check, 0, 15, 1, 1);
8113 button = gtk_button_new_with_label ("close");
8114 g_signal_connect_swapped (button, "clicked",
8115 G_CALLBACK (gtk_widget_destroy),
8117 gtk_widget_set_can_default (button, TRUE);
8118 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8119 gtk_widget_grab_default (button);
8122 if (!gtk_widget_get_visible (pdata->window))
8123 gtk_widget_show_all (pdata->window);
8125 gtk_widget_destroy (pdata->window);
8137 GtkWidget *res_widget;
8141 find_widget (GtkWidget *widget, FindWidgetData *data)
8143 GtkAllocation new_allocation;
8147 gtk_widget_get_allocation (widget, &new_allocation);
8149 if (data->found || !gtk_widget_get_mapped (widget))
8152 /* Note that in the following code, we only count the
8153 * position as being inside a WINDOW widget if it is inside
8154 * widget->window; points that are outside of widget->window
8155 * but within the allocation are not counted. This is consistent
8156 * with the way we highlight drag targets.
8158 if (gtk_widget_get_has_window (widget))
8160 new_allocation.x = 0;
8161 new_allocation.y = 0;
8164 if (gtk_widget_get_parent (widget) && !data->first)
8166 GdkWindow *window = gtk_widget_get_window (widget);
8167 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8169 gint tx, ty, twidth, theight;
8171 twidth = gdk_window_get_width (window);
8172 theight = gdk_window_get_height (window);
8174 if (new_allocation.x < 0)
8176 new_allocation.width += new_allocation.x;
8177 new_allocation.x = 0;
8179 if (new_allocation.y < 0)
8181 new_allocation.height += new_allocation.y;
8182 new_allocation.y = 0;
8184 if (new_allocation.x + new_allocation.width > twidth)
8185 new_allocation.width = twidth - new_allocation.x;
8186 if (new_allocation.y + new_allocation.height > theight)
8187 new_allocation.height = theight - new_allocation.y;
8189 gdk_window_get_position (window, &tx, &ty);
8190 new_allocation.x += tx;
8192 new_allocation.y += ty;
8195 window = gdk_window_get_parent (window);
8199 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8200 (data->x < new_allocation.x + new_allocation.width) &&
8201 (data->y < new_allocation.y + new_allocation.height))
8203 /* First, check if the drag is in a valid drop site in
8204 * one of our children
8206 if (GTK_IS_CONTAINER (widget))
8208 FindWidgetData new_data = *data;
8210 new_data.x -= x_offset;
8211 new_data.y -= y_offset;
8212 new_data.found = FALSE;
8213 new_data.first = FALSE;
8215 gtk_container_forall (GTK_CONTAINER (widget),
8216 (GtkCallback)find_widget,
8219 data->found = new_data.found;
8221 data->res_widget = new_data.res_widget;
8224 /* If not, and this widget is registered as a drop site, check to
8225 * emit "drag_motion" to check if we are actually in
8231 data->res_widget = widget;
8237 find_widget_at_pointer (GdkDevice *device)
8239 GtkWidget *widget = NULL;
8240 GdkWindow *pointer_window;
8242 FindWidgetData data;
8244 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8248 gpointer widget_ptr;
8250 gdk_window_get_user_data (pointer_window, &widget_ptr);
8251 widget = widget_ptr;
8256 gdk_window_get_device_position (gtk_widget_get_window (widget),
8265 find_widget (widget, &data);
8267 return data.res_widget;
8273 struct PropertiesData {
8281 destroy_properties (GtkWidget *widget,
8282 struct PropertiesData *data)
8286 *data->window = NULL;
8287 data->window = NULL;
8292 g_object_unref (data->cursor);
8293 data->cursor = NULL;
8298 g_signal_handler_disconnect (widget, data->handler);
8306 property_query_event (GtkWidget *widget,
8308 struct PropertiesData *data)
8310 GtkWidget *res_widget = NULL;
8312 if (!data->in_query)
8315 if (event->type == GDK_BUTTON_RELEASE)
8317 gtk_grab_remove (widget);
8318 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8320 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8323 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8324 gtk_widget_get_screen (widget));
8325 create_prop_editor (G_OBJECT (res_widget), 0);
8328 data->in_query = FALSE;
8335 query_properties (GtkButton *button,
8336 struct PropertiesData *data)
8338 GtkWidget *widget = GTK_WIDGET (button);
8339 GdkDisplay *display;
8340 GdkDeviceManager *device_manager;
8343 g_signal_connect (button, "event",
8344 G_CALLBACK (property_query_event), data);
8346 display = gtk_widget_get_display (widget);
8349 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8351 device_manager = gdk_display_get_device_manager (display);
8352 device = gdk_device_manager_get_client_pointer (device_manager);
8353 gdk_device_grab (device,
8354 gtk_widget_get_window (widget),
8357 GDK_BUTTON_RELEASE_MASK,
8360 gtk_grab_add (widget);
8362 data->in_query = TRUE;
8366 create_properties (GtkWidget *widget)
8368 static GtkWidget *window = NULL;
8372 struct PropertiesData *data;
8374 data = g_new (struct PropertiesData, 1);
8375 data->window = &window;
8376 data->in_query = FALSE;
8377 data->cursor = NULL;
8382 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8384 gtk_window_set_screen (GTK_WINDOW (window),
8385 gtk_widget_get_screen (widget));
8387 data->handler = g_signal_connect (window, "destroy",
8388 G_CALLBACK (destroy_properties),
8391 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8392 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8394 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8395 gtk_container_add (GTK_CONTAINER (window), vbox);
8397 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8398 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8400 button = gtk_button_new_with_label ("Query properties");
8401 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8402 g_signal_connect (button, "clicked",
8403 G_CALLBACK (query_properties),
8407 if (!gtk_widget_get_visible (window))
8408 gtk_widget_show_all (window);
8410 gtk_widget_destroy (window);
8414 struct SnapshotData {
8415 GtkWidget *toplevel_button;
8419 gboolean is_toplevel;
8424 destroy_snapshot_data (GtkWidget *widget,
8425 struct SnapshotData *data)
8428 *data->window = NULL;
8432 g_object_unref (data->cursor);
8433 data->cursor = NULL;
8438 g_signal_handler_disconnect (widget, data->handler);
8446 snapshot_widget_event (GtkWidget *widget,
8448 struct SnapshotData *data)
8450 GtkWidget *res_widget = NULL;
8452 if (!data->in_query)
8455 if (event->type == GDK_BUTTON_RELEASE)
8457 gtk_grab_remove (widget);
8458 gdk_device_ungrab (gdk_event_get_device (event),
8461 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8462 if (data->is_toplevel && res_widget)
8463 res_widget = gtk_widget_get_toplevel (res_widget);
8466 cairo_surface_t *surface;
8467 GtkWidget *window, *image;
8472 width = gtk_widget_get_allocated_width (res_widget);
8473 height = gtk_widget_get_allocated_height (res_widget);
8475 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8477 cr = cairo_create (surface);
8478 gtk_widget_draw (res_widget, cr);
8481 pixbuf = gdk_pixbuf_get_from_surface (surface,
8484 cairo_surface_destroy (surface);
8486 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8487 image = gtk_image_new_from_pixbuf (pixbuf);
8488 g_object_unref (pixbuf);
8490 gtk_container_add (GTK_CONTAINER (window), image);
8491 gtk_widget_show_all (window);
8494 data->in_query = FALSE;
8501 snapshot_widget (GtkButton *button,
8502 struct SnapshotData *data)
8504 GtkWidget *widget = GTK_WIDGET (button);
8507 device = gtk_get_current_event_device ();
8511 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8512 device = gdk_device_get_associated_device (device);
8514 data->is_toplevel = widget == data->toplevel_button;
8517 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8520 gdk_device_grab (device,
8521 gtk_widget_get_window (widget),
8522 GDK_OWNERSHIP_APPLICATION,
8524 GDK_BUTTON_RELEASE_MASK,
8528 g_signal_connect (button, "event",
8529 G_CALLBACK (snapshot_widget_event), data);
8531 gtk_grab_add (widget);
8533 data->in_query = TRUE;
8537 create_snapshot (GtkWidget *widget)
8539 static GtkWidget *window = NULL;
8542 struct SnapshotData *data;
8544 data = g_new (struct SnapshotData, 1);
8545 data->window = &window;
8546 data->in_query = FALSE;
8547 data->cursor = NULL;
8552 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8554 gtk_window_set_screen (GTK_WINDOW (window),
8555 gtk_widget_get_screen (widget));
8557 data->handler = g_signal_connect (window, "destroy",
8558 G_CALLBACK (destroy_snapshot_data),
8561 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8562 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8564 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8565 gtk_container_add (GTK_CONTAINER (window), vbox);
8567 button = gtk_button_new_with_label ("Snapshot widget");
8568 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8569 g_signal_connect (button, "clicked",
8570 G_CALLBACK (snapshot_widget),
8573 button = gtk_button_new_with_label ("Snapshot toplevel");
8574 data->toplevel_button = button;
8575 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8576 g_signal_connect (button, "clicked",
8577 G_CALLBACK (snapshot_widget),
8581 if (!gtk_widget_get_visible (window))
8582 gtk_widget_show_all (window);
8584 gtk_widget_destroy (window);
8593 selection_test_received (GtkWidget *tree_view,
8594 GtkSelectionData *selection_data)
8596 GtkTreeModel *model;
8597 GtkListStore *store;
8601 if (gtk_selection_data_get_length (selection_data) < 0)
8603 g_print ("Selection retrieval failed\n");
8606 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8608 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8612 /* Clear out any current list items */
8614 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8615 store = GTK_LIST_STORE (model);
8616 gtk_list_store_clear (store);
8618 /* Add new items to list */
8620 gtk_selection_data_get_targets (selection_data,
8623 for (i = 0; i < l; i++)
8628 name = gdk_atom_name (atoms[i]);
8631 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
8635 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
8642 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
8644 static GdkAtom targets_atom = GDK_NONE;
8646 if (targets_atom == GDK_NONE)
8647 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
8649 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
8654 create_selection_test (GtkWidget *widget)
8656 static GtkWidget *window = NULL;
8657 GtkWidget *action_area, *content_area;
8660 GtkWidget *scrolled_win;
8661 GtkListStore* store;
8662 GtkWidget *tree_view;
8663 GtkTreeViewColumn *column;
8664 GtkCellRenderer *renderer;
8669 window = gtk_dialog_new ();
8671 gtk_window_set_screen (GTK_WINDOW (window),
8672 gtk_widget_get_screen (widget));
8674 g_signal_connect (window, "destroy",
8675 G_CALLBACK (gtk_widget_destroyed),
8678 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8679 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
8681 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
8682 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8684 /* Create the list */
8686 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8687 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8688 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
8690 label = gtk_label_new ("Gets available targets for current selection");
8691 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8693 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
8694 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
8695 GTK_POLICY_AUTOMATIC,
8696 GTK_POLICY_AUTOMATIC);
8697 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
8698 gtk_widget_set_size_request (scrolled_win, 100, 200);
8700 store = gtk_list_store_new (1, G_TYPE_STRING);
8701 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
8702 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
8704 renderer = gtk_cell_renderer_text_new ();
8705 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
8707 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
8709 g_signal_connect (tree_view, "selection_received",
8710 G_CALLBACK (selection_test_received), NULL);
8712 /* .. And create some buttons */
8713 button = gtk_button_new_with_label ("Get Targets");
8714 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8716 g_signal_connect (button, "clicked",
8717 G_CALLBACK (selection_test_get_targets), tree_view);
8719 button = gtk_button_new_with_label ("Quit");
8720 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8722 g_signal_connect_swapped (button, "clicked",
8723 G_CALLBACK (gtk_widget_destroy),
8727 if (!gtk_widget_get_visible (window))
8728 gtk_widget_show_all (window);
8730 gtk_widget_destroy (window);
8737 static int scroll_test_pos = 0.0;
8740 scroll_test_draw (GtkWidget *widget,
8742 GtkAdjustment *adjustment)
8745 gint imin, imax, jmin, jmax;
8748 gdk_cairo_get_clip_rectangle (cr, &clip);
8750 imin = (clip.x) / 10;
8751 imax = (clip.x + clip.width + 9) / 10;
8753 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
8754 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
8756 for (i=imin; i<imax; i++)
8757 for (j=jmin; j<jmax; j++)
8759 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
8767 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
8768 GtkAdjustment *adjustment)
8770 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
8771 -gtk_adjustment_get_page_increment (adjustment) / 2:
8772 gtk_adjustment_get_page_increment (adjustment) / 2);
8773 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
8774 gtk_adjustment_set_value (adjustment, new_value);
8780 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
8781 GtkAdjustment *adjustment)
8783 GtkAllocation allocation;
8785 gtk_widget_get_allocation (widget, &allocation);
8786 gtk_adjustment_configure (adjustment,
8787 gtk_adjustment_get_value (adjustment),
8788 gtk_adjustment_get_lower (adjustment),
8789 gtk_adjustment_get_upper (adjustment),
8790 0.1 * allocation.height,
8791 0.9 * allocation.height,
8796 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
8801 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
8802 scroll_test_pos = gtk_adjustment_get_value (adjustment);
8804 if (!gtk_widget_is_drawable (widget))
8807 window = gtk_widget_get_window (widget);
8808 gdk_window_scroll (window, 0, dy);
8809 gdk_window_process_updates (window, FALSE);
8814 create_scroll_test (GtkWidget *widget)
8816 static GtkWidget *window = NULL;
8817 GtkWidget *action_area, *content_area;
8819 GtkWidget *drawing_area;
8820 GtkWidget *scrollbar;
8822 GtkAdjustment *adjustment;
8823 GdkGeometry geometry;
8824 GdkWindowHints geometry_mask;
8828 window = gtk_dialog_new ();
8830 gtk_window_set_screen (GTK_WINDOW (window),
8831 gtk_widget_get_screen (widget));
8833 g_signal_connect (window, "destroy",
8834 G_CALLBACK (gtk_widget_destroyed),
8837 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8838 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
8840 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
8841 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8843 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8844 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
8845 gtk_widget_show (hbox);
8847 drawing_area = gtk_drawing_area_new ();
8848 gtk_widget_set_size_request (drawing_area, 200, 200);
8849 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
8850 gtk_widget_show (drawing_area);
8852 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
8854 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
8855 scroll_test_pos = 0.0;
8857 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
8858 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
8859 gtk_widget_show (scrollbar);
8861 g_signal_connect (drawing_area, "draw",
8862 G_CALLBACK (scroll_test_draw), adjustment);
8863 g_signal_connect (drawing_area, "configure_event",
8864 G_CALLBACK (scroll_test_configure), adjustment);
8865 g_signal_connect (drawing_area, "scroll_event",
8866 G_CALLBACK (scroll_test_scroll), adjustment);
8868 g_signal_connect (adjustment, "value_changed",
8869 G_CALLBACK (scroll_test_adjustment_changed),
8872 /* .. And create some buttons */
8874 button = gtk_button_new_with_label ("Quit");
8875 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8877 g_signal_connect_swapped (button, "clicked",
8878 G_CALLBACK (gtk_widget_destroy),
8880 gtk_widget_show (button);
8882 /* Set up gridded geometry */
8884 geometry_mask = GDK_HINT_MIN_SIZE |
8885 GDK_HINT_BASE_SIZE |
8886 GDK_HINT_RESIZE_INC;
8888 geometry.min_width = 20;
8889 geometry.min_height = 20;
8890 geometry.base_width = 0;
8891 geometry.base_height = 0;
8892 geometry.width_inc = 10;
8893 geometry.height_inc = 10;
8895 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8896 drawing_area, &geometry, geometry_mask);
8899 if (!gtk_widget_get_visible (window))
8900 gtk_widget_show (window);
8902 gtk_widget_destroy (window);
8909 static int timer = 0;
8912 timeout_test (GtkWidget *label)
8914 static int count = 0;
8915 static char buffer[32];
8917 sprintf (buffer, "count: %d", ++count);
8918 gtk_label_set_text (GTK_LABEL (label), buffer);
8924 start_timeout_test (GtkWidget *widget,
8929 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
8934 stop_timeout_test (GtkWidget *widget,
8939 g_source_remove (timer);
8945 destroy_timeout_test (GtkWidget *widget,
8948 stop_timeout_test (NULL, NULL);
8954 create_timeout_test (GtkWidget *widget)
8956 static GtkWidget *window = NULL;
8957 GtkWidget *action_area, *content_area;
8963 window = gtk_dialog_new ();
8965 gtk_window_set_screen (GTK_WINDOW (window),
8966 gtk_widget_get_screen (widget));
8968 g_signal_connect (window, "destroy",
8969 G_CALLBACK (destroy_timeout_test),
8972 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8973 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8975 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
8976 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8978 label = gtk_label_new ("count: 0");
8979 g_object_set (label, "margin", 10, NULL);
8980 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
8981 gtk_widget_show (label);
8983 button = gtk_button_new_with_label ("close");
8984 g_signal_connect_swapped (button, "clicked",
8985 G_CALLBACK (gtk_widget_destroy),
8987 gtk_widget_set_can_default (button, TRUE);
8988 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8989 gtk_widget_grab_default (button);
8990 gtk_widget_show (button);
8992 button = gtk_button_new_with_label ("start");
8993 g_signal_connect (button, "clicked",
8994 G_CALLBACK(start_timeout_test),
8996 gtk_widget_set_can_default (button, TRUE);
8997 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8998 gtk_widget_show (button);
9000 button = gtk_button_new_with_label ("stop");
9001 g_signal_connect (button, "clicked",
9002 G_CALLBACK (stop_timeout_test),
9004 gtk_widget_set_can_default (button, TRUE);
9005 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9006 gtk_widget_show (button);
9009 if (!gtk_widget_get_visible (window))
9010 gtk_widget_show (window);
9012 gtk_widget_destroy (window);
9019 static int idle_id = 0;
9022 idle_test (GtkWidget *label)
9024 static int count = 0;
9025 static char buffer[32];
9027 sprintf (buffer, "count: %d", ++count);
9028 gtk_label_set_text (GTK_LABEL (label), buffer);
9030 return G_SOURCE_CONTINUE;
9034 start_idle_test (GtkWidget *widget,
9039 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9044 stop_idle_test (GtkWidget *widget,
9049 g_source_remove (idle_id);
9055 destroy_idle_test (GtkWidget *widget,
9058 stop_idle_test (NULL, NULL);
9064 toggle_idle_container (GObject *button,
9065 GtkContainer *container)
9067 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9071 create_idle_test (GtkWidget *widget)
9073 static GtkWidget *window = NULL;
9076 GtkWidget *container;
9080 GtkWidget *action_area, *content_area;
9085 window = gtk_dialog_new ();
9087 gtk_window_set_screen (GTK_WINDOW (window),
9088 gtk_widget_get_screen (widget));
9090 g_signal_connect (window, "destroy",
9091 G_CALLBACK (destroy_idle_test),
9094 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9095 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9097 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9098 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9100 label = gtk_label_new ("count: 0");
9101 g_object_set (label, "margin", 10, NULL);
9102 gtk_widget_show (label);
9105 g_object_new (GTK_TYPE_BOX,
9107 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9108 * "GtkWidget::visible", TRUE,
9113 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9116 g_object_new (GTK_TYPE_FRAME,
9118 "label", "Label Container",
9120 "parent", content_area,
9123 g_object_new (GTK_TYPE_BOX,
9126 "orientation", GTK_ORIENTATION_VERTICAL,
9129 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9130 "label", "Resize-Parent",
9131 "user_data", (void*)GTK_RESIZE_PARENT,
9135 "signal::clicked", toggle_idle_container, container,
9137 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9138 "label", "Resize-Queue",
9139 "user_data", (void*)GTK_RESIZE_QUEUE,
9144 g_object_connect (button,
9145 "signal::clicked", toggle_idle_container, container,
9147 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9148 "label", "Resize-Immediate",
9149 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9151 g_object_connect (button2,
9152 "signal::clicked", toggle_idle_container, container,
9154 g_object_set (button2,
9160 button = gtk_button_new_with_label ("close");
9161 g_signal_connect_swapped (button, "clicked",
9162 G_CALLBACK (gtk_widget_destroy),
9164 gtk_widget_set_can_default (button, TRUE);
9165 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9166 gtk_widget_grab_default (button);
9167 gtk_widget_show (button);
9169 button = gtk_button_new_with_label ("start");
9170 g_signal_connect (button, "clicked",
9171 G_CALLBACK (start_idle_test),
9173 gtk_widget_set_can_default (button, TRUE);
9174 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9175 gtk_widget_show (button);
9177 button = gtk_button_new_with_label ("stop");
9178 g_signal_connect (button, "clicked",
9179 G_CALLBACK (stop_idle_test),
9181 gtk_widget_set_can_default (button, TRUE);
9182 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9183 gtk_widget_show (button);
9186 if (!gtk_widget_get_visible (window))
9187 gtk_widget_show (window);
9189 gtk_widget_destroy (window);
9197 create_rc_file (GtkWidget *widget)
9199 static GtkWidget *window = NULL;
9200 GtkWidget *action_area, *content_area;
9208 window = gtk_dialog_new ();
9210 gtk_window_set_screen (GTK_WINDOW (window),
9211 gtk_widget_get_screen (widget));
9213 g_signal_connect (window, "destroy",
9214 G_CALLBACK (gtk_widget_destroyed),
9217 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9218 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9220 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9221 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9223 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9224 gtk_container_add (GTK_CONTAINER (frame), vbox);
9226 label = gtk_label_new ("This label should be red");
9227 gtk_widget_set_name (label, "testgtk-red-label");
9228 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9230 label = gtk_label_new ("This label should be green");
9231 gtk_widget_set_name (label, "testgtk-green-label");
9232 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9234 label = gtk_label_new ("This label should be blue");
9235 gtk_widget_set_name (label, "testgtk-blue-label");
9236 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9238 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9239 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9241 button = gtk_button_new_with_label ("Reload");
9242 g_signal_connect_swapped (button, "clicked",
9243 G_CALLBACK (gtk_style_context_reset_widgets),
9244 gtk_widget_get_screen (button));
9245 gtk_widget_set_can_default (button, TRUE);
9246 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9247 gtk_widget_grab_default (button);
9249 button = gtk_button_new_with_label ("Close");
9250 g_signal_connect_swapped (button, "clicked",
9251 G_CALLBACK (gtk_widget_destroy),
9253 gtk_widget_set_can_default (button, TRUE);
9254 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9257 if (!gtk_widget_get_visible (window))
9258 gtk_widget_show_all (window);
9260 gtk_widget_destroy (window);
9264 * Test of recursive mainloop
9268 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9275 create_mainloop (GtkWidget *widget)
9277 static GtkWidget *window = NULL;
9278 GtkWidget *action_area, *content_area;
9284 window = gtk_dialog_new ();
9286 gtk_window_set_screen (GTK_WINDOW (window),
9287 gtk_widget_get_screen (widget));
9289 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9291 g_signal_connect (window, "destroy",
9292 G_CALLBACK (mainloop_destroyed),
9295 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9296 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9298 label = gtk_label_new ("In recursive main loop...");
9299 g_object_set (label, "margin", 20, NULL);
9301 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9302 gtk_widget_show (label);
9304 button = gtk_button_new_with_label ("Leave");
9305 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9307 g_signal_connect_swapped (button, "clicked",
9308 G_CALLBACK (gtk_widget_destroy),
9311 gtk_widget_set_can_default (button, TRUE);
9312 gtk_widget_grab_default (button);
9314 gtk_widget_show (button);
9317 if (!gtk_widget_get_visible (window))
9319 gtk_widget_show (window);
9321 g_print ("create_mainloop: start\n");
9323 g_print ("create_mainloop: done\n");
9326 gtk_widget_destroy (window);
9330 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9333 GdkWindow *bin_window;
9336 gint imin, imax, jmin, jmax;
9338 layout = GTK_LAYOUT (widget);
9339 bin_window = gtk_layout_get_bin_window (layout);
9341 if (!gtk_cairo_should_draw_window (cr, bin_window))
9344 gdk_window_get_position (bin_window, &x, &y);
9345 cairo_translate (cr, x, y);
9347 gdk_cairo_get_clip_rectangle (cr, &clip);
9349 imin = (clip.x) / 10;
9350 imax = (clip.x + clip.width + 9) / 10;
9352 jmin = (clip.y) / 10;
9353 jmax = (clip.y + clip.height + 9) / 10;
9355 for (i=imin; i<imax; i++)
9356 for (j=jmin; j<jmax; j++)
9358 cairo_rectangle (cr,
9367 void create_layout (GtkWidget *widget)
9369 GtkAdjustment *hadjustment, *vadjustment;
9371 static GtkWidget *window = NULL;
9372 GtkWidget *layout_widget;
9373 GtkWidget *scrolledwindow;
9382 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9383 gtk_window_set_screen (GTK_WINDOW (window),
9384 gtk_widget_get_screen (widget));
9386 g_signal_connect (window, "destroy",
9387 G_CALLBACK (gtk_widget_destroyed),
9390 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9391 gtk_widget_set_size_request (window, 200, 200);
9393 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9394 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9396 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9397 GTK_CORNER_TOP_RIGHT);
9399 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9401 layout_widget = gtk_layout_new (NULL, NULL);
9402 layout = GTK_LAYOUT (layout_widget);
9403 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9405 /* We set step sizes here since GtkLayout does not set
9408 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9409 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9410 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9411 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9412 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9413 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9415 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9416 g_signal_connect (layout, "draw",
9417 G_CALLBACK (layout_draw_handler), NULL);
9419 gtk_layout_set_size (layout, 1600, 128000);
9421 for (i=0 ; i < 16 ; i++)
9422 for (j=0 ; j < 16 ; j++)
9424 sprintf(buf, "Button %d, %d", i, j);
9426 button = gtk_button_new_with_label (buf);
9428 button = gtk_label_new (buf);
9430 gtk_layout_put (layout, button, j*100, i*100);
9433 for (i=16; i < 1280; i++)
9435 sprintf(buf, "Button %d, %d", i, 0);
9437 button = gtk_button_new_with_label (buf);
9439 button = gtk_label_new (buf);
9441 gtk_layout_put (layout, button, 0, i*100);
9445 if (!gtk_widget_get_visible (window))
9446 gtk_widget_show_all (window);
9448 gtk_widget_destroy (window);
9452 /* FIXME: need to completely redo this for GtkStyleContext */
9454 create_styles (GtkWidget *widget)
9456 static GtkWidget *window = NULL;
9457 GtkWidget *content_area, *action_area;
9462 static GdkRGBA red = { 1,0,0,1 };
9463 static GdkRGBA green = { 0,1,0,1 };
9464 static GdkRGBA blue = { 0,0,1,1 };
9465 static GdkRGBA yellow = { 1,1,0,1 };
9466 static GdkRGBA cyan = { 0,1,1,1 };
9467 PangoFontDescription *font_desc;
9469 GtkRcStyle *rc_style;
9473 window = gtk_dialog_new ();
9474 gtk_window_set_screen (GTK_WINDOW (window),
9475 gtk_widget_get_screen (widget));
9477 g_signal_connect (window, "destroy",
9478 G_CALLBACK (gtk_widget_destroyed),
9481 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9482 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9484 button = gtk_button_new_with_label ("Close");
9485 g_signal_connect_swapped (button, "clicked",
9486 G_CALLBACK (gtk_widget_destroy),
9488 gtk_widget_set_can_default (button, TRUE);
9489 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9490 gtk_widget_show (button);
9492 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9493 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9494 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9496 label = gtk_label_new ("Font:");
9497 gtk_widget_set_halign (label, GTK_ALIGN_START);
9498 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9499 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9501 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9503 button = gtk_button_new_with_label ("Some Text");
9504 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9505 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9507 label = gtk_label_new ("Foreground:");
9508 gtk_widget_set_halign (label, GTK_ALIGN_START);
9509 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9510 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9512 button = gtk_button_new_with_label ("Some Text");
9513 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9514 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9516 label = gtk_label_new ("Background:");
9517 gtk_widget_set_halign (label, GTK_ALIGN_START);
9518 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9519 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9521 button = gtk_button_new_with_label ("Some Text");
9522 gtk_widget_override_background_color (button, 0, &green);
9523 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9525 label = gtk_label_new ("Text:");
9526 gtk_widget_set_halign (label, GTK_ALIGN_START);
9527 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9528 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9530 entry = gtk_entry_new ();
9531 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9532 gtk_widget_override_color (entry, 0, &blue);
9533 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9535 label = gtk_label_new ("Base:");
9536 gtk_widget_set_halign (label, GTK_ALIGN_START);
9537 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9538 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9540 entry = gtk_entry_new ();
9541 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9542 gtk_widget_override_background_color (entry, 0, &yellow);
9543 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9545 label = gtk_label_new ("Cursor:");
9546 gtk_widget_set_halign (label, GTK_ALIGN_START);
9547 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9548 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9550 entry = gtk_entry_new ();
9551 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9552 gtk_widget_modify_cursor (entry, &red, &red);
9553 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9555 label = gtk_label_new ("Multiple:");
9556 gtk_widget_set_halign (label, GTK_ALIGN_START);
9557 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9558 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9560 button = gtk_button_new_with_label ("Some Text");
9562 rc_style = gtk_rc_style_new ();
9564 rc_style->font_desc = pango_font_description_copy (font_desc);
9565 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9566 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9567 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9568 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9569 rc_style->bg[GTK_STATE_NORMAL] = blue;
9570 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9571 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9572 rc_style->fg[GTK_STATE_ACTIVE] = red;
9573 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9574 rc_style->xthickness = 5;
9575 rc_style->ythickness = 5;
9577 gtk_widget_modify_style (button, rc_style);
9578 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9580 g_object_unref (rc_style);
9582 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9585 if (!gtk_widget_get_visible (window))
9586 gtk_widget_show_all (window);
9588 gtk_widget_destroy (window);
9593 * Main Window and Exit
9597 do_exit (GtkWidget *widget, GtkWidget *window)
9599 gtk_widget_destroy (window);
9605 void (*func) (GtkWidget *widget);
9606 gboolean do_not_benchmark;
9609 { "alpha window", create_alpha_window },
9610 { "big windows", create_big_windows },
9611 { "button box", create_button_box },
9612 { "buttons", create_buttons },
9613 { "check buttons", create_check_buttons },
9614 { "color selection", create_color_selection },
9615 { "composited window", create_composited_window },
9616 { "cursors", create_cursors },
9617 { "dialog", create_dialog },
9618 { "display & screen", create_display_screen, TRUE },
9619 { "entry", create_entry },
9620 { "event box", create_event_box },
9621 { "event watcher", create_event_watcher },
9622 { "expander", create_expander },
9623 { "flipping", create_flipping },
9624 { "focus", create_focus },
9625 { "font selection", create_font_selection },
9626 { "image", create_image },
9627 { "key lookup", create_key_lookup },
9628 { "labels", create_labels },
9629 { "layout", create_layout },
9630 { "menus", create_menus },
9631 { "message dialog", create_message_dialog },
9632 { "modal window", create_modal_window, TRUE },
9633 { "notebook", create_notebook },
9634 { "panes", create_panes },
9635 { "paned keyboard", create_paned_keyboard_navigation },
9636 { "pixbuf", create_pixbuf },
9637 { "progress bar", create_progress_bar },
9638 { "properties", create_properties },
9639 { "radio buttons", create_radio_buttons },
9640 { "range controls", create_range_controls },
9641 { "rc file", create_rc_file },
9642 { "reparent", create_reparent },
9643 { "resize grips", create_resize_grips },
9644 { "rotated label", create_rotated_label },
9645 { "rotated text", create_rotated_text },
9646 { "saved position", create_saved_position },
9647 { "scrolled windows", create_scrolled_windows },
9648 { "shapes", create_shapes },
9649 { "size groups", create_size_groups },
9650 { "snapshot", create_snapshot },
9651 { "spinbutton", create_spins },
9652 { "statusbar", create_statusbar },
9654 { "styles", create_styles },
9656 { "test idle", create_idle_test },
9657 { "test mainloop", create_mainloop, TRUE },
9658 { "test scrolling", create_scroll_test },
9659 { "test selection", create_selection_test },
9660 { "test timeout", create_timeout_test },
9661 { "toggle buttons", create_toggle_buttons },
9662 { "toolbar", create_toolbar },
9663 { "tooltips", create_tooltips },
9664 { "WM hints", create_wmhints },
9665 { "window sizing", create_window_sizing },
9666 { "window states", create_window_states }
9668 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
9671 create_main_window (void)
9676 GtkWidget *scrolled_window;
9680 GtkWidget *separator;
9681 GdkGeometry geometry;
9684 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9685 gtk_widget_set_name (window, "main_window");
9686 gtk_window_move (GTK_WINDOW (window), 50, 20);
9687 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
9689 geometry.min_width = -1;
9690 geometry.min_height = -1;
9691 geometry.max_width = -1;
9692 geometry.max_height = G_MAXSHORT;
9693 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
9695 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
9697 g_signal_connect (window, "destroy",
9698 G_CALLBACK (gtk_main_quit),
9700 g_signal_connect (window, "delete-event",
9701 G_CALLBACK (gtk_false),
9704 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9705 gtk_container_add (GTK_CONTAINER (window), box1);
9707 if (gtk_micro_version > 0)
9710 gtk_get_major_version (),
9711 gtk_get_minor_version (),
9712 gtk_get_micro_version ());
9716 gtk_get_major_version (),
9717 gtk_get_minor_version ());
9719 label = gtk_label_new (buffer);
9720 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
9721 gtk_widget_set_name (label, "testgtk-version-label");
9723 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
9724 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
9725 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
9727 GTK_POLICY_AUTOMATIC);
9728 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
9730 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9731 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9732 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
9733 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
9734 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
9735 gtk_widget_show (box2);
9737 for (i = 0; i < nbuttons; i++)
9739 button = gtk_button_new_with_label (buttons[i].label);
9740 if (buttons[i].func)
9741 g_signal_connect (button,
9743 G_CALLBACK(buttons[i].func),
9746 gtk_widget_set_sensitive (button, FALSE);
9747 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9750 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
9751 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9753 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
9754 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9755 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9757 button = gtk_button_new_with_mnemonic ("_Close");
9758 g_signal_connect (button, "clicked",
9759 G_CALLBACK (do_exit),
9761 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9762 gtk_widget_set_can_default (button, TRUE);
9763 gtk_widget_grab_default (button);
9765 gtk_widget_show_all (window);
9771 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
9772 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
9776 pad (const char *str, int to)
9778 static char buf[256];
9779 int len = strlen (str);
9782 for (i = 0; i < to; i++)
9787 memcpy (buf, str, len);
9793 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
9795 fn (widget); /* on */
9796 while (g_main_context_iteration (NULL, FALSE));
9797 fn (widget); /* off */
9798 while (g_main_context_iteration (NULL, FALSE));
9802 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
9808 static gboolean printed_headers = FALSE;
9810 if (!printed_headers) {
9811 g_print ("Test Iters First Other\n");
9812 g_print ("-------------------- ----- ---------- ----------\n");
9813 printed_headers = TRUE;
9816 g_get_current_time (&tv0);
9817 bench_iteration (widget, fn);
9818 g_get_current_time (&tv1);
9820 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
9821 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
9823 g_get_current_time (&tv0);
9824 for (n = 0; n < num - 1; n++)
9825 bench_iteration (widget, fn);
9826 g_get_current_time (&tv1);
9827 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
9828 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
9830 g_print ("%s %5d ", pad (name, 20), num);
9832 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
9834 g_print ("%10.1f\n", dt_first);
9838 do_bench (char* what, int num)
9842 void (* fn) (GtkWidget *widget);
9844 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9846 if (g_ascii_strcasecmp (what, "ALL") == 0)
9848 for (i = 0; i < nbuttons; i++)
9850 if (!buttons[i].do_not_benchmark)
9851 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
9858 for (i = 0; i < nbuttons; i++)
9860 if (strcmp (buttons[i].label, what) == 0)
9862 fn = buttons[i].func;
9868 g_print ("Can't bench: \"%s\" not found.\n", what);
9870 do_real_bench (widget, fn, buttons[i].label, num);
9877 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
9882 main (int argc, char *argv[])
9884 GtkCssProvider *provider, *memory_provider;
9885 GdkDisplay *display;
9887 GtkBindingSet *binding_set;
9889 gboolean done_benchmarks = FALSE;
9891 srand (time (NULL));
9895 g_set_application_name ("GTK+ Test Program");
9897 gtk_init (&argc, &argv);
9899 provider = gtk_css_provider_new ();
9901 /* Check to see if we are being run from the correct
9904 if (file_exists ("testgtk.css"))
9905 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
9906 else if (file_exists ("tests/testgtk.css"))
9907 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
9909 g_warning ("Couldn't find file \"testgtk.css\".");
9911 display = gdk_display_get_default ();
9912 screen = gdk_display_get_default_screen (display);
9914 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
9915 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
9916 g_object_unref (provider);
9918 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
9927 for (i = 1; i < argc; i++)
9929 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
9936 nextarg = strchr (argv[i], '=');
9947 count = strchr (nextarg, ':');
9950 what = g_strndup (nextarg, count - nextarg);
9957 what = g_strdup (nextarg);
9959 do_bench (what, num ? num : 1);
9960 done_benchmarks = TRUE;
9965 if (done_benchmarks)
9970 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
9971 gtk_binding_entry_add_signal (binding_set,
9972 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
9975 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
9977 memory_provider = gtk_css_provider_new ();
9978 gtk_css_provider_load_from_data (memory_provider,
9979 "#testgtk-version-label {\n"
9984 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
9985 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
9987 create_main_window ();
9993 while (g_main_context_pending (NULL))
9994 g_main_context_iteration (NULL, FALSE);
9997 while (g_main_context_pending (NULL))
9998 g_main_context_iteration (NULL, FALSE);