1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
44 #include "gdk/gdkkeysyms.h"
47 #define sleep(n) _sleep(n)
50 #include "prop-editor.h"
55 file_exists (const char *filename)
59 return stat (filename, &statbuf) == 0;
63 shape_create_icon (GdkScreen *screen,
72 build_option_menu (gchar *items[],
75 void (*func) (GtkWidget *widget, gpointer data),
78 /* macro, structure and variables used by tree window demos */
79 #define DEFAULT_NUMBER_OF_ITEM 3
80 #define DEFAULT_RECURSION_LEVEL 3
83 GSList* selection_mode_group;
84 GtkWidget* single_button;
85 GtkWidget* browse_button;
86 GtkWidget* multiple_button;
87 GtkWidget* draw_line_button;
88 GtkWidget* view_line_button;
89 GtkWidget* no_root_item_button;
90 GtkWidget* nb_item_spinner;
91 GtkWidget* recursion_spinner;
92 } sTreeSampleSelection;
94 typedef struct sTreeButtons {
96 GtkWidget* add_button;
97 GtkWidget* remove_button;
98 GtkWidget* subtree_button;
100 /* end of tree section */
103 build_option_menu (gchar *items[],
106 void (*func)(GtkWidget *widget, gpointer data),
112 omenu = gtk_combo_box_text_new ();
113 g_signal_connect (omenu, "changed",
114 G_CALLBACK (func), data);
116 for (i = 0; i < num_items; i++)
117 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), items[i]);
119 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
125 * Windows with an alpha channel
130 on_alpha_window_draw (GtkWidget *widget,
133 cairo_pattern_t *pattern;
134 int radius, width, height;
136 width = gtk_widget_get_allocated_width (widget);
137 height = gtk_widget_get_allocated_height (widget);
138 radius = MIN (width, height) / 2;
139 pattern = cairo_pattern_create_radial (width / 2,
146 if (gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)) &&
147 gtk_widget_is_composited (widget))
148 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
150 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
152 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
155 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
156 1.0, 0.75, 0.0, 1.0); /* solid orange */
157 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
158 1.0, 0.75, 0.0, 0.0); /* transparent orange */
160 cairo_set_source (cr, pattern);
161 cairo_pattern_destroy (pattern);
163 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
170 build_alpha_widgets (void)
173 GtkWidget *radio_button;
174 GtkWidget *check_button;
179 grid = gtk_grid_new ();
181 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
182 gtk_widget_set_hexpand (radio_button, TRUE);
183 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 0, 1, 1);
185 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
186 gtk_widget_set_hexpand (radio_button, TRUE);
187 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 1, 1, 1);
189 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
190 gtk_widget_set_hexpand (radio_button, TRUE);
191 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 2, 1, 1);
193 check_button = gtk_check_button_new_with_label ("Sedentary"),
194 gtk_widget_set_hexpand (check_button, TRUE);
195 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 0, 1, 1);
197 check_button = gtk_check_button_new_with_label ("Nocturnal"),
198 gtk_widget_set_hexpand (check_button, TRUE);
199 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 1, 1, 1);
201 check_button = gtk_check_button_new_with_label ("Compulsive"),
202 gtk_widget_set_hexpand (check_button, TRUE);
203 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 2, 1, 1);
205 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
206 label = gtk_label_new (NULL);
207 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
208 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
209 entry = gtk_entry_new ();
210 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
211 gtk_widget_set_hexpand (hbox, TRUE);
212 gtk_grid_attach (GTK_GRID (grid), hbox, 0, 3, 2, 1);
218 on_alpha_screen_changed (GtkWindow *window,
219 GdkScreen *old_screen,
222 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window));
223 GdkVisual *visual = gdk_screen_get_rgba_visual (screen);
227 visual = gdk_screen_get_system_visual (screen);
228 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
232 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
235 gtk_widget_set_visual (GTK_WIDGET (window), visual);
239 on_composited_changed (GtkWidget *window,
242 gboolean is_composited = gtk_widget_is_composited (window);
245 gtk_label_set_text (label, "Composited");
247 gtk_label_set_text (label, "Not composited");
251 create_alpha_window (GtkWidget *widget)
253 static GtkWidget *window;
257 GtkWidget *content_area;
261 window = gtk_dialog_new_with_buttons ("Alpha Window",
262 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
266 gtk_widget_set_app_paintable (window, TRUE);
267 g_signal_connect (window, "draw",
268 G_CALLBACK (on_alpha_window_draw), NULL);
270 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
272 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
273 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
274 gtk_box_pack_start (GTK_BOX (content_area), vbox,
277 label = gtk_label_new (NULL);
278 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
279 on_alpha_screen_changed (GTK_WINDOW (window), NULL, label);
280 g_signal_connect (window, "screen-changed",
281 G_CALLBACK (on_alpha_screen_changed), label);
283 label = gtk_label_new (NULL);
284 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
285 on_composited_changed (window, GTK_LABEL (label));
286 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
288 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
290 g_signal_connect (window, "destroy",
291 G_CALLBACK (gtk_widget_destroyed),
294 g_signal_connect (window, "response",
295 G_CALLBACK (gtk_widget_destroy),
299 if (!gtk_widget_get_visible (window))
300 gtk_widget_show_all (window);
302 gtk_widget_destroy (window);
306 * Composited non-toplevel window
309 /* The draw event handler for the event box.
311 * This function simply draws a transparency onto a widget on the area
312 * for which it receives expose events. This is intended to give the
313 * event box a "transparent" background.
315 * In order for this to work properly, the widget must have an RGBA
316 * colourmap. The widget should also be set as app-paintable since it
317 * doesn't make sense for GTK to draw a background if we are drawing it
318 * (and because GTK might actually replace our transparency with its
319 * default background colour).
322 transparent_draw (GtkWidget *widget,
325 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
331 /* The expose event handler for the window.
333 * This function performs the actual compositing of the event box onto
334 * the already-existing background of the window at 50% normal opacity.
336 * In this case we do not want app-paintable to be set on the widget
337 * since we want it to draw its own (red) background. Because of this,
338 * however, we must ensure that we use g_signal_register_after so that
339 * this handler is called after the red has been drawn. If it was
340 * called before then GTK would just blindly paint over our work.
343 window_draw (GtkWidget *widget,
346 GtkAllocation allocation;
349 /* get our child (in this case, the event box) */
350 child = gtk_bin_get_child (GTK_BIN (widget));
352 gtk_widget_get_allocation (child, &allocation);
354 /* the source data is the (composited) event box */
355 gdk_cairo_set_source_window (cr, gtk_widget_get_window (child),
359 /* composite, with a 50% opacity */
360 cairo_paint_with_alpha (cr, 0.5);
366 create_composited_window (GtkWidget *widget)
368 static GtkWidget *window;
372 GtkWidget *event, *button;
375 /* make the widgets */
376 button = gtk_button_new_with_label ("A Button");
377 event = gtk_event_box_new ();
378 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
380 g_signal_connect (window, "destroy",
381 G_CALLBACK (gtk_widget_destroyed),
384 /* put a red background on the window */
385 gdk_rgba_parse (&red, "red");
386 gtk_widget_override_background_color (window, 0, &red);
388 /* set our event box to have a fully-transparent background
389 * drawn on it. currently there is no way to simply tell gtk
390 * that "transparency" is the background colour for a widget.
392 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
393 g_signal_connect (event, "draw",
394 G_CALLBACK (transparent_draw), NULL);
396 /* put them inside one another */
397 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
398 gtk_container_add (GTK_CONTAINER (window), event);
399 gtk_container_add (GTK_CONTAINER (event), button);
401 /* realise and show everything */
402 gtk_widget_realize (button);
404 /* set the event box GdkWindow to be composited.
405 * obviously must be performed after event box is realised.
407 gdk_window_set_composited (gtk_widget_get_window (event),
410 /* set up the compositing handler.
411 * note that we do _after so that the normal (red) background is drawn
412 * by gtk before our compositing occurs.
414 g_signal_connect_after (window, "draw",
415 G_CALLBACK (window_draw), NULL);
418 if (!gtk_widget_get_visible (window))
419 gtk_widget_show_all (window);
421 gtk_widget_destroy (window);
425 * Big windows and guffaw scrolling
429 pattern_set_bg (GtkWidget *widget,
433 static GdkRGBA colors[] = {
434 { 0.27, 0.27, 1.0, 1.0 },
435 { 0.53, 0.53, 1.0, 1.0},
436 { 0.67, 0.67, 1.0, 1.0 }
439 gdk_window_set_user_data (child, widget);
440 gdk_window_set_background_rgba (child, &colors[level]);
444 create_pattern (GtkWidget *widget,
455 while (2 * h <= height)
460 while (2 * w <= width)
462 if ((i + j) % 2 == 0)
467 GdkWindowAttr attributes;
469 attributes.window_type = GDK_WINDOW_CHILD;
472 attributes.width = w;
473 attributes.height = h;
474 attributes.wclass = GDK_INPUT_OUTPUT;
475 attributes.event_mask = GDK_EXPOSURE_MASK;
476 attributes.visual = gtk_widget_get_visual (widget);
478 child = gdk_window_new (parent, &attributes,
479 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
481 pattern_set_bg (widget, child, level);
484 create_pattern (widget, child, level + 1, w, h);
486 gdk_window_show (child);
496 #define PATTERN_SIZE (1 << 18)
499 pattern_hadj_changed (GtkAdjustment *adjustment,
502 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
503 gint new_value = gtk_adjustment_get_value (adjustment);
505 if (gtk_widget_get_realized (darea))
507 gdk_window_scroll (gtk_widget_get_window (darea),
508 *old_value - new_value, 0);
509 *old_value = new_value;
514 pattern_vadj_changed (GtkAdjustment *adjustment,
517 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
518 gint new_value = gtk_adjustment_get_value (adjustment);
520 if (gtk_widget_get_realized (darea))
522 gdk_window_scroll (gtk_widget_get_window (darea),
523 0, *old_value - new_value);
524 *old_value = new_value;
529 pattern_realize (GtkWidget *widget,
534 window = gtk_widget_get_window (widget);
535 pattern_set_bg (widget, window, 0);
536 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
540 create_big_windows (GtkWidget *widget)
542 static GtkWidget *window = NULL;
543 GtkWidget *content_area;
544 GtkWidget *darea, *grid, *scrollbar;
546 GtkAdjustment *hadjustment;
547 GtkAdjustment *vadjustment;
548 static gint current_x;
549 static gint current_y;
556 window = gtk_dialog_new_with_buttons ("Big Windows",
562 gtk_window_set_screen (GTK_WINDOW (window),
563 gtk_widget_get_screen (widget));
565 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
567 g_signal_connect (window, "destroy",
568 G_CALLBACK (gtk_widget_destroyed),
571 g_signal_connect (window, "response",
572 G_CALLBACK (gtk_widget_destroy),
575 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
577 grid = gtk_grid_new ();
578 gtk_box_pack_start (GTK_BOX (content_area), grid, TRUE, TRUE, 0);
580 darea = gtk_drawing_area_new ();
582 hadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
583 g_signal_connect (hadjustment, "value_changed",
584 G_CALLBACK (pattern_hadj_changed), darea);
585 g_object_set_data (G_OBJECT (hadjustment), "old-value", ¤t_x);
587 vadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
588 g_signal_connect (vadjustment, "value_changed",
589 G_CALLBACK (pattern_vadj_changed), darea);
590 g_object_set_data (G_OBJECT (vadjustment), "old-value", ¤t_y);
592 g_signal_connect (darea, "realize",
593 G_CALLBACK (pattern_realize),
596 eventbox = gtk_event_box_new ();
597 gtk_widget_set_hexpand (eventbox, TRUE);
598 gtk_widget_set_vexpand (eventbox, TRUE);
599 gtk_grid_attach (GTK_GRID (grid), eventbox, 0, 0, 1, 1);
601 gtk_container_add (GTK_CONTAINER (eventbox), darea);
603 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
604 gtk_widget_set_hexpand (scrollbar, TRUE);
605 gtk_grid_attach (GTK_GRID (grid), scrollbar, 0, 1, 1, 1);
607 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
608 gtk_widget_set_vexpand (scrollbar, TRUE);
609 gtk_grid_attach (GTK_GRID (grid), scrollbar, 1, 0, 1, 1);
612 if (!gtk_widget_get_visible (window))
613 gtk_widget_show_all (window);
615 gtk_widget_hide (window);
623 button_window (GtkWidget *widget,
626 if (!gtk_widget_get_visible (button))
627 gtk_widget_show (button);
629 gtk_widget_hide (button);
633 create_buttons (GtkWidget *widget)
635 static GtkWidget *window = NULL;
639 GtkWidget *separator;
640 GtkWidget *button[10];
641 int button_x[9] = { 0, 1, 2, 0, 2, 1, 1, 2, 0 };
642 int button_y[9] = { 0, 1, 2, 2, 0, 2, 0, 1, 1 };
647 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
648 gtk_window_set_screen (GTK_WINDOW (window),
649 gtk_widget_get_screen (widget));
651 g_signal_connect (window, "destroy",
652 G_CALLBACK (gtk_widget_destroyed),
655 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
656 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
658 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
659 gtk_container_add (GTK_CONTAINER (window), box1);
661 grid = gtk_grid_new ();
662 gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
663 gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
664 gtk_container_set_border_width (GTK_CONTAINER (grid), 10);
665 gtk_box_pack_start (GTK_BOX (box1), grid, TRUE, TRUE, 0);
667 button[0] = gtk_button_new_with_label ("button1");
668 button[1] = gtk_button_new_with_mnemonic ("_button2");
669 button[2] = gtk_button_new_with_mnemonic ("_button3");
670 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
671 button[4] = gtk_button_new_with_label ("button5");
672 button[5] = gtk_button_new_with_label ("button6");
673 button[6] = gtk_button_new_with_label ("button7");
674 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
675 button[8] = gtk_button_new_with_label ("button9");
677 for (i = 0; i < 9; i++)
679 g_signal_connect (button[i], "clicked",
680 G_CALLBACK (button_window),
681 button[(i + 1) % 9]);
682 gtk_widget_set_hexpand (button[i], TRUE);
683 gtk_widget_set_vexpand (button[i], TRUE);
685 gtk_grid_attach (GTK_GRID (grid), button[i],
686 button_x[i], button_y[i] + 1, 1, 1);
689 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
690 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
692 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
693 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
694 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
696 button[9] = gtk_button_new_with_label ("close");
697 g_signal_connect_swapped (button[9], "clicked",
698 G_CALLBACK (gtk_widget_destroy),
700 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
701 gtk_widget_set_can_default (button[9], TRUE);
702 gtk_widget_grab_default (button[9]);
705 if (!gtk_widget_get_visible (window))
706 gtk_widget_show_all (window);
708 gtk_widget_destroy (window);
716 create_toggle_buttons (GtkWidget *widget)
718 static GtkWidget *window = NULL;
722 GtkWidget *separator;
726 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
727 gtk_window_set_screen (GTK_WINDOW (window),
728 gtk_widget_get_screen (widget));
730 g_signal_connect (window, "destroy",
731 G_CALLBACK (gtk_widget_destroyed),
734 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
735 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
737 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
738 gtk_container_add (GTK_CONTAINER (window), box1);
740 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
741 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
742 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
744 button = gtk_toggle_button_new_with_label ("button1");
745 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
747 button = gtk_toggle_button_new_with_label ("button2");
748 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
750 button = gtk_toggle_button_new_with_label ("button3");
751 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
753 button = gtk_toggle_button_new_with_label ("inconsistent");
754 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
755 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
757 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
758 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
760 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
761 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
762 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
764 button = gtk_button_new_with_label ("close");
765 g_signal_connect_swapped (button, "clicked",
766 G_CALLBACK (gtk_widget_destroy),
768 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
769 gtk_widget_set_can_default (button, TRUE);
770 gtk_widget_grab_default (button);
773 if (!gtk_widget_get_visible (window))
774 gtk_widget_show_all (window);
776 gtk_widget_destroy (window);
780 create_widget_grid (GType widget_type)
783 GtkWidget *group_widget = NULL;
786 grid = gtk_grid_new ();
788 for (i = 0; i < 5; i++)
790 for (j = 0; j < 5; j++)
795 if (i == 0 && j == 0)
801 tmp = g_strdup_printf ("%d", j);
802 widget = gtk_label_new (tmp);
807 tmp = g_strdup_printf ("%c", 'A' + i - 1);
808 widget = gtk_label_new (tmp);
813 widget = g_object_new (widget_type, NULL);
815 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
818 group_widget = widget;
820 g_object_set (widget, "group", group_widget, NULL);
825 gtk_grid_attach (GTK_GRID (grid), widget, i, j, 1, 1);
837 create_check_buttons (GtkWidget *widget)
839 static GtkWidget *window = NULL;
843 GtkWidget *separator;
848 window = gtk_dialog_new_with_buttons ("Check Buttons",
854 gtk_window_set_screen (GTK_WINDOW (window),
855 gtk_widget_get_screen (widget));
857 g_signal_connect (window, "destroy",
858 G_CALLBACK (gtk_widget_destroyed),
860 g_signal_connect (window, "response",
861 G_CALLBACK (gtk_widget_destroy),
864 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
866 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
867 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
868 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
870 button = gtk_check_button_new_with_mnemonic ("_button1");
871 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
873 button = gtk_check_button_new_with_label ("button2");
874 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
876 button = gtk_check_button_new_with_label ("button3");
877 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
879 button = gtk_check_button_new_with_label ("inconsistent");
880 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
881 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
883 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
884 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
886 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
887 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
888 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
891 if (!gtk_widget_get_visible (window))
892 gtk_widget_show_all (window);
894 gtk_widget_destroy (window);
902 create_radio_buttons (GtkWidget *widget)
904 static GtkWidget *window = NULL;
908 GtkWidget *separator;
913 window = gtk_dialog_new_with_buttons ("Radio Buttons",
919 gtk_window_set_screen (GTK_WINDOW (window),
920 gtk_widget_get_screen (widget));
922 g_signal_connect (window, "destroy",
923 G_CALLBACK (gtk_widget_destroyed),
925 g_signal_connect (window, "response",
926 G_CALLBACK (gtk_widget_destroy),
929 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
931 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
932 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
933 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
935 button = gtk_radio_button_new_with_label (NULL, "button1");
936 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
938 button = gtk_radio_button_new_with_label (
939 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
941 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
942 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
944 button = gtk_radio_button_new_with_label (
945 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
947 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
949 button = gtk_radio_button_new_with_label (
950 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
952 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
953 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
955 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
956 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
958 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
959 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
960 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
962 button = gtk_radio_button_new_with_label (NULL, "button4");
963 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
964 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
966 button = gtk_radio_button_new_with_label (
967 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
969 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
970 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
971 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
973 button = gtk_radio_button_new_with_label (
974 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
976 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
977 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
979 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
980 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
982 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
983 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
984 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
987 if (!gtk_widget_get_visible (window))
988 gtk_widget_show_all (window);
990 gtk_widget_destroy (window);
998 create_bbox (gint horizontal,
1009 frame = gtk_frame_new (title);
1012 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1014 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1016 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1017 gtk_container_add (GTK_CONTAINER (frame), bbox);
1019 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1020 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1022 button = gtk_button_new_with_label ("OK");
1023 gtk_container_add (GTK_CONTAINER (bbox), button);
1025 button = gtk_button_new_with_label ("Cancel");
1026 gtk_container_add (GTK_CONTAINER (bbox), button);
1028 button = gtk_button_new_with_label ("Help");
1029 gtk_container_add (GTK_CONTAINER (bbox), button);
1035 create_button_box (GtkWidget *widget)
1037 static GtkWidget* window = NULL;
1038 GtkWidget *main_vbox;
1041 GtkWidget *frame_horz;
1042 GtkWidget *frame_vert;
1046 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1047 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1048 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1050 g_signal_connect (window, "destroy",
1051 G_CALLBACK (gtk_widget_destroyed),
1054 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1056 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1057 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1059 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1060 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1062 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1063 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1064 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1066 gtk_box_pack_start (GTK_BOX (vbox),
1067 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1070 gtk_box_pack_start (GTK_BOX (vbox),
1071 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1074 gtk_box_pack_start (GTK_BOX (vbox),
1075 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1078 gtk_box_pack_start (GTK_BOX (vbox),
1079 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1082 gtk_box_pack_start (GTK_BOX (vbox),
1083 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1086 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1087 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1089 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1090 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1091 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1093 gtk_box_pack_start (GTK_BOX (hbox),
1094 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1097 gtk_box_pack_start (GTK_BOX (hbox),
1098 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1101 gtk_box_pack_start (GTK_BOX (hbox),
1102 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1105 gtk_box_pack_start (GTK_BOX (hbox),
1106 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1109 gtk_box_pack_start (GTK_BOX (hbox),
1110 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1114 if (!gtk_widget_get_visible (window))
1115 gtk_widget_show_all (window);
1117 gtk_widget_destroy (window);
1125 new_pixbuf (char *filename,
1131 if (strcmp (filename, "test.xpm") == 0)
1134 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1137 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1139 widget = gtk_image_new_from_pixbuf (pixbuf);
1141 g_object_unref (pixbuf);
1148 set_toolbar_small_stock (GtkWidget *widget,
1151 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1155 set_toolbar_large_stock (GtkWidget *widget,
1158 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1162 set_toolbar_horizontal (GtkWidget *widget,
1165 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1169 set_toolbar_vertical (GtkWidget *widget,
1172 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1176 set_toolbar_icons (GtkWidget *widget,
1179 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1183 set_toolbar_text (GtkWidget *widget,
1186 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1190 set_toolbar_both (GtkWidget *widget,
1193 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1197 set_toolbar_both_horiz (GtkWidget *widget,
1200 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1204 set_toolbar_enable (GtkWidget *widget,
1207 GtkSettings *settings = gtk_widget_get_settings (widget);
1208 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1212 set_toolbar_disable (GtkWidget *widget,
1215 GtkSettings *settings = gtk_widget_get_settings (widget);
1216 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1219 static GtkActionEntry create_toolbar_items[] = {
1220 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1221 G_CALLBACK (set_toolbar_small_stock) },
1222 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1223 G_CALLBACK (set_toolbar_large_stock) },
1224 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1225 G_CALLBACK (set_toolbar_horizontal) },
1226 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1227 G_CALLBACK (set_toolbar_vertical) },
1229 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1230 G_CALLBACK (set_toolbar_icons) },
1231 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1232 G_CALLBACK (set_toolbar_text) },
1233 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1234 G_CALLBACK (set_toolbar_both) },
1235 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1236 G_CALLBACK (set_toolbar_both_horiz) },
1238 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1242 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1243 G_CALLBACK (set_toolbar_enable) },
1244 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1245 G_CALLBACK (set_toolbar_disable) },
1247 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1249 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1252 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1254 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1259 create_toolbar (GtkWidget *widget)
1261 static GtkWidget *window = NULL;
1268 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1269 gtk_window_set_screen (GTK_WINDOW (window),
1270 gtk_widget_get_screen (widget));
1272 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1274 g_signal_connect (window, "destroy",
1275 G_CALLBACK (gtk_widget_destroyed),
1278 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1279 gtk_widget_realize (window);
1281 toolbar = gtk_toolbar_new ();
1282 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1284 GtkToolItem *toolitem;
1286 if (create_toolbar_items[i].tooltip == NULL)
1287 toolitem = gtk_separator_tool_item_new ();
1288 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1292 toolitem = gtk_tool_item_new ();
1293 entry = gtk_entry_new ();
1294 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1296 else if (create_toolbar_items[i].stock_id)
1297 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1302 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1303 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1305 if (create_toolbar_items[i].callback)
1306 g_signal_connect (toolitem, "clicked",
1307 create_toolbar_items[i].callback, toolbar);
1308 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1309 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1312 gtk_container_add (GTK_CONTAINER (window), toolbar);
1314 gtk_widget_set_size_request (toolbar, 200, -1);
1317 if (!gtk_widget_get_visible (window))
1318 gtk_widget_show_all (window);
1320 gtk_widget_destroy (window);
1327 static guint statusbar_counter = 1;
1330 statusbar_push (GtkWidget *button,
1331 GtkStatusbar *statusbar)
1335 sprintf (text, "something %d", statusbar_counter++);
1337 gtk_statusbar_push (statusbar, 1, text);
1341 statusbar_push_long (GtkWidget *button,
1342 GtkStatusbar *statusbar)
1346 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\").");
1348 gtk_statusbar_push (statusbar, 1, text);
1352 statusbar_pop (GtkWidget *button,
1353 GtkStatusbar *statusbar)
1355 gtk_statusbar_pop (statusbar, 1);
1359 statusbar_steal (GtkWidget *button,
1360 GtkStatusbar *statusbar)
1362 gtk_statusbar_remove (statusbar, 1, 4);
1366 statusbar_popped (GtkStatusbar *statusbar,
1371 statusbar_counter = 1;
1375 statusbar_contexts (GtkStatusbar *statusbar)
1379 string = "any context";
1380 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1382 gtk_statusbar_get_context_id (statusbar, string));
1384 string = "idle messages";
1385 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1387 gtk_statusbar_get_context_id (statusbar, string));
1389 string = "some text";
1390 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1392 gtk_statusbar_get_context_id (statusbar, string));
1394 string = "hit the mouse";
1395 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1397 gtk_statusbar_get_context_id (statusbar, string));
1399 string = "hit the mouse2";
1400 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1402 gtk_statusbar_get_context_id (statusbar, string));
1406 create_statusbar (GtkWidget *widget)
1408 static GtkWidget *window = NULL;
1412 GtkWidget *separator;
1413 GtkWidget *statusbar;
1417 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1418 gtk_window_set_screen (GTK_WINDOW (window),
1419 gtk_widget_get_screen (widget));
1421 g_signal_connect (window, "destroy",
1422 G_CALLBACK (gtk_widget_destroyed),
1425 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1426 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1428 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1429 gtk_container_add (GTK_CONTAINER (window), box1);
1431 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1432 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1433 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1435 statusbar = gtk_statusbar_new ();
1436 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1437 g_signal_connect (statusbar,
1439 G_CALLBACK (statusbar_popped),
1442 button = g_object_new (gtk_button_get_type (),
1443 "label", "push something",
1447 g_object_connect (button,
1448 "signal::clicked", statusbar_push, statusbar,
1451 button = g_object_connect (g_object_new (gtk_button_get_type (),
1456 "signal_after::clicked", statusbar_pop, statusbar,
1459 button = g_object_connect (g_object_new (gtk_button_get_type (),
1460 "label", "steal #4",
1464 "signal_after::clicked", statusbar_steal, statusbar,
1467 button = g_object_connect (g_object_new (gtk_button_get_type (),
1468 "label", "test contexts",
1472 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1475 button = g_object_connect (g_object_new (gtk_button_get_type (),
1476 "label", "push something long",
1480 "signal_after::clicked", statusbar_push_long, statusbar,
1483 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1484 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1486 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1487 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1488 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1490 button = gtk_button_new_with_label ("close");
1491 g_signal_connect_swapped (button, "clicked",
1492 G_CALLBACK (gtk_widget_destroy),
1494 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1495 gtk_widget_set_can_default (button, TRUE);
1496 gtk_widget_grab_default (button);
1499 if (!gtk_widget_get_visible (window))
1500 gtk_widget_show_all (window);
1502 gtk_widget_destroy (window);
1509 sensitivity_toggled (GtkWidget *toggle,
1512 gtk_widget_set_sensitive (widget,
1513 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1517 create_sensitivity_control (GtkWidget *widget)
1521 button = gtk_toggle_button_new_with_label ("Sensitive");
1523 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1524 gtk_widget_is_sensitive (widget));
1526 g_signal_connect (button,
1528 G_CALLBACK (sensitivity_toggled),
1531 gtk_widget_show_all (button);
1537 set_selectable_recursive (GtkWidget *widget,
1540 if (GTK_IS_CONTAINER (widget))
1545 children = gtk_container_get_children (GTK_CONTAINER (widget));
1549 set_selectable_recursive (tmp->data, setting);
1553 g_list_free (children);
1555 else if (GTK_IS_LABEL (widget))
1557 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1562 selectable_toggled (GtkWidget *toggle,
1565 set_selectable_recursive (widget,
1566 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1570 create_selectable_control (GtkWidget *widget)
1574 button = gtk_toggle_button_new_with_label ("Selectable");
1576 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1579 g_signal_connect (button,
1581 G_CALLBACK (selectable_toggled),
1584 gtk_widget_show_all (button);
1590 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1594 gtk_widget_destroy (dialog);
1596 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1597 "as hyperlinks, which can be clicked\n"
1598 "or activated via <a href=\"keynav\">keynav</a>.\n"
1599 "The links remain the same.";
1600 gtk_label_set_markup (label, text);
1604 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1606 if (g_strcmp0 (uri, "keynav") == 0)
1610 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1611 GTK_DIALOG_DESTROY_WITH_PARENT,
1614 "The term <i>keynav</i> is a shorthand for "
1615 "keyboard navigation and refers to the process of using a program "
1616 "(exclusively) via keyboard input.");
1618 gtk_window_present (GTK_WINDOW (dialog));
1620 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1628 void create_labels (GtkWidget *widget)
1630 static GtkWidget *window = NULL;
1639 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1641 gtk_window_set_screen (GTK_WINDOW (window),
1642 gtk_widget_get_screen (widget));
1644 g_signal_connect (window, "destroy",
1645 G_CALLBACK (gtk_widget_destroyed),
1648 gtk_window_set_title (GTK_WINDOW (window), "Label");
1650 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1652 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1653 gtk_container_add (GTK_CONTAINER (window), vbox);
1655 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1657 button = create_sensitivity_control (hbox);
1659 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1661 button = create_selectable_control (hbox);
1663 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1665 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1667 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1668 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1670 frame = gtk_frame_new ("Normal Label");
1671 label = gtk_label_new ("This is a Normal label");
1672 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1673 gtk_container_add (GTK_CONTAINER (frame), label);
1674 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1676 frame = gtk_frame_new ("Multi-line Label");
1677 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1678 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1679 gtk_container_add (GTK_CONTAINER (frame), label);
1680 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1682 frame = gtk_frame_new ("Left Justified Label");
1683 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1684 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1685 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1686 gtk_container_add (GTK_CONTAINER (frame), label);
1687 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1689 frame = gtk_frame_new ("Right Justified Label");
1690 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1691 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1692 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1693 gtk_container_add (GTK_CONTAINER (frame), label);
1694 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1696 frame = gtk_frame_new ("Internationalized Label");
1697 label = gtk_label_new (NULL);
1698 gtk_label_set_markup (GTK_LABEL (label),
1699 "French (Fran\303\247ais) Bonjour, Salut\n"
1700 "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"
1701 "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"
1702 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1703 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1704 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1705 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1706 gtk_container_add (GTK_CONTAINER (frame), label);
1707 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1709 frame = gtk_frame_new ("Bidirection Label");
1710 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"
1711 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1712 gtk_container_add (GTK_CONTAINER (frame), label);
1713 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1715 frame = gtk_frame_new ("Links in a label");
1716 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1717 "as hyperlinks, which can be clicked\n"
1718 "or activated via <a href=\"keynav\">keynav</a>");
1719 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1720 gtk_container_add (GTK_CONTAINER (frame), label);
1721 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1722 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1724 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1725 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1726 frame = gtk_frame_new ("Line wrapped label");
1727 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1728 "up the entire "/* big space to test spacing */\
1729 "width allocated to it, but automatically wraps the words to fit. "\
1730 "The time has come, for all good men, to come to the aid of their party. "\
1731 "The sixth sheik's six sheep's sick.\n"\
1732 " It supports multiple paragraphs correctly, and correctly adds "\
1733 "many extra spaces. ");
1735 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1736 gtk_container_add (GTK_CONTAINER (frame), label);
1737 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1739 frame = gtk_frame_new ("Filled, wrapped label");
1740 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
1741 "up the entire width allocated to it. Here is a seneance to prove "\
1742 "my point. Here is another sentence. "\
1743 "Here comes the sun, do de do de do.\n"\
1744 " This is a new paragraph.\n"\
1745 " This is another newer, longer, better paragraph. It is coming to an end, "\
1747 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
1748 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1749 gtk_container_add (GTK_CONTAINER (frame), label);
1750 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1752 frame = gtk_frame_new ("Underlined label");
1753 label = gtk_label_new ("This label is underlined!\n"
1754 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
1755 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1756 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
1757 gtk_container_add (GTK_CONTAINER (frame), label);
1758 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1760 frame = gtk_frame_new ("Markup label");
1761 label = gtk_label_new (NULL);
1763 /* There's also a gtk_label_set_markup() without accel if you
1764 * don't have an accelerator key
1766 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
1767 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
1768 "<b>markup</b> _such as "
1769 "<big><i>Big Italics</i></big>\n"
1770 "<tt>Monospace font</tt>\n"
1771 "<u>Underline!</u>\n"
1773 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
1774 "and nothing on this line,\n"
1777 "or even on this one\n"
1778 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
1779 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
1780 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
1782 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
1784 gtk_container_add (GTK_CONTAINER (frame), label);
1785 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1788 if (!gtk_widget_get_visible (window))
1789 gtk_widget_show_all (window);
1791 gtk_widget_destroy (window);
1795 on_angle_scale_changed (GtkRange *range,
1798 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
1802 create_rotated_label (GtkWidget *widget)
1804 static GtkWidget *window = NULL;
1805 GtkWidget *content_area;
1809 GtkWidget *scale_label;
1810 GtkWidget *scale_hbox;
1814 window = gtk_dialog_new_with_buttons ("Rotated Label",
1815 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
1816 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
1819 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1821 gtk_window_set_screen (GTK_WINDOW (window),
1822 gtk_widget_get_screen (widget));
1824 g_signal_connect (window, "response",
1825 G_CALLBACK (gtk_widget_destroy), NULL);
1826 g_signal_connect (window, "destroy",
1827 G_CALLBACK (gtk_widget_destroyed), &window);
1829 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1831 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1832 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
1833 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1835 label = gtk_label_new (NULL);
1836 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
1837 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
1839 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1840 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
1842 scale_label = gtk_label_new (NULL);
1843 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
1844 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
1846 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
1848 g_signal_connect (hscale, "value-changed",
1849 G_CALLBACK (on_angle_scale_changed), label);
1851 gtk_range_set_value (GTK_RANGE (hscale), 45);
1852 gtk_widget_set_size_request (hscale, 200, -1);
1853 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
1856 if (!gtk_widget_get_visible (window))
1857 gtk_widget_show_all (window);
1859 gtk_widget_destroy (window);
1862 #define DEFAULT_TEXT_RADIUS 200
1865 on_rotated_text_unrealize (GtkWidget *widget)
1867 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
1871 on_rotated_text_draw (GtkWidget *widget,
1873 GdkPixbuf *tile_pixbuf)
1875 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
1876 "had", "10,000", "men" };
1881 PangoLayout *layout;
1882 PangoContext *context;
1883 PangoFontDescription *desc;
1887 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
1888 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
1891 cairo_set_source_rgb (cr, 0, 0, 0);
1893 width = gtk_widget_get_allocated_width (widget);
1894 height = gtk_widget_get_allocated_height (widget);
1895 radius = MIN (width, height) / 2.;
1897 cairo_translate (cr,
1898 radius + (width - 2 * radius) / 2,
1899 radius + (height - 2 * radius) / 2);
1900 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
1902 context = gtk_widget_get_pango_context (widget);
1903 layout = pango_layout_new (context);
1904 desc = pango_font_description_from_string ("Sans Bold 30");
1905 pango_layout_set_font_description (layout, desc);
1906 pango_font_description_free (desc);
1908 n_words = G_N_ELEMENTS (words);
1909 for (i = 0; i < n_words; i++)
1915 cairo_rotate (cr, 2 * G_PI * i / n_words);
1916 pango_cairo_update_layout (cr, layout);
1918 pango_layout_set_text (layout, words[i], -1);
1919 pango_layout_get_size (layout, &width, &height);
1921 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
1922 pango_cairo_show_layout (cr, layout);
1927 g_object_unref (layout);
1933 create_rotated_text (GtkWidget *widget)
1935 static GtkWidget *window = NULL;
1939 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
1940 GtkRequisition requisition;
1941 GtkWidget *content_area;
1942 GtkWidget *drawing_area;
1943 GdkPixbuf *tile_pixbuf;
1945 window = gtk_dialog_new_with_buttons ("Rotated Text",
1946 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
1947 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
1950 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1952 gtk_window_set_screen (GTK_WINDOW (window),
1953 gtk_widget_get_screen (widget));
1955 g_signal_connect (window, "response",
1956 G_CALLBACK (gtk_widget_destroy), NULL);
1957 g_signal_connect (window, "destroy",
1958 G_CALLBACK (gtk_widget_destroyed), &window);
1960 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1962 drawing_area = gtk_drawing_area_new ();
1963 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
1964 gtk_widget_override_background_color (drawing_area, 0, &white);
1966 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
1968 g_signal_connect (drawing_area, "draw",
1969 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
1970 g_signal_connect (drawing_area, "unrealize",
1971 G_CALLBACK (on_rotated_text_unrealize), NULL);
1973 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
1975 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
1976 gtk_widget_get_preferred_size ( (window),
1977 &requisition, NULL);
1978 gtk_widget_set_size_request (drawing_area, -1, -1);
1979 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
1982 if (!gtk_widget_get_visible (window))
1983 gtk_widget_show (window);
1985 gtk_widget_destroy (window);
1993 reparent_label (GtkWidget *widget,
1994 GtkWidget *new_parent)
1998 label = g_object_get_data (G_OBJECT (widget), "user_data");
2000 gtk_widget_reparent (label, new_parent);
2004 set_parent_signal (GtkWidget *child,
2005 GtkWidget *old_parent,
2010 parent = gtk_widget_get_parent (child);
2011 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2012 g_type_name (G_OBJECT_TYPE (child)),
2013 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2014 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2015 GPOINTER_TO_INT (func_data));
2019 create_reparent (GtkWidget *widget)
2021 static GtkWidget *window = NULL;
2028 GtkWidget *separator;
2029 GtkWidget *event_box;
2033 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2035 gtk_window_set_screen (GTK_WINDOW (window),
2036 gtk_widget_get_screen (widget));
2038 g_signal_connect (window, "destroy",
2039 G_CALLBACK (gtk_widget_destroyed),
2042 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2043 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2045 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2046 gtk_container_add (GTK_CONTAINER (window), box1);
2048 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2049 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2050 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2052 label = gtk_label_new ("Hello World");
2054 frame = gtk_frame_new ("Frame 1");
2055 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2057 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2058 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2059 gtk_container_add (GTK_CONTAINER (frame), box3);
2061 button = gtk_button_new_with_label ("switch");
2062 g_object_set_data (G_OBJECT (button), "user_data", label);
2063 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2065 event_box = gtk_event_box_new ();
2066 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2067 gtk_container_add (GTK_CONTAINER (event_box), label);
2069 g_signal_connect (button, "clicked",
2070 G_CALLBACK (reparent_label),
2073 g_signal_connect (label, "parent_set",
2074 G_CALLBACK (set_parent_signal),
2075 GINT_TO_POINTER (42));
2077 frame = gtk_frame_new ("Frame 2");
2078 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2080 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2081 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2082 gtk_container_add (GTK_CONTAINER (frame), box3);
2084 button = gtk_button_new_with_label ("switch");
2085 g_object_set_data (G_OBJECT (button), "user_data", label);
2086 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2088 event_box = gtk_event_box_new ();
2089 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2091 g_signal_connect (button, "clicked",
2092 G_CALLBACK (reparent_label),
2095 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2096 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2098 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2099 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2100 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2102 button = gtk_button_new_with_label ("close");
2103 g_signal_connect_swapped (button, "clicked",
2104 G_CALLBACK (gtk_widget_destroy), window);
2105 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2106 gtk_widget_set_can_default (button, TRUE);
2107 gtk_widget_grab_default (button);
2110 if (!gtk_widget_get_visible (window))
2111 gtk_widget_show_all (window);
2113 gtk_widget_destroy (window);
2120 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2122 if (event->type == GDK_BUTTON_PRESS)
2124 if (event->button == 1)
2125 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2126 event->button, event->x_root, event->y_root,
2128 else if (event->button == 2)
2129 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2130 event->button, event->x_root, event->y_root,
2137 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2139 GtkStyleContext *context;
2140 GtkJunctionSides sides;
2144 case GDK_WINDOW_EDGE_NORTH_WEST:
2145 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2147 case GDK_WINDOW_EDGE_NORTH:
2148 sides = GTK_JUNCTION_TOP;
2150 case GDK_WINDOW_EDGE_NORTH_EAST:
2151 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2153 case GDK_WINDOW_EDGE_WEST:
2154 sides = GTK_JUNCTION_LEFT;
2156 case GDK_WINDOW_EDGE_EAST:
2157 sides = GTK_JUNCTION_RIGHT;
2159 case GDK_WINDOW_EDGE_SOUTH_WEST:
2160 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2162 case GDK_WINDOW_EDGE_SOUTH:
2163 sides = GTK_JUNCTION_BOTTOM;
2165 case GDK_WINDOW_EDGE_SOUTH_EAST:
2166 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2169 g_assert_not_reached();
2172 context = gtk_widget_get_style_context (area);
2173 gtk_style_context_save (context);
2174 gtk_style_context_add_class (context, "grip");
2175 gtk_style_context_set_junction_sides (context, sides);
2176 gtk_render_handle (context, cr,
2178 gtk_widget_get_allocated_width (area),
2179 gtk_widget_get_allocated_height (area));
2181 gtk_style_context_restore (context);
2187 create_resize_grips (GtkWidget *widget)
2189 static GtkWidget *window = NULL;
2191 GtkWidget *hbox, *vbox;
2194 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2196 gtk_window_set_screen (GTK_WINDOW (window),
2197 gtk_widget_get_screen (widget));
2199 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2201 g_signal_connect (window, "destroy",
2202 G_CALLBACK (gtk_widget_destroyed),
2205 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2206 gtk_container_add (GTK_CONTAINER (window), vbox);
2208 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2209 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2212 area = gtk_drawing_area_new ();
2213 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2214 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2215 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2216 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2217 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2218 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2221 area = gtk_drawing_area_new ();
2222 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2223 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2224 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2225 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2226 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2227 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2230 area = gtk_drawing_area_new ();
2231 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2232 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2233 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2234 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2235 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2236 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2238 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2239 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2242 area = gtk_drawing_area_new ();
2243 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2244 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2245 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2246 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2247 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2248 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2251 area = gtk_drawing_area_new ();
2252 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2255 area = gtk_drawing_area_new ();
2256 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2257 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2258 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2259 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2260 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2261 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2264 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2265 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2268 area = gtk_drawing_area_new ();
2269 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2270 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2271 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2272 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2273 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2274 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2276 area = gtk_drawing_area_new ();
2277 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2278 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2279 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2280 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2281 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2282 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2285 area = gtk_drawing_area_new ();
2286 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2287 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2288 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2289 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2290 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2291 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2294 if (!gtk_widget_get_visible (window))
2295 gtk_widget_show_all (window);
2297 gtk_widget_destroy (window);
2303 gint upositionx = 0;
2304 gint upositiony = 0;
2307 uposition_configure (GtkWidget *window)
2313 lx = g_object_get_data (G_OBJECT (window), "x");
2314 ly = g_object_get_data (G_OBJECT (window), "y");
2316 gdk_window_get_root_origin (gtk_widget_get_window (window),
2317 &upositionx, &upositiony);
2318 sprintf (buffer, "%d", upositionx);
2319 gtk_label_set_text (lx, buffer);
2320 sprintf (buffer, "%d", upositiony);
2321 gtk_label_set_text (ly, buffer);
2327 uposition_stop_configure (GtkToggleButton *toggle,
2330 if (gtk_toggle_button_get_active (toggle))
2331 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2333 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2337 create_saved_position (GtkWidget *widget)
2339 static GtkWidget *window = NULL;
2344 GtkWidget *main_vbox;
2352 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2353 "type", GTK_WINDOW_TOPLEVEL,
2354 "title", "Saved Position",
2356 "signal::configure_event", uposition_configure, NULL,
2359 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2361 gtk_window_set_screen (GTK_WINDOW (window),
2362 gtk_widget_get_screen (widget));
2365 g_signal_connect (window, "destroy",
2366 G_CALLBACK (gtk_widget_destroyed),
2369 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2370 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2371 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2374 g_object_new (GTK_TYPE_BOX,
2375 "orientation", GTK_ORIENTATION_VERTICAL,
2376 "GtkBox::homogeneous", FALSE,
2377 "GtkBox::spacing", 5,
2378 "GtkContainer::border_width", 10,
2379 "GtkWidget::parent", main_vbox,
2380 "GtkWidget::visible", TRUE,
2381 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2382 "label", "Stop Events",
2386 "signal::clicked", uposition_stop_configure, window,
2390 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2391 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2392 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2394 label = gtk_label_new ("X Origin : ");
2395 gtk_widget_set_halign (label, GTK_ALIGN_START);
2396 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2397 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2399 x_label = gtk_label_new ("");
2400 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2401 g_object_set_data (G_OBJECT (window), "x", x_label);
2403 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2404 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2405 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2407 label = gtk_label_new ("Y Origin : ");
2408 gtk_widget_set_halign (label, GTK_ALIGN_START);
2409 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2410 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2412 y_label = gtk_label_new ("");
2413 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2414 g_object_set_data (G_OBJECT (window), "y", y_label);
2417 g_object_new (gtk_separator_get_type (),
2418 "GtkWidget::visible", TRUE,
2420 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2422 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2423 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2424 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2426 button = gtk_button_new_with_label ("Close");
2427 g_signal_connect_swapped (button, "clicked",
2428 G_CALLBACK (gtk_widget_destroy),
2430 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2431 gtk_widget_set_can_default (button, TRUE);
2432 gtk_widget_grab_default (button);
2434 gtk_widget_show_all (window);
2437 gtk_widget_destroy (window);
2445 create_pixbuf (GtkWidget *widget)
2447 static GtkWidget *window = NULL;
2453 GtkWidget *separator;
2454 GtkWidget *pixbufwid;
2455 GdkWindow *gdk_window;
2459 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2461 gtk_window_set_screen (GTK_WINDOW (window),
2462 gtk_widget_get_screen (widget));
2464 g_signal_connect (window, "destroy",
2465 G_CALLBACK (gtk_widget_destroyed),
2468 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2469 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2470 gtk_widget_realize(window);
2472 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2473 gtk_container_add (GTK_CONTAINER (window), box1);
2475 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2476 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2477 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2479 button = gtk_button_new ();
2480 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2482 gdk_window = gtk_widget_get_window (window);
2484 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2486 label = gtk_label_new ("Pixbuf\ntest");
2487 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2488 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2489 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2490 gtk_container_add (GTK_CONTAINER (box3), label);
2491 gtk_container_add (GTK_CONTAINER (button), box3);
2493 button = gtk_button_new ();
2494 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2496 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2498 label = gtk_label_new ("Pixbuf\ntest");
2499 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2500 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2501 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2502 gtk_container_add (GTK_CONTAINER (box3), label);
2503 gtk_container_add (GTK_CONTAINER (button), box3);
2505 gtk_widget_set_sensitive (button, FALSE);
2507 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2508 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2510 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2511 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2512 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2514 button = gtk_button_new_with_label ("close");
2515 g_signal_connect_swapped (button, "clicked",
2516 G_CALLBACK (gtk_widget_destroy),
2518 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2519 gtk_widget_set_can_default (button, TRUE);
2520 gtk_widget_grab_default (button);
2523 if (!gtk_widget_get_visible (window))
2524 gtk_widget_show_all (window);
2526 gtk_widget_destroy (window);
2530 create_tooltips (GtkWidget *widget)
2532 static GtkWidget *window = NULL;
2539 GtkWidget *separator;
2544 g_object_new (gtk_window_get_type (),
2545 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2546 "GtkContainer::border_width", 0,
2547 "GtkWindow::title", "Tooltips",
2548 "GtkWindow::resizable", FALSE,
2551 gtk_window_set_screen (GTK_WINDOW (window),
2552 gtk_widget_get_screen (widget));
2554 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2555 gtk_container_add (GTK_CONTAINER (window), box1);
2557 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2558 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2559 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2561 button = gtk_toggle_button_new_with_label ("button1");
2562 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2564 gtk_widget_set_tooltip_text (button, "This is button 1");
2566 button = gtk_toggle_button_new_with_label ("button2");
2567 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2569 gtk_widget_set_tooltip_text (button,
2570 "This is button 2. This is also a really long tooltip which probably "
2571 "won't fit on a single line and will therefore need to be wrapped. "
2572 "Hopefully the wrapping will work correctly.");
2574 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2575 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2577 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2580 g_object_new (GTK_TYPE_BOX,
2581 "orientation", GTK_ORIENTATION_VERTICAL,
2582 "homogeneous", FALSE,
2589 g_object_new (gtk_button_get_type (),
2594 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2595 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2597 frame = g_object_new (gtk_frame_get_type (),
2598 "label", "ToolTips Inspector",
2599 "label_xalign", (double) 0.5,
2605 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2607 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2608 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2610 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2611 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2612 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2614 button = gtk_button_new_with_label ("close");
2615 g_signal_connect_swapped (button, "clicked",
2616 G_CALLBACK (gtk_widget_destroy),
2618 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2619 gtk_widget_set_can_default (button, TRUE);
2620 gtk_widget_grab_default (button);
2622 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2625 if (!gtk_widget_get_visible (window))
2626 gtk_widget_show_all (window);
2628 gtk_widget_destroy (window);
2636 pack_image (GtkWidget *box,
2640 gtk_box_pack_start (GTK_BOX (box),
2641 gtk_label_new (text),
2644 gtk_box_pack_start (GTK_BOX (box),
2650 create_image (GtkWidget *widget)
2652 static GtkWidget *window = NULL;
2659 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2661 gtk_window_set_screen (GTK_WINDOW (window),
2662 gtk_widget_get_screen (widget));
2664 /* this is bogus for testing drawing when allocation < request,
2665 * don't copy into real code
2667 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2669 g_signal_connect (window, "destroy",
2670 G_CALLBACK (gtk_widget_destroyed),
2673 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2675 gtk_container_add (GTK_CONTAINER (window), vbox);
2677 pack_image (vbox, "Stock Warning Dialog",
2678 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2679 GTK_ICON_SIZE_DIALOG));
2681 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2683 pack_image (vbox, "Pixbuf",
2684 gtk_image_new_from_pixbuf (pixbuf));
2686 g_object_unref (pixbuf);
2689 if (!gtk_widget_get_visible (window))
2690 gtk_widget_show_all (window);
2692 gtk_widget_destroy (window);
2700 create_menu (GdkScreen *screen, gint depth, gint length)
2703 GtkWidget *menuitem;
2712 menu = gtk_menu_new ();
2713 gtk_menu_set_screen (GTK_MENU (menu), screen);
2717 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2718 GTK_ICON_SIZE_MENU);
2719 gtk_widget_show (image);
2720 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2721 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2722 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2723 gtk_widget_show (menuitem);
2725 for (i = 0, j = 1; i < length; i++, j++)
2727 sprintf (buf, "item %2d - %d", depth, j);
2729 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2730 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2732 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2733 gtk_widget_show (menuitem);
2735 gtk_widget_set_sensitive (menuitem, FALSE);
2738 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
2742 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
2743 create_menu (screen, depth - 1, 5));
2750 create_table_menu (GdkScreen *screen, gint cols, gint rows)
2753 GtkWidget *menuitem;
2759 menu = gtk_menu_new ();
2760 gtk_menu_set_screen (GTK_MENU (menu), screen);
2764 menuitem = gtk_menu_item_new_with_label ("items");
2765 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
2767 submenu = gtk_menu_new ();
2768 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2769 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2770 gtk_widget_show (menuitem);
2773 /* now fill the items submenu */
2774 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2775 GTK_ICON_SIZE_MENU);
2776 gtk_widget_show (image);
2777 menuitem = gtk_image_menu_item_new_with_label ("Image");
2778 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2779 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
2780 gtk_widget_show (menuitem);
2782 menuitem = gtk_menu_item_new_with_label ("x");
2783 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
2784 gtk_widget_show (menuitem);
2786 menuitem = gtk_menu_item_new_with_label ("x");
2787 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
2788 gtk_widget_show (menuitem);
2790 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2791 GTK_ICON_SIZE_MENU);
2792 gtk_widget_show (image);
2793 menuitem = gtk_image_menu_item_new_with_label ("Image");
2794 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2795 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
2796 gtk_widget_show (menuitem);
2798 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
2799 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
2800 gtk_widget_show (menuitem);
2802 menuitem = gtk_menu_item_new_with_label ("x");
2803 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
2804 gtk_widget_show (menuitem);
2806 menuitem = gtk_menu_item_new_with_label ("x");
2807 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
2808 gtk_widget_show (menuitem);
2810 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
2811 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
2812 gtk_widget_show (menuitem);
2814 menuitem = gtk_check_menu_item_new_with_label ("Check");
2815 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
2816 gtk_widget_show (menuitem);
2818 menuitem = gtk_menu_item_new_with_label ("x");
2819 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
2820 gtk_widget_show (menuitem);
2822 menuitem = gtk_menu_item_new_with_label ("x");
2823 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
2824 gtk_widget_show (menuitem);
2826 menuitem = gtk_check_menu_item_new_with_label ("Check");
2827 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
2828 gtk_widget_show (menuitem);
2830 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
2831 gtk_widget_show (menuitem);
2832 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
2834 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
2835 gtk_widget_show (menuitem);
2836 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
2838 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
2839 gtk_widget_show (menuitem);
2840 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
2842 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
2843 gtk_widget_show (menuitem);
2844 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
2846 /* end of items submenu */
2848 menuitem = gtk_menu_item_new_with_label ("spanning");
2849 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
2851 submenu = gtk_menu_new ();
2852 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2853 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2854 gtk_widget_show (menuitem);
2857 /* now fill the spanning submenu */
2858 menuitem = gtk_menu_item_new_with_label ("a");
2859 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
2860 gtk_widget_show (menuitem);
2862 menuitem = gtk_menu_item_new_with_label ("b");
2863 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
2864 gtk_widget_show (menuitem);
2866 menuitem = gtk_menu_item_new_with_label ("c");
2867 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
2868 gtk_widget_show (menuitem);
2870 menuitem = gtk_menu_item_new_with_label ("d");
2871 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
2872 gtk_widget_show (menuitem);
2874 menuitem = gtk_menu_item_new_with_label ("e");
2875 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
2876 gtk_widget_show (menuitem);
2877 /* end of spanning submenu */
2879 menuitem = gtk_menu_item_new_with_label ("left");
2880 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
2881 submenu = gtk_menu_new ();
2882 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2883 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2884 gtk_widget_show (menuitem);
2886 menuitem = gtk_menu_item_new_with_label ("Empty");
2887 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
2888 submenu = gtk_menu_new ();
2889 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2890 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2891 gtk_widget_show (menuitem);
2893 menuitem = gtk_menu_item_new_with_label ("right");
2894 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
2895 submenu = gtk_menu_new ();
2896 gtk_menu_set_screen (GTK_MENU (submenu), screen);
2897 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
2898 gtk_widget_show (menuitem);
2900 menuitem = gtk_menu_item_new_with_label ("Empty");
2901 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
2902 gtk_widget_show (menuitem);
2906 for (; j < rows; j++)
2907 for (i = 0; i < cols; i++)
2909 sprintf (buf, "(%d %d)", i, j);
2910 menuitem = gtk_menu_item_new_with_label (buf);
2911 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
2912 gtk_widget_show (menuitem);
2915 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
2916 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
2917 gtk_widget_show (menuitem);
2918 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
2919 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
2920 gtk_widget_show (menuitem);
2921 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
2922 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
2923 gtk_widget_show (menuitem);
2924 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
2925 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
2926 gtk_widget_show (menuitem);
2932 create_menus (GtkWidget *widget)
2934 static GtkWidget *window = NULL;
2938 GtkWidget *optionmenu;
2939 GtkWidget *separator;
2945 GtkWidget *menuitem;
2946 GtkAccelGroup *accel_group;
2948 GdkScreen *screen = gtk_widget_get_screen (widget);
2950 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2952 gtk_window_set_screen (GTK_WINDOW (window), screen);
2954 g_signal_connect (window, "destroy",
2955 G_CALLBACK (gtk_widget_destroyed),
2957 g_signal_connect (window, "delete-event",
2958 G_CALLBACK (gtk_true),
2961 accel_group = gtk_accel_group_new ();
2962 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
2964 gtk_window_set_title (GTK_WINDOW (window), "menus");
2965 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2968 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2969 gtk_container_add (GTK_CONTAINER (window), box1);
2970 gtk_widget_show (box1);
2972 menubar = gtk_menu_bar_new ();
2973 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
2974 gtk_widget_show (menubar);
2976 menu = create_menu (screen, 2, 50);
2978 menuitem = gtk_menu_item_new_with_label ("test\nline2");
2979 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
2980 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
2981 gtk_widget_show (menuitem);
2983 menu = create_table_menu (screen, 2, 50);
2985 menuitem = gtk_menu_item_new_with_label ("table");
2986 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
2987 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
2988 gtk_widget_show (menuitem);
2990 menuitem = gtk_menu_item_new_with_label ("foo");
2991 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5));
2992 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
2993 gtk_widget_show (menuitem);
2995 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
2996 GTK_ICON_SIZE_MENU);
2997 gtk_widget_show (image);
2998 menuitem = gtk_image_menu_item_new_with_label ("Help");
2999 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3000 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5));
3001 gtk_widget_set_hexpand (menuitem, TRUE);
3002 gtk_widget_set_halign (menuitem, GTK_ALIGN_END);
3003 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3004 gtk_widget_show (menuitem);
3006 menubar = gtk_menu_bar_new ();
3007 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3008 gtk_widget_show (menubar);
3010 menu = create_menu (screen, 2, 10);
3012 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3013 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3014 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3015 gtk_widget_show (menuitem);
3017 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3018 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3019 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3020 gtk_widget_show (box2);
3022 menu = create_menu (screen, 1, 5);
3023 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3025 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3026 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3027 gtk_widget_show (menuitem);
3029 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3030 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3031 gtk_widget_show (menuitem);
3032 gtk_widget_add_accelerator (menuitem,
3038 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3039 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3040 gtk_widget_show (menuitem);
3041 gtk_widget_add_accelerator (menuitem,
3046 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3047 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3048 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3049 gtk_widget_show (menuitem);
3050 gtk_widget_add_accelerator (menuitem,
3056 gtk_widget_add_accelerator (menuitem,
3063 optionmenu = gtk_combo_box_text_new ();
3064 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3065 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3066 gtk_widget_show (optionmenu);
3068 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3069 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3070 gtk_widget_show (separator);
3072 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3073 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3074 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3075 gtk_widget_show (box2);
3077 button = gtk_button_new_with_label ("close");
3078 g_signal_connect_swapped (button, "clicked",
3079 G_CALLBACK (gtk_widget_destroy),
3081 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3082 gtk_widget_set_can_default (button, TRUE);
3083 gtk_widget_grab_default (button);
3084 gtk_widget_show (button);
3087 if (!gtk_widget_get_visible (window))
3088 gtk_widget_show (window);
3090 gtk_widget_destroy (window);
3093 /* GdkPixbuf RGBA C-Source image dump */
3095 static const guint8 apple[] =
3097 /* Pixbuf magic (0x47646b50) */
3099 /* length: header (24) + pixel_data (2304) */
3101 /* pixdata_type (0x1010002) */
3103 /* rowstride (96) */
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\0\0"
3115 "\0\0\0\0\0\0\0\0\0\0\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\26\24"
3117 "\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"
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`m"
3119 "[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"
3120 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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`l[Blza\373s\202d\354w\206g\372p~c"
3122 "\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"
3123 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3124 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3125 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3126 "\0\0\0\0\0\0\0\0\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"
3127 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3128 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3129 "\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["
3130 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3131 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3132 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3133 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3134 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3135 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3136 "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"
3137 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3138 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3139 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3140 "\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"
3141 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3142 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3143 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3144 "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"
3145 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3146 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3147 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3148 "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"
3149 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3150 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3151 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3152 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3153 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3154 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3155 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3156 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3157 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3158 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3159 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3160 "\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>"
3161 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3162 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3163 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3164 "\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"
3165 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3166 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3167 "\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"
3168 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3169 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3170 "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"
3171 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3172 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3173 "\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"
3174 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3175 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3176 "\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"
3177 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3178 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3179 "\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"
3180 "\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"
3181 "\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"
3182 "\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"
3183 "\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"
3184 "\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"
3185 "\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"
3186 "\0\0\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"
3187 "\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"
3188 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3192 accel_button_new (GtkAccelGroup *accel_group,
3197 GdkModifierType modifiers;
3201 gtk_accelerator_parse (accel, &keyval, &modifiers);
3204 button = gtk_button_new ();
3205 gtk_widget_add_accelerator (button, "activate", accel_group,
3206 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3208 label = gtk_accel_label_new (text);
3209 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3210 gtk_widget_show (label);
3212 gtk_container_add (GTK_CONTAINER (button), label);
3218 create_key_lookup (GtkWidget *widget)
3220 static GtkWidget *window = NULL;
3221 gpointer window_ptr;
3225 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3227 GtkWidget *content_area;
3229 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3230 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3233 gtk_window_set_screen (GTK_WINDOW (window),
3234 gtk_widget_get_screen (widget));
3236 /* We have to expand it so the accel labels will draw their labels
3238 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3240 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3242 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3244 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3245 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3246 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3247 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3248 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3249 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3250 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3251 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3252 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3253 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3254 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3255 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3256 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3257 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3258 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3259 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3260 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3261 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3262 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3263 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3264 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3265 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3266 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3267 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3268 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3269 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3270 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3271 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3273 window_ptr = &window;
3274 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3275 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3277 gtk_widget_show_all (window);
3280 gtk_widget_destroy (window);
3289 cmw_destroy_cb(GtkWidget *widget)
3291 /* This is needed to get out of gtk_main */
3298 cmw_color (GtkWidget *widget, GtkWidget *parent)
3301 GtkWidget *colorsel;
3302 GtkWidget *ok_button, *cancel_button;
3304 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3306 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3308 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3309 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3313 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3315 /* And mark it as a transient dialog */
3316 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3318 g_signal_connect (csd, "destroy",
3319 G_CALLBACK (cmw_destroy_cb), NULL);
3322 "ok-button", &ok_button,
3323 "cancel-button", &cancel_button,
3326 g_signal_connect_swapped (ok_button,
3327 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3328 g_signal_connect_swapped (cancel_button,
3329 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3331 /* wait until destroy calls gtk_main_quit */
3332 gtk_widget_show (csd);
3337 cmw_file (GtkWidget *widget, GtkWidget *parent)
3341 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3342 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3343 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3344 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3346 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3347 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3349 g_signal_connect (fs, "destroy",
3350 G_CALLBACK (cmw_destroy_cb), NULL);
3351 g_signal_connect_swapped (fs, "response",
3352 G_CALLBACK (gtk_widget_destroy), fs);
3354 /* wait until destroy calls gtk_main_quit */
3355 gtk_widget_show (fs);
3361 create_modal_window (GtkWidget *widget)
3363 GtkWidget *window = NULL;
3364 GtkWidget *box1,*box2;
3366 GtkWidget *btnColor,*btnFile,*btnClose;
3368 /* Create modal window (Here you can use any window descendent )*/
3369 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3370 gtk_window_set_screen (GTK_WINDOW (window),
3371 gtk_widget_get_screen (widget));
3373 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3375 /* Set window as modal */
3376 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3378 /* Create widgets */
3379 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3380 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3381 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3382 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3383 btnColor = gtk_button_new_with_label ("Color");
3384 btnFile = gtk_button_new_with_label ("File Selection");
3385 btnClose = gtk_button_new_with_label ("Close");
3388 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3389 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3392 gtk_container_add (GTK_CONTAINER (window), box1);
3393 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3394 gtk_container_add (GTK_CONTAINER (frame1), box2);
3395 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3396 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3397 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3398 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3400 /* connect signals */
3401 g_signal_connect_swapped (btnClose, "clicked",
3402 G_CALLBACK (gtk_widget_destroy), window);
3404 g_signal_connect (window, "destroy",
3405 G_CALLBACK (cmw_destroy_cb), NULL);
3407 g_signal_connect (btnColor, "clicked",
3408 G_CALLBACK (cmw_color), window);
3409 g_signal_connect (btnFile, "clicked",
3410 G_CALLBACK (cmw_file), window);
3413 gtk_widget_show_all (window);
3415 /* wait until dialog get destroyed */
3424 make_message_dialog (GdkScreen *screen,
3426 GtkMessageType type,
3427 GtkButtonsType buttons,
3428 guint default_response)
3432 gtk_widget_destroy (*dialog);
3437 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3438 "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.)");
3440 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3442 g_signal_connect_swapped (*dialog,
3444 G_CALLBACK (gtk_widget_destroy),
3447 g_signal_connect (*dialog,
3449 G_CALLBACK (gtk_widget_destroyed),
3452 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3454 gtk_widget_show (*dialog);
3458 create_message_dialog (GtkWidget *widget)
3460 static GtkWidget *info = NULL;
3461 static GtkWidget *warning = NULL;
3462 static GtkWidget *error = NULL;
3463 static GtkWidget *question = NULL;
3464 GdkScreen *screen = gtk_widget_get_screen (widget);
3466 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3467 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3468 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3469 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3476 static GtkWidget *sw_parent = NULL;
3477 static GtkWidget *sw_float_parent;
3478 static gulong sw_destroyed_handler = 0;
3481 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3483 gtk_widget_reparent (scrollwin, sw_parent);
3485 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3486 sw_float_parent = NULL;
3488 sw_destroyed_handler = 0;
3494 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3496 gtk_widget_destroy (sw_float_parent);
3498 sw_float_parent = NULL;
3500 sw_destroyed_handler = 0;
3504 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3508 gtk_widget_reparent (scrollwin, sw_parent);
3509 gtk_widget_destroy (sw_float_parent);
3511 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3512 sw_float_parent = NULL;
3514 sw_destroyed_handler = 0;
3518 sw_parent = gtk_widget_get_parent (scrollwin);
3519 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3520 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3521 gtk_widget_get_screen (widget));
3523 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3525 gtk_widget_reparent (scrollwin, sw_float_parent);
3526 gtk_widget_show (sw_float_parent);
3528 sw_destroyed_handler =
3529 g_signal_connect (sw_parent, "destroy",
3530 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3531 g_signal_connect (sw_float_parent, "delete_event",
3532 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3537 create_scrolled_windows (GtkWidget *widget)
3539 static GtkWidget *window;
3540 GtkWidget *content_area, *action_area;
3541 GtkWidget *scrolled_window;
3549 window = gtk_dialog_new ();
3551 gtk_window_set_screen (GTK_WINDOW (window),
3552 gtk_widget_get_screen (widget));
3554 g_signal_connect (window, "destroy",
3555 G_CALLBACK (gtk_widget_destroyed),
3558 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3559 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3561 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3562 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3564 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3565 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3566 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3567 GTK_POLICY_AUTOMATIC,
3568 GTK_POLICY_AUTOMATIC);
3569 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3570 gtk_widget_show (scrolled_window);
3572 grid = gtk_grid_new ();
3573 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
3574 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
3575 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), grid);
3576 gtk_container_set_focus_hadjustment (GTK_CONTAINER (grid),
3577 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3578 gtk_container_set_focus_vadjustment (GTK_CONTAINER (grid),
3579 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3580 gtk_widget_show (grid);
3582 for (i = 0; i < 20; i++)
3583 for (j = 0; j < 20; j++)
3585 sprintf (buffer, "button (%d,%d)\n", i, j);
3586 button = gtk_toggle_button_new_with_label (buffer);
3587 gtk_grid_attach (GTK_GRID (grid), button, i, j, 1, 1);
3588 gtk_widget_show (button);
3592 button = gtk_button_new_with_label ("Close");
3593 g_signal_connect_swapped (button, "clicked",
3594 G_CALLBACK (gtk_widget_destroy),
3596 gtk_widget_set_can_default (button, TRUE);
3597 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3598 gtk_widget_grab_default (button);
3599 gtk_widget_show (button);
3601 button = gtk_button_new_with_label ("Reparent Out");
3602 g_signal_connect (button, "clicked",
3603 G_CALLBACK (scrolled_windows_remove),
3605 gtk_widget_set_can_default (button, TRUE);
3606 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3607 gtk_widget_grab_default (button);
3608 gtk_widget_show (button);
3610 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3613 if (!gtk_widget_get_visible (window))
3614 gtk_widget_show (window);
3616 gtk_widget_destroy (window);
3624 entry_toggle_frame (GtkWidget *checkbutton,
3627 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3628 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3632 entry_toggle_sensitive (GtkWidget *checkbutton,
3635 gtk_widget_set_sensitive (entry,
3636 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3640 entry_progress_timeout (gpointer data)
3642 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3644 gtk_entry_progress_pulse (GTK_ENTRY (data));
3650 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3653 if (fraction > 1.0001)
3656 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3659 return G_SOURCE_CONTINUE;
3663 entry_remove_timeout (gpointer data)
3665 g_source_remove (GPOINTER_TO_UINT (data));
3669 entry_toggle_progress (GtkWidget *checkbutton,
3672 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3674 guint timeout = gdk_threads_add_timeout (100,
3675 entry_progress_timeout,
3677 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3678 GUINT_TO_POINTER (timeout),
3679 entry_remove_timeout);
3683 g_object_set_data (G_OBJECT (entry), "timeout-id",
3684 GUINT_TO_POINTER (0));
3686 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3691 entry_toggle_pulse (GtkWidget *checkbutton,
3694 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3695 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3699 props_clicked (GtkWidget *button,
3702 GtkWidget *window = create_prop_editor (object, 0);
3704 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3708 create_entry (GtkWidget *widget)
3710 static GtkWidget *window = NULL;
3714 GtkWidget *has_frame_check;
3715 GtkWidget *sensitive_check;
3716 GtkWidget *progress_check;
3718 GtkComboBoxText *cb;
3719 GtkWidget *cb_entry;
3721 GtkWidget *separator;
3725 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3726 gtk_window_set_screen (GTK_WINDOW (window),
3727 gtk_widget_get_screen (widget));
3729 g_signal_connect (window, "destroy",
3730 G_CALLBACK (gtk_widget_destroyed),
3733 gtk_window_set_title (GTK_WINDOW (window), "entry");
3734 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3737 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3738 gtk_container_add (GTK_CONTAINER (window), box1);
3741 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3742 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3743 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3745 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
3746 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
3748 entry = gtk_entry_new ();
3749 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");
3750 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
3751 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
3753 button = gtk_button_new_with_mnemonic ("_Props");
3754 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
3755 g_signal_connect (button, "clicked",
3756 G_CALLBACK (props_clicked),
3759 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
3761 gtk_combo_box_text_append_text (cb, "item0");
3762 gtk_combo_box_text_append_text (cb, "item0");
3763 gtk_combo_box_text_append_text (cb, "item1 item1");
3764 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
3765 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
3766 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
3767 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
3768 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
3769 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
3770 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
3771 gtk_combo_box_text_append_text (cb, "item9 item9");
3773 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
3774 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
3775 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
3776 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
3778 sensitive_check = gtk_check_button_new_with_label("Sensitive");
3779 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
3780 g_signal_connect (sensitive_check, "toggled",
3781 G_CALLBACK (entry_toggle_sensitive), entry);
3782 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
3784 has_frame_check = gtk_check_button_new_with_label("Has Frame");
3785 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
3786 g_signal_connect (has_frame_check, "toggled",
3787 G_CALLBACK (entry_toggle_frame), entry);
3788 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
3790 progress_check = gtk_check_button_new_with_label("Show Progress");
3791 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
3792 g_signal_connect (progress_check, "toggled",
3793 G_CALLBACK (entry_toggle_progress), entry);
3795 progress_check = gtk_check_button_new_with_label("Pulse Progress");
3796 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
3797 g_signal_connect (progress_check, "toggled",
3798 G_CALLBACK (entry_toggle_pulse), entry);
3800 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3801 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3803 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3804 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3805 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3807 button = gtk_button_new_with_label ("close");
3808 g_signal_connect_swapped (button, "clicked",
3809 G_CALLBACK (gtk_widget_destroy),
3811 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3812 gtk_widget_set_can_default (button, TRUE);
3813 gtk_widget_grab_default (button);
3816 if (!gtk_widget_get_visible (window))
3817 gtk_widget_show_all (window);
3819 gtk_widget_destroy (window);
3823 create_expander (GtkWidget *widget)
3826 GtkWidget *expander;
3828 static GtkWidget *window = NULL;
3832 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3833 gtk_window_set_screen (GTK_WINDOW (window),
3834 gtk_widget_get_screen (widget));
3836 g_signal_connect (window, "destroy",
3837 G_CALLBACK (gtk_widget_destroyed),
3840 gtk_window_set_title (GTK_WINDOW (window), "expander");
3841 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3843 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3844 gtk_container_add (GTK_CONTAINER (window), box1);
3846 expander = gtk_expander_new ("The Hidden");
3848 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
3850 hidden = gtk_label_new ("Revealed!");
3852 gtk_container_add (GTK_CONTAINER (expander), hidden);
3855 if (!gtk_widget_get_visible (window))
3856 gtk_widget_show_all (window);
3858 gtk_widget_destroy (window);
3866 event_box_label_pressed (GtkWidget *widget,
3867 GdkEventButton *event,
3870 g_print ("clicked on event box\n");
3874 event_box_button_clicked (GtkWidget *widget,
3878 g_print ("pushed button\n");
3882 event_box_toggle_visible_window (GtkWidget *checkbutton,
3883 GtkEventBox *event_box)
3885 gtk_event_box_set_visible_window (event_box,
3886 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3890 event_box_toggle_above_child (GtkWidget *checkbutton,
3891 GtkEventBox *event_box)
3893 gtk_event_box_set_above_child (event_box,
3894 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3898 create_event_box (GtkWidget *widget)
3900 static GtkWidget *window = NULL;
3906 GtkWidget *separator;
3907 GtkWidget *event_box;
3909 GtkWidget *visible_window_check;
3910 GtkWidget *above_child_check;
3920 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3921 gtk_window_set_screen (GTK_WINDOW (window),
3922 gtk_widget_get_screen (widget));
3924 g_signal_connect (window, "destroy",
3925 G_CALLBACK (gtk_widget_destroyed),
3928 gtk_window_set_title (GTK_WINDOW (window), "event box");
3929 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3931 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3932 gtk_container_add (GTK_CONTAINER (window), box1);
3933 gtk_widget_override_background_color (window, 0, &color);
3935 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
3936 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
3938 event_box = gtk_event_box_new ();
3939 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
3941 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3942 gtk_container_add (GTK_CONTAINER (event_box), vbox);
3943 g_signal_connect (event_box, "button_press_event",
3944 G_CALLBACK (event_box_label_pressed),
3947 label = gtk_label_new ("Click on this label");
3948 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
3950 button = gtk_button_new_with_label ("button in eventbox");
3951 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
3952 g_signal_connect (button, "clicked",
3953 G_CALLBACK (event_box_button_clicked),
3957 visible_window_check = gtk_check_button_new_with_label("Visible Window");
3958 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
3959 g_signal_connect (visible_window_check, "toggled",
3960 G_CALLBACK (event_box_toggle_visible_window), event_box);
3961 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
3963 above_child_check = gtk_check_button_new_with_label("Above Child");
3964 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
3965 g_signal_connect (above_child_check, "toggled",
3966 G_CALLBACK (event_box_toggle_above_child), event_box);
3967 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
3969 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3970 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3972 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3973 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3974 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3976 button = gtk_button_new_with_label ("close");
3977 g_signal_connect_swapped (button, "clicked",
3978 G_CALLBACK (gtk_widget_destroy),
3980 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3981 gtk_widget_set_can_default (button, TRUE);
3982 gtk_widget_grab_default (button);
3985 if (!gtk_widget_get_visible (window))
3986 gtk_widget_show_all (window);
3988 gtk_widget_destroy (window);
3996 #define SIZE_GROUP_INITIAL_SIZE 50
3999 size_group_hsize_changed (GtkSpinButton *spin_button,
4002 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4003 gtk_spin_button_get_value_as_int (spin_button),
4008 size_group_vsize_changed (GtkSpinButton *spin_button,
4011 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4013 gtk_spin_button_get_value_as_int (spin_button));
4017 create_size_group_window (GdkScreen *screen,
4018 GtkSizeGroup *master_size_group)
4020 GtkWidget *content_area;
4023 GtkWidget *main_button;
4025 GtkWidget *spin_button;
4027 GtkSizeGroup *hgroup1;
4028 GtkSizeGroup *hgroup2;
4029 GtkSizeGroup *vgroup1;
4030 GtkSizeGroup *vgroup2;
4032 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4038 gtk_window_set_screen (GTK_WINDOW (window), screen);
4040 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4042 g_signal_connect (window, "response",
4043 G_CALLBACK (gtk_widget_destroy),
4046 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4048 grid = gtk_grid_new ();
4049 gtk_box_pack_start (GTK_BOX (content_area), grid, TRUE, TRUE, 0);
4051 gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
4052 gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
4053 gtk_container_set_border_width (GTK_CONTAINER (grid), 5);
4054 gtk_widget_set_size_request (grid, 250, 250);
4056 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4057 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4058 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4059 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4061 main_button = gtk_button_new_with_label ("X");
4062 gtk_widget_set_hexpand (main_button, TRUE);
4063 gtk_widget_set_vexpand (main_button, TRUE);
4064 gtk_widget_set_halign (main_button, GTK_ALIGN_CENTER);
4065 gtk_widget_set_valign (main_button, GTK_ALIGN_CENTER);
4066 gtk_grid_attach (GTK_GRID (grid), main_button, 0, 0, 1, 1);
4068 gtk_size_group_add_widget (master_size_group, main_button);
4069 gtk_size_group_add_widget (hgroup1, main_button);
4070 gtk_size_group_add_widget (vgroup1, main_button);
4071 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4072 SIZE_GROUP_INITIAL_SIZE,
4073 SIZE_GROUP_INITIAL_SIZE);
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, 0, 1, 1);
4082 gtk_size_group_add_widget (vgroup1, button);
4083 gtk_size_group_add_widget (vgroup2, button);
4085 button = gtk_button_new ();
4086 gtk_widget_set_hexpand (button, TRUE);
4087 gtk_widget_set_vexpand (button, TRUE);
4088 gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
4089 gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
4090 gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 1, 1);
4092 gtk_size_group_add_widget (hgroup1, button);
4093 gtk_size_group_add_widget (hgroup2, button);
4095 button = gtk_button_new ();
4096 gtk_widget_set_hexpand (button, TRUE);
4097 gtk_widget_set_vexpand (button, TRUE);
4098 gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
4099 gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
4100 gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1);
4102 gtk_size_group_add_widget (hgroup2, button);
4103 gtk_size_group_add_widget (vgroup2, button);
4105 g_object_unref (hgroup1);
4106 g_object_unref (hgroup2);
4107 g_object_unref (vgroup1);
4108 g_object_unref (vgroup2);
4110 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4111 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4113 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4114 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4115 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4116 g_signal_connect (spin_button, "value_changed",
4117 G_CALLBACK (size_group_hsize_changed), main_button);
4119 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4120 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4121 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4122 g_signal_connect (spin_button, "value_changed",
4123 G_CALLBACK (size_group_vsize_changed), main_button);
4129 create_size_groups (GtkWidget *widget)
4131 static GtkWidget *window1 = NULL;
4132 static GtkWidget *window2 = NULL;
4133 static GtkSizeGroup *master_size_group;
4135 if (!master_size_group)
4136 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4140 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4143 g_signal_connect (window1, "destroy",
4144 G_CALLBACK (gtk_widget_destroyed),
4150 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4153 g_signal_connect (window2, "destroy",
4154 G_CALLBACK (gtk_widget_destroyed),
4158 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4160 gtk_widget_destroy (window1);
4161 gtk_widget_destroy (window2);
4165 if (!gtk_widget_get_visible (window1))
4166 gtk_widget_show_all (window1);
4167 if (!gtk_widget_get_visible (window2))
4168 gtk_widget_show_all (window2);
4176 static GtkWidget *spinner1;
4179 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4181 gtk_spin_button_set_snap_to_ticks (spin,
4182 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4186 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4188 gtk_spin_button_set_numeric (spin,
4189 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4193 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4195 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4196 gtk_spin_button_get_value_as_int (spin));
4200 get_value (GtkWidget *widget, gpointer data)
4204 GtkSpinButton *spin;
4206 spin = GTK_SPIN_BUTTON (spinner1);
4207 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4208 if (GPOINTER_TO_INT (data) == 1)
4209 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4211 sprintf (buf, "%0.*f",
4212 gtk_spin_button_get_digits (spin),
4213 gtk_spin_button_get_value (spin));
4215 gtk_label_set_text (label, buf);
4219 get_spin_value (GtkWidget *widget, gpointer data)
4223 GtkSpinButton *spin;
4225 spin = GTK_SPIN_BUTTON (widget);
4226 label = GTK_LABEL (data);
4228 buffer = g_strdup_printf ("%0.*f",
4229 gtk_spin_button_get_digits (spin),
4230 gtk_spin_button_get_value (spin));
4231 gtk_label_set_text (label, buffer);
4237 spin_button_time_output_func (GtkSpinButton *spin_button)
4239 GtkAdjustment *adjustment;
4240 static gchar buf[6];
4244 adjustment = gtk_spin_button_get_adjustment (spin_button);
4245 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4246 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4247 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4248 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4249 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4254 spin_button_month_input_func (GtkSpinButton *spin_button,
4258 static gchar *month[12] = { "January", "February", "March", "April",
4259 "May", "June", "July", "August",
4260 "September", "October", "November", "December" };
4262 gboolean found = FALSE;
4264 for (i = 1; i <= 12; i++)
4266 tmp1 = g_ascii_strup (month[i - 1], -1);
4267 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4268 if (strstr (tmp1, tmp2) == tmp1)
4278 return GTK_INPUT_ERROR;
4280 *new_val = (gdouble) i;
4285 spin_button_month_output_func (GtkSpinButton *spin_button)
4287 GtkAdjustment *adjustment;
4290 static gchar *month[12] = { "January", "February", "March", "April",
4291 "May", "June", "July", "August", "September",
4292 "October", "November", "December" };
4294 adjustment = gtk_spin_button_get_adjustment (spin_button);
4295 value = gtk_adjustment_get_value (adjustment);
4296 for (i = 1; i <= 12; i++)
4297 if (fabs (value - (double)i) < 1e-5)
4299 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4300 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4306 spin_button_hex_input_func (GtkSpinButton *spin_button,
4313 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4314 res = strtol(buf, &err, 16);
4317 return GTK_INPUT_ERROR;
4323 spin_button_hex_output_func (GtkSpinButton *spin_button)
4325 GtkAdjustment *adjustment;
4326 static gchar buf[7];
4329 adjustment = gtk_spin_button_get_adjustment (spin_button);
4330 val = (gint) gtk_adjustment_get_value (adjustment);
4331 if (fabs (val) < 1e-5)
4332 sprintf (buf, "0x00");
4334 sprintf (buf, "0x%.2X", val);
4335 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4336 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4341 create_spins (GtkWidget *widget)
4343 static GtkWidget *window = NULL;
4346 GtkWidget *main_vbox;
4349 GtkWidget *spinner2;
4353 GtkWidget *val_label;
4354 GtkAdjustment *adjustment;
4358 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4359 gtk_window_set_screen (GTK_WINDOW (window),
4360 gtk_widget_get_screen (widget));
4362 g_signal_connect (window, "destroy",
4363 G_CALLBACK (gtk_widget_destroyed),
4366 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4368 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4369 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4370 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4372 frame = gtk_frame_new ("Not accelerated");
4373 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4375 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4376 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4377 gtk_container_add (GTK_CONTAINER (frame), vbox);
4379 /* Time, month, hex spinners */
4381 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4382 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4384 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4385 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4387 label = gtk_label_new ("Time :");
4388 gtk_widget_set_halign (label, GTK_ALIGN_START);
4389 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4390 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4392 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4393 spinner = gtk_spin_button_new (adjustment, 0, 0);
4394 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4395 g_signal_connect (spinner,
4397 G_CALLBACK (spin_button_time_output_func),
4399 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4400 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4401 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4403 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4404 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4406 label = gtk_label_new ("Month :");
4407 gtk_widget_set_halign (label, GTK_ALIGN_START);
4408 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4409 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4411 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4413 spinner = gtk_spin_button_new (adjustment, 0, 0);
4414 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4415 GTK_UPDATE_IF_VALID);
4416 g_signal_connect (spinner,
4418 G_CALLBACK (spin_button_month_input_func),
4420 g_signal_connect (spinner,
4422 G_CALLBACK (spin_button_month_output_func),
4424 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4425 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4426 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4428 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4429 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4431 label = gtk_label_new ("Hex :");
4432 gtk_widget_set_halign (label, GTK_ALIGN_START);
4433 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4434 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4436 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4437 spinner = gtk_spin_button_new (adjustment, 0, 0);
4438 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4439 g_signal_connect (spinner,
4441 G_CALLBACK (spin_button_hex_input_func),
4443 g_signal_connect (spinner,
4445 G_CALLBACK (spin_button_hex_output_func),
4447 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4448 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4449 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4451 frame = gtk_frame_new ("Accelerated");
4452 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4454 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4455 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4456 gtk_container_add (GTK_CONTAINER (frame), vbox);
4458 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4459 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4461 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4462 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4464 label = gtk_label_new ("Value :");
4465 gtk_widget_set_halign (label, GTK_ALIGN_START);
4466 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4467 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4469 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4471 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4472 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4473 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4475 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4476 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4478 label = gtk_label_new ("Digits :");
4479 gtk_widget_set_halign (label, GTK_ALIGN_START);
4480 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4481 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4483 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4484 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4485 g_signal_connect (adjustment, "value_changed",
4486 G_CALLBACK (change_digits),
4488 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4490 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4491 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4493 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4494 g_signal_connect (button, "clicked",
4495 G_CALLBACK (toggle_snap),
4497 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4498 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4500 button = gtk_check_button_new_with_label ("Numeric only input mode");
4501 g_signal_connect (button, "clicked",
4502 G_CALLBACK (toggle_numeric),
4504 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4505 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4507 val_label = gtk_label_new ("");
4509 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4510 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4512 button = gtk_button_new_with_label ("Value as Int");
4513 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4514 g_signal_connect (button, "clicked",
4515 G_CALLBACK (get_value),
4516 GINT_TO_POINTER (1));
4517 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4519 button = gtk_button_new_with_label ("Value as Float");
4520 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4521 g_signal_connect (button, "clicked",
4522 G_CALLBACK (get_value),
4523 GINT_TO_POINTER (2));
4524 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4526 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4527 gtk_label_set_text (GTK_LABEL (val_label), "0");
4529 frame = gtk_frame_new ("Using Convenience Constructor");
4530 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4532 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4533 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4534 gtk_container_add (GTK_CONTAINER (frame), hbox);
4536 val_label = gtk_label_new ("0.0");
4538 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4539 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4540 g_signal_connect (spinner, "value_changed",
4541 G_CALLBACK (get_spin_value), val_label);
4542 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4543 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4545 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4546 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4548 button = gtk_button_new_with_label ("Close");
4549 g_signal_connect_swapped (button, "clicked",
4550 G_CALLBACK (gtk_widget_destroy),
4552 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4555 if (!gtk_widget_get_visible (window))
4556 gtk_widget_show_all (window);
4558 gtk_widget_destroy (window);
4567 cursor_draw (GtkWidget *widget,
4572 GtkStyleContext *context;
4575 width = gtk_widget_get_allocated_width (widget);
4576 height = gtk_widget_get_allocated_height (widget);
4578 cairo_set_source_rgb (cr, 1, 1, 1);
4579 cairo_rectangle (cr, 0, 0, width, height / 2);
4582 cairo_set_source_rgb (cr, 0, 0, 0);
4583 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4586 context = gtk_widget_get_style_context (widget);
4587 gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
4588 gdk_cairo_set_source_rgba (cr, &bg);
4589 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4596 set_cursor (GtkWidget *spinner,
4605 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4608 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4610 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4611 vals = class->values;
4613 while (vals && vals->value != c)
4616 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4618 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4620 g_type_class_unref (class);
4622 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4623 gdk_window_set_cursor (gtk_widget_get_window (widget),
4625 g_object_unref (cursor);
4629 cursor_event (GtkWidget *widget,
4631 GtkSpinButton *spinner)
4633 if ((event->type == GDK_BUTTON_PRESS) &&
4634 ((event->button.button == GDK_BUTTON_PRIMARY) ||
4635 (event->button.button == GDK_BUTTON_SECONDARY)))
4637 gtk_spin_button_spin (spinner, event->button.button == GDK_BUTTON_PRIMARY ?
4638 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4645 #ifdef GDK_WINDOWING_X11
4646 #include "x11/gdkx.h"
4649 change_cursor_theme (GtkWidget *widget,
4656 children = gtk_container_get_children (GTK_CONTAINER (data));
4658 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4659 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4661 g_list_free (children);
4663 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4670 create_cursors (GtkWidget *widget)
4672 static GtkWidget *window = NULL;
4675 GtkWidget *main_vbox;
4682 GtkAdjustment *adjustment;
4688 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4689 gtk_window_set_screen (GTK_WINDOW (window),
4690 gtk_widget_get_screen (widget));
4692 g_signal_connect (window, "destroy",
4693 G_CALLBACK (gtk_widget_destroyed),
4696 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4698 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4699 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4700 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4703 g_object_new (GTK_TYPE_BOX,
4704 "orientation", GTK_ORIENTATION_VERTICAL,
4705 "GtkBox::homogeneous", FALSE,
4706 "GtkBox::spacing", 5,
4707 "GtkContainer::border_width", 10,
4708 "GtkWidget::parent", main_vbox,
4709 "GtkWidget::visible", TRUE,
4712 #ifdef GDK_WINDOWING_X11
4713 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4714 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4715 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4717 label = gtk_label_new ("Cursor Theme : ");
4718 gtk_widget_set_halign (label, GTK_ALIGN_START);
4719 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4720 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4722 entry = gtk_entry_new ();
4723 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4724 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4726 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4727 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4728 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4730 g_signal_connect (entry, "changed",
4731 G_CALLBACK (change_cursor_theme), hbox);
4732 g_signal_connect (size, "changed",
4733 G_CALLBACK (change_cursor_theme), hbox);
4736 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4737 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4738 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4740 label = gtk_label_new ("Cursor Value : ");
4741 gtk_widget_set_halign (label, GTK_ALIGN_START);
4742 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4743 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4745 adjustment = gtk_adjustment_new (0,
4749 spinner = gtk_spin_button_new (adjustment, 0, 0);
4750 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
4753 g_object_new (gtk_frame_get_type (),
4754 "GtkFrame::label_xalign", 0.5,
4755 "GtkFrame::label", "Cursor Area",
4756 "GtkContainer::border_width", 10,
4757 "GtkWidget::parent", vbox,
4758 "GtkWidget::visible", TRUE,
4761 darea = gtk_drawing_area_new ();
4762 gtk_widget_set_size_request (darea, 80, 80);
4763 gtk_container_add (GTK_CONTAINER (frame), darea);
4764 g_signal_connect (darea,
4766 G_CALLBACK (cursor_draw),
4768 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
4769 g_signal_connect (darea,
4770 "button_press_event",
4771 G_CALLBACK (cursor_event),
4773 gtk_widget_show (darea);
4775 g_signal_connect (spinner, "changed",
4776 G_CALLBACK (set_cursor),
4779 label = g_object_new (GTK_TYPE_LABEL,
4784 gtk_container_child_set (GTK_CONTAINER (vbox), label,
4787 g_object_set_data (G_OBJECT (spinner), "user_data", label);
4789 any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4790 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
4792 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4793 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
4794 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4796 button = gtk_button_new_with_label ("Close");
4797 g_signal_connect_swapped (button, "clicked",
4798 G_CALLBACK (gtk_widget_destroy),
4800 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4802 gtk_widget_show_all (window);
4804 set_cursor (spinner, darea);
4807 gtk_widget_destroy (window);
4815 create_color_selection (GtkWidget *widget)
4817 static GtkWidget *window = NULL;
4826 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4827 gtk_window_set_screen (GTK_WINDOW (window),
4828 gtk_widget_get_screen (widget));
4830 g_signal_connect (window, "destroy",
4831 G_CALLBACK (gtk_widget_destroyed),
4834 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
4835 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4837 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
4838 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
4839 gtk_container_add (GTK_CONTAINER (window), hbox);
4841 label = gtk_label_new ("Pick a color");
4842 gtk_container_add (GTK_CONTAINER (hbox), label);
4844 picker = gtk_color_button_new ();
4845 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
4846 gtk_container_add (GTK_CONTAINER (hbox), picker);
4848 button = gtk_button_new_with_mnemonic ("_Props");
4849 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4850 g_signal_connect (button, "clicked",
4851 G_CALLBACK (props_clicked),
4855 if (!gtk_widget_get_visible (window))
4856 gtk_widget_show_all (window);
4858 gtk_widget_destroy (window);
4862 flipping_toggled_cb (GtkWidget *widget, gpointer data)
4864 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
4865 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
4867 gtk_widget_set_default_direction (new_direction);
4871 orientable_toggle_orientation (GtkOrientable *orientable)
4873 GtkOrientation orientation;
4875 orientation = gtk_orientable_get_orientation (orientable);
4876 gtk_orientable_set_orientation (orientable,
4877 orientation == GTK_ORIENTATION_HORIZONTAL ?
4878 GTK_ORIENTATION_VERTICAL :
4879 GTK_ORIENTATION_HORIZONTAL);
4881 if (GTK_IS_CONTAINER (orientable))
4886 children = gtk_container_get_children (GTK_CONTAINER (orientable));
4888 for (child = children; child; child = child->next)
4890 if (GTK_IS_ORIENTABLE (child->data))
4891 orientable_toggle_orientation (child->data);
4894 g_list_free (children);
4899 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
4901 GtkWidget *content_area;
4902 GtkWidget *toplevel;
4904 toplevel = gtk_widget_get_toplevel (widget);
4905 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
4906 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
4910 set_direction_recurse (GtkWidget *widget,
4913 GtkTextDirection *dir = data;
4915 gtk_widget_set_direction (widget, *dir);
4916 if (GTK_IS_CONTAINER (widget))
4917 gtk_container_foreach (GTK_CONTAINER (widget),
4918 set_direction_recurse,
4923 create_forward_back (const char *title,
4924 GtkTextDirection text_dir)
4926 GtkWidget *frame = gtk_frame_new (title);
4927 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
4928 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
4929 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
4931 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
4933 gtk_container_add (GTK_CONTAINER (frame), bbox);
4934 gtk_container_add (GTK_CONTAINER (bbox), back_button);
4935 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
4937 set_direction_recurse (frame, &text_dir);
4943 create_flipping (GtkWidget *widget)
4945 static GtkWidget *window = NULL;
4946 GtkWidget *check_button, *button;
4947 GtkWidget *action_area, *content_area;
4951 window = gtk_dialog_new ();
4953 gtk_window_set_screen (GTK_WINDOW (window),
4954 gtk_widget_get_screen (widget));
4956 g_signal_connect (window, "destroy",
4957 G_CALLBACK (gtk_widget_destroyed),
4960 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4961 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
4963 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
4965 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
4966 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
4967 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
4969 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
4970 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
4972 g_signal_connect (check_button, "toggled",
4973 G_CALLBACK (flipping_toggled_cb), NULL);
4975 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
4976 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
4977 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
4979 g_signal_connect (check_button, "toggled",
4980 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
4982 gtk_box_pack_start (GTK_BOX (content_area),
4983 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
4986 gtk_box_pack_start (GTK_BOX (content_area),
4987 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
4990 gtk_box_pack_start (GTK_BOX (content_area),
4991 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
4994 button = gtk_button_new_with_label ("Close");
4995 g_signal_connect_swapped (button, "clicked",
4996 G_CALLBACK (gtk_widget_destroy), window);
4997 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5000 if (!gtk_widget_get_visible (window))
5001 gtk_widget_show_all (window);
5003 gtk_widget_destroy (window);
5011 make_focus_table (GList **list)
5016 grid = gtk_grid_new ();
5018 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
5019 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
5021 for (i = 0; i < 5; i++)
5023 for (j = 0; j < 5; j++)
5028 widget = gtk_entry_new ();
5030 widget = gtk_button_new_with_label ("Foo");
5032 *list = g_list_prepend (*list, widget);
5034 gtk_widget_set_hexpand (widget, TRUE);
5035 gtk_widget_set_vexpand (widget, TRUE);
5037 gtk_grid_attach (GTK_GRID (grid), widget, i, j, 1, 1);
5041 *list = g_list_reverse (*list);
5047 create_focus (GtkWidget *widget)
5049 static GtkWidget *window = NULL;
5053 GtkWidget *content_area;
5058 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5064 gtk_window_set_screen (GTK_WINDOW (window),
5065 gtk_widget_get_screen (widget));
5067 g_signal_connect (window, "destroy",
5068 G_CALLBACK (gtk_widget_destroyed),
5071 g_signal_connect (window, "response",
5072 G_CALLBACK (gtk_widget_destroy),
5075 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5077 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5079 frame = gtk_frame_new ("Weird tab focus chain");
5081 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5083 table = make_focus_table (&list);
5085 gtk_container_add (GTK_CONTAINER (frame), table);
5087 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5092 frame = gtk_frame_new ("Default tab focus chain");
5094 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5097 table = make_focus_table (&list);
5101 gtk_container_add (GTK_CONTAINER (frame), table);
5104 if (!gtk_widget_get_visible (window))
5105 gtk_widget_show_all (window);
5107 gtk_widget_destroy (window);
5115 create_font_selection (GtkWidget *widget)
5117 static GtkWidget *window = NULL;
5125 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5126 gtk_window_set_screen (GTK_WINDOW (window),
5127 gtk_widget_get_screen (widget));
5129 g_signal_connect (window, "destroy",
5130 G_CALLBACK (gtk_widget_destroyed),
5133 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5134 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5136 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5137 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5138 gtk_container_add (GTK_CONTAINER (window), hbox);
5140 label = gtk_label_new ("Pick a font");
5141 gtk_container_add (GTK_CONTAINER (hbox), label);
5143 picker = gtk_font_button_new ();
5144 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5145 gtk_container_add (GTK_CONTAINER (hbox), picker);
5148 if (!gtk_widget_get_visible (window))
5149 gtk_widget_show_all (window);
5151 gtk_widget_destroy (window);
5158 static GtkWidget *dialog_window = NULL;
5161 label_toggle (GtkWidget *widget,
5166 *label = gtk_label_new ("Dialog Test");
5167 g_signal_connect (*label,
5169 G_CALLBACK (gtk_widget_destroyed),
5171 g_object_set (*label, "margin", 10, NULL);
5172 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5173 *label, TRUE, TRUE, 0);
5174 gtk_widget_show (*label);
5177 gtk_widget_destroy (*label);
5181 create_dialog (GtkWidget *widget)
5183 static GtkWidget *label;
5184 GtkWidget *action_area;
5189 /* This is a terrible example; it's much simpler to create
5190 * dialogs than this. Don't use testgtk for example code,
5194 dialog_window = gtk_dialog_new ();
5195 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5196 gtk_widget_get_screen (widget));
5198 g_signal_connect (dialog_window, "destroy",
5199 G_CALLBACK (gtk_widget_destroyed),
5202 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5204 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5205 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5207 button = gtk_button_new_with_label ("OK");
5208 gtk_widget_set_can_default (button, TRUE);
5209 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5210 gtk_widget_grab_default (button);
5211 gtk_widget_show (button);
5213 button = gtk_button_new_with_label ("Toggle");
5214 g_signal_connect (button, "clicked",
5215 G_CALLBACK (label_toggle),
5217 gtk_widget_set_can_default (button, TRUE);
5218 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5219 gtk_widget_show (button);
5224 if (!gtk_widget_get_visible (dialog_window))
5225 gtk_widget_show (dialog_window);
5227 gtk_widget_destroy (dialog_window);
5230 /* Display & Screen test
5237 GtkWidget *radio_dpy;
5238 GtkWidget *toplevel;
5239 GtkWidget *dialog_window;
5240 } ScreenDisplaySelection;
5243 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5245 const gchar *display_name;
5246 GdkDisplay *display = gtk_widget_get_display (widget);
5248 GdkScreen *new_screen = NULL;
5249 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5251 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5253 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5254 display = gdk_display_open (display_name);
5258 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5259 GTK_DIALOG_DESTROY_WITH_PARENT,
5262 "The display :\n%s\ncannot be opened",
5264 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5265 gtk_widget_show (dialog);
5266 g_signal_connect (dialog, "response",
5267 G_CALLBACK (gtk_widget_destroy),
5272 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5275 gboolean found = FALSE;
5276 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5279 gtk_tree_model_get (model, &iter, 0, &name, -1);
5280 found = !g_ascii_strcasecmp (display_name, name);
5287 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5288 new_screen = gdk_display_get_default_screen (display);
5293 gint number_of_screens = gdk_display_get_n_screens (display);
5294 gint screen_num = gdk_screen_get_number (current_screen);
5295 if ((screen_num +1) < number_of_screens)
5296 new_screen = gdk_display_get_screen (display, screen_num + 1);
5298 new_screen = gdk_display_get_screen (display, 0);
5303 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5304 gtk_widget_destroy (data->dialog_window);
5309 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5311 gtk_widget_destroy (data);
5315 create_display_screen (GtkWidget *widget)
5317 GtkWidget *grid, *frame, *window, *combo_dpy, *vbox;
5318 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5320 ScreenDisplaySelection *scr_dpy_data;
5321 GdkScreen *screen = gtk_widget_get_screen (widget);
5322 GdkDisplay *display = gdk_screen_get_display (screen);
5324 window = g_object_new (gtk_window_get_type (),
5326 "type", GTK_WINDOW_TOPLEVEL,
5327 "title", "Screen or Display selection",
5330 g_signal_connect (window, "destroy",
5331 G_CALLBACK (gtk_widget_destroy), NULL);
5333 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5334 gtk_container_add (GTK_CONTAINER (window), vbox);
5336 frame = gtk_frame_new ("Select screen or display");
5337 gtk_container_add (GTK_CONTAINER (vbox), frame);
5339 grid = gtk_grid_new ();
5340 gtk_grid_set_row_spacing (GTK_GRID (grid), 3);
5341 gtk_grid_set_column_spacing (GTK_GRID (grid), 3);
5343 gtk_container_add (GTK_CONTAINER (frame), grid);
5345 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5346 if (gdk_display_get_n_screens(display) > 1)
5347 radio_scr = gtk_radio_button_new_with_label
5348 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5351 radio_scr = gtk_radio_button_new_with_label
5352 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5353 "only one screen on the current display");
5354 gtk_widget_set_sensitive (radio_scr, FALSE);
5356 combo_dpy = gtk_combo_box_text_new_with_entry ();
5357 gtk_widget_set_hexpand (combo_dpy, TRUE);
5358 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5359 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5360 "<hostname>:<X Server Num>.<Screen Num>");
5362 gtk_grid_attach (GTK_GRID (grid), radio_dpy, 0, 0, 1, 1);
5363 gtk_grid_attach (GTK_GRID (grid), radio_scr, 0, 1, 1, 1);
5364 gtk_grid_attach (GTK_GRID (grid), combo_dpy, 1, 0, 1, 1);
5366 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5367 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5368 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5370 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5372 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5373 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5375 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5377 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5378 scr_dpy_data->radio_dpy = radio_dpy;
5379 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5380 scr_dpy_data->dialog_window = window;
5382 g_signal_connect (cancelb, "clicked",
5383 G_CALLBACK (screen_display_destroy_diag), window);
5384 g_signal_connect (applyb, "clicked",
5385 G_CALLBACK (screen_display_check), scr_dpy_data);
5386 gtk_widget_show_all (window);
5391 static gulong event_watcher_enter_id = 0;
5392 static gulong event_watcher_leave_id = 0;
5395 event_watcher (GSignalInvocationHint *ihint,
5396 guint n_param_values,
5397 const GValue *param_values,
5400 g_print ("Watch: \"%s\" emitted for %s\n",
5401 g_signal_name (ihint->signal_id),
5402 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5408 event_watcher_down (void)
5410 if (event_watcher_enter_id)
5414 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5415 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5416 event_watcher_enter_id = 0;
5417 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5418 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5419 event_watcher_leave_id = 0;
5424 event_watcher_toggle (void)
5426 if (event_watcher_enter_id)
5427 event_watcher_down ();
5432 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5433 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5434 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5435 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5440 create_event_watcher (GtkWidget *widget)
5442 GtkWidget *action_area, *content_area;
5447 dialog_window = gtk_dialog_new ();
5448 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5449 gtk_widget_get_screen (widget));
5451 g_signal_connect (dialog_window, "destroy",
5452 G_CALLBACK (gtk_widget_destroyed),
5454 g_signal_connect (dialog_window, "destroy",
5455 G_CALLBACK (event_watcher_down),
5458 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5459 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5461 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5462 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5463 gtk_widget_set_size_request (dialog_window, 200, 110);
5465 button = gtk_toggle_button_new_with_label ("Activate Watch");
5466 g_signal_connect (button, "clicked",
5467 G_CALLBACK (event_watcher_toggle),
5469 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5470 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5471 gtk_widget_show (button);
5473 button = gtk_button_new_with_label ("Close");
5474 g_signal_connect_swapped (button, "clicked",
5475 G_CALLBACK (gtk_widget_destroy),
5477 gtk_widget_set_can_default (button, TRUE);
5478 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5479 gtk_widget_grab_default (button);
5480 gtk_widget_show (button);
5483 if (!gtk_widget_get_visible (dialog_window))
5484 gtk_widget_show (dialog_window);
5486 gtk_widget_destroy (dialog_window);
5494 reformat_value (GtkScale *scale,
5497 return g_strdup_printf ("-->%0.*g<--",
5498 gtk_scale_get_digits (scale), value);
5502 create_range_controls (GtkWidget *widget)
5504 static GtkWidget *window = NULL;
5508 GtkWidget *scrollbar;
5510 GtkWidget *separator;
5511 GtkAdjustment *adjustment;
5516 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5518 gtk_window_set_screen (GTK_WINDOW (window),
5519 gtk_widget_get_screen (widget));
5521 g_signal_connect (window, "destroy",
5522 G_CALLBACK (gtk_widget_destroyed),
5525 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5526 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5529 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5530 gtk_container_add (GTK_CONTAINER (window), box1);
5531 gtk_widget_show (box1);
5534 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5535 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5536 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5537 gtk_widget_show (box2);
5540 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5542 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5543 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5544 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5545 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5546 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5547 gtk_widget_show (scale);
5549 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5550 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5551 gtk_widget_show (scrollbar);
5553 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5554 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5555 g_signal_connect (scale,
5557 G_CALLBACK (reformat_value),
5559 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5560 gtk_widget_show (scale);
5562 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5564 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5565 gtk_widget_set_size_request (scale, -1, 200);
5566 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5567 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5568 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5569 gtk_widget_show (scale);
5571 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5572 gtk_widget_set_size_request (scale, -1, 200);
5573 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5574 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5575 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5576 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5577 gtk_widget_show (scale);
5579 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5580 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5581 g_signal_connect (scale,
5583 G_CALLBACK (reformat_value),
5585 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5586 gtk_widget_show (scale);
5589 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5590 gtk_widget_show (hbox);
5592 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5593 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5594 gtk_widget_show (separator);
5597 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5598 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5599 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5600 gtk_widget_show (box2);
5603 button = gtk_button_new_with_label ("close");
5604 g_signal_connect_swapped (button, "clicked",
5605 G_CALLBACK (gtk_widget_destroy),
5607 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5608 gtk_widget_set_can_default (button, TRUE);
5609 gtk_widget_grab_default (button);
5610 gtk_widget_show (button);
5613 if (!gtk_widget_get_visible (window))
5614 gtk_widget_show (window);
5616 gtk_widget_destroy (window);
5623 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5624 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5625 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5626 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5627 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5628 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5629 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5630 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5633 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5639 static const char * book_open_xpm[] = {
5662 static const char * book_closed_xpm[] = {
5687 GdkPixbuf *book_open;
5688 GdkPixbuf *book_closed;
5689 GtkWidget *sample_notebook;
5692 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
5694 GtkWidget *page_widget;
5697 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
5699 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
5700 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5702 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
5703 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5707 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
5709 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
5710 gint old_page_num = gtk_notebook_get_current_page (notebook);
5712 if (page_num == old_page_num)
5715 set_page_image (notebook, page_num, book_open);
5717 if (old_page_num != -1)
5718 set_page_image (notebook, old_page_num, book_closed);
5722 tab_fill (GtkToggleButton *button, GtkWidget *child)
5724 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5725 "tab-fill", gtk_toggle_button_get_active (button),
5730 tab_expand (GtkToggleButton *button, GtkWidget *child)
5732 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
5733 "tab-expand", gtk_toggle_button_get_active (button),
5738 create_pages (GtkNotebook *notebook, gint start, gint end)
5740 GtkWidget *child = NULL;
5745 GtkWidget *label_box;
5746 GtkWidget *menu_box;
5750 char accel_buffer[32];
5752 for (i = start; i <= end; i++)
5754 sprintf (buffer, "Page %d", i);
5755 sprintf (accel_buffer, "Page _%d", i);
5757 child = gtk_frame_new (buffer);
5758 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
5760 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5761 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
5762 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
5763 gtk_container_add (GTK_CONTAINER (child), vbox);
5765 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5766 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
5767 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5769 button = gtk_check_button_new_with_label ("Fill Tab");
5770 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5771 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5772 g_signal_connect (button, "toggled",
5773 G_CALLBACK (tab_fill), child);
5775 button = gtk_check_button_new_with_label ("Expand Tab");
5776 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5777 g_signal_connect (button, "toggled",
5778 G_CALLBACK (tab_expand), child);
5780 button = gtk_button_new_with_label ("Hide Page");
5781 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
5782 g_signal_connect_swapped (button, "clicked",
5783 G_CALLBACK (gtk_widget_hide),
5786 gtk_widget_show_all (child);
5788 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5789 pixwid = gtk_image_new_from_pixbuf (book_closed);
5790 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
5792 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
5793 gtk_widget_set_margin_left (pixwid, 3);
5794 gtk_widget_set_margin_right (pixwid, 3);
5795 gtk_widget_set_margin_bottom (pixwid, 1);
5796 gtk_widget_set_margin_top (pixwid, 1);
5797 label = gtk_label_new_with_mnemonic (accel_buffer);
5798 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
5799 gtk_widget_show_all (label_box);
5802 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5803 pixwid = gtk_image_new_from_pixbuf (book_closed);
5804 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
5806 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
5807 gtk_widget_set_margin_left (pixwid, 3);
5808 gtk_widget_set_margin_right (pixwid, 3);
5809 gtk_widget_set_margin_bottom (pixwid, 1);
5810 gtk_widget_set_margin_top (pixwid, 1);
5811 label = gtk_label_new (buffer);
5812 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
5813 gtk_widget_show_all (menu_box);
5815 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
5820 rotate_notebook (GtkButton *button,
5821 GtkNotebook *notebook)
5823 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
5827 show_all_pages (GtkButton *button,
5828 GtkNotebook *notebook)
5830 gtk_container_foreach (GTK_CONTAINER (notebook),
5831 (GtkCallback) gtk_widget_show, NULL);
5835 notebook_type_changed (GtkWidget *optionmenu,
5838 GtkNotebook *notebook;
5848 notebook = GTK_NOTEBOOK (data);
5850 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
5855 /* standard notebook */
5856 gtk_notebook_set_show_tabs (notebook, TRUE);
5857 gtk_notebook_set_show_border (notebook, TRUE);
5858 gtk_notebook_set_scrollable (notebook, FALSE);
5862 /* notabs notebook */
5863 gtk_notebook_set_show_tabs (notebook, FALSE);
5864 gtk_notebook_set_show_border (notebook, TRUE);
5869 gtk_notebook_set_show_tabs (notebook, FALSE);
5870 gtk_notebook_set_show_border (notebook, FALSE);
5875 gtk_notebook_set_show_tabs (notebook, TRUE);
5876 gtk_notebook_set_show_border (notebook, TRUE);
5877 gtk_notebook_set_scrollable (notebook, TRUE);
5878 if (gtk_notebook_get_n_pages (notebook) == 5)
5879 create_pages (notebook, 6, 15);
5885 if (gtk_notebook_get_n_pages (notebook) == 15)
5886 for (i = 0; i < 10; i++)
5887 gtk_notebook_remove_page (notebook, 5);
5891 notebook_popup (GtkToggleButton *button,
5892 GtkNotebook *notebook)
5894 if (gtk_toggle_button_get_active (button))
5895 gtk_notebook_popup_enable (notebook);
5897 gtk_notebook_popup_disable (notebook);
5901 create_notebook (GtkWidget *widget)
5903 static GtkWidget *window = NULL;
5907 GtkWidget *separator;
5911 static gchar *items[] =
5921 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5922 gtk_window_set_screen (GTK_WINDOW (window),
5923 gtk_widget_get_screen (widget));
5925 g_signal_connect (window, "destroy",
5926 G_CALLBACK (gtk_widget_destroyed),
5929 gtk_window_set_title (GTK_WINDOW (window), "notebook");
5930 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5932 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5933 gtk_container_add (GTK_CONTAINER (window), box1);
5935 sample_notebook = gtk_notebook_new ();
5936 g_signal_connect (sample_notebook, "switch_page",
5937 G_CALLBACK (page_switch), NULL);
5938 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
5939 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
5940 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
5942 gtk_widget_realize (sample_notebook);
5945 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
5948 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
5950 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
5952 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5953 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
5955 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
5956 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5957 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5959 button = gtk_check_button_new_with_label ("popup menu");
5960 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
5961 g_signal_connect (button, "clicked",
5962 G_CALLBACK (notebook_popup),
5965 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
5966 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5967 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5969 label = gtk_label_new ("Notebook Style :");
5970 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
5972 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
5973 notebook_type_changed,
5975 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
5977 button = gtk_button_new_with_label ("Show all Pages");
5978 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
5979 g_signal_connect (button, "clicked",
5980 G_CALLBACK (show_all_pages), sample_notebook);
5982 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
5983 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
5984 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5985 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5987 button = gtk_button_new_with_label ("prev");
5988 g_signal_connect_swapped (button, "clicked",
5989 G_CALLBACK (gtk_notebook_prev_page),
5991 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5993 button = gtk_button_new_with_label ("next");
5994 g_signal_connect_swapped (button, "clicked",
5995 G_CALLBACK (gtk_notebook_next_page),
5997 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5999 button = gtk_button_new_with_label ("rotate");
6000 g_signal_connect (button, "clicked",
6001 G_CALLBACK (rotate_notebook), sample_notebook);
6002 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6004 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6005 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6007 button = gtk_button_new_with_label ("close");
6008 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6009 g_signal_connect_swapped (button, "clicked",
6010 G_CALLBACK (gtk_widget_destroy),
6012 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6013 gtk_widget_set_can_default (button, TRUE);
6014 gtk_widget_grab_default (button);
6017 if (!gtk_widget_get_visible (window))
6018 gtk_widget_show_all (window);
6020 gtk_widget_destroy (window);
6028 toggle_resize (GtkWidget *widget, GtkWidget *child)
6030 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6031 GValue value = G_VALUE_INIT;
6032 g_value_init (&value, G_TYPE_BOOLEAN);
6033 gtk_container_child_get_property (container, child, "resize", &value);
6034 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6035 gtk_container_child_set_property (container, child, "resize", &value);
6039 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6041 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6042 GValue value = G_VALUE_INIT;
6043 g_value_init (&value, G_TYPE_BOOLEAN);
6044 gtk_container_child_get_property (container, child, "shrink", &value);
6045 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6046 gtk_container_child_set_property (container, child, "shrink", &value);
6050 paned_props_clicked (GtkWidget *button,
6053 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6055 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6059 create_pane_options (GtkPaned *paned,
6060 const gchar *frame_label,
6061 const gchar *label1,
6062 const gchar *label2)
6064 GtkWidget *child1, *child2;
6069 GtkWidget *check_button;
6071 child1 = gtk_paned_get_child1 (paned);
6072 child2 = gtk_paned_get_child2 (paned);
6074 frame = gtk_frame_new (frame_label);
6075 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6077 grid = gtk_grid_new ();
6078 gtk_container_add (GTK_CONTAINER (frame), grid);
6080 label = gtk_label_new (label1);
6081 gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
6083 check_button = gtk_check_button_new_with_label ("Resize");
6084 gtk_grid_attach (GTK_GRID (grid), check_button, 0, 1, 1, 1);
6085 g_signal_connect (check_button, "toggled",
6086 G_CALLBACK (toggle_resize),
6089 check_button = gtk_check_button_new_with_label ("Shrink");
6090 gtk_grid_attach (GTK_GRID (grid), check_button, 0, 2, 1, 1);
6091 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6093 g_signal_connect (check_button, "toggled",
6094 G_CALLBACK (toggle_shrink),
6097 label = gtk_label_new (label2);
6098 gtk_grid_attach (GTK_GRID (grid), label, 1, 0, 1, 1);
6100 check_button = gtk_check_button_new_with_label ("Resize");
6101 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 1, 1, 1);
6102 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6104 g_signal_connect (check_button, "toggled",
6105 G_CALLBACK (toggle_resize),
6108 check_button = gtk_check_button_new_with_label ("Shrink");
6109 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 2, 1, 1);
6110 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6112 g_signal_connect (check_button, "toggled",
6113 G_CALLBACK (toggle_shrink),
6116 button = gtk_button_new_with_mnemonic ("_Properties");
6117 gtk_grid_attach (GTK_GRID (grid), button, 0, 3, 2, 1);
6118 g_signal_connect (button, "clicked",
6119 G_CALLBACK (paned_props_clicked),
6126 create_panes (GtkWidget *widget)
6128 static GtkWidget *window = NULL;
6137 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6139 gtk_window_set_screen (GTK_WINDOW (window),
6140 gtk_widget_get_screen (widget));
6142 g_signal_connect (window, "destroy",
6143 G_CALLBACK (gtk_widget_destroyed),
6146 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6147 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6149 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6150 gtk_container_add (GTK_CONTAINER (window), vbox);
6152 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6153 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6154 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6156 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6157 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6159 frame = gtk_frame_new (NULL);
6160 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6161 gtk_widget_set_size_request (frame, 60, 60);
6162 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6164 button = gtk_button_new_with_label ("Hi there");
6165 gtk_container_add (GTK_CONTAINER(frame), button);
6167 frame = gtk_frame_new (NULL);
6168 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6169 gtk_widget_set_size_request (frame, 80, 60);
6170 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6172 frame = gtk_frame_new (NULL);
6173 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6174 gtk_widget_set_size_request (frame, 60, 80);
6175 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6177 /* Now create toggle buttons to control sizing */
6179 gtk_box_pack_start (GTK_BOX (vbox),
6180 create_pane_options (GTK_PANED (hpaned),
6186 gtk_box_pack_start (GTK_BOX (vbox),
6187 create_pane_options (GTK_PANED (vpaned),
6193 gtk_widget_show_all (vbox);
6196 if (!gtk_widget_get_visible (window))
6197 gtk_widget_show (window);
6199 gtk_widget_destroy (window);
6203 * Paned keyboard navigation
6207 paned_keyboard_window1 (GtkWidget *widget)
6230 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6231 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6232 gtk_window_set_screen (GTK_WINDOW (window1),
6233 gtk_widget_get_screen (widget));
6235 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6236 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6238 frame1 = gtk_frame_new (NULL);
6239 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6240 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6242 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6243 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6245 button7 = gtk_button_new_with_label ("button7");
6246 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6248 button8 = gtk_button_new_with_label ("button8");
6249 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6251 button9 = gtk_button_new_with_label ("button9");
6252 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6254 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6255 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6257 frame2 = gtk_frame_new (NULL);
6258 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6259 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6261 frame5 = gtk_frame_new (NULL);
6262 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6264 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6265 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6267 button5 = gtk_button_new_with_label ("button5");
6268 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6270 button6 = gtk_button_new_with_label ("button6");
6271 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6273 frame3 = gtk_frame_new (NULL);
6274 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6275 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6277 frame4 = gtk_frame_new ("Buttons");
6278 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6279 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6281 grid1 = gtk_grid_new ();
6282 gtk_container_add (GTK_CONTAINER (frame4), grid1);
6283 gtk_container_set_border_width (GTK_CONTAINER (grid1), 11);
6285 button1 = gtk_button_new_with_label ("button1");
6286 gtk_grid_attach (GTK_GRID (grid1), button1, 0, 0, 1, 1);
6288 button2 = gtk_button_new_with_label ("button2");
6289 gtk_grid_attach (GTK_GRID (grid1), button2, 1, 0, 1, 1);
6291 button3 = gtk_button_new_with_label ("button3");
6292 gtk_grid_attach (GTK_GRID (grid1), button3, 0, 1, 1, 1);
6294 button4 = gtk_button_new_with_label ("button4");
6295 gtk_grid_attach (GTK_GRID (grid1), button4, 1, 1, 1, 1);
6301 paned_keyboard_window2 (GtkWidget *widget)
6306 GtkWidget *button13;
6310 GtkWidget *button12;
6312 GtkWidget *button11;
6313 GtkWidget *button10;
6315 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6316 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6318 gtk_window_set_screen (GTK_WINDOW (window2),
6319 gtk_widget_get_screen (widget));
6321 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6322 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6324 frame6 = gtk_frame_new (NULL);
6325 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6326 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6328 button13 = gtk_button_new_with_label ("button13");
6329 gtk_container_add (GTK_CONTAINER (frame6), button13);
6331 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6332 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6334 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6335 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6337 frame7 = gtk_frame_new (NULL);
6338 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6339 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6341 button12 = gtk_button_new_with_label ("button12");
6342 gtk_container_add (GTK_CONTAINER (frame7), button12);
6344 frame8 = gtk_frame_new (NULL);
6345 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6346 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6348 button11 = gtk_button_new_with_label ("button11");
6349 gtk_container_add (GTK_CONTAINER (frame8), button11);
6351 button10 = gtk_button_new_with_label ("button10");
6352 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6358 paned_keyboard_window3 (GtkWidget *widget)
6365 GtkWidget *button14;
6368 GtkWidget *button15;
6371 GtkWidget *button16;
6373 GtkWidget *button17;
6375 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6376 g_object_set_data (G_OBJECT (window3), "window3", window3);
6377 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6379 gtk_window_set_screen (GTK_WINDOW (window3),
6380 gtk_widget_get_screen (widget));
6383 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6384 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6386 label1 = gtk_label_new ("Three panes nested inside each other");
6387 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6389 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6390 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6392 frame9 = gtk_frame_new (NULL);
6393 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6394 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6396 button14 = gtk_button_new_with_label ("button14");
6397 gtk_container_add (GTK_CONTAINER (frame9), button14);
6399 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6400 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6402 frame10 = gtk_frame_new (NULL);
6403 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6404 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6406 button15 = gtk_button_new_with_label ("button15");
6407 gtk_container_add (GTK_CONTAINER (frame10), button15);
6409 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6410 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6412 frame11 = gtk_frame_new (NULL);
6413 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6414 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6416 button16 = gtk_button_new_with_label ("button16");
6417 gtk_container_add (GTK_CONTAINER (frame11), button16);
6419 frame12 = gtk_frame_new (NULL);
6420 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6421 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6423 button17 = gtk_button_new_with_label ("button17");
6424 gtk_container_add (GTK_CONTAINER (frame12), button17);
6430 paned_keyboard_window4 (GtkWidget *widget)
6437 GtkWidget *button19;
6438 GtkWidget *button18;
6441 GtkWidget *button21;
6442 GtkWidget *button20;
6444 GtkWidget *button23;
6445 GtkWidget *button22;
6447 GtkWidget *button25;
6448 GtkWidget *button24;
6450 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6451 g_object_set_data (G_OBJECT (window4), "window4", window4);
6452 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6454 gtk_window_set_screen (GTK_WINDOW (window4),
6455 gtk_widget_get_screen (widget));
6457 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6458 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6460 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6461 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6462 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6464 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6465 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6467 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6468 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6470 button19 = gtk_button_new_with_label ("button19");
6471 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6473 button18 = gtk_button_new_with_label ("button18");
6474 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6476 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6477 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6479 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6480 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6482 button21 = gtk_button_new_with_label ("button21");
6483 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6485 button20 = gtk_button_new_with_label ("button20");
6486 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6488 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6489 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6491 button23 = gtk_button_new_with_label ("button23");
6492 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6494 button22 = gtk_button_new_with_label ("button22");
6495 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6497 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6498 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6500 button25 = gtk_button_new_with_label ("button25");
6501 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6503 button24 = gtk_button_new_with_label ("button24");
6504 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6510 create_paned_keyboard_navigation (GtkWidget *widget)
6512 static GtkWidget *window1 = NULL;
6513 static GtkWidget *window2 = NULL;
6514 static GtkWidget *window3 = NULL;
6515 static GtkWidget *window4 = NULL;
6518 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6520 gtk_widget_destroy (window1);
6521 gtk_widget_destroy (window2);
6522 gtk_widget_destroy (window3);
6523 gtk_widget_destroy (window4);
6528 window1 = paned_keyboard_window1 (widget);
6529 g_signal_connect (window1, "destroy",
6530 G_CALLBACK (gtk_widget_destroyed),
6536 window2 = paned_keyboard_window2 (widget);
6537 g_signal_connect (window2, "destroy",
6538 G_CALLBACK (gtk_widget_destroyed),
6544 window3 = paned_keyboard_window3 (widget);
6545 g_signal_connect (window3, "destroy",
6546 G_CALLBACK (gtk_widget_destroyed),
6552 window4 = paned_keyboard_window4 (widget);
6553 g_signal_connect (window4, "destroy",
6554 G_CALLBACK (gtk_widget_destroyed),
6558 if (gtk_widget_get_visible (window1))
6559 gtk_widget_destroy (GTK_WIDGET (window1));
6561 gtk_widget_show_all (GTK_WIDGET (window1));
6563 if (gtk_widget_get_visible (window2))
6564 gtk_widget_destroy (GTK_WIDGET (window2));
6566 gtk_widget_show_all (GTK_WIDGET (window2));
6568 if (gtk_widget_get_visible (window3))
6569 gtk_widget_destroy (GTK_WIDGET (window3));
6571 gtk_widget_show_all (GTK_WIDGET (window3));
6573 if (gtk_widget_get_visible (window4))
6574 gtk_widget_destroy (GTK_WIDGET (window4));
6576 gtk_widget_show_all (GTK_WIDGET (window4));
6584 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6587 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6591 /* ignore double and triple click */
6592 if (event->type != GDK_BUTTON_PRESS)
6595 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6596 p->x = (int) event->x;
6597 p->y = (int) event->y;
6599 gtk_grab_add (widget);
6600 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6601 gtk_widget_get_window (widget),
6604 GDK_BUTTON_RELEASE_MASK |
6605 GDK_BUTTON_MOTION_MASK |
6606 GDK_POINTER_MOTION_HINT_MASK,
6612 shape_released (GtkWidget *widget,
6613 GdkEventButton *event)
6615 gtk_grab_remove (widget);
6616 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6620 shape_motion (GtkWidget *widget,
6621 GdkEventMotion *event)
6626 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6629 * Can't use event->x / event->y here
6630 * because I need absolute coordinates.
6632 gdk_window_get_device_position (gdk_screen_get_root_window (gtk_widget_get_screen (widget)),
6633 gdk_event_get_device ((GdkEvent *) event),
6635 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6639 shape_create_icon (GdkScreen *screen,
6650 CursorOffset* icon_pos;
6651 cairo_surface_t *mask;
6652 cairo_region_t *mask_region;
6657 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
6659 window = gtk_window_new (window_type);
6660 gtk_window_set_screen (GTK_WINDOW (window), screen);
6662 fixed = gtk_fixed_new ();
6663 gtk_widget_set_size_request (fixed, 100, 100);
6664 gtk_container_add (GTK_CONTAINER (window), fixed);
6665 gtk_widget_show (fixed);
6667 gtk_widget_set_events (window,
6668 gtk_widget_get_events (window) |
6669 GDK_BUTTON_MOTION_MASK |
6670 GDK_POINTER_MOTION_HINT_MASK |
6671 GDK_BUTTON_PRESS_MASK);
6673 gtk_widget_realize (window);
6675 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
6676 g_assert (pixbuf); /* FIXME: error handling */
6678 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
6679 gdk_pixbuf_get_width (pixbuf),
6680 gdk_pixbuf_get_height (pixbuf));
6681 cr = cairo_create (mask);
6682 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
6686 mask_region = gdk_cairo_region_create_from_surface (mask);
6688 cairo_region_translate (mask_region, px, py);
6690 image = gtk_image_new_from_pixbuf (pixbuf);
6691 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
6692 gtk_widget_show (image);
6694 gtk_widget_shape_combine_region (window, mask_region);
6696 cairo_region_destroy (mask_region);
6697 cairo_surface_destroy (mask);
6698 g_object_unref (pixbuf);
6700 g_signal_connect (window, "button_press_event",
6701 G_CALLBACK (shape_pressed), NULL);
6702 g_signal_connect (window, "button_release_event",
6703 G_CALLBACK (shape_released), NULL);
6704 g_signal_connect (window, "motion_notify_event",
6705 G_CALLBACK (shape_motion), NULL);
6707 icon_pos = g_new (CursorOffset, 1);
6708 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
6710 gtk_window_move (GTK_WINDOW (window), x, y);
6711 gtk_widget_show (window);
6717 create_shapes (GtkWidget *widget)
6719 /* Variables used by the Drag/Drop and Shape Window demos */
6720 static GtkWidget *modeller = NULL;
6721 static GtkWidget *sheets = NULL;
6722 static GtkWidget *rings = NULL;
6723 static GtkWidget *with_region = NULL;
6724 GdkScreen *screen = gtk_widget_get_screen (widget);
6726 if (!(file_exists ("Modeller.xpm") &&
6727 file_exists ("FilesQueue.xpm") &&
6728 file_exists ("3DRings.xpm")))
6734 modeller = shape_create_icon (screen, "Modeller.xpm",
6735 440, 140, 0,0, GTK_WINDOW_POPUP);
6737 g_signal_connect (modeller, "destroy",
6738 G_CALLBACK (gtk_widget_destroyed),
6742 gtk_widget_destroy (modeller);
6746 sheets = shape_create_icon (screen, "FilesQueue.xpm",
6747 580, 170, 0,0, GTK_WINDOW_POPUP);
6749 g_signal_connect (sheets, "destroy",
6750 G_CALLBACK (gtk_widget_destroyed),
6755 gtk_widget_destroy (sheets);
6759 rings = shape_create_icon (screen, "3DRings.xpm",
6760 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
6762 g_signal_connect (rings, "destroy",
6763 G_CALLBACK (gtk_widget_destroyed),
6767 gtk_widget_destroy (rings);
6771 cairo_region_t *region;
6774 with_region = shape_create_icon (screen, "3DRings.xpm",
6775 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
6777 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
6779 g_signal_connect (with_region, "destroy",
6780 G_CALLBACK (gtk_widget_destroyed),
6783 /* reset shape from mask to a region */
6786 region = cairo_region_create ();
6798 cairo_region_union_rectangle (region, &rect);
6806 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
6811 gtk_widget_destroy (with_region);
6819 create_wmhints (GtkWidget *widget)
6821 static GtkWidget *window = NULL;
6823 GtkWidget *separator;
6827 GdkWindow *gdk_window;
6833 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6835 gtk_window_set_screen (GTK_WINDOW (window),
6836 gtk_widget_get_screen (widget));
6838 g_signal_connect (window, "destroy",
6839 G_CALLBACK (gtk_widget_destroyed),
6842 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
6843 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6845 gtk_widget_realize (window);
6847 gdk_window = gtk_widget_get_window (window);
6849 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
6850 list = g_list_prepend (NULL, pixbuf);
6852 gdk_window_set_icon_list (gdk_window, list);
6855 g_object_unref (pixbuf);
6857 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
6859 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
6860 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
6862 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6863 gtk_container_add (GTK_CONTAINER (window), box1);
6864 gtk_widget_show (box1);
6866 label = gtk_label_new ("Try iconizing me!");
6867 gtk_widget_set_size_request (label, 150, 50);
6868 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
6869 gtk_widget_show (label);
6872 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6873 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6874 gtk_widget_show (separator);
6877 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
6878 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6879 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6880 gtk_widget_show (box2);
6883 button = gtk_button_new_with_label ("close");
6885 g_signal_connect_swapped (button, "clicked",
6886 G_CALLBACK (gtk_widget_destroy),
6889 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6890 gtk_widget_set_can_default (button, TRUE);
6891 gtk_widget_grab_default (button);
6892 gtk_widget_show (button);
6895 if (!gtk_widget_get_visible (window))
6896 gtk_widget_show (window);
6898 gtk_widget_destroy (window);
6903 * Window state tracking
6907 window_state_callback (GtkWidget *widget,
6908 GdkEventWindowState *event,
6911 GtkWidget *label = data;
6914 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
6915 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
6916 "withdrawn" : "not withdrawn", ", ",
6917 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
6918 "iconified" : "not iconified", ", ",
6919 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
6920 "sticky" : "not sticky", ", ",
6921 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
6922 "maximized" : "not maximized", ", ",
6923 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
6924 "fullscreen" : "not fullscreen",
6925 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
6926 "above" : "not above", ", ",
6927 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
6928 "below" : "not below", ", ",
6931 gtk_label_set_text (GTK_LABEL (label), msg);
6939 tracking_label (GtkWidget *window)
6945 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6947 g_signal_connect_object (hbox,
6949 G_CALLBACK (gtk_widget_destroy),
6953 label = gtk_label_new ("<no window state events received>");
6954 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
6955 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
6957 g_signal_connect (window,
6958 "window_state_event",
6959 G_CALLBACK (window_state_callback),
6962 button = gtk_button_new_with_label ("Deiconify");
6963 g_signal_connect_object (button,
6965 G_CALLBACK (gtk_window_deiconify),
6968 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6970 button = gtk_button_new_with_label ("Iconify");
6971 g_signal_connect_object (button,
6973 G_CALLBACK (gtk_window_iconify),
6976 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6978 button = gtk_button_new_with_label ("Fullscreen");
6979 g_signal_connect_object (button,
6981 G_CALLBACK (gtk_window_fullscreen),
6984 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6986 button = gtk_button_new_with_label ("Unfullscreen");
6987 g_signal_connect_object (button,
6989 G_CALLBACK (gtk_window_unfullscreen),
6992 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
6994 button = gtk_button_new_with_label ("Present");
6995 g_signal_connect_object (button,
6997 G_CALLBACK (gtk_window_present),
7000 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7002 button = gtk_button_new_with_label ("Show");
7003 g_signal_connect_object (button,
7005 G_CALLBACK (gtk_widget_show),
7008 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7010 gtk_widget_show_all (hbox);
7016 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7018 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7020 gtk_window_set_keep_above (GTK_WINDOW (data),
7021 gtk_toggle_button_get_active (togglebutton));
7023 if (gtk_toggle_button_get_active (togglebutton))
7024 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7028 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7030 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7032 gtk_window_set_keep_below (GTK_WINDOW (data),
7033 gtk_toggle_button_get_active (togglebutton));
7035 if (gtk_toggle_button_get_active (togglebutton))
7036 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7041 get_state_controls (GtkWidget *window)
7045 GtkWidget *button_above;
7046 GtkWidget *button_below;
7048 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7050 button = gtk_button_new_with_label ("Stick");
7051 g_signal_connect_object (button,
7053 G_CALLBACK (gtk_window_stick),
7056 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7058 button = gtk_button_new_with_label ("Unstick");
7059 g_signal_connect_object (button,
7061 G_CALLBACK (gtk_window_unstick),
7064 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7066 button = gtk_button_new_with_label ("Maximize");
7067 g_signal_connect_object (button,
7069 G_CALLBACK (gtk_window_maximize),
7072 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7074 button = gtk_button_new_with_label ("Unmaximize");
7075 g_signal_connect_object (button,
7077 G_CALLBACK (gtk_window_unmaximize),
7080 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7082 button = gtk_button_new_with_label ("Iconify");
7083 g_signal_connect_object (button,
7085 G_CALLBACK (gtk_window_iconify),
7088 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7090 button = gtk_button_new_with_label ("Fullscreen");
7091 g_signal_connect_object (button,
7093 G_CALLBACK (gtk_window_fullscreen),
7096 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7098 button = gtk_button_new_with_label ("Unfullscreen");
7099 g_signal_connect_object (button,
7101 G_CALLBACK (gtk_window_unfullscreen),
7104 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7106 button_above = gtk_toggle_button_new_with_label ("Keep above");
7107 g_signal_connect (button_above,
7109 G_CALLBACK (keep_window_above),
7111 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7113 button_below = gtk_toggle_button_new_with_label ("Keep below");
7114 g_signal_connect (button_below,
7116 G_CALLBACK (keep_window_below),
7118 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7120 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7121 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7123 button = gtk_button_new_with_label ("Hide (withdraw)");
7124 g_signal_connect_object (button,
7126 G_CALLBACK (gtk_widget_hide),
7129 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7131 gtk_widget_show_all (vbox);
7137 create_window_states (GtkWidget *widget)
7139 static GtkWidget *window = NULL;
7142 GtkWidget *iconified;
7144 GtkWidget *controls;
7148 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7149 gtk_window_set_screen (GTK_WINDOW (window),
7150 gtk_widget_get_screen (widget));
7152 g_signal_connect (window, "destroy",
7153 G_CALLBACK (gtk_widget_destroyed),
7156 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7158 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7159 gtk_container_add (GTK_CONTAINER (window), box1);
7161 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7163 gtk_window_set_screen (GTK_WINDOW (iconified),
7164 gtk_widget_get_screen (widget));
7166 g_signal_connect_object (iconified, "destroy",
7167 G_CALLBACK (gtk_widget_destroy),
7170 gtk_window_iconify (GTK_WINDOW (iconified));
7171 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7172 controls = get_state_controls (iconified);
7173 gtk_container_add (GTK_CONTAINER (iconified), controls);
7175 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7177 gtk_window_set_screen (GTK_WINDOW (normal),
7178 gtk_widget_get_screen (widget));
7180 g_signal_connect_object (normal, "destroy",
7181 G_CALLBACK (gtk_widget_destroy),
7185 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7186 controls = get_state_controls (normal);
7187 gtk_container_add (GTK_CONTAINER (normal), controls);
7189 label = tracking_label (iconified);
7190 gtk_container_add (GTK_CONTAINER (box1), label);
7192 label = tracking_label (normal);
7193 gtk_container_add (GTK_CONTAINER (box1), label);
7195 gtk_widget_show_all (iconified);
7196 gtk_widget_show_all (normal);
7197 gtk_widget_show_all (box1);
7200 if (!gtk_widget_get_visible (window))
7201 gtk_widget_show (window);
7203 gtk_widget_destroy (window);
7211 configure_event_callback (GtkWidget *widget,
7212 GdkEventConfigure *event,
7215 GtkWidget *label = data;
7219 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7221 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7223 event->x, event->y, event->width, event->height,
7226 gtk_label_set_text (GTK_LABEL (label), msg);
7234 get_ints (GtkWidget *window,
7241 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7242 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7244 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7245 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7249 set_size_callback (GtkWidget *widget,
7254 get_ints (data, &w, &h);
7256 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7260 unset_default_size_callback (GtkWidget *widget,
7263 gtk_window_set_default_size (g_object_get_data (data, "target"),
7268 set_default_size_callback (GtkWidget *widget,
7273 get_ints (data, &w, &h);
7275 gtk_window_set_default_size (g_object_get_data (data, "target"),
7280 unset_size_request_callback (GtkWidget *widget,
7283 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7288 set_size_request_callback (GtkWidget *widget,
7293 get_ints (data, &w, &h);
7295 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7300 set_location_callback (GtkWidget *widget,
7305 get_ints (data, &x, &y);
7307 gtk_window_move (g_object_get_data (data, "target"), x, y);
7311 move_to_position_callback (GtkWidget *widget,
7317 window = g_object_get_data (data, "target");
7319 gtk_window_get_position (window, &x, &y);
7321 gtk_window_move (window, x, y);
7325 set_geometry_callback (GtkWidget *entry,
7331 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7333 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7335 if (!gtk_window_parse_geometry (target, text))
7336 g_print ("Bad geometry string '%s'\n", text);
7342 resizable_callback (GtkWidget *widget,
7345 g_object_set (g_object_get_data (data, "target"),
7346 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7351 gravity_selected (GtkWidget *widget,
7354 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7355 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7359 pos_selected (GtkWidget *widget,
7362 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7363 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7367 move_gravity_window_to_current_position (GtkWidget *widget,
7373 window = GTK_WINDOW (data);
7375 gtk_window_get_position (window, &x, &y);
7377 gtk_window_move (window, x, y);
7381 get_screen_corner (GtkWindow *window,
7386 GdkScreen * screen = gtk_window_get_screen (window);
7388 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7390 switch (gtk_window_get_gravity (window))
7392 case GDK_GRAVITY_SOUTH_EAST:
7393 *x = gdk_screen_get_width (screen) - w;
7394 *y = gdk_screen_get_height (screen) - h;
7397 case GDK_GRAVITY_NORTH_EAST:
7398 *x = gdk_screen_get_width (screen) - w;
7402 case GDK_GRAVITY_SOUTH_WEST:
7404 *y = gdk_screen_get_height (screen) - h;
7407 case GDK_GRAVITY_NORTH_WEST:
7412 case GDK_GRAVITY_SOUTH:
7413 *x = (gdk_screen_get_width (screen) - w) / 2;
7414 *y = gdk_screen_get_height (screen) - h;
7417 case GDK_GRAVITY_NORTH:
7418 *x = (gdk_screen_get_width (screen) - w) / 2;
7422 case GDK_GRAVITY_WEST:
7424 *y = (gdk_screen_get_height (screen) - h) / 2;
7427 case GDK_GRAVITY_EAST:
7428 *x = gdk_screen_get_width (screen) - w;
7429 *y = (gdk_screen_get_height (screen) - h) / 2;
7432 case GDK_GRAVITY_CENTER:
7433 *x = (gdk_screen_get_width (screen) - w) / 2;
7434 *y = (gdk_screen_get_height (screen) - h) / 2;
7437 case GDK_GRAVITY_STATIC:
7438 /* pick some random numbers */
7444 g_assert_not_reached ();
7450 move_gravity_window_to_starting_position (GtkWidget *widget,
7456 window = GTK_WINDOW (data);
7458 get_screen_corner (window,
7461 gtk_window_move (window, x, y);
7465 make_gravity_window (GtkWidget *destroy_with,
7474 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7476 gtk_window_set_screen (GTK_WINDOW (window),
7477 gtk_widget_get_screen (destroy_with));
7479 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7480 gtk_widget_show (vbox);
7482 gtk_container_add (GTK_CONTAINER (window), vbox);
7483 gtk_window_set_title (GTK_WINDOW (window), title);
7484 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7486 g_signal_connect_object (destroy_with,
7488 G_CALLBACK (gtk_widget_destroy),
7493 button = gtk_button_new_with_mnemonic ("_Move to current position");
7495 g_signal_connect (button, "clicked",
7496 G_CALLBACK (move_gravity_window_to_current_position),
7499 gtk_container_add (GTK_CONTAINER (vbox), button);
7500 gtk_widget_show (button);
7502 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7504 g_signal_connect (button, "clicked",
7505 G_CALLBACK (move_gravity_window_to_starting_position),
7508 gtk_container_add (GTK_CONTAINER (vbox), button);
7509 gtk_widget_show (button);
7511 /* Pretend this is the result of --geometry.
7512 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7513 * and in that case you probably should just use gtk_window_parse_geometry().
7514 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7515 * you are parsing --geometry or equivalent.
7517 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7521 gtk_window_set_default_size (GTK_WINDOW (window),
7524 get_screen_corner (GTK_WINDOW (window), &x, &y);
7526 gtk_window_move (GTK_WINDOW (window),
7533 do_gravity_test (GtkWidget *widget,
7536 GtkWidget *destroy_with = data;
7539 /* We put a window at each gravity point on the screen. */
7540 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7542 gtk_widget_show (window);
7544 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7546 gtk_widget_show (window);
7548 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7550 gtk_widget_show (window);
7552 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7554 gtk_widget_show (window);
7556 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7558 gtk_widget_show (window);
7560 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7562 gtk_widget_show (window);
7565 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7567 gtk_widget_show (window);
7570 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7572 gtk_widget_show (window);
7574 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7576 gtk_widget_show (window);
7578 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7580 gtk_widget_show (window);
7584 window_controls (GtkWidget *window)
7586 GtkWidget *control_window;
7591 GtkAdjustment *adjustment;
7596 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7598 gtk_window_set_screen (GTK_WINDOW (control_window),
7599 gtk_widget_get_screen (window));
7601 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7603 g_object_set_data (G_OBJECT (control_window),
7607 g_signal_connect_object (control_window,
7609 G_CALLBACK (gtk_widget_destroy),
7613 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7615 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7617 label = gtk_label_new ("<no configure events>");
7618 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7620 g_signal_connect (window,
7622 G_CALLBACK (configure_event_callback),
7625 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7626 spin = gtk_spin_button_new (adjustment, 0, 0);
7628 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7630 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7632 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7633 spin = gtk_spin_button_new (adjustment, 0, 0);
7635 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7637 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7639 entry = gtk_entry_new ();
7640 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7642 g_signal_connect (entry, "changed",
7643 G_CALLBACK (set_geometry_callback),
7646 button = gtk_button_new_with_label ("Show gravity test windows");
7647 g_signal_connect_swapped (button,
7649 G_CALLBACK (do_gravity_test),
7651 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7653 button = gtk_button_new_with_label ("Reshow with initial size");
7654 g_signal_connect_object (button,
7656 G_CALLBACK (gtk_window_reshow_with_initial_size),
7659 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7661 button = gtk_button_new_with_label ("Queue resize");
7662 g_signal_connect_object (button,
7664 G_CALLBACK (gtk_widget_queue_resize),
7667 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7669 button = gtk_button_new_with_label ("Resize");
7670 g_signal_connect (button,
7672 G_CALLBACK (set_size_callback),
7674 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7676 button = gtk_button_new_with_label ("Set default size");
7677 g_signal_connect (button,
7679 G_CALLBACK (set_default_size_callback),
7681 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7683 button = gtk_button_new_with_label ("Unset default size");
7684 g_signal_connect (button,
7686 G_CALLBACK (unset_default_size_callback),
7688 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7690 button = gtk_button_new_with_label ("Set size request");
7691 g_signal_connect (button,
7693 G_CALLBACK (set_size_request_callback),
7695 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7697 button = gtk_button_new_with_label ("Unset size request");
7698 g_signal_connect (button,
7700 G_CALLBACK (unset_size_request_callback),
7702 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7704 button = gtk_button_new_with_label ("Move");
7705 g_signal_connect (button,
7707 G_CALLBACK (set_location_callback),
7709 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7711 button = gtk_button_new_with_label ("Move to current position");
7712 g_signal_connect (button,
7714 G_CALLBACK (move_to_position_callback),
7716 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7718 button = gtk_check_button_new_with_label ("Allow resize");
7719 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
7720 g_signal_connect (button,
7722 G_CALLBACK (resizable_callback),
7724 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7726 button = gtk_button_new_with_mnemonic ("_Show");
7727 g_signal_connect_object (button,
7729 G_CALLBACK (gtk_widget_show),
7732 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7734 button = gtk_button_new_with_mnemonic ("_Hide");
7735 g_signal_connect_object (button,
7737 G_CALLBACK (gtk_widget_hide),
7740 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7742 om = gtk_combo_box_text_new ();
7746 static gchar *names[] = {
7747 "GDK_GRAVITY_NORTH_WEST",
7748 "GDK_GRAVITY_NORTH",
7749 "GDK_GRAVITY_NORTH_EAST",
7751 "GDK_GRAVITY_CENTER",
7753 "GDK_GRAVITY_SOUTH_WEST",
7754 "GDK_GRAVITY_SOUTH",
7755 "GDK_GRAVITY_SOUTH_EAST",
7756 "GDK_GRAVITY_STATIC",
7760 g_assert (names[i]);
7761 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
7766 g_signal_connect (om,
7768 G_CALLBACK (gravity_selected),
7771 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
7774 om = gtk_combo_box_text_new ();
7778 static gchar *names[] = {
7780 "GTK_WIN_POS_CENTER",
7781 "GTK_WIN_POS_MOUSE",
7782 "GTK_WIN_POS_CENTER_ALWAYS",
7783 "GTK_WIN_POS_CENTER_ON_PARENT",
7787 g_assert (names[i]);
7788 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
7793 g_signal_connect (om,
7795 G_CALLBACK (pos_selected),
7798 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
7800 gtk_widget_show_all (vbox);
7802 return control_window;
7806 create_window_sizing (GtkWidget *widget)
7808 static GtkWidget *window = NULL;
7809 static GtkWidget *target_window = NULL;
7815 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7816 gtk_window_set_screen (GTK_WINDOW (target_window),
7817 gtk_widget_get_screen (widget));
7818 label = gtk_label_new (NULL);
7819 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");
7820 gtk_container_add (GTK_CONTAINER (target_window), label);
7821 gtk_widget_show (label);
7823 g_signal_connect (target_window, "destroy",
7824 G_CALLBACK (gtk_widget_destroyed),
7827 window = window_controls (target_window);
7829 g_signal_connect (window, "destroy",
7830 G_CALLBACK (gtk_widget_destroyed),
7833 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
7836 /* don't show target window by default, we want to allow testing
7837 * of behavior on first show.
7840 if (!gtk_widget_get_visible (window))
7841 gtk_widget_show (window);
7843 gtk_widget_destroy (window);
7850 typedef struct _ProgressData {
7853 GtkWidget *block_spin;
7854 GtkWidget *x_align_spin;
7855 GtkWidget *y_align_spin;
7856 GtkWidget *step_spin;
7857 GtkWidget *act_blocks_spin;
7868 progress_timeout (gpointer data)
7870 ProgressData *pdata = data;
7874 if (pdata->activity)
7876 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
7878 text = g_strdup_printf ("%s", "???");
7882 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
7885 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
7887 text = g_strdup_printf ("%.0f%%", 100 * new_val);
7890 gtk_label_set_text (GTK_LABEL (pdata->label), text);
7897 destroy_progress (GtkWidget *widget,
7898 ProgressData **pdata)
7900 if ((*pdata)->timer)
7902 g_source_remove ((*pdata)->timer);
7903 (*pdata)->timer = 0;
7905 (*pdata)->window = NULL;
7911 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
7913 ProgressData *pdata;
7916 pdata = (ProgressData *) data;
7918 if (!gtk_widget_get_mapped (widget))
7921 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
7923 if (i == 0 || i == 1)
7924 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
7926 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
7928 if (i == 1 || i == 2)
7929 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
7931 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
7935 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
7939 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7940 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
7944 progressbar_toggle_ellipsize (GtkWidget *widget,
7947 ProgressData *pdata = data;
7948 if (gtk_widget_is_drawable (widget))
7950 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
7951 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
7956 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
7958 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7962 toggle_running (GtkWidget *widget, ProgressData *pdata)
7964 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
7966 if (pdata->timer == 0)
7967 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
7971 if (pdata->timer != 0)
7973 g_source_remove (pdata->timer);
7980 entry_changed (GtkWidget *widget, ProgressData *pdata)
7982 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
7983 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
7987 create_progress_bar (GtkWidget *widget)
7989 GtkWidget *action_area, *content_area;
7999 static ProgressData *pdata = NULL;
8001 static gchar *items1[] =
8009 static char *ellipsize_items[] = {
8010 "None", // PANGO_ELLIPSIZE_NONE,
8011 "Start", // PANGO_ELLIPSIZE_START,
8012 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8013 "End", // PANGO_ELLIPSIZE_END
8017 pdata = g_new0 (ProgressData, 1);
8021 pdata->window = gtk_dialog_new ();
8023 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8024 gtk_widget_get_screen (widget));
8026 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8028 g_signal_connect (pdata->window, "destroy",
8029 G_CALLBACK (destroy_progress),
8033 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8034 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8036 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8037 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8039 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8040 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8041 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8043 frame = gtk_frame_new ("Progress");
8044 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8046 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8047 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8049 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8050 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8052 pdata->pbar = gtk_progress_bar_new ();
8053 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8054 PANGO_ELLIPSIZE_MIDDLE);
8056 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8058 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8059 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8061 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8062 gtk_container_add (GTK_CONTAINER (align), hbox);
8063 label = gtk_label_new ("Label updated by user :");
8064 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8065 pdata->label = gtk_label_new ("");
8066 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8068 frame = gtk_frame_new ("Options");
8069 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8071 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8072 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8074 grid = gtk_grid_new ();
8075 gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
8076 gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
8077 gtk_box_pack_start (GTK_BOX (vbox2), grid, FALSE, TRUE, 0);
8079 label = gtk_label_new ("Orientation :");
8080 gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
8081 gtk_widget_set_halign (label, GTK_ALIGN_START);
8082 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8084 pdata->omenu1 = build_option_menu (items1, 4, 0,
8085 progressbar_toggle_orientation,
8087 gtk_grid_attach (GTK_GRID (grid), pdata->omenu1, 1, 0, 1, 1);
8089 check = gtk_check_button_new_with_label ("Running");
8090 g_signal_connect (check, "toggled",
8091 G_CALLBACK (toggle_running),
8093 gtk_grid_attach (GTK_GRID (grid), check, 0, 1, 2, 1);
8094 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8096 check = gtk_check_button_new_with_label ("Show text");
8097 g_signal_connect (check, "clicked",
8098 G_CALLBACK (toggle_show_text),
8100 gtk_grid_attach (GTK_GRID (grid), check, 0, 2, 1, 1);
8102 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8103 gtk_grid_attach (GTK_GRID (grid), hbox, 1, 2, 1, 1);
8105 label = gtk_label_new ("Text: ");
8106 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8108 pdata->entry = gtk_entry_new ();
8109 gtk_widget_set_hexpand (pdata->entry, TRUE);
8110 g_signal_connect (pdata->entry, "changed",
8111 G_CALLBACK (entry_changed),
8113 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8114 gtk_widget_set_size_request (pdata->entry, 100, -1);
8116 label = gtk_label_new ("Ellipsize text :");
8117 gtk_grid_attach (GTK_GRID (grid), label, 0, 10, 1, 1);
8119 gtk_widget_set_halign (label, GTK_ALIGN_START);
8120 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8121 pdata->elmenu = build_option_menu (ellipsize_items,
8122 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8123 2, // PANGO_ELLIPSIZE_MIDDLE
8124 progressbar_toggle_ellipsize,
8126 gtk_grid_attach (GTK_GRID (grid), pdata->elmenu, 1, 10, 1, 1);
8128 check = gtk_check_button_new_with_label ("Activity mode");
8129 g_signal_connect (check, "clicked",
8130 G_CALLBACK (toggle_activity_mode), pdata);
8131 gtk_grid_attach (GTK_GRID (grid), check, 0, 15, 1, 1);
8133 button = gtk_button_new_with_label ("close");
8134 g_signal_connect_swapped (button, "clicked",
8135 G_CALLBACK (gtk_widget_destroy),
8137 gtk_widget_set_can_default (button, TRUE);
8138 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8139 gtk_widget_grab_default (button);
8142 if (!gtk_widget_get_visible (pdata->window))
8143 gtk_widget_show_all (pdata->window);
8145 gtk_widget_destroy (pdata->window);
8157 GtkWidget *res_widget;
8161 find_widget (GtkWidget *widget, FindWidgetData *data)
8163 GtkAllocation new_allocation;
8167 gtk_widget_get_allocation (widget, &new_allocation);
8169 if (data->found || !gtk_widget_get_mapped (widget))
8172 /* Note that in the following code, we only count the
8173 * position as being inside a WINDOW widget if it is inside
8174 * widget->window; points that are outside of widget->window
8175 * but within the allocation are not counted. This is consistent
8176 * with the way we highlight drag targets.
8178 if (gtk_widget_get_has_window (widget))
8180 new_allocation.x = 0;
8181 new_allocation.y = 0;
8184 if (gtk_widget_get_parent (widget) && !data->first)
8186 GdkWindow *window = gtk_widget_get_window (widget);
8187 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8189 gint tx, ty, twidth, theight;
8191 twidth = gdk_window_get_width (window);
8192 theight = gdk_window_get_height (window);
8194 if (new_allocation.x < 0)
8196 new_allocation.width += new_allocation.x;
8197 new_allocation.x = 0;
8199 if (new_allocation.y < 0)
8201 new_allocation.height += new_allocation.y;
8202 new_allocation.y = 0;
8204 if (new_allocation.x + new_allocation.width > twidth)
8205 new_allocation.width = twidth - new_allocation.x;
8206 if (new_allocation.y + new_allocation.height > theight)
8207 new_allocation.height = theight - new_allocation.y;
8209 gdk_window_get_position (window, &tx, &ty);
8210 new_allocation.x += tx;
8212 new_allocation.y += ty;
8215 window = gdk_window_get_parent (window);
8219 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8220 (data->x < new_allocation.x + new_allocation.width) &&
8221 (data->y < new_allocation.y + new_allocation.height))
8223 /* First, check if the drag is in a valid drop site in
8224 * one of our children
8226 if (GTK_IS_CONTAINER (widget))
8228 FindWidgetData new_data = *data;
8230 new_data.x -= x_offset;
8231 new_data.y -= y_offset;
8232 new_data.found = FALSE;
8233 new_data.first = FALSE;
8235 gtk_container_forall (GTK_CONTAINER (widget),
8236 (GtkCallback)find_widget,
8239 data->found = new_data.found;
8241 data->res_widget = new_data.res_widget;
8244 /* If not, and this widget is registered as a drop site, check to
8245 * emit "drag_motion" to check if we are actually in
8251 data->res_widget = widget;
8257 find_widget_at_pointer (GdkDevice *device)
8259 GtkWidget *widget = NULL;
8260 GdkWindow *pointer_window;
8262 FindWidgetData data;
8264 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8268 gpointer widget_ptr;
8270 gdk_window_get_user_data (pointer_window, &widget_ptr);
8271 widget = widget_ptr;
8276 gdk_window_get_device_position (gtk_widget_get_window (widget),
8285 find_widget (widget, &data);
8287 return data.res_widget;
8293 struct PropertiesData {
8301 destroy_properties (GtkWidget *widget,
8302 struct PropertiesData *data)
8306 *data->window = NULL;
8307 data->window = NULL;
8312 g_object_unref (data->cursor);
8313 data->cursor = NULL;
8318 g_signal_handler_disconnect (widget, data->handler);
8326 property_query_event (GtkWidget *widget,
8328 struct PropertiesData *data)
8330 GtkWidget *res_widget = NULL;
8332 if (!data->in_query)
8335 if (event->type == GDK_BUTTON_RELEASE)
8337 gtk_grab_remove (widget);
8338 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8340 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8343 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8344 gtk_widget_get_screen (widget));
8345 create_prop_editor (G_OBJECT (res_widget), 0);
8348 data->in_query = FALSE;
8355 query_properties (GtkButton *button,
8356 struct PropertiesData *data)
8358 GtkWidget *widget = GTK_WIDGET (button);
8359 GdkDisplay *display;
8360 GdkDeviceManager *device_manager;
8363 g_signal_connect (button, "event",
8364 G_CALLBACK (property_query_event), data);
8366 display = gtk_widget_get_display (widget);
8369 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8371 device_manager = gdk_display_get_device_manager (display);
8372 device = gdk_device_manager_get_client_pointer (device_manager);
8373 gdk_device_grab (device,
8374 gtk_widget_get_window (widget),
8377 GDK_BUTTON_RELEASE_MASK,
8380 gtk_grab_add (widget);
8382 data->in_query = TRUE;
8386 create_properties (GtkWidget *widget)
8388 static GtkWidget *window = NULL;
8392 struct PropertiesData *data;
8394 data = g_new (struct PropertiesData, 1);
8395 data->window = &window;
8396 data->in_query = FALSE;
8397 data->cursor = NULL;
8402 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8404 gtk_window_set_screen (GTK_WINDOW (window),
8405 gtk_widget_get_screen (widget));
8407 data->handler = g_signal_connect (window, "destroy",
8408 G_CALLBACK (destroy_properties),
8411 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8412 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8414 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8415 gtk_container_add (GTK_CONTAINER (window), vbox);
8417 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8418 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8420 button = gtk_button_new_with_label ("Query properties");
8421 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8422 g_signal_connect (button, "clicked",
8423 G_CALLBACK (query_properties),
8427 if (!gtk_widget_get_visible (window))
8428 gtk_widget_show_all (window);
8430 gtk_widget_destroy (window);
8434 struct SnapshotData {
8435 GtkWidget *toplevel_button;
8439 gboolean is_toplevel;
8444 destroy_snapshot_data (GtkWidget *widget,
8445 struct SnapshotData *data)
8448 *data->window = NULL;
8452 g_object_unref (data->cursor);
8453 data->cursor = NULL;
8458 g_signal_handler_disconnect (widget, data->handler);
8466 snapshot_widget_event (GtkWidget *widget,
8468 struct SnapshotData *data)
8470 GtkWidget *res_widget = NULL;
8472 if (!data->in_query)
8475 if (event->type == GDK_BUTTON_RELEASE)
8477 gtk_grab_remove (widget);
8478 gdk_device_ungrab (gdk_event_get_device (event),
8481 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8482 if (data->is_toplevel && res_widget)
8483 res_widget = gtk_widget_get_toplevel (res_widget);
8486 cairo_surface_t *surface;
8487 GtkWidget *window, *image;
8492 width = gtk_widget_get_allocated_width (res_widget);
8493 height = gtk_widget_get_allocated_height (res_widget);
8495 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8497 cr = cairo_create (surface);
8498 gtk_widget_draw (res_widget, cr);
8501 pixbuf = gdk_pixbuf_get_from_surface (surface,
8504 cairo_surface_destroy (surface);
8506 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8507 image = gtk_image_new_from_pixbuf (pixbuf);
8508 g_object_unref (pixbuf);
8510 gtk_container_add (GTK_CONTAINER (window), image);
8511 gtk_widget_show_all (window);
8514 data->in_query = FALSE;
8521 snapshot_widget (GtkButton *button,
8522 struct SnapshotData *data)
8524 GtkWidget *widget = GTK_WIDGET (button);
8527 device = gtk_get_current_event_device ();
8531 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8532 device = gdk_device_get_associated_device (device);
8534 data->is_toplevel = widget == data->toplevel_button;
8537 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8540 gdk_device_grab (device,
8541 gtk_widget_get_window (widget),
8542 GDK_OWNERSHIP_APPLICATION,
8544 GDK_BUTTON_RELEASE_MASK,
8548 g_signal_connect (button, "event",
8549 G_CALLBACK (snapshot_widget_event), data);
8551 gtk_grab_add (widget);
8553 data->in_query = TRUE;
8557 create_snapshot (GtkWidget *widget)
8559 static GtkWidget *window = NULL;
8562 struct SnapshotData *data;
8564 data = g_new (struct SnapshotData, 1);
8565 data->window = &window;
8566 data->in_query = FALSE;
8567 data->cursor = NULL;
8572 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8574 gtk_window_set_screen (GTK_WINDOW (window),
8575 gtk_widget_get_screen (widget));
8577 data->handler = g_signal_connect (window, "destroy",
8578 G_CALLBACK (destroy_snapshot_data),
8581 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8582 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8584 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8585 gtk_container_add (GTK_CONTAINER (window), vbox);
8587 button = gtk_button_new_with_label ("Snapshot widget");
8588 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8589 g_signal_connect (button, "clicked",
8590 G_CALLBACK (snapshot_widget),
8593 button = gtk_button_new_with_label ("Snapshot toplevel");
8594 data->toplevel_button = button;
8595 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8596 g_signal_connect (button, "clicked",
8597 G_CALLBACK (snapshot_widget),
8601 if (!gtk_widget_get_visible (window))
8602 gtk_widget_show_all (window);
8604 gtk_widget_destroy (window);
8613 selection_test_received (GtkWidget *tree_view,
8614 GtkSelectionData *selection_data)
8616 GtkTreeModel *model;
8617 GtkListStore *store;
8621 if (gtk_selection_data_get_length (selection_data) < 0)
8623 g_print ("Selection retrieval failed\n");
8626 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8628 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8632 /* Clear out any current list items */
8634 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8635 store = GTK_LIST_STORE (model);
8636 gtk_list_store_clear (store);
8638 /* Add new items to list */
8640 gtk_selection_data_get_targets (selection_data,
8643 for (i = 0; i < l; i++)
8648 name = gdk_atom_name (atoms[i]);
8651 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
8655 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
8662 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
8664 static GdkAtom targets_atom = GDK_NONE;
8666 if (targets_atom == GDK_NONE)
8667 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
8669 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
8674 create_selection_test (GtkWidget *widget)
8676 static GtkWidget *window = NULL;
8677 GtkWidget *action_area, *content_area;
8680 GtkWidget *scrolled_win;
8681 GtkListStore* store;
8682 GtkWidget *tree_view;
8683 GtkTreeViewColumn *column;
8684 GtkCellRenderer *renderer;
8689 window = gtk_dialog_new ();
8691 gtk_window_set_screen (GTK_WINDOW (window),
8692 gtk_widget_get_screen (widget));
8694 g_signal_connect (window, "destroy",
8695 G_CALLBACK (gtk_widget_destroyed),
8698 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8699 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
8701 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
8702 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8704 /* Create the list */
8706 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8707 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8708 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
8710 label = gtk_label_new ("Gets available targets for current selection");
8711 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8713 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
8714 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
8715 GTK_POLICY_AUTOMATIC,
8716 GTK_POLICY_AUTOMATIC);
8717 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
8718 gtk_widget_set_size_request (scrolled_win, 100, 200);
8720 store = gtk_list_store_new (1, G_TYPE_STRING);
8721 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
8722 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
8724 renderer = gtk_cell_renderer_text_new ();
8725 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
8727 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
8729 g_signal_connect (tree_view, "selection_received",
8730 G_CALLBACK (selection_test_received), NULL);
8732 /* .. And create some buttons */
8733 button = gtk_button_new_with_label ("Get Targets");
8734 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8736 g_signal_connect (button, "clicked",
8737 G_CALLBACK (selection_test_get_targets), tree_view);
8739 button = gtk_button_new_with_label ("Quit");
8740 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8742 g_signal_connect_swapped (button, "clicked",
8743 G_CALLBACK (gtk_widget_destroy),
8747 if (!gtk_widget_get_visible (window))
8748 gtk_widget_show_all (window);
8750 gtk_widget_destroy (window);
8757 static int scroll_test_pos = 0.0;
8760 scroll_test_draw (GtkWidget *widget,
8762 GtkAdjustment *adjustment)
8765 gint imin, imax, jmin, jmax;
8768 gdk_cairo_get_clip_rectangle (cr, &clip);
8770 imin = (clip.x) / 10;
8771 imax = (clip.x + clip.width + 9) / 10;
8773 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
8774 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
8776 for (i=imin; i<imax; i++)
8777 for (j=jmin; j<jmax; j++)
8779 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
8787 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
8788 GtkAdjustment *adjustment)
8790 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
8791 -gtk_adjustment_get_page_increment (adjustment) / 2:
8792 gtk_adjustment_get_page_increment (adjustment) / 2);
8793 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
8794 gtk_adjustment_set_value (adjustment, new_value);
8800 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
8801 GtkAdjustment *adjustment)
8803 GtkAllocation allocation;
8805 gtk_widget_get_allocation (widget, &allocation);
8806 gtk_adjustment_configure (adjustment,
8807 gtk_adjustment_get_value (adjustment),
8808 gtk_adjustment_get_lower (adjustment),
8809 gtk_adjustment_get_upper (adjustment),
8810 0.1 * allocation.height,
8811 0.9 * allocation.height,
8816 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
8821 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
8822 scroll_test_pos = gtk_adjustment_get_value (adjustment);
8824 if (!gtk_widget_is_drawable (widget))
8827 window = gtk_widget_get_window (widget);
8828 gdk_window_scroll (window, 0, dy);
8829 gdk_window_process_updates (window, FALSE);
8834 create_scroll_test (GtkWidget *widget)
8836 static GtkWidget *window = NULL;
8837 GtkWidget *action_area, *content_area;
8839 GtkWidget *drawing_area;
8840 GtkWidget *scrollbar;
8842 GtkAdjustment *adjustment;
8843 GdkGeometry geometry;
8844 GdkWindowHints geometry_mask;
8848 window = gtk_dialog_new ();
8850 gtk_window_set_screen (GTK_WINDOW (window),
8851 gtk_widget_get_screen (widget));
8853 g_signal_connect (window, "destroy",
8854 G_CALLBACK (gtk_widget_destroyed),
8857 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8858 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
8860 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
8861 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8863 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8864 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
8865 gtk_widget_show (hbox);
8867 drawing_area = gtk_drawing_area_new ();
8868 gtk_widget_set_size_request (drawing_area, 200, 200);
8869 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
8870 gtk_widget_show (drawing_area);
8872 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
8874 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
8875 scroll_test_pos = 0.0;
8877 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
8878 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
8879 gtk_widget_show (scrollbar);
8881 g_signal_connect (drawing_area, "draw",
8882 G_CALLBACK (scroll_test_draw), adjustment);
8883 g_signal_connect (drawing_area, "configure_event",
8884 G_CALLBACK (scroll_test_configure), adjustment);
8885 g_signal_connect (drawing_area, "scroll_event",
8886 G_CALLBACK (scroll_test_scroll), adjustment);
8888 g_signal_connect (adjustment, "value_changed",
8889 G_CALLBACK (scroll_test_adjustment_changed),
8892 /* .. And create some buttons */
8894 button = gtk_button_new_with_label ("Quit");
8895 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8897 g_signal_connect_swapped (button, "clicked",
8898 G_CALLBACK (gtk_widget_destroy),
8900 gtk_widget_show (button);
8902 /* Set up gridded geometry */
8904 geometry_mask = GDK_HINT_MIN_SIZE |
8905 GDK_HINT_BASE_SIZE |
8906 GDK_HINT_RESIZE_INC;
8908 geometry.min_width = 20;
8909 geometry.min_height = 20;
8910 geometry.base_width = 0;
8911 geometry.base_height = 0;
8912 geometry.width_inc = 10;
8913 geometry.height_inc = 10;
8915 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8916 drawing_area, &geometry, geometry_mask);
8919 if (!gtk_widget_get_visible (window))
8920 gtk_widget_show (window);
8922 gtk_widget_destroy (window);
8929 static int timer = 0;
8932 timeout_test (GtkWidget *label)
8934 static int count = 0;
8935 static char buffer[32];
8937 sprintf (buffer, "count: %d", ++count);
8938 gtk_label_set_text (GTK_LABEL (label), buffer);
8944 start_timeout_test (GtkWidget *widget,
8949 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
8954 stop_timeout_test (GtkWidget *widget,
8959 g_source_remove (timer);
8965 destroy_timeout_test (GtkWidget *widget,
8968 stop_timeout_test (NULL, NULL);
8974 create_timeout_test (GtkWidget *widget)
8976 static GtkWidget *window = NULL;
8977 GtkWidget *action_area, *content_area;
8983 window = gtk_dialog_new ();
8985 gtk_window_set_screen (GTK_WINDOW (window),
8986 gtk_widget_get_screen (widget));
8988 g_signal_connect (window, "destroy",
8989 G_CALLBACK (destroy_timeout_test),
8992 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8993 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
8995 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
8996 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8998 label = gtk_label_new ("count: 0");
8999 g_object_set (label, "margin", 10, NULL);
9000 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9001 gtk_widget_show (label);
9003 button = gtk_button_new_with_label ("close");
9004 g_signal_connect_swapped (button, "clicked",
9005 G_CALLBACK (gtk_widget_destroy),
9007 gtk_widget_set_can_default (button, TRUE);
9008 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9009 gtk_widget_grab_default (button);
9010 gtk_widget_show (button);
9012 button = gtk_button_new_with_label ("start");
9013 g_signal_connect (button, "clicked",
9014 G_CALLBACK(start_timeout_test),
9016 gtk_widget_set_can_default (button, TRUE);
9017 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9018 gtk_widget_show (button);
9020 button = gtk_button_new_with_label ("stop");
9021 g_signal_connect (button, "clicked",
9022 G_CALLBACK (stop_timeout_test),
9024 gtk_widget_set_can_default (button, TRUE);
9025 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9026 gtk_widget_show (button);
9029 if (!gtk_widget_get_visible (window))
9030 gtk_widget_show (window);
9032 gtk_widget_destroy (window);
9039 static int idle_id = 0;
9042 idle_test (GtkWidget *label)
9044 static int count = 0;
9045 static char buffer[32];
9047 sprintf (buffer, "count: %d", ++count);
9048 gtk_label_set_text (GTK_LABEL (label), buffer);
9050 return G_SOURCE_CONTINUE;
9054 start_idle_test (GtkWidget *widget,
9059 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9064 stop_idle_test (GtkWidget *widget,
9069 g_source_remove (idle_id);
9075 destroy_idle_test (GtkWidget *widget,
9078 stop_idle_test (NULL, NULL);
9084 toggle_idle_container (GObject *button,
9085 GtkContainer *container)
9087 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9091 create_idle_test (GtkWidget *widget)
9093 static GtkWidget *window = NULL;
9096 GtkWidget *container;
9100 GtkWidget *action_area, *content_area;
9105 window = gtk_dialog_new ();
9107 gtk_window_set_screen (GTK_WINDOW (window),
9108 gtk_widget_get_screen (widget));
9110 g_signal_connect (window, "destroy",
9111 G_CALLBACK (destroy_idle_test),
9114 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9115 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9117 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9118 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9120 label = gtk_label_new ("count: 0");
9121 g_object_set (label, "margin", 10, NULL);
9122 gtk_widget_show (label);
9125 g_object_new (GTK_TYPE_BOX,
9127 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9128 * "GtkWidget::visible", TRUE,
9133 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9136 g_object_new (GTK_TYPE_FRAME,
9138 "label", "Label Container",
9140 "parent", content_area,
9143 g_object_new (GTK_TYPE_BOX,
9146 "orientation", GTK_ORIENTATION_VERTICAL,
9149 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9150 "label", "Resize-Parent",
9151 "user_data", (void*)GTK_RESIZE_PARENT,
9155 "signal::clicked", toggle_idle_container, container,
9157 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9158 "label", "Resize-Queue",
9159 "user_data", (void*)GTK_RESIZE_QUEUE,
9164 g_object_connect (button,
9165 "signal::clicked", toggle_idle_container, container,
9167 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9168 "label", "Resize-Immediate",
9169 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9171 g_object_connect (button2,
9172 "signal::clicked", toggle_idle_container, container,
9174 g_object_set (button2,
9180 button = gtk_button_new_with_label ("close");
9181 g_signal_connect_swapped (button, "clicked",
9182 G_CALLBACK (gtk_widget_destroy),
9184 gtk_widget_set_can_default (button, TRUE);
9185 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9186 gtk_widget_grab_default (button);
9187 gtk_widget_show (button);
9189 button = gtk_button_new_with_label ("start");
9190 g_signal_connect (button, "clicked",
9191 G_CALLBACK (start_idle_test),
9193 gtk_widget_set_can_default (button, TRUE);
9194 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9195 gtk_widget_show (button);
9197 button = gtk_button_new_with_label ("stop");
9198 g_signal_connect (button, "clicked",
9199 G_CALLBACK (stop_idle_test),
9201 gtk_widget_set_can_default (button, TRUE);
9202 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9203 gtk_widget_show (button);
9206 if (!gtk_widget_get_visible (window))
9207 gtk_widget_show (window);
9209 gtk_widget_destroy (window);
9217 create_rc_file (GtkWidget *widget)
9219 static GtkWidget *window = NULL;
9220 GtkWidget *action_area, *content_area;
9228 window = gtk_dialog_new ();
9230 gtk_window_set_screen (GTK_WINDOW (window),
9231 gtk_widget_get_screen (widget));
9233 g_signal_connect (window, "destroy",
9234 G_CALLBACK (gtk_widget_destroyed),
9237 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9238 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9240 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9241 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9243 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9244 gtk_container_add (GTK_CONTAINER (frame), vbox);
9246 label = gtk_label_new ("This label should be red");
9247 gtk_widget_set_name (label, "testgtk-red-label");
9248 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9250 label = gtk_label_new ("This label should be green");
9251 gtk_widget_set_name (label, "testgtk-green-label");
9252 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9254 label = gtk_label_new ("This label should be blue");
9255 gtk_widget_set_name (label, "testgtk-blue-label");
9256 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9258 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9259 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9261 button = gtk_button_new_with_label ("Reload");
9262 g_signal_connect_swapped (button, "clicked",
9263 G_CALLBACK (gtk_style_context_reset_widgets),
9264 gtk_widget_get_screen (button));
9265 gtk_widget_set_can_default (button, TRUE);
9266 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9267 gtk_widget_grab_default (button);
9269 button = gtk_button_new_with_label ("Close");
9270 g_signal_connect_swapped (button, "clicked",
9271 G_CALLBACK (gtk_widget_destroy),
9273 gtk_widget_set_can_default (button, TRUE);
9274 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9277 if (!gtk_widget_get_visible (window))
9278 gtk_widget_show_all (window);
9280 gtk_widget_destroy (window);
9284 * Test of recursive mainloop
9288 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9295 create_mainloop (GtkWidget *widget)
9297 static GtkWidget *window = NULL;
9298 GtkWidget *action_area, *content_area;
9304 window = gtk_dialog_new ();
9306 gtk_window_set_screen (GTK_WINDOW (window),
9307 gtk_widget_get_screen (widget));
9309 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9311 g_signal_connect (window, "destroy",
9312 G_CALLBACK (mainloop_destroyed),
9315 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9316 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9318 label = gtk_label_new ("In recursive main loop...");
9319 g_object_set (label, "margin", 20, NULL);
9321 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9322 gtk_widget_show (label);
9324 button = gtk_button_new_with_label ("Leave");
9325 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9327 g_signal_connect_swapped (button, "clicked",
9328 G_CALLBACK (gtk_widget_destroy),
9331 gtk_widget_set_can_default (button, TRUE);
9332 gtk_widget_grab_default (button);
9334 gtk_widget_show (button);
9337 if (!gtk_widget_get_visible (window))
9339 gtk_widget_show (window);
9341 g_print ("create_mainloop: start\n");
9343 g_print ("create_mainloop: done\n");
9346 gtk_widget_destroy (window);
9350 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9353 GdkWindow *bin_window;
9356 gint imin, imax, jmin, jmax;
9358 layout = GTK_LAYOUT (widget);
9359 bin_window = gtk_layout_get_bin_window (layout);
9361 if (!gtk_cairo_should_draw_window (cr, bin_window))
9364 gdk_window_get_position (bin_window, &x, &y);
9365 cairo_translate (cr, x, y);
9367 gdk_cairo_get_clip_rectangle (cr, &clip);
9369 imin = (clip.x) / 10;
9370 imax = (clip.x + clip.width + 9) / 10;
9372 jmin = (clip.y) / 10;
9373 jmax = (clip.y + clip.height + 9) / 10;
9375 for (i=imin; i<imax; i++)
9376 for (j=jmin; j<jmax; j++)
9378 cairo_rectangle (cr,
9387 void create_layout (GtkWidget *widget)
9389 GtkAdjustment *hadjustment, *vadjustment;
9391 static GtkWidget *window = NULL;
9392 GtkWidget *layout_widget;
9393 GtkWidget *scrolledwindow;
9402 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9403 gtk_window_set_screen (GTK_WINDOW (window),
9404 gtk_widget_get_screen (widget));
9406 g_signal_connect (window, "destroy",
9407 G_CALLBACK (gtk_widget_destroyed),
9410 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9411 gtk_widget_set_size_request (window, 200, 200);
9413 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9414 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9416 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9417 GTK_CORNER_TOP_RIGHT);
9419 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9421 layout_widget = gtk_layout_new (NULL, NULL);
9422 layout = GTK_LAYOUT (layout_widget);
9423 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9425 /* We set step sizes here since GtkLayout does not set
9428 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9429 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9430 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9431 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9432 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9433 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9435 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9436 g_signal_connect (layout, "draw",
9437 G_CALLBACK (layout_draw_handler), NULL);
9439 gtk_layout_set_size (layout, 1600, 128000);
9441 for (i=0 ; i < 16 ; i++)
9442 for (j=0 ; j < 16 ; j++)
9444 sprintf(buf, "Button %d, %d", i, j);
9446 button = gtk_button_new_with_label (buf);
9448 button = gtk_label_new (buf);
9450 gtk_layout_put (layout, button, j*100, i*100);
9453 for (i=16; i < 1280; i++)
9455 sprintf(buf, "Button %d, %d", i, 0);
9457 button = gtk_button_new_with_label (buf);
9459 button = gtk_label_new (buf);
9461 gtk_layout_put (layout, button, 0, i*100);
9465 if (!gtk_widget_get_visible (window))
9466 gtk_widget_show_all (window);
9468 gtk_widget_destroy (window);
9472 /* FIXME: need to completely redo this for GtkStyleContext */
9474 create_styles (GtkWidget *widget)
9476 static GtkWidget *window = NULL;
9477 GtkWidget *content_area, *action_area;
9482 static GdkRGBA red = { 1,0,0,1 };
9483 static GdkRGBA green = { 0,1,0,1 };
9484 static GdkRGBA blue = { 0,0,1,1 };
9485 static GdkRGBA yellow = { 1,1,0,1 };
9486 static GdkRGBA cyan = { 0,1,1,1 };
9487 PangoFontDescription *font_desc;
9489 GtkRcStyle *rc_style;
9493 window = gtk_dialog_new ();
9494 gtk_window_set_screen (GTK_WINDOW (window),
9495 gtk_widget_get_screen (widget));
9497 g_signal_connect (window, "destroy",
9498 G_CALLBACK (gtk_widget_destroyed),
9501 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9502 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9504 button = gtk_button_new_with_label ("Close");
9505 g_signal_connect_swapped (button, "clicked",
9506 G_CALLBACK (gtk_widget_destroy),
9508 gtk_widget_set_can_default (button, TRUE);
9509 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9510 gtk_widget_show (button);
9512 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9513 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9514 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9516 label = gtk_label_new ("Font:");
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 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9523 button = gtk_button_new_with_label ("Some Text");
9524 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9525 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9527 label = gtk_label_new ("Foreground:");
9528 gtk_widget_set_halign (label, GTK_ALIGN_START);
9529 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9530 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9532 button = gtk_button_new_with_label ("Some Text");
9533 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9534 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9536 label = gtk_label_new ("Background:");
9537 gtk_widget_set_halign (label, GTK_ALIGN_START);
9538 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9539 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9541 button = gtk_button_new_with_label ("Some Text");
9542 gtk_widget_override_background_color (button, 0, &green);
9543 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9545 label = gtk_label_new ("Text:");
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_override_color (entry, 0, &blue);
9553 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9555 label = gtk_label_new ("Base:");
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 entry = gtk_entry_new ();
9561 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9562 gtk_widget_override_background_color (entry, 0, &yellow);
9563 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9565 label = gtk_label_new ("Cursor:");
9566 gtk_widget_set_halign (label, GTK_ALIGN_START);
9567 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9568 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9570 entry = gtk_entry_new ();
9571 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9572 gtk_widget_modify_cursor (entry, &red, &red);
9573 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9575 label = gtk_label_new ("Multiple:");
9576 gtk_widget_set_halign (label, GTK_ALIGN_START);
9577 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9578 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9580 button = gtk_button_new_with_label ("Some Text");
9582 rc_style = gtk_rc_style_new ();
9584 rc_style->font_desc = pango_font_description_copy (font_desc);
9585 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9586 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9587 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9588 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9589 rc_style->bg[GTK_STATE_NORMAL] = blue;
9590 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9591 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9592 rc_style->fg[GTK_STATE_ACTIVE] = red;
9593 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9594 rc_style->xthickness = 5;
9595 rc_style->ythickness = 5;
9597 gtk_widget_modify_style (button, rc_style);
9598 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9600 g_object_unref (rc_style);
9602 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9605 if (!gtk_widget_get_visible (window))
9606 gtk_widget_show_all (window);
9608 gtk_widget_destroy (window);
9613 * Main Window and Exit
9617 do_exit (GtkWidget *widget, GtkWidget *window)
9619 gtk_widget_destroy (window);
9625 void (*func) (GtkWidget *widget);
9626 gboolean do_not_benchmark;
9629 { "alpha window", create_alpha_window },
9630 { "big windows", create_big_windows },
9631 { "button box", create_button_box },
9632 { "buttons", create_buttons },
9633 { "check buttons", create_check_buttons },
9634 { "color selection", create_color_selection },
9635 { "composited window", create_composited_window },
9636 { "cursors", create_cursors },
9637 { "dialog", create_dialog },
9638 { "display & screen", create_display_screen, TRUE },
9639 { "entry", create_entry },
9640 { "event box", create_event_box },
9641 { "event watcher", create_event_watcher },
9642 { "expander", create_expander },
9643 { "flipping", create_flipping },
9644 { "focus", create_focus },
9645 { "font selection", create_font_selection },
9646 { "image", create_image },
9647 { "key lookup", create_key_lookup },
9648 { "labels", create_labels },
9649 { "layout", create_layout },
9650 { "menus", create_menus },
9651 { "message dialog", create_message_dialog },
9652 { "modal window", create_modal_window, TRUE },
9653 { "notebook", create_notebook },
9654 { "panes", create_panes },
9655 { "paned keyboard", create_paned_keyboard_navigation },
9656 { "pixbuf", create_pixbuf },
9657 { "progress bar", create_progress_bar },
9658 { "properties", create_properties },
9659 { "radio buttons", create_radio_buttons },
9660 { "range controls", create_range_controls },
9661 { "rc file", create_rc_file },
9662 { "reparent", create_reparent },
9663 { "resize grips", create_resize_grips },
9664 { "rotated label", create_rotated_label },
9665 { "rotated text", create_rotated_text },
9666 { "saved position", create_saved_position },
9667 { "scrolled windows", create_scrolled_windows },
9668 { "shapes", create_shapes },
9669 { "size groups", create_size_groups },
9670 { "snapshot", create_snapshot },
9671 { "spinbutton", create_spins },
9672 { "statusbar", create_statusbar },
9674 { "styles", create_styles },
9676 { "test idle", create_idle_test },
9677 { "test mainloop", create_mainloop, TRUE },
9678 { "test scrolling", create_scroll_test },
9679 { "test selection", create_selection_test },
9680 { "test timeout", create_timeout_test },
9681 { "toggle buttons", create_toggle_buttons },
9682 { "toolbar", create_toolbar },
9683 { "tooltips", create_tooltips },
9684 { "WM hints", create_wmhints },
9685 { "window sizing", create_window_sizing },
9686 { "window states", create_window_states }
9688 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
9691 create_main_window (void)
9696 GtkWidget *scrolled_window;
9700 GtkWidget *separator;
9701 GdkGeometry geometry;
9704 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9705 gtk_widget_set_name (window, "main_window");
9706 gtk_window_move (GTK_WINDOW (window), 50, 20);
9707 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
9709 geometry.min_width = -1;
9710 geometry.min_height = -1;
9711 geometry.max_width = -1;
9712 geometry.max_height = G_MAXSHORT;
9713 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
9715 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
9717 g_signal_connect (window, "destroy",
9718 G_CALLBACK (gtk_main_quit),
9720 g_signal_connect (window, "delete-event",
9721 G_CALLBACK (gtk_false),
9724 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9725 gtk_container_add (GTK_CONTAINER (window), box1);
9727 if (gtk_micro_version > 0)
9730 gtk_get_major_version (),
9731 gtk_get_minor_version (),
9732 gtk_get_micro_version ());
9736 gtk_get_major_version (),
9737 gtk_get_minor_version ());
9739 label = gtk_label_new (buffer);
9740 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
9741 gtk_widget_set_name (label, "testgtk-version-label");
9743 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
9744 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
9745 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
9747 GTK_POLICY_AUTOMATIC);
9748 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
9750 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9751 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9752 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
9753 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
9754 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
9755 gtk_widget_show (box2);
9757 for (i = 0; i < nbuttons; i++)
9759 button = gtk_button_new_with_label (buttons[i].label);
9760 if (buttons[i].func)
9761 g_signal_connect (button,
9763 G_CALLBACK(buttons[i].func),
9766 gtk_widget_set_sensitive (button, FALSE);
9767 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9770 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
9771 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9773 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
9774 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9775 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9777 button = gtk_button_new_with_mnemonic ("_Close");
9778 g_signal_connect (button, "clicked",
9779 G_CALLBACK (do_exit),
9781 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9782 gtk_widget_set_can_default (button, TRUE);
9783 gtk_widget_grab_default (button);
9785 gtk_widget_show_all (window);
9791 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
9792 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
9796 pad (const char *str, int to)
9798 static char buf[256];
9799 int len = strlen (str);
9802 for (i = 0; i < to; i++)
9807 memcpy (buf, str, len);
9813 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
9815 fn (widget); /* on */
9816 while (g_main_context_iteration (NULL, FALSE));
9817 fn (widget); /* off */
9818 while (g_main_context_iteration (NULL, FALSE));
9822 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
9828 static gboolean printed_headers = FALSE;
9830 if (!printed_headers) {
9831 g_print ("Test Iters First Other\n");
9832 g_print ("-------------------- ----- ---------- ----------\n");
9833 printed_headers = TRUE;
9836 g_get_current_time (&tv0);
9837 bench_iteration (widget, fn);
9838 g_get_current_time (&tv1);
9840 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
9841 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
9843 g_get_current_time (&tv0);
9844 for (n = 0; n < num - 1; n++)
9845 bench_iteration (widget, fn);
9846 g_get_current_time (&tv1);
9847 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
9848 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
9850 g_print ("%s %5d ", pad (name, 20), num);
9852 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
9854 g_print ("%10.1f\n", dt_first);
9858 do_bench (char* what, int num)
9862 void (* fn) (GtkWidget *widget);
9864 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9866 if (g_ascii_strcasecmp (what, "ALL") == 0)
9868 for (i = 0; i < nbuttons; i++)
9870 if (!buttons[i].do_not_benchmark)
9871 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
9878 for (i = 0; i < nbuttons; i++)
9880 if (strcmp (buttons[i].label, what) == 0)
9882 fn = buttons[i].func;
9888 g_print ("Can't bench: \"%s\" not found.\n", what);
9890 do_real_bench (widget, fn, buttons[i].label, num);
9897 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
9902 main (int argc, char *argv[])
9904 GtkCssProvider *provider, *memory_provider;
9905 GdkDisplay *display;
9907 GtkBindingSet *binding_set;
9909 gboolean done_benchmarks = FALSE;
9911 srand (time (NULL));
9915 g_set_application_name ("GTK+ Test Program");
9917 gtk_init (&argc, &argv);
9919 provider = gtk_css_provider_new ();
9921 /* Check to see if we are being run from the correct
9924 if (file_exists ("testgtk.css"))
9925 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
9926 else if (file_exists ("tests/testgtk.css"))
9927 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
9929 g_warning ("Couldn't find file \"testgtk.css\".");
9931 display = gdk_display_get_default ();
9932 screen = gdk_display_get_default_screen (display);
9934 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
9935 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
9936 g_object_unref (provider);
9938 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
9947 for (i = 1; i < argc; i++)
9949 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
9956 nextarg = strchr (argv[i], '=');
9967 count = strchr (nextarg, ':');
9970 what = g_strndup (nextarg, count - nextarg);
9977 what = g_strdup (nextarg);
9979 do_bench (what, num ? num : 1);
9980 done_benchmarks = TRUE;
9985 if (done_benchmarks)
9990 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
9991 gtk_binding_entry_add_signal (binding_set,
9992 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
9995 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
9997 memory_provider = gtk_css_provider_new ();
9998 gtk_css_provider_load_from_data (memory_provider,
9999 "#testgtk-version-label {\n"
10001 " font: Sans 18;\n"
10004 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10005 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10007 create_main_window ();
10013 while (g_main_context_pending (NULL))
10014 g_main_context_iteration (NULL, FALSE);
10017 while (g_main_context_pending (NULL))
10018 g_main_context_iteration (NULL, FALSE);