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/.
41 #define GTK_ENABLE_BROKEN
44 #include "gdk/gdkkeysyms.h"
47 #define sleep(n) _sleep(n)
50 #include "prop-editor.h"
52 #include "circles.xbm"
56 file_exists (const char *filename)
60 return stat (filename, &statbuf) == 0;
64 shape_create_icon (GdkScreen *screen,
73 build_option_menu (gchar *items[],
76 void (*func)(GtkWidget *widget, gpointer data),
79 /* macro, structure and variables used by tree window demos */
80 #define DEFAULT_NUMBER_OF_ITEM 3
81 #define DEFAULT_RECURSION_LEVEL 3
84 GSList* selection_mode_group;
85 GtkWidget* single_button;
86 GtkWidget* browse_button;
87 GtkWidget* multiple_button;
88 GtkWidget* draw_line_button;
89 GtkWidget* view_line_button;
90 GtkWidget* no_root_item_button;
91 GtkWidget* nb_item_spinner;
92 GtkWidget* recursion_spinner;
93 } sTreeSampleSelection;
95 typedef struct sTreeButtons {
97 GtkWidget* add_button;
98 GtkWidget* remove_button;
99 GtkWidget* subtree_button;
101 /* end of tree section */
104 build_option_menu (gchar *items[],
107 void (*func)(GtkWidget *widget, gpointer data),
112 GtkWidget *menu_item;
116 omenu = gtk_option_menu_new ();
117 g_signal_connect (omenu, "changed",
118 G_CALLBACK (func), data);
120 menu = gtk_menu_new ();
123 for (i = 0; i < num_items; i++)
125 menu_item = gtk_radio_menu_item_new_with_label (group, items[i]);
126 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menu_item));
127 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
129 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
130 gtk_widget_show (menu_item);
133 gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
134 gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), history);
140 destroy_tooltips (GtkWidget *widget, GtkWindow **window)
142 GtkTooltips *tt = g_object_get_data (G_OBJECT (*window), "tooltips");
149 * Big windows and guffaw scrolling
153 pattern_expose (GtkWidget *widget,
154 GdkEventExpose *event,
158 GdkWindow *window = event->window;
160 color = g_object_get_data (G_OBJECT (window), "pattern-color");
163 GdkGC *tmp_gc = gdk_gc_new (window);
164 gdk_gc_set_rgb_fg_color (tmp_gc, color);
166 gdk_draw_rectangle (window, tmp_gc, TRUE,
167 event->area.x, event->area.y,
168 event->area.width, event->area.height);
170 g_object_unref (tmp_gc);
177 pattern_set_bg (GtkWidget *widget,
181 static const GdkColor colors[] = {
182 { 0, 0x4444, 0x4444, 0xffff },
183 { 0, 0x8888, 0x8888, 0xffff },
184 { 0, 0xaaaa, 0xaaaa, 0xffff }
187 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
188 gdk_window_set_user_data (child, widget);
192 create_pattern (GtkWidget *widget,
203 while (2 * h <= height)
208 while (2 * w <= width)
210 if ((i + j) % 2 == 0)
215 GdkWindowAttr attributes;
217 attributes.window_type = GDK_WINDOW_CHILD;
220 attributes.width = w;
221 attributes.height = h;
222 attributes.wclass = GDK_INPUT_OUTPUT;
223 attributes.event_mask = GDK_EXPOSURE_MASK;
224 attributes.visual = gtk_widget_get_visual (widget);
225 attributes.colormap = gtk_widget_get_colormap (widget);
227 child = gdk_window_new (parent, &attributes,
228 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
230 pattern_set_bg (widget, child, level);
233 create_pattern (widget, child, level + 1, w, h);
235 gdk_window_show (child);
245 #define PATTERN_SIZE (1 << 18)
248 pattern_hadj_changed (GtkAdjustment *adj,
251 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
252 gint new_value = adj->value;
254 if (GTK_WIDGET_REALIZED (darea))
256 gdk_window_scroll (darea->window, *old_value - new_value, 0);
257 *old_value = new_value;
262 pattern_vadj_changed (GtkAdjustment *adj,
265 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
266 gint new_value = adj->value;
268 if (GTK_WIDGET_REALIZED (darea))
270 gdk_window_scroll (darea->window, 0, *old_value - new_value);
271 *old_value = new_value;
276 pattern_realize (GtkWidget *widget,
279 pattern_set_bg (widget, widget->window, 0);
280 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
284 create_big_windows (GtkWidget *widget)
286 static GtkWidget *window = NULL;
287 GtkWidget *darea, *table, *scrollbar;
291 static gint current_x;
292 static gint current_y;
299 window = gtk_dialog_new_with_buttons ("Big Windows",
305 gtk_window_set_screen (GTK_WINDOW (window),
306 gtk_widget_get_screen (widget));
308 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
310 g_signal_connect (window, "destroy",
311 G_CALLBACK (gtk_widget_destroyed),
314 g_signal_connect (window, "response",
315 G_CALLBACK (gtk_widget_destroy),
318 table = gtk_table_new (2, 2, FALSE);
319 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
320 table, TRUE, TRUE, 0);
322 darea = gtk_drawing_area_new ();
324 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
325 g_signal_connect (hadj, "value_changed",
326 G_CALLBACK (pattern_hadj_changed), darea);
327 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
329 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
330 g_signal_connect (vadj, "value_changed",
331 G_CALLBACK (pattern_vadj_changed), darea);
332 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
334 g_signal_connect (darea, "realize",
335 G_CALLBACK (pattern_realize),
337 g_signal_connect (darea, "expose_event",
338 G_CALLBACK (pattern_expose),
341 eventbox = gtk_event_box_new ();
342 gtk_table_attach (GTK_TABLE (table), eventbox,
344 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
347 gtk_container_add (GTK_CONTAINER (eventbox), darea);
349 scrollbar = gtk_hscrollbar_new (hadj);
350 gtk_table_attach (GTK_TABLE (table), scrollbar,
352 GTK_FILL | GTK_EXPAND, GTK_FILL,
355 scrollbar = gtk_vscrollbar_new (vadj);
356 gtk_table_attach (GTK_TABLE (table), scrollbar,
358 GTK_FILL, GTK_EXPAND | GTK_FILL,
363 if (!GTK_WIDGET_VISIBLE (window))
364 gtk_widget_show_all (window);
366 gtk_widget_hide (window);
374 button_window (GtkWidget *widget,
377 if (!GTK_WIDGET_VISIBLE (button))
378 gtk_widget_show (button);
380 gtk_widget_hide (button);
384 create_buttons (GtkWidget *widget)
386 static GtkWidget *window = NULL;
390 GtkWidget *button[10];
391 GtkWidget *separator;
395 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
396 gtk_window_set_screen (GTK_WINDOW (window),
397 gtk_widget_get_screen (widget));
399 g_signal_connect (window, "destroy",
400 G_CALLBACK (gtk_widget_destroyed),
403 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
404 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
406 box1 = gtk_vbox_new (FALSE, 0);
407 gtk_container_add (GTK_CONTAINER (window), box1);
409 table = gtk_table_new (3, 3, FALSE);
410 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
411 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
412 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
413 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
415 button[0] = gtk_button_new_with_label ("button1");
416 button[1] = gtk_button_new_with_mnemonic ("_button2");
417 button[2] = gtk_button_new_with_mnemonic ("_button3");
418 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
419 button[4] = gtk_button_new_with_label ("button5");
420 button[5] = gtk_button_new_with_label ("button6");
421 button[6] = gtk_button_new_with_label ("button7");
422 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
423 button[8] = gtk_button_new_with_label ("button9");
425 g_signal_connect (button[0], "clicked",
426 G_CALLBACK (button_window),
429 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
430 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
432 g_signal_connect (button[1], "clicked",
433 G_CALLBACK (button_window),
436 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
437 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
439 g_signal_connect (button[2], "clicked",
440 G_CALLBACK (button_window),
442 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
443 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
445 g_signal_connect (button[3], "clicked",
446 G_CALLBACK (button_window),
448 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
449 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
451 g_signal_connect (button[4], "clicked",
452 G_CALLBACK (button_window),
454 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
455 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
457 g_signal_connect (button[5], "clicked",
458 G_CALLBACK (button_window),
460 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
461 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
463 g_signal_connect (button[6], "clicked",
464 G_CALLBACK (button_window),
466 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
467 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
469 g_signal_connect (button[7], "clicked",
470 G_CALLBACK (button_window),
472 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
473 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
475 g_signal_connect (button[8], "clicked",
476 G_CALLBACK (button_window),
478 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
479 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
481 separator = gtk_hseparator_new ();
482 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
484 box2 = gtk_vbox_new (FALSE, 10);
485 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
486 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
488 button[9] = gtk_button_new_with_label ("close");
489 g_signal_connect_swapped (button[9], "clicked",
490 G_CALLBACK (gtk_widget_destroy),
492 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
493 GTK_WIDGET_SET_FLAGS (button[9], GTK_CAN_DEFAULT);
494 gtk_widget_grab_default (button[9]);
497 if (!GTK_WIDGET_VISIBLE (window))
498 gtk_widget_show_all (window);
500 gtk_widget_destroy (window);
508 create_toggle_buttons (GtkWidget *widget)
510 static GtkWidget *window = NULL;
514 GtkWidget *separator;
518 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
519 gtk_window_set_screen (GTK_WINDOW (window),
520 gtk_widget_get_screen (widget));
522 g_signal_connect (window, "destroy",
523 G_CALLBACK (gtk_widget_destroyed),
526 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
527 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
529 box1 = gtk_vbox_new (FALSE, 0);
530 gtk_container_add (GTK_CONTAINER (window), box1);
532 box2 = gtk_vbox_new (FALSE, 10);
533 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
534 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
536 button = gtk_toggle_button_new_with_label ("button1");
537 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
539 button = gtk_toggle_button_new_with_label ("button2");
540 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
542 button = gtk_toggle_button_new_with_label ("button3");
543 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
545 button = gtk_toggle_button_new_with_label ("inconsistent");
546 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
547 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
549 separator = gtk_hseparator_new ();
550 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
552 box2 = gtk_vbox_new (FALSE, 10);
553 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
554 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
556 button = gtk_button_new_with_label ("close");
557 g_signal_connect_swapped (button, "clicked",
558 G_CALLBACK (gtk_widget_destroy),
560 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
561 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
562 gtk_widget_grab_default (button);
565 if (!GTK_WIDGET_VISIBLE (window))
566 gtk_widget_show_all (window);
568 gtk_widget_destroy (window);
572 create_widget_grid (GType widget_type)
575 GtkWidget *group_widget = NULL;
578 table = gtk_table_new (FALSE, 3, 3);
580 for (i = 0; i < 5; i++)
582 for (j = 0; j < 5; j++)
587 if (i == 0 && j == 0)
593 tmp = g_strdup_printf ("%d", j);
594 widget = gtk_label_new (tmp);
599 tmp = g_strdup_printf ("%c", 'A' + i - 1);
600 widget = gtk_label_new (tmp);
605 widget = g_object_new (widget_type, NULL);
607 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
610 group_widget = widget;
612 g_object_set (widget, "group", group_widget, NULL);
617 gtk_table_attach (GTK_TABLE (table), widget,
632 create_check_buttons (GtkWidget *widget)
634 static GtkWidget *window = NULL;
638 GtkWidget *separator;
643 window = gtk_dialog_new_with_buttons ("Check Buttons",
649 gtk_window_set_screen (GTK_WINDOW (window),
650 gtk_widget_get_screen (widget));
652 g_signal_connect (window, "destroy",
653 G_CALLBACK (gtk_widget_destroyed),
655 g_signal_connect (window, "response",
656 G_CALLBACK (gtk_widget_destroy),
659 box1 = GTK_DIALOG (window)->vbox;
661 box2 = gtk_vbox_new (FALSE, 10);
662 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
663 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
665 button = gtk_check_button_new_with_mnemonic ("_button1");
666 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
668 button = gtk_check_button_new_with_label ("button2");
669 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
671 button = gtk_check_button_new_with_label ("button3");
672 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
674 button = gtk_check_button_new_with_label ("inconsistent");
675 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
676 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
678 separator = gtk_hseparator_new ();
679 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
681 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
682 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
683 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
686 if (!GTK_WIDGET_VISIBLE (window))
687 gtk_widget_show_all (window);
689 gtk_widget_destroy (window);
697 create_radio_buttons (GtkWidget *widget)
699 static GtkWidget *window = NULL;
703 GtkWidget *separator;
708 window = gtk_dialog_new_with_buttons ("Radio Buttons",
714 gtk_window_set_screen (GTK_WINDOW (window),
715 gtk_widget_get_screen (widget));
717 g_signal_connect (window, "destroy",
718 G_CALLBACK (gtk_widget_destroyed),
720 g_signal_connect (window, "response",
721 G_CALLBACK (gtk_widget_destroy),
724 box1 = GTK_DIALOG (window)->vbox;
726 box2 = gtk_vbox_new (FALSE, 10);
727 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
728 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
730 button = gtk_radio_button_new_with_label (NULL, "button1");
731 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
733 button = gtk_radio_button_new_with_label (
734 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
736 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
737 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
739 button = gtk_radio_button_new_with_label (
740 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
742 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
744 button = gtk_radio_button_new_with_label (
745 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
747 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
748 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
750 separator = gtk_hseparator_new ();
751 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
753 box2 = gtk_vbox_new (FALSE, 10);
754 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
755 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
757 button = gtk_radio_button_new_with_label (NULL, "button4");
758 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
759 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
761 button = gtk_radio_button_new_with_label (
762 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
764 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
765 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
766 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
768 button = gtk_radio_button_new_with_label (
769 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
771 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
772 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
774 separator = gtk_hseparator_new ();
775 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
777 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
778 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
779 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
782 if (!GTK_WIDGET_VISIBLE (window))
783 gtk_widget_show_all (window);
785 gtk_widget_destroy (window);
793 create_bbox (gint horizontal,
804 frame = gtk_frame_new (title);
807 bbox = gtk_hbutton_box_new ();
809 bbox = gtk_vbutton_box_new ();
811 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
812 gtk_container_add (GTK_CONTAINER (frame), bbox);
814 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
815 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
816 gtk_button_box_set_child_size (GTK_BUTTON_BOX (bbox), child_w, child_h);
818 button = gtk_button_new_with_label ("OK");
819 gtk_container_add (GTK_CONTAINER (bbox), button);
821 button = gtk_button_new_with_label ("Cancel");
822 gtk_container_add (GTK_CONTAINER (bbox), button);
824 button = gtk_button_new_with_label ("Help");
825 gtk_container_add (GTK_CONTAINER (bbox), button);
831 create_button_box (GtkWidget *widget)
833 static GtkWidget* window = NULL;
834 GtkWidget *main_vbox;
837 GtkWidget *frame_horz;
838 GtkWidget *frame_vert;
842 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
843 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
844 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
846 g_signal_connect (window, "destroy",
847 G_CALLBACK (gtk_widget_destroyed),
850 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
852 main_vbox = gtk_vbox_new (FALSE, 0);
853 gtk_container_add (GTK_CONTAINER (window), main_vbox);
855 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
856 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
858 vbox = gtk_vbox_new (FALSE, 0);
859 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
860 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
862 gtk_box_pack_start (GTK_BOX (vbox),
863 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
866 gtk_box_pack_start (GTK_BOX (vbox),
867 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
870 gtk_box_pack_start (GTK_BOX (vbox),
871 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
874 gtk_box_pack_start (GTK_BOX (vbox),
875 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
878 frame_vert = gtk_frame_new ("Vertical Button Boxes");
879 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
881 hbox = gtk_hbox_new (FALSE, 0);
882 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
883 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
885 gtk_box_pack_start (GTK_BOX (hbox),
886 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
889 gtk_box_pack_start (GTK_BOX (hbox),
890 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
893 gtk_box_pack_start (GTK_BOX (hbox),
894 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
897 gtk_box_pack_start (GTK_BOX (hbox),
898 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
902 if (!GTK_WIDGET_VISIBLE (window))
903 gtk_widget_show_all (window);
905 gtk_widget_destroy (window);
913 new_pixmap (char *filename,
915 GdkColor *background)
921 if (strcmp (filename, "test.xpm") == 0 ||
922 !file_exists (filename))
924 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask,
929 pixmap = gdk_pixmap_create_from_xpm (window, &mask,
933 wpixmap = gtk_image_new_from_pixmap (pixmap, mask);
940 set_toolbar_small_stock (GtkWidget *widget,
943 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
947 set_toolbar_large_stock (GtkWidget *widget,
950 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
954 set_toolbar_horizontal (GtkWidget *widget,
957 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_HORIZONTAL);
961 set_toolbar_vertical (GtkWidget *widget,
964 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_VERTICAL);
968 set_toolbar_icons (GtkWidget *widget,
971 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
975 set_toolbar_text (GtkWidget *widget,
978 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
982 set_toolbar_both (GtkWidget *widget,
985 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
989 set_toolbar_both_horiz (GtkWidget *widget,
992 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
996 set_toolbar_enable (GtkWidget *widget,
999 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), TRUE);
1003 set_toolbar_disable (GtkWidget *widget,
1006 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), FALSE);
1010 create_toolbar (GtkWidget *widget)
1012 static GtkWidget *window = NULL;
1018 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1019 gtk_window_set_screen (GTK_WINDOW (window),
1020 gtk_widget_get_screen (widget));
1022 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1023 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
1025 g_signal_connect (window, "destroy",
1026 G_CALLBACK (gtk_widget_destroyed),
1029 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1030 gtk_widget_realize (window);
1032 toolbar = gtk_toolbar_new ();
1034 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1036 "Stock icon: New", "Toolbar/New",
1037 G_CALLBACK (set_toolbar_small_stock), toolbar, -1);
1039 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1041 "Stock icon: Open", "Toolbar/Open",
1042 G_CALLBACK (set_toolbar_large_stock), toolbar, -1);
1044 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1045 "Horizontal", "Horizontal toolbar layout", "Toolbar/Horizontal",
1046 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1047 G_CALLBACK (set_toolbar_horizontal), toolbar);
1048 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1049 "Vertical", "Vertical toolbar layout", "Toolbar/Vertical",
1050 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1051 G_CALLBACK (set_toolbar_vertical), toolbar);
1053 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1055 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1056 "Icons", "Only show toolbar icons", "Toolbar/IconsOnly",
1057 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1058 G_CALLBACK (set_toolbar_icons), toolbar);
1059 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1060 "Text", "Only show toolbar text", "Toolbar/TextOnly",
1061 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1062 G_CALLBACK (set_toolbar_text), toolbar);
1063 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1064 "Both", "Show toolbar icons and text", "Toolbar/Both",
1065 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1066 G_CALLBACK (set_toolbar_both), toolbar);
1067 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1068 "Both (horizontal)",
1069 "Show toolbar icons and text in a horizontal fashion",
1070 "Toolbar/BothHoriz",
1071 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1072 G_CALLBACK (set_toolbar_both_horiz), toolbar);
1074 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1076 entry = gtk_entry_new ();
1078 gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), entry, "This is an unusable GtkEntry ;)", "Hey don't click me!!!");
1080 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1083 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1085 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1086 "Enable", "Enable tooltips", NULL,
1087 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1088 G_CALLBACK (set_toolbar_enable), toolbar);
1089 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1090 "Disable", "Disable tooltips", NULL,
1091 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1092 G_CALLBACK (set_toolbar_disable), toolbar);
1094 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1096 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1097 "Frobate", "Frobate tooltip", NULL,
1098 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1100 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1101 "Baz", "Baz tooltip", NULL,
1102 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1105 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1107 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1108 "Blah", "Blah tooltip", NULL,
1109 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1111 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1112 "Bar", "Bar tooltip", NULL,
1113 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1116 gtk_container_add (GTK_CONTAINER (window), toolbar);
1119 if (!GTK_WIDGET_VISIBLE (window))
1120 gtk_widget_show_all (window);
1122 gtk_widget_destroy (window);
1126 make_toolbar (GtkWidget *window)
1130 if (!GTK_WIDGET_REALIZED (window))
1131 gtk_widget_realize (window);
1133 toolbar = gtk_toolbar_new ();
1135 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1136 "Horizontal", "Horizontal toolbar layout", NULL,
1137 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1138 G_CALLBACK (set_toolbar_horizontal), toolbar);
1139 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1140 "Vertical", "Vertical toolbar layout", NULL,
1141 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1142 G_CALLBACK (set_toolbar_vertical), toolbar);
1144 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1146 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1147 "Icons", "Only show toolbar icons", NULL,
1148 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1149 G_CALLBACK (set_toolbar_icons), toolbar);
1150 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1151 "Text", "Only show toolbar text", NULL,
1152 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1153 G_CALLBACK (set_toolbar_text), toolbar);
1154 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1155 "Both", "Show toolbar icons and text", NULL,
1156 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1157 G_CALLBACK (set_toolbar_both), toolbar);
1159 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1161 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1162 "Woot", "Woot woot woot", NULL,
1163 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1165 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1166 "Blah", "Blah blah blah", "Toolbar/Big",
1167 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1170 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1172 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1173 "Enable", "Enable tooltips", NULL,
1174 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1175 G_CALLBACK (set_toolbar_enable), toolbar);
1176 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1177 "Disable", "Disable tooltips", NULL,
1178 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1179 G_CALLBACK (set_toolbar_disable), toolbar);
1181 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1183 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1184 "Hoo", "Hoo tooltip", NULL,
1185 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1187 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1188 "Woo", "Woo tooltip", NULL,
1189 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1199 static guint statusbar_counter = 1;
1202 statusbar_push (GtkWidget *button,
1203 GtkStatusbar *statusbar)
1207 sprintf (text, "something %d", statusbar_counter++);
1209 gtk_statusbar_push (statusbar, 1, text);
1213 statusbar_pop (GtkWidget *button,
1214 GtkStatusbar *statusbar)
1216 gtk_statusbar_pop (statusbar, 1);
1220 statusbar_steal (GtkWidget *button,
1221 GtkStatusbar *statusbar)
1223 gtk_statusbar_remove (statusbar, 1, 4);
1227 statusbar_popped (GtkStatusbar *statusbar,
1231 if (!statusbar->messages)
1232 statusbar_counter = 1;
1236 statusbar_contexts (GtkStatusbar *statusbar)
1240 string = "any context";
1241 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1243 gtk_statusbar_get_context_id (statusbar, string));
1245 string = "idle messages";
1246 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1248 gtk_statusbar_get_context_id (statusbar, string));
1250 string = "some text";
1251 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1253 gtk_statusbar_get_context_id (statusbar, string));
1255 string = "hit the mouse";
1256 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1258 gtk_statusbar_get_context_id (statusbar, string));
1260 string = "hit the mouse2";
1261 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1263 gtk_statusbar_get_context_id (statusbar, string));
1267 create_statusbar (GtkWidget *widget)
1269 static GtkWidget *window = NULL;
1273 GtkWidget *separator;
1274 GtkWidget *statusbar;
1278 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1279 gtk_window_set_screen (GTK_WINDOW (window),
1280 gtk_widget_get_screen (widget));
1282 g_signal_connect (window, "destroy",
1283 G_CALLBACK (gtk_widget_destroyed),
1286 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1287 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1289 box1 = gtk_vbox_new (FALSE, 0);
1290 gtk_container_add (GTK_CONTAINER (window), box1);
1292 box2 = gtk_vbox_new (FALSE, 10);
1293 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1294 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1296 statusbar = gtk_statusbar_new ();
1297 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1298 g_signal_connect (statusbar,
1300 G_CALLBACK (statusbar_popped),
1303 button = gtk_widget_new (gtk_button_get_type (),
1304 "label", "push something",
1308 g_object_connect (button,
1309 "signal::clicked", statusbar_push, statusbar,
1312 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1317 "signal_after::clicked", statusbar_pop, statusbar,
1320 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1321 "label", "steal #4",
1325 "signal_after::clicked", statusbar_steal, statusbar,
1328 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1329 "label", "test contexts",
1333 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1336 separator = gtk_hseparator_new ();
1337 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1339 box2 = gtk_vbox_new (FALSE, 10);
1340 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1341 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1343 button = gtk_button_new_with_label ("close");
1344 g_signal_connect_swapped (button, "clicked",
1345 G_CALLBACK (gtk_widget_destroy),
1347 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1348 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1349 gtk_widget_grab_default (button);
1352 if (!GTK_WIDGET_VISIBLE (window))
1353 gtk_widget_show_all (window);
1355 gtk_widget_destroy (window);
1363 cb_tree_destroy_event(GtkWidget* w)
1365 sTreeButtons* tree_buttons;
1367 /* free buttons structure associate at this tree */
1368 tree_buttons = g_object_get_data (G_OBJECT (w), "user_data");
1369 g_free (tree_buttons);
1373 cb_add_new_item(GtkWidget* w, GtkTree* tree)
1375 sTreeButtons* tree_buttons;
1376 GList* selected_list;
1377 GtkWidget* selected_item;
1379 GtkWidget* item_new;
1382 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1384 selected_list = GTK_TREE_SELECTION_OLD(tree);
1386 if(selected_list == NULL)
1388 /* there is no item in tree */
1389 subtree = GTK_WIDGET(tree);
1393 /* list can have only one element */
1394 selected_item = GTK_WIDGET(selected_list->data);
1396 subtree = GTK_TREE_ITEM_SUBTREE(selected_item);
1400 /* current selected item have not subtree ... create it */
1401 subtree = gtk_tree_new();
1402 gtk_tree_item_set_subtree(GTK_TREE_ITEM(selected_item),
1407 /* at this point, we know which subtree will be used to add new item */
1408 /* create a new item */
1409 sprintf(buffer, "item add %d", tree_buttons->nb_item_add);
1410 item_new = gtk_tree_item_new_with_label(buffer);
1411 gtk_tree_append(GTK_TREE(subtree), item_new);
1412 gtk_widget_show(item_new);
1414 tree_buttons->nb_item_add++;
1418 cb_remove_item(GtkWidget*w, GtkTree* tree)
1420 GList* selected_list;
1423 selected_list = GTK_TREE_SELECTION_OLD(tree);
1427 while (selected_list)
1429 clear_list = g_list_prepend (clear_list, selected_list->data);
1430 selected_list = selected_list->next;
1433 clear_list = g_list_reverse (clear_list);
1434 gtk_tree_remove_items(tree, clear_list);
1436 g_list_free (clear_list);
1440 cb_remove_subtree(GtkWidget*w, GtkTree* tree)
1442 GList* selected_list;
1445 selected_list = GTK_TREE_SELECTION_OLD(tree);
1449 item = GTK_TREE_ITEM (selected_list->data);
1451 gtk_tree_item_remove_subtree (item);
1456 cb_tree_changed(GtkTree* tree)
1458 sTreeButtons* tree_buttons;
1459 GList* selected_list;
1462 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1464 selected_list = GTK_TREE_SELECTION_OLD(tree);
1465 nb_selected = g_list_length(selected_list);
1467 if(nb_selected == 0)
1469 if(tree->children == NULL)
1470 gtk_widget_set_sensitive(tree_buttons->add_button, TRUE);
1472 gtk_widget_set_sensitive(tree_buttons->add_button, FALSE);
1473 gtk_widget_set_sensitive(tree_buttons->remove_button, FALSE);
1474 gtk_widget_set_sensitive(tree_buttons->subtree_button, FALSE);
1478 gtk_widget_set_sensitive(tree_buttons->remove_button, TRUE);
1479 gtk_widget_set_sensitive(tree_buttons->add_button, (nb_selected == 1));
1480 gtk_widget_set_sensitive(tree_buttons->subtree_button, (nb_selected == 1));
1485 create_subtree(GtkWidget* item, guint level, guint nb_item_max, guint recursion_level_max)
1487 GtkWidget* item_subtree;
1488 GtkWidget* item_new;
1493 if(level == recursion_level_max) return;
1497 /* query with no root item */
1499 item_subtree = item;
1504 /* query with no root item */
1505 /* create subtree and associate it with current item */
1506 item_subtree = gtk_tree_new();
1510 for(nb_item = 0; nb_item < nb_item_max; nb_item++)
1512 sprintf(buffer, "item %d-%d", level, nb_item);
1513 item_new = gtk_tree_item_new_with_label(buffer);
1514 gtk_tree_append(GTK_TREE(item_subtree), item_new);
1515 create_subtree(item_new, level+1, nb_item_max, recursion_level_max);
1516 gtk_widget_show(item_new);
1520 gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), item_subtree);
1524 create_tree_sample(GdkScreen *screen, guint selection_mode,
1525 guint draw_line, guint view_line, guint no_root_item,
1526 guint nb_item_max, guint recursion_level_max)
1531 GtkWidget* separator;
1533 GtkWidget* scrolled_win;
1534 GtkWidget* root_tree;
1535 GtkWidget* root_item;
1536 sTreeButtons* tree_buttons;
1538 /* create tree buttons struct */
1539 if ((tree_buttons = g_malloc (sizeof (sTreeButtons))) == NULL)
1541 g_error("can't allocate memory for tree structure !\n");
1544 tree_buttons->nb_item_add = 0;
1546 /* create top level window */
1547 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1548 gtk_window_set_screen (GTK_WINDOW (window), screen);
1549 gtk_window_set_title(GTK_WINDOW(window), "Tree Sample");
1550 g_signal_connect (window, "destroy",
1551 G_CALLBACK (cb_tree_destroy_event), NULL);
1552 g_object_set_data (G_OBJECT (window), "user_data", tree_buttons);
1554 box1 = gtk_vbox_new(FALSE, 0);
1555 gtk_container_add(GTK_CONTAINER(window), box1);
1556 gtk_widget_show(box1);
1558 /* create tree box */
1559 box2 = gtk_vbox_new(FALSE, 0);
1560 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
1561 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1562 gtk_widget_show(box2);
1564 /* create scrolled window */
1565 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
1566 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
1567 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1568 gtk_box_pack_start (GTK_BOX (box2), scrolled_win, TRUE, TRUE, 0);
1569 gtk_widget_set_size_request (scrolled_win, 200, 200);
1570 gtk_widget_show (scrolled_win);
1572 /* create root tree widget */
1573 root_tree = gtk_tree_new();
1574 g_signal_connect (root_tree, "selection_changed",
1575 G_CALLBACK (cb_tree_changed),
1577 g_object_set_data (G_OBJECT (root_tree), "user_data", tree_buttons);
1578 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), root_tree);
1579 gtk_tree_set_selection_mode(GTK_TREE(root_tree), selection_mode);
1580 gtk_tree_set_view_lines(GTK_TREE(root_tree), draw_line);
1581 gtk_tree_set_view_mode(GTK_TREE(root_tree), !view_line);
1582 gtk_widget_show(root_tree);
1586 /* set root tree to subtree function with root item variable */
1587 root_item = GTK_WIDGET(root_tree);
1591 /* create root tree item widget */
1592 root_item = gtk_tree_item_new_with_label("root item");
1593 gtk_tree_append(GTK_TREE(root_tree), root_item);
1594 gtk_widget_show(root_item);
1596 create_subtree(root_item, -no_root_item, nb_item_max, recursion_level_max);
1598 box2 = gtk_vbox_new(FALSE, 0);
1599 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1600 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1601 gtk_widget_show(box2);
1603 button = gtk_button_new_with_label("Add Item");
1604 gtk_widget_set_sensitive(button, FALSE);
1605 g_signal_connect (button, "clicked",
1606 G_CALLBACK (cb_add_new_item),
1608 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1609 gtk_widget_show(button);
1610 tree_buttons->add_button = button;
1612 button = gtk_button_new_with_label("Remove Item(s)");
1613 gtk_widget_set_sensitive(button, FALSE);
1614 g_signal_connect (button, "clicked",
1615 G_CALLBACK (cb_remove_item),
1617 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1618 gtk_widget_show(button);
1619 tree_buttons->remove_button = button;
1621 button = gtk_button_new_with_label("Remove Subtree");
1622 gtk_widget_set_sensitive(button, FALSE);
1623 g_signal_connect (button, "clicked",
1624 G_CALLBACK (cb_remove_subtree),
1626 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1627 gtk_widget_show(button);
1628 tree_buttons->subtree_button = button;
1630 /* create separator */
1631 separator = gtk_hseparator_new();
1632 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
1633 gtk_widget_show(separator);
1635 /* create button box */
1636 box2 = gtk_vbox_new(FALSE, 0);
1637 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1638 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1639 gtk_widget_show(box2);
1641 button = gtk_button_new_with_label("Close");
1642 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1643 g_signal_connect_swapped (button, "clicked",
1644 G_CALLBACK (gtk_widget_destroy),
1646 gtk_widget_show(button);
1648 gtk_widget_show(window);
1652 cb_create_tree(GtkWidget* w)
1654 guint selection_mode = GTK_SELECTION_SINGLE;
1659 guint recursion_level;
1661 /* get selection mode choice */
1662 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.single_button)->active)
1663 selection_mode = GTK_SELECTION_SINGLE;
1665 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.browse_button)->active)
1666 selection_mode = GTK_SELECTION_BROWSE;
1668 selection_mode = GTK_SELECTION_MULTIPLE;
1670 /* get options choice */
1671 draw_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.draw_line_button)->active;
1672 view_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.view_line_button)->active;
1673 no_root_item = GTK_TOGGLE_BUTTON(sTreeSampleSelection.no_root_item_button)->active;
1676 nb_item = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.nb_item_spinner));
1677 recursion_level = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.recursion_spinner));
1679 if (pow (nb_item, recursion_level) > 10000)
1681 g_print ("%g total items? That will take a very long time. Try less\n",
1682 pow (nb_item, recursion_level));
1686 create_tree_sample(gtk_widget_get_screen (w),
1687 selection_mode, draw_line,
1688 view_line, no_root_item, nb_item, recursion_level);
1692 create_tree_mode_window(GtkWidget *widget)
1694 static GtkWidget* window;
1702 GtkWidget* separator;
1709 /* create toplevel window */
1710 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1711 gtk_window_set_screen (GTK_WINDOW (window),
1712 gtk_widget_get_screen (widget));
1713 gtk_window_set_title(GTK_WINDOW(window), "Set Tree Parameters");
1714 g_signal_connect (window, "destroy",
1715 G_CALLBACK (gtk_widget_destroyed),
1717 box1 = gtk_vbox_new(FALSE, 0);
1718 gtk_container_add(GTK_CONTAINER(window), box1);
1720 /* create upper box - selection box */
1721 box2 = gtk_vbox_new(FALSE, 5);
1722 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
1723 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1725 box3 = gtk_hbox_new(FALSE, 5);
1726 gtk_box_pack_start(GTK_BOX(box2), box3, TRUE, TRUE, 0);
1728 /* create selection mode frame */
1729 frame = gtk_frame_new("Selection Mode");
1730 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
1732 box4 = gtk_vbox_new(FALSE, 0);
1733 gtk_container_add(GTK_CONTAINER(frame), box4);
1734 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1736 /* create radio button */
1737 button = gtk_radio_button_new_with_label(NULL, "SINGLE");
1738 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1739 sTreeSampleSelection.single_button = button;
1741 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1743 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1744 sTreeSampleSelection.browse_button = button;
1746 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1748 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1749 sTreeSampleSelection.multiple_button = button;
1751 sTreeSampleSelection.selection_mode_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
1753 /* create option mode frame */
1754 frame = gtk_frame_new("Options");
1755 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
1757 box4 = gtk_vbox_new(FALSE, 0);
1758 gtk_container_add(GTK_CONTAINER(frame), box4);
1759 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1761 /* create check button */
1762 button = gtk_check_button_new_with_label("Draw line");
1763 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1764 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
1765 sTreeSampleSelection.draw_line_button = button;
1767 button = gtk_check_button_new_with_label("View Line mode");
1768 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1769 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
1770 sTreeSampleSelection.view_line_button = button;
1772 button = gtk_check_button_new_with_label("Without Root item");
1773 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1774 sTreeSampleSelection.no_root_item_button = button;
1776 /* create recursion parameter */
1777 frame = gtk_frame_new("Size Parameters");
1778 gtk_box_pack_start(GTK_BOX(box2), frame, TRUE, TRUE, 0);
1780 box4 = gtk_hbox_new(FALSE, 5);
1781 gtk_container_add(GTK_CONTAINER(frame), box4);
1782 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1784 /* create number of item spin button */
1785 box5 = gtk_hbox_new(FALSE, 5);
1786 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
1788 label = gtk_label_new("Number of items : ");
1789 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1790 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
1792 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_NUMBER_OF_ITEM, 1.0, 255.0, 1.0,
1794 spinner = gtk_spin_button_new (adj, 0, 0);
1795 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
1796 sTreeSampleSelection.nb_item_spinner = spinner;
1798 /* create recursion level spin button */
1799 box5 = gtk_hbox_new(FALSE, 5);
1800 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
1802 label = gtk_label_new("Depth : ");
1803 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1804 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
1806 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_RECURSION_LEVEL, 0.0, 255.0, 1.0,
1808 spinner = gtk_spin_button_new (adj, 0, 0);
1809 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
1810 sTreeSampleSelection.recursion_spinner = spinner;
1812 /* create horizontal separator */
1813 separator = gtk_hseparator_new();
1814 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
1816 /* create bottom button box */
1817 box2 = gtk_hbox_new(TRUE, 10);
1818 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1819 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1821 button = gtk_button_new_with_label("Create Tree");
1822 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1823 g_signal_connect (button, "clicked",
1824 G_CALLBACK (cb_create_tree), NULL);
1826 button = gtk_button_new_with_label("Close");
1827 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1828 g_signal_connect_swapped (button, "clicked",
1829 G_CALLBACK (gtk_widget_destroy),
1832 if (!GTK_WIDGET_VISIBLE (window))
1833 gtk_widget_show_all (window);
1835 gtk_widget_destroy (window);
1841 #define GRID_SIZE 20
1842 #define DEFAULT_GEOMETRY "10x10"
1845 gridded_geometry_expose (GtkWidget *widget,
1846 GdkEventExpose *event)
1850 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
1851 0, 0, widget->allocation.width, widget->allocation.height);
1853 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
1854 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
1856 if ((i + j) % 2 == 0)
1857 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
1858 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1865 gridded_geometry_subresponse (GtkDialog *dialog,
1867 gchar *geometry_string)
1869 if (response_id == GTK_RESPONSE_NONE)
1871 gtk_widget_destroy (GTK_WIDGET (dialog));
1875 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1877 g_print ("Can't parse geometry string %s\n", geometry_string);
1878 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1884 gridded_geometry_response (GtkDialog *dialog,
1888 if (response_id == GTK_RESPONSE_NONE)
1890 gtk_widget_destroy (GTK_WIDGET (dialog));
1894 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1895 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1897 GtkWidget *drawing_area;
1899 GdkGeometry geometry;
1901 window = gtk_dialog_new_with_buttons (title,
1904 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1907 gtk_window_set_screen (GTK_WINDOW (window),
1908 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1910 g_signal_connect (window, "response",
1911 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1913 box = gtk_vbox_new (FALSE, 0);
1914 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), box, TRUE, TRUE, 0);
1916 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1918 drawing_area = gtk_drawing_area_new ();
1919 g_signal_connect (drawing_area, "expose_event",
1920 G_CALLBACK (gridded_geometry_expose), NULL);
1921 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1923 /* Gross hack to work around bug 68668... if we set the size request
1924 * large enough, then the current
1926 * request_of_window - request_of_geometry_widget
1928 * method of getting the base size works more or less works.
1930 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1932 geometry.base_width = 0;
1933 geometry.base_height = 0;
1934 geometry.min_width = 2 * GRID_SIZE;
1935 geometry.min_height = 2 * GRID_SIZE;
1936 geometry.width_inc = GRID_SIZE;
1937 geometry.height_inc = GRID_SIZE;
1939 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1941 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1943 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1945 g_print ("Can't parse geometry string %s\n", geometry_string);
1946 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1949 gtk_widget_show_all (window);
1954 create_gridded_geometry (GtkWidget *widget)
1956 static GtkWidget *window = NULL;
1962 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1965 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1968 gtk_window_set_screen (GTK_WINDOW (window),
1969 gtk_widget_get_screen (widget));
1971 label = gtk_label_new ("Geometry string:");
1972 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0);
1974 entry = gtk_entry_new ();
1975 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1976 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), entry, FALSE, FALSE, 0);
1978 g_signal_connect (window, "response",
1979 G_CALLBACK (gridded_geometry_response), entry);
1980 g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
1982 gtk_widget_show_all (window);
1985 gtk_widget_destroy (window);
1993 handle_box_child_signal (GtkHandleBox *hb,
1995 const gchar *action)
1997 printf ("%s: child <%s> %sed\n",
1998 g_type_name (G_OBJECT_TYPE (hb)),
1999 g_type_name (G_OBJECT_TYPE (child)),
2004 create_handle_box (GtkWidget *widget)
2006 static GtkWidget* window = NULL;
2007 GtkWidget *handle_box;
2008 GtkWidget *handle_box2;
2013 GtkWidget *separator;
2017 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2019 gtk_window_set_screen (GTK_WINDOW (window),
2020 gtk_widget_get_screen (widget));
2022 gtk_window_set_title (GTK_WINDOW (window),
2024 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
2026 g_signal_connect (window, "destroy",
2027 G_CALLBACK (gtk_widget_destroyed),
2030 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
2032 vbox = gtk_vbox_new (FALSE, 0);
2033 gtk_container_add (GTK_CONTAINER (window), vbox);
2034 gtk_widget_show (vbox);
2036 label = gtk_label_new ("Above");
2037 gtk_container_add (GTK_CONTAINER (vbox), label);
2038 gtk_widget_show (label);
2040 separator = gtk_hseparator_new ();
2041 gtk_container_add (GTK_CONTAINER (vbox), separator);
2042 gtk_widget_show (separator);
2044 hbox = gtk_hbox_new (FALSE, 10);
2045 gtk_container_add (GTK_CONTAINER (vbox), hbox);
2046 gtk_widget_show (hbox);
2048 separator = gtk_hseparator_new ();
2049 gtk_container_add (GTK_CONTAINER (vbox), separator);
2050 gtk_widget_show (separator);
2052 label = gtk_label_new ("Below");
2053 gtk_container_add (GTK_CONTAINER (vbox), label);
2054 gtk_widget_show (label);
2056 handle_box = gtk_handle_box_new ();
2057 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2058 g_signal_connect (handle_box,
2060 G_CALLBACK (handle_box_child_signal),
2062 g_signal_connect (handle_box,
2064 G_CALLBACK (handle_box_child_signal),
2066 gtk_widget_show (handle_box);
2068 toolbar = make_toolbar (window);
2070 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2071 gtk_widget_show (toolbar);
2073 handle_box = gtk_handle_box_new ();
2074 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2075 g_signal_connect (handle_box,
2077 G_CALLBACK (handle_box_child_signal),
2079 g_signal_connect (handle_box,
2081 G_CALLBACK (handle_box_child_signal),
2083 gtk_widget_show (handle_box);
2085 handle_box2 = gtk_handle_box_new ();
2086 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2087 g_signal_connect (handle_box2,
2089 G_CALLBACK (handle_box_child_signal),
2091 g_signal_connect (handle_box2,
2093 G_CALLBACK (handle_box_child_signal),
2095 gtk_widget_show (handle_box2);
2097 label = gtk_label_new ("Fooo!");
2098 gtk_container_add (GTK_CONTAINER (handle_box2), label);
2099 gtk_widget_show (label);
2102 if (!GTK_WIDGET_VISIBLE (window))
2103 gtk_widget_show (window);
2105 gtk_widget_destroy (window);
2109 * Test for getting an image from a drawable
2120 take_snapshot (GtkWidget *button,
2123 struct GetImageData *gid = data;
2124 GdkRectangle visible;
2126 int height_fraction;
2129 GdkColor color = { 0, 30000, 0, 0 };
2130 GdkRectangle target;
2133 /* Do some begin_paint_rect on some random rects, draw some
2134 * distinctive stuff into those rects, then take the snapshot.
2135 * figure out whether any rects were overlapped and report to
2139 visible = gid->sw->allocation;
2141 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2142 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2144 width_fraction = visible.width / 4;
2145 height_fraction = visible.height / 4;
2147 gc = gdk_gc_new (gid->src->window);
2148 black_gc = gid->src->style->black_gc;
2150 gdk_gc_set_rgb_fg_color (gc, &color);
2153 target.x = visible.x + width_fraction;
2154 target.y = visible.y + height_fraction * 3;
2155 target.width = width_fraction;
2156 target.height = height_fraction / 2;
2158 gdk_window_begin_paint_rect (gid->src->window,
2161 gdk_draw_rectangle (gid->src->window,
2165 target.width, target.height);
2167 gdk_draw_rectangle (gid->src->window,
2170 target.x + 10, target.y + 10,
2171 target.width - 20, target.height - 20);
2173 target.x = visible.x + width_fraction;
2174 target.y = visible.y + height_fraction;
2175 target.width = width_fraction;
2176 target.height = height_fraction;
2178 gdk_window_begin_paint_rect (gid->src->window,
2181 gdk_draw_rectangle (gid->src->window,
2185 target.width, target.height);
2187 gdk_draw_rectangle (gid->src->window,
2190 target.x + 10, target.y + 10,
2191 target.width - 20, target.height - 20);
2193 target.x = visible.x + width_fraction * 3;
2194 target.y = visible.y + height_fraction;
2195 target.width = width_fraction / 2;
2196 target.height = height_fraction;
2198 gdk_window_begin_paint_rect (gid->src->window,
2201 gdk_draw_rectangle (gid->src->window,
2205 target.width, target.height);
2207 gdk_draw_rectangle (gid->src->window,
2210 target.x + 10, target.y + 10,
2211 target.width - 20, target.height - 20);
2213 target.x = visible.x + width_fraction * 2;
2214 target.y = visible.y + height_fraction * 2;
2215 target.width = width_fraction / 4;
2216 target.height = height_fraction / 4;
2218 gdk_window_begin_paint_rect (gid->src->window,
2221 gdk_draw_rectangle (gid->src->window,
2225 target.width, target.height);
2227 gdk_draw_rectangle (gid->src->window,
2230 target.x + 10, target.y + 10,
2231 target.width - 20, target.height - 20);
2233 target.x += target.width / 2;
2234 target.y += target.width / 2;
2236 gdk_window_begin_paint_rect (gid->src->window,
2239 gdk_draw_rectangle (gid->src->window,
2243 target.width, target.height);
2245 gdk_draw_rectangle (gid->src->window,
2248 target.x + 10, target.y + 10,
2249 target.width - 20, target.height - 20);
2251 /* Screen shot area */
2253 target.x = visible.x + width_fraction * 1.5;
2254 target.y = visible.y + height_fraction * 1.5;
2255 target.width = width_fraction * 2;
2256 target.height = height_fraction * 2;
2258 shot = gdk_drawable_get_image (gid->src->window,
2260 target.width, target.height);
2262 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2265 g_object_unref (shot);
2267 gdk_window_end_paint (gid->src->window);
2268 gdk_window_end_paint (gid->src->window);
2269 gdk_window_end_paint (gid->src->window);
2270 gdk_window_end_paint (gid->src->window);
2271 gdk_window_end_paint (gid->src->window);
2273 gdk_draw_rectangle (gid->src->window,
2274 gid->src->style->black_gc,
2277 target.width, target.height);
2279 g_object_unref (gc);
2283 image_source_expose (GtkWidget *da,
2284 GdkEventExpose *event,
2287 int x = event->area.x;
2288 GdkColor red = { 0, 65535, 0, 0 };
2289 GdkColor green = { 0, 0, 65535, 0 };
2290 GdkColor blue = { 0, 0, 0, 65535 };
2293 gc = gdk_gc_new (event->window);
2295 while (x < (event->area.x + event->area.width))
2302 gdk_gc_set_rgb_fg_color (gc, &red);
2308 gdk_gc_set_rgb_fg_color (gc, &green);
2314 gdk_gc_set_rgb_fg_color (gc, &blue);
2318 g_assert_not_reached ();
2322 gdk_draw_line (event->window,
2325 x, event->area.y + event->area.height);
2330 g_object_unref (gc);
2336 create_get_image (GtkWidget *widget)
2338 static GtkWidget *window = NULL;
2341 gtk_widget_destroy (window);
2350 struct GetImageData *gid;
2352 gid = g_new (struct GetImageData, 1);
2354 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2356 gtk_window_set_screen (GTK_WINDOW (window),
2357 gtk_widget_get_screen (widget));
2359 g_signal_connect (window,
2361 G_CALLBACK (gtk_widget_destroyed),
2364 g_object_set_data_full (G_OBJECT (window),
2365 "testgtk-get-image-data",
2369 vbox = gtk_vbox_new (FALSE, 0);
2371 gtk_container_add (GTK_CONTAINER (window), vbox);
2373 sw = gtk_scrolled_window_new (NULL, NULL);
2374 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2375 GTK_POLICY_AUTOMATIC,
2376 GTK_POLICY_AUTOMATIC);
2380 gtk_widget_set_size_request (sw, 400, 400);
2382 src = gtk_drawing_area_new ();
2383 gtk_widget_set_size_request (src, 10000, 10000);
2385 g_signal_connect (src,
2387 G_CALLBACK (image_source_expose),
2392 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2395 gtk_box_pack_start (GTK_BOX (vbox),
2399 hbox = gtk_hbox_new (FALSE, 3);
2401 snap = gtk_widget_new (GTK_TYPE_IMAGE, NULL);
2405 sw = gtk_scrolled_window_new (NULL, NULL);
2406 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2407 GTK_POLICY_AUTOMATIC,
2408 GTK_POLICY_AUTOMATIC);
2409 gtk_widget_set_size_request (sw, 300, 300);
2411 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2413 gtk_box_pack_end (GTK_BOX (hbox), sw, FALSE, FALSE, 5);
2415 button = gtk_button_new_with_label ("Get image from drawable");
2417 g_signal_connect (button,
2419 G_CALLBACK (take_snapshot),
2422 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
2424 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2426 gtk_widget_show_all (window);
2434 sensitivity_toggled (GtkWidget *toggle,
2437 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2441 create_sensitivity_control (GtkWidget *widget)
2445 button = gtk_toggle_button_new_with_label ("Sensitive");
2447 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2448 GTK_WIDGET_IS_SENSITIVE (widget));
2450 g_signal_connect (button,
2452 G_CALLBACK (sensitivity_toggled),
2455 gtk_widget_show_all (button);
2461 set_selectable_recursive (GtkWidget *widget,
2464 if (GTK_IS_CONTAINER (widget))
2469 children = gtk_container_get_children (GTK_CONTAINER (widget));
2473 set_selectable_recursive (tmp->data, setting);
2477 g_list_free (children);
2479 else if (GTK_IS_LABEL (widget))
2481 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2486 selectable_toggled (GtkWidget *toggle,
2489 set_selectable_recursive (widget,
2490 GTK_TOGGLE_BUTTON (toggle)->active);
2494 create_selectable_control (GtkWidget *widget)
2498 button = gtk_toggle_button_new_with_label ("Selectable");
2500 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2503 g_signal_connect (button,
2505 G_CALLBACK (selectable_toggled),
2508 gtk_widget_show_all (button);
2513 void create_labels (GtkWidget *widget)
2515 static GtkWidget *window = NULL;
2524 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2526 gtk_window_set_screen (GTK_WINDOW (window),
2527 gtk_widget_get_screen (widget));
2529 g_signal_connect (window, "destroy",
2530 G_CALLBACK (gtk_widget_destroyed),
2533 gtk_window_set_title (GTK_WINDOW (window), "Label");
2535 vbox = gtk_vbox_new (FALSE, 5);
2537 hbox = gtk_hbox_new (FALSE, 5);
2538 gtk_container_add (GTK_CONTAINER (window), vbox);
2540 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2542 button = create_sensitivity_control (hbox);
2544 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2546 button = create_selectable_control (hbox);
2548 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2550 vbox = gtk_vbox_new (FALSE, 5);
2552 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2553 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2555 frame = gtk_frame_new ("Normal Label");
2556 label = gtk_label_new ("This is a Normal label");
2557 gtk_container_add (GTK_CONTAINER (frame), label);
2558 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2560 frame = gtk_frame_new ("Multi-line Label");
2561 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2562 gtk_container_add (GTK_CONTAINER (frame), label);
2563 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2565 frame = gtk_frame_new ("Left Justified Label");
2566 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2567 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2568 gtk_container_add (GTK_CONTAINER (frame), label);
2569 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2571 frame = gtk_frame_new ("Right Justified Label");
2572 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2573 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2574 gtk_container_add (GTK_CONTAINER (frame), label);
2575 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2577 frame = gtk_frame_new ("Internationalized Label");
2578 label = gtk_label_new (NULL);
2579 gtk_label_set_markup (GTK_LABEL (label),
2580 "French (Français) Bonjour, Salut\n"
2581 "Korean (한글) 안녕하세요, 안녕하십니까\n"
2582 "Russian (Русский) Здравствуйте!\n"
2583 "Chinese (Simplified) <span lang=\"zh-cn\">元气 开发</span>\n"
2584 "Chinese (Traditional) <span lang=\"zh-tw\">元氣 開發</span>\n"
2585 "Japanese <span lang=\"ja\">元気 開発</span>");
2586 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2587 gtk_container_add (GTK_CONTAINER (frame), label);
2588 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2590 frame = gtk_frame_new ("Bidirection Label");
2591 label = gtk_label_new ("Arabic السلام عليكم\n"
2593 gtk_widget_set_direction (label, GTK_TEXT_DIR_RTL);
2594 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2595 gtk_container_add (GTK_CONTAINER (frame), label);
2596 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2598 vbox = gtk_vbox_new (FALSE, 5);
2599 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2600 frame = gtk_frame_new ("Line wrapped label");
2601 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2602 "up the entire "/* big space to test spacing */\
2603 "width allocated to it, but automatically wraps the words to fit. "\
2604 "The time has come, for all good men, to come to the aid of their party. "\
2605 "The sixth sheik's six sheep's sick.\n"\
2606 " It supports multiple paragraphs correctly, and correctly adds "\
2607 "many extra spaces. ");
2609 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2610 gtk_container_add (GTK_CONTAINER (frame), label);
2611 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2613 frame = gtk_frame_new ("Filled, wrapped label");
2614 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2615 "up the entire width allocated to it. Here is a seneance to prove "\
2616 "my point. Here is another sentence. "\
2617 "Here comes the sun, do de do de do.\n"\
2618 " This is a new paragraph.\n"\
2619 " This is another newer, longer, better paragraph. It is coming to an end, "\
2621 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2622 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2623 gtk_container_add (GTK_CONTAINER (frame), label);
2624 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2626 frame = gtk_frame_new ("Underlined label");
2627 label = gtk_label_new ("This label is underlined!\n"
2628 "This one is underlined (こんにちは) in quite a funky fashion");
2629 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2630 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2631 gtk_container_add (GTK_CONTAINER (frame), label);
2632 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2634 frame = gtk_frame_new ("Markup label");
2635 label = gtk_label_new (NULL);
2637 /* There's also a gtk_label_set_markup() without accel if you
2638 * don't have an accelerator key
2640 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2641 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2642 "<b>markup</b> _such as "
2643 "<big><i>Big Italics</i></big>\n"
2644 "<tt>Monospace font</tt>\n"
2645 "<u>Underline!</u>\n"
2647 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2648 "and nothing on this line,\n"
2651 "or even on this one\n"
2652 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2653 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2654 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2656 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2658 gtk_container_add (GTK_CONTAINER (frame), label);
2659 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2662 if (!GTK_WIDGET_VISIBLE (window))
2663 gtk_widget_show_all (window);
2665 gtk_widget_destroy (window);
2673 reparent_label (GtkWidget *widget,
2674 GtkWidget *new_parent)
2678 label = g_object_get_data (G_OBJECT (widget), "user_data");
2680 gtk_widget_reparent (label, new_parent);
2684 set_parent_signal (GtkWidget *child,
2685 GtkWidget *old_parent,
2688 g_print ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2689 g_type_name (G_OBJECT_TYPE (child)),
2690 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
2691 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2692 GPOINTER_TO_INT (func_data));
2696 create_reparent (GtkWidget *widget)
2698 static GtkWidget *window = NULL;
2705 GtkWidget *separator;
2706 GtkWidget *event_box;
2710 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2712 gtk_window_set_screen (GTK_WINDOW (window),
2713 gtk_widget_get_screen (widget));
2715 g_signal_connect (window, "destroy",
2716 G_CALLBACK (gtk_widget_destroyed),
2719 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2720 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2722 box1 = gtk_vbox_new (FALSE, 0);
2723 gtk_container_add (GTK_CONTAINER (window), box1);
2725 box2 = gtk_hbox_new (FALSE, 5);
2726 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2727 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2729 label = gtk_label_new ("Hello World");
2731 frame = gtk_frame_new ("Frame 1");
2732 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2734 box3 = gtk_vbox_new (FALSE, 5);
2735 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2736 gtk_container_add (GTK_CONTAINER (frame), box3);
2738 button = gtk_button_new_with_label ("switch");
2739 g_object_set_data (G_OBJECT (button), "user_data", label);
2740 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2742 event_box = gtk_event_box_new ();
2743 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2744 gtk_container_add (GTK_CONTAINER (event_box), label);
2746 g_signal_connect (button, "clicked",
2747 G_CALLBACK (reparent_label),
2750 g_signal_connect (label, "parent_set",
2751 G_CALLBACK (set_parent_signal),
2752 GINT_TO_POINTER (42));
2754 frame = gtk_frame_new ("Frame 2");
2755 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2757 box3 = gtk_vbox_new (FALSE, 5);
2758 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2759 gtk_container_add (GTK_CONTAINER (frame), box3);
2761 button = gtk_button_new_with_label ("switch");
2762 g_object_set_data (G_OBJECT (button), "user_data", label);
2763 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2765 event_box = gtk_event_box_new ();
2766 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2768 g_signal_connect (button, "clicked",
2769 G_CALLBACK (reparent_label),
2772 separator = gtk_hseparator_new ();
2773 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2775 box2 = gtk_vbox_new (FALSE, 10);
2776 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2777 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2779 button = gtk_button_new_with_label ("close");
2780 g_signal_connect_swapped (button, "clicked",
2781 G_CALLBACK (gtk_widget_destroy), window);
2782 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2783 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
2784 gtk_widget_grab_default (button);
2787 if (!GTK_WIDGET_VISIBLE (window))
2788 gtk_widget_show_all (window);
2790 gtk_widget_destroy (window);
2797 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2799 if (event->type == GDK_BUTTON_PRESS)
2801 if (event->button == 1)
2802 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2803 event->button, event->x_root, event->y_root,
2805 else if (event->button == 2)
2806 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2807 event->button, event->x_root, event->y_root,
2814 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
2816 gtk_paint_resize_grip (area->style,
2818 GTK_WIDGET_STATE (area),
2824 area->allocation.width,
2825 area->allocation.height);
2831 create_resize_grips (GtkWidget *widget)
2833 static GtkWidget *window = NULL;
2835 GtkWidget *hbox, *vbox;
2838 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2840 gtk_window_set_screen (GTK_WINDOW (window),
2841 gtk_widget_get_screen (widget));
2843 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2845 g_signal_connect (window, "destroy",
2846 G_CALLBACK (gtk_widget_destroyed),
2849 vbox = gtk_vbox_new (FALSE, 0);
2850 gtk_container_add (GTK_CONTAINER (window), vbox);
2852 hbox = gtk_hbox_new (FALSE, 0);
2853 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2856 area = gtk_drawing_area_new ();
2857 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2858 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2859 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2860 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2861 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2862 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2865 area = gtk_drawing_area_new ();
2866 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2867 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2868 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2869 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2870 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2871 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2874 area = gtk_drawing_area_new ();
2875 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2876 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2877 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2878 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2879 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2880 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2882 hbox = gtk_hbox_new (FALSE, 0);
2883 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2886 area = gtk_drawing_area_new ();
2887 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2888 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2889 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2890 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2891 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2892 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2895 area = gtk_drawing_area_new ();
2896 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2899 area = gtk_drawing_area_new ();
2900 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2901 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2902 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2903 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2904 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2905 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2908 hbox = gtk_hbox_new (FALSE, 0);
2909 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2912 area = gtk_drawing_area_new ();
2913 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2914 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2915 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2916 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2917 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2918 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2920 area = gtk_drawing_area_new ();
2921 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2922 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2923 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2924 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2925 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2926 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2929 area = gtk_drawing_area_new ();
2930 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2931 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2932 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2933 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2934 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2935 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2938 if (!GTK_WIDGET_VISIBLE (window))
2939 gtk_widget_show_all (window);
2941 gtk_widget_destroy (window);
2947 gint upositionx = 0;
2948 gint upositiony = 0;
2951 uposition_configure (GtkWidget *window)
2957 lx = g_object_get_data (G_OBJECT (window), "x");
2958 ly = g_object_get_data (G_OBJECT (window), "y");
2960 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
2961 sprintf (buffer, "%d", upositionx);
2962 gtk_label_set_text (lx, buffer);
2963 sprintf (buffer, "%d", upositiony);
2964 gtk_label_set_text (ly, buffer);
2970 uposition_stop_configure (GtkToggleButton *toggle,
2974 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2976 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2980 create_saved_position (GtkWidget *widget)
2982 static GtkWidget *window = NULL;
2987 GtkWidget *main_vbox;
2995 window = g_object_connect (gtk_widget_new (GTK_TYPE_WINDOW,
2996 "type", GTK_WINDOW_TOPLEVEL,
2999 "title", "Saved Position",
3001 "signal::configure_event", uposition_configure, NULL,
3004 gtk_window_set_screen (GTK_WINDOW (window),
3005 gtk_widget_get_screen (widget));
3008 g_signal_connect (window, "destroy",
3009 G_CALLBACK (gtk_widget_destroyed),
3012 main_vbox = gtk_vbox_new (FALSE, 5);
3013 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3014 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3017 gtk_widget_new (gtk_vbox_get_type (),
3018 "GtkBox::homogeneous", FALSE,
3019 "GtkBox::spacing", 5,
3020 "GtkContainer::border_width", 10,
3021 "GtkWidget::parent", main_vbox,
3022 "GtkWidget::visible", TRUE,
3023 "child", g_object_connect (gtk_widget_new (GTK_TYPE_TOGGLE_BUTTON,
3024 "label", "Stop Events",
3028 "signal::clicked", uposition_stop_configure, window,
3032 hbox = gtk_hbox_new (FALSE, 0);
3033 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3034 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3036 label = gtk_label_new ("X Origin : ");
3037 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3038 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3040 x_label = gtk_label_new ("");
3041 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3042 g_object_set_data (G_OBJECT (window), "x", x_label);
3044 hbox = gtk_hbox_new (FALSE, 0);
3045 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3046 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3048 label = gtk_label_new ("Y Origin : ");
3049 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3050 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3052 y_label = gtk_label_new ("");
3053 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3054 g_object_set_data (G_OBJECT (window), "y", y_label);
3057 gtk_widget_new (gtk_hseparator_get_type (),
3058 "GtkWidget::visible", TRUE,
3060 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3062 hbox = gtk_hbox_new (FALSE, 0);
3063 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3064 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3066 button = gtk_button_new_with_label ("Close");
3067 g_signal_connect_swapped (button, "clicked",
3068 G_CALLBACK (gtk_widget_destroy),
3070 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3071 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3072 gtk_widget_grab_default (button);
3074 gtk_widget_show_all (window);
3077 gtk_widget_destroy (window);
3085 create_pixmap (GtkWidget *widget)
3087 static GtkWidget *window = NULL;
3093 GtkWidget *separator;
3094 GtkWidget *pixmapwid;
3098 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3100 gtk_window_set_screen (GTK_WINDOW (window),
3101 gtk_widget_get_screen (widget));
3103 g_signal_connect (window, "destroy",
3104 G_CALLBACK (gtk_widget_destroyed),
3107 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3108 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3109 gtk_widget_realize(window);
3111 box1 = gtk_vbox_new (FALSE, 0);
3112 gtk_container_add (GTK_CONTAINER (window), box1);
3114 box2 = gtk_vbox_new (FALSE, 10);
3115 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3116 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3118 button = gtk_button_new ();
3119 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3121 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3123 label = gtk_label_new ("Pixmap\ntest");
3124 box3 = gtk_hbox_new (FALSE, 0);
3125 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3126 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3127 gtk_container_add (GTK_CONTAINER (box3), label);
3128 gtk_container_add (GTK_CONTAINER (button), box3);
3130 button = gtk_button_new ();
3131 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3133 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3135 label = gtk_label_new ("Pixmap\ntest");
3136 box3 = gtk_hbox_new (FALSE, 0);
3137 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3138 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3139 gtk_container_add (GTK_CONTAINER (box3), label);
3140 gtk_container_add (GTK_CONTAINER (button), box3);
3142 gtk_widget_set_sensitive (button, FALSE);
3144 separator = gtk_hseparator_new ();
3145 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3147 box2 = gtk_vbox_new (FALSE, 10);
3148 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3149 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3151 button = gtk_button_new_with_label ("close");
3152 g_signal_connect_swapped (button, "clicked",
3153 G_CALLBACK (gtk_widget_destroy),
3155 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3156 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3157 gtk_widget_grab_default (button);
3160 if (!GTK_WIDGET_VISIBLE (window))
3161 gtk_widget_show_all (window);
3163 gtk_widget_destroy (window);
3167 tips_query_widget_entered (GtkTipsQuery *tips_query,
3169 const gchar *tip_text,
3170 const gchar *tip_private,
3173 if (GTK_TOGGLE_BUTTON (toggle)->active)
3175 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3176 /* don't let GtkTipsQuery reset its label */
3177 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3182 tips_query_widget_selected (GtkWidget *tips_query,
3184 const gchar *tip_text,
3185 const gchar *tip_private,
3186 GdkEventButton *event,
3190 g_print ("Help \"%s\" requested for <%s>\n",
3191 tip_private ? tip_private : "None",
3192 g_type_name (G_OBJECT_TYPE (widget)));
3197 create_tooltips (GtkWidget *widget)
3199 static GtkWidget *window = NULL;
3206 GtkWidget *tips_query;
3207 GtkWidget *separator;
3208 GtkTooltips *tooltips;
3213 gtk_widget_new (gtk_window_get_type (),
3214 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3215 "GtkContainer::border_width", 0,
3216 "GtkWindow::title", "Tooltips",
3217 "GtkWindow::allow_shrink", TRUE,
3218 "GtkWindow::allow_grow", FALSE,
3221 gtk_window_set_screen (GTK_WINDOW (window),
3222 gtk_widget_get_screen (widget));
3224 g_signal_connect (window, "destroy",
3225 G_CALLBACK (destroy_tooltips),
3228 tooltips=gtk_tooltips_new();
3229 g_object_ref (tooltips);
3230 gtk_object_sink (GTK_OBJECT (tooltips));
3231 g_object_set_data (G_OBJECT (window), "tooltips", tooltips);
3233 box1 = gtk_vbox_new (FALSE, 0);
3234 gtk_container_add (GTK_CONTAINER (window), box1);
3236 box2 = gtk_vbox_new (FALSE, 10);
3237 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3238 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3240 button = gtk_toggle_button_new_with_label ("button1");
3241 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3243 gtk_tooltips_set_tip (tooltips,
3246 "ContextHelp/buttons/1");
3248 button = gtk_toggle_button_new_with_label ("button2");
3249 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3251 gtk_tooltips_set_tip (tooltips,
3253 "This is button 2. This is also a really long tooltip which probably won't fit on a single line and will therefore need to be wrapped. Hopefully the wrapping will work correctly.",
3254 "ContextHelp/buttons/2_long");
3256 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3257 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3259 gtk_tooltips_set_tip (tooltips,
3261 "Toggle TipsQuery view.",
3265 gtk_widget_new (gtk_vbox_get_type (),
3266 "homogeneous", FALSE,
3272 tips_query = gtk_tips_query_new ();
3275 gtk_widget_new (gtk_button_get_type (),
3280 g_object_connect (button,
3281 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3283 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3284 gtk_tooltips_set_tip (tooltips,
3286 "Start the Tooltips Inspector",
3287 "ContextHelp/buttons/?");
3290 g_object_set (g_object_connect (tips_query,
3291 "signal::widget_entered", tips_query_widget_entered, toggle,
3292 "signal::widget_selected", tips_query_widget_selected, NULL,
3299 frame = gtk_widget_new (gtk_frame_get_type (),
3300 "label", "ToolTips Inspector",
3301 "label_xalign", (double) 0.5,
3307 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3309 separator = gtk_hseparator_new ();
3310 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3312 box2 = gtk_vbox_new (FALSE, 10);
3313 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3314 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3316 button = gtk_button_new_with_label ("close");
3317 g_signal_connect_swapped (button, "clicked",
3318 G_CALLBACK (gtk_widget_destroy),
3320 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3321 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3322 gtk_widget_grab_default (button);
3324 gtk_tooltips_set_tip (tooltips, button, "Push this button to close window", "ContextHelp/buttons/Close");
3327 if (!GTK_WIDGET_VISIBLE (window))
3328 gtk_widget_show_all (window);
3330 gtk_widget_destroy (window);
3338 pack_image (GtkWidget *box,
3342 gtk_box_pack_start (GTK_BOX (box),
3343 gtk_label_new (text),
3346 gtk_box_pack_start (GTK_BOX (box),
3352 create_image (GtkWidget *widget)
3354 static GtkWidget *window = NULL;
3362 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3364 gtk_window_set_screen (GTK_WINDOW (window),
3365 gtk_widget_get_screen (widget));
3367 /* this is bogus for testing drawing when allocation < request,
3368 * don't copy into real code
3370 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
3372 g_signal_connect (window, "destroy",
3373 G_CALLBACK (gtk_widget_destroyed),
3376 vbox = gtk_vbox_new (FALSE, 5);
3378 gtk_container_add (GTK_CONTAINER (window), vbox);
3380 pack_image (vbox, "Stock Warning Dialog",
3381 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3382 GTK_ICON_SIZE_DIALOG));
3384 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
3385 gtk_widget_get_colormap (window),
3390 pack_image (vbox, "Pixmap",
3391 gtk_image_new_from_pixmap (pixmap, mask));
3394 if (!GTK_WIDGET_VISIBLE (window))
3395 gtk_widget_show_all (window);
3397 gtk_widget_destroy (window);
3405 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3408 GtkWidget *menuitem;
3417 menu = gtk_menu_new ();
3418 gtk_menu_set_screen (GTK_MENU (menu), screen);
3424 menuitem = gtk_tearoff_menu_item_new ();
3425 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3426 gtk_widget_show (menuitem);
3429 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3430 GTK_ICON_SIZE_MENU);
3431 gtk_widget_show (image);
3432 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3433 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3434 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3435 gtk_widget_show (menuitem);
3437 for (i = 0, j = 1; i < length; i++, j++)
3439 sprintf (buf, "item %2d - %d", depth, j);
3441 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3442 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3446 gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
3449 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3450 gtk_widget_show (menuitem);
3452 gtk_widget_set_sensitive (menuitem, FALSE);
3455 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3459 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3460 create_menu (screen, depth - 1, 5, TRUE));
3467 create_menus (GtkWidget *widget)
3469 static GtkWidget *window = NULL;
3473 GtkWidget *optionmenu;
3474 GtkWidget *separator;
3480 GtkWidget *menuitem;
3481 GtkAccelGroup *accel_group;
3483 GdkScreen *screen = gtk_widget_get_screen (widget);
3485 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3487 gtk_window_set_screen (GTK_WINDOW (window), screen);
3489 g_signal_connect (window, "destroy",
3490 G_CALLBACK (gtk_widget_destroyed),
3492 g_signal_connect (window, "delete-event",
3493 G_CALLBACK (gtk_true),
3496 accel_group = gtk_accel_group_new ();
3497 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3499 gtk_window_set_title (GTK_WINDOW (window), "menus");
3500 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3503 box1 = gtk_vbox_new (FALSE, 0);
3504 gtk_container_add (GTK_CONTAINER (window), box1);
3505 gtk_widget_show (box1);
3507 menubar = gtk_menu_bar_new ();
3508 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3509 gtk_widget_show (menubar);
3511 menu = create_menu (screen, 2, 50, TRUE);
3513 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3514 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3515 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3516 gtk_widget_show (menuitem);
3518 menuitem = gtk_menu_item_new_with_label ("foo");
3519 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3520 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3521 gtk_widget_show (menuitem);
3523 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3524 GTK_ICON_SIZE_MENU);
3525 gtk_widget_show (image);
3526 menuitem = gtk_image_menu_item_new_with_label ("Help");
3527 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3528 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3529 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3530 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3531 gtk_widget_show (menuitem);
3533 menubar = gtk_menu_bar_new ();
3534 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3535 gtk_widget_show (menubar);
3537 menu = create_menu (screen, 2, 10, TRUE);
3539 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3540 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3541 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3542 gtk_widget_show (menuitem);
3544 box2 = gtk_vbox_new (FALSE, 10);
3545 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3546 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3547 gtk_widget_show (box2);
3549 menu = create_menu (screen, 1, 5, FALSE);
3550 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3552 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3553 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3554 gtk_widget_show (menuitem);
3556 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3557 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3558 gtk_widget_show (menuitem);
3559 gtk_widget_add_accelerator (menuitem,
3565 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3566 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3567 gtk_widget_show (menuitem);
3568 gtk_widget_add_accelerator (menuitem,
3573 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3574 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3575 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3576 gtk_widget_show (menuitem);
3577 gtk_widget_add_accelerator (menuitem,
3583 gtk_widget_add_accelerator (menuitem,
3590 optionmenu = gtk_option_menu_new ();
3591 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
3592 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
3593 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3594 gtk_widget_show (optionmenu);
3596 separator = gtk_hseparator_new ();
3597 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3598 gtk_widget_show (separator);
3600 box2 = gtk_vbox_new (FALSE, 10);
3601 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3602 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3603 gtk_widget_show (box2);
3605 button = gtk_button_new_with_label ("close");
3606 g_signal_connect_swapped (button, "clicked",
3607 G_CALLBACK (gtk_widget_destroy),
3609 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3610 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3611 gtk_widget_grab_default (button);
3612 gtk_widget_show (button);
3615 if (!GTK_WIDGET_VISIBLE (window))
3616 gtk_widget_show (window);
3618 gtk_widget_destroy (window);
3622 gtk_ifactory_cb (gpointer callback_data,
3623 guint callback_action,
3626 g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
3629 /* GdkPixbuf RGBA C-Source image dump */
3631 static const guint8 apple[] =
3633 /* Pixbuf magic (0x47646b50) */
3635 /* length: header (24) + pixel_data (2304) */
3637 /* pixdata_type (0x1010002) */
3639 /* rowstride (96) */
3646 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3647 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3648 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3649 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3650 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3651 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3652 "\0\0\0\0\0\0\0\0\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"
3653 "\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"
3654 "\0\0\0\0\0\0\0\0\0\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"
3655 "[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"
3656 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3657 "\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"
3658 "\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"
3659 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3660 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3661 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3662 "\0\0\0\0\0\0\0\0\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"
3663 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3664 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3665 "\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["
3666 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3667 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3668 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3669 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3670 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3671 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3672 "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"
3673 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3674 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3675 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3676 "\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"
3677 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3678 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3679 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3680 "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"
3681 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3682 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3683 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3684 "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"
3685 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3686 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3687 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3688 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3689 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3690 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3691 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3692 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3693 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3694 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3695 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3696 "\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>"
3697 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3698 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3699 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3700 "\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"
3701 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3702 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3703 "\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"
3704 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3705 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3706 "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"
3707 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3708 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3709 "\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"
3710 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3711 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3712 "\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"
3713 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3714 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3715 "\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"
3716 "\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"
3717 "\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"
3718 "\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"
3719 "\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"
3720 "\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"
3721 "\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"
3722 "\0\0\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"
3723 "\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"
3724 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3728 dump_accels (gpointer callback_data,
3729 guint callback_action,
3732 gtk_accel_map_save_fd (1 /* stdout */);
3735 static GtkItemFactoryEntry menu_items[] =
3737 { "/_File", NULL, 0, 0, "<Branch>" },
3738 { "/File/tearoff1", NULL, gtk_ifactory_cb, 0, "<Tearoff>" },
3739 { "/File/_New", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_NEW },
3740 { "/File/_Open", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
3741 { "/File/_Save", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
3742 { "/File/Save _As...", "<control>A", gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
3743 { "/File/_Dump \"_Accels\"", NULL, dump_accels, 0 },
3744 { "/File/\\/Test__Escaping/And\\/\n\tWei\\\\rdly",
3745 NULL, gtk_ifactory_cb, 0 },
3746 { "/File/sep1", NULL, gtk_ifactory_cb, 0, "<Separator>" },
3747 { "/File/_Quit", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
3749 { "/_Preferences", NULL, 0, 0, "<Branch>" },
3750 { "/_Preferences/_Color", NULL, 0, 0, "<Branch>" },
3751 { "/_Preferences/Color/_Red", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
3752 { "/_Preferences/Color/_Green", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
3753 { "/_Preferences/Color/_Blue", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
3754 { "/_Preferences/_Shape", NULL, 0, 0, "<Branch>" },
3755 { "/_Preferences/Shape/_Square", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
3756 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
3757 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
3758 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
3759 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
3760 { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple },
3761 { "/_Preferences/Coffee", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3762 { "/_Preferences/Toast", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3763 { "/_Preferences/Marshmallow Froot Loops", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3765 /* For testing deletion of menus */
3766 { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
3767 { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
3768 { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
3770 { "/_Help", NULL, 0, 0, "<LastBranch>" },
3771 { "/Help/_Help", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_HELP},
3772 { "/Help/_About", NULL, gtk_ifactory_cb, 0 },
3776 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
3779 create_item_factory (GtkWidget *widget)
3781 static GtkWidget *window = NULL;
3787 GtkWidget *separator;
3790 GtkAccelGroup *accel_group;
3791 GtkItemFactory *item_factory;
3792 GtkTooltips *tooltips;
3794 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3796 gtk_window_set_screen (GTK_WINDOW (window),
3797 gtk_widget_get_screen (widget));
3799 g_signal_connect (window, "destroy",
3800 G_CALLBACK(gtk_widget_destroyed),
3802 g_signal_connect (window, "delete-event",
3803 G_CALLBACK (gtk_true),
3806 accel_group = gtk_accel_group_new ();
3807 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
3808 g_object_set_data_full (G_OBJECT (window),
3812 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3813 gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
3814 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3815 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
3817 /* preselect /Preferences/Shape/Oval over the other radios
3819 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3820 "/Preferences/Shape/Oval")),
3823 /* preselect /Preferences/Coffee
3825 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3826 "/Preferences/Coffee")),
3829 /* preselect /Preferences/Marshmallow Froot Loops and set it insensitive
3831 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3832 "/Preferences/Marshmallow Froot Loops")),
3834 gtk_widget_set_sensitive (GTK_WIDGET (gtk_item_factory_get_item (item_factory,
3835 "/Preferences/Marshmallow Froot Loops")),
3838 /* Test how tooltips (ugh) work on menu items
3840 tooltips = gtk_tooltips_new ();
3841 g_object_ref (tooltips);
3842 gtk_object_sink (GTK_OBJECT (tooltips));
3843 g_object_set_data_full (G_OBJECT (window), "testgtk-tooltips",
3844 tooltips, (GDestroyNotify)g_object_unref);
3846 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/New"),
3847 "Create a new file", NULL);
3848 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Open"),
3849 "Open a file", NULL);
3850 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Save"),
3852 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/Preferences/Color"),
3853 "Modify color", NULL);
3855 box1 = gtk_vbox_new (FALSE, 0);
3856 gtk_container_add (GTK_CONTAINER (window), box1);
3858 gtk_box_pack_start (GTK_BOX (box1),
3859 gtk_item_factory_get_widget (item_factory, "<main>"),
3862 label = gtk_label_new ("Type\n<alt>\nto start");
3863 gtk_widget_set_size_request (label, 200, 200);
3864 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
3865 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
3868 separator = gtk_hseparator_new ();
3869 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3872 box2 = gtk_vbox_new (FALSE, 10);
3873 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3874 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3876 button = gtk_button_new_with_label ("close");
3877 g_signal_connect_swapped (button, "clicked",
3878 G_CALLBACK (gtk_widget_destroy),
3880 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3881 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3882 gtk_widget_grab_default (button);
3884 gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
3886 gtk_widget_show_all (window);
3889 gtk_widget_destroy (window);
3893 accel_button_new (GtkAccelGroup *accel_group,
3898 GdkModifierType modifiers;
3902 gtk_accelerator_parse (accel, &keyval, &modifiers);
3905 button = gtk_button_new ();
3906 gtk_widget_add_accelerator (button, "activate", accel_group,
3907 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3909 label = gtk_accel_label_new (text);
3910 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3911 gtk_widget_show (label);
3913 gtk_container_add (GTK_CONTAINER (button), label);
3919 create_key_lookup (GtkWidget *widget)
3921 static GtkWidget *window = NULL;
3925 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3928 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3929 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3932 gtk_window_set_screen (GTK_WINDOW (window),
3933 gtk_widget_get_screen (widget));
3935 /* We have to expand it so the accel labels will draw their labels
3937 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3939 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3941 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3942 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3943 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3944 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3945 button = gtk_button_new_with_mnemonic ("Button 3 (_ф)");
3946 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3947 button = gtk_button_new_with_mnemonic ("Button 4 (_Ф)");
3948 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3949 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3950 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3951 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3952 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3953 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3954 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3955 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3956 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3957 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3958 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3959 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3960 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3962 g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
3963 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
3965 gtk_widget_show_all (window);
3968 gtk_widget_destroy (window);
3977 cmw_destroy_cb(GtkWidget *widget)
3979 /* This is needed to get out of gtk_main */
3986 cmw_color (GtkWidget *widget, GtkWidget *parent)
3990 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3992 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3994 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
3998 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4000 /* And mark it as a transient dialog */
4001 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4003 g_signal_connect (csd, "destroy",
4004 G_CALLBACK (cmw_destroy_cb), NULL);
4006 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4007 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4008 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4009 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4011 /* wait until destroy calls gtk_main_quit */
4012 gtk_widget_show (csd);
4017 cmw_file (GtkWidget *widget, GtkWidget *parent)
4021 fs = gtk_file_selection_new("This is a modal file selection dialog");
4023 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4026 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4028 /* And mark it as a transient dialog */
4029 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4031 g_signal_connect (fs, "destroy",
4032 G_CALLBACK (cmw_destroy_cb), NULL);
4034 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4035 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4036 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4037 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4039 /* wait until destroy calls gtk_main_quit */
4040 gtk_widget_show (fs);
4047 create_modal_window (GtkWidget *widget)
4049 GtkWidget *window = NULL;
4050 GtkWidget *box1,*box2;
4052 GtkWidget *btnColor,*btnFile,*btnClose;
4054 /* Create modal window (Here you can use any window descendent )*/
4055 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4056 gtk_window_set_screen (GTK_WINDOW (window),
4057 gtk_widget_get_screen (widget));
4059 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4061 /* Set window as modal */
4062 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4064 /* Create widgets */
4065 box1 = gtk_vbox_new (FALSE,5);
4066 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4067 box2 = gtk_vbox_new (TRUE,5);
4068 btnColor = gtk_button_new_with_label ("Color");
4069 btnFile = gtk_button_new_with_label ("File Selection");
4070 btnClose = gtk_button_new_with_label ("Close");
4073 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4074 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4077 gtk_container_add (GTK_CONTAINER (window), box1);
4078 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4079 gtk_container_add (GTK_CONTAINER (frame1), box2);
4080 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4081 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4082 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4083 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4085 /* connect signals */
4086 g_signal_connect_swapped (btnClose, "clicked",
4087 G_CALLBACK (gtk_widget_destroy), window);
4089 g_signal_connect (window, "destroy",
4090 G_CALLBACK (cmw_destroy_cb), NULL);
4092 g_signal_connect (btnColor, "clicked",
4093 G_CALLBACK (cmw_color), window);
4094 g_signal_connect (btnFile, "clicked",
4095 G_CALLBACK (cmw_file), window);
4098 gtk_widget_show_all (window);
4100 /* wait until dialog get destroyed */
4109 make_message_dialog (GdkScreen *screen,
4111 GtkMessageType type,
4112 GtkButtonsType buttons,
4113 guint default_response)
4117 gtk_widget_destroy (*dialog);
4122 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4123 "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.)");
4125 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4127 g_signal_connect_swapped (*dialog,
4129 G_CALLBACK (gtk_widget_destroy),
4132 g_signal_connect (*dialog,
4134 G_CALLBACK (gtk_widget_destroyed),
4137 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4139 gtk_widget_show (*dialog);
4143 create_message_dialog (GtkWidget *widget)
4145 static GtkWidget *info = NULL;
4146 static GtkWidget *warning = NULL;
4147 static GtkWidget *error = NULL;
4148 static GtkWidget *question = NULL;
4149 GdkScreen *screen = gtk_widget_get_screen (widget);
4151 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4152 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_OK);
4153 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4154 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_YES);
4161 static GtkWidget *sw_parent = NULL;
4162 static GtkWidget *sw_float_parent;
4163 static guint sw_destroyed_handler = 0;
4166 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4168 gtk_widget_reparent (scrollwin, sw_parent);
4170 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4171 sw_float_parent = NULL;
4173 sw_destroyed_handler = 0;
4179 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4181 gtk_widget_destroy (sw_float_parent);
4183 sw_float_parent = NULL;
4185 sw_destroyed_handler = 0;
4189 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4193 gtk_widget_reparent (scrollwin, sw_parent);
4194 gtk_widget_destroy (sw_float_parent);
4196 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4197 sw_float_parent = NULL;
4199 sw_destroyed_handler = 0;
4203 sw_parent = scrollwin->parent;
4204 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4205 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4206 gtk_widget_get_screen (widget));
4208 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4210 gtk_widget_reparent (scrollwin, sw_float_parent);
4211 gtk_widget_show (sw_float_parent);
4213 sw_destroyed_handler =
4214 g_signal_connect (sw_parent, "destroy",
4215 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4216 g_signal_connect (sw_float_parent, "delete_event",
4217 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4222 create_scrolled_windows (GtkWidget *widget)
4224 static GtkWidget *window;
4225 GtkWidget *scrolled_window;
4233 window = gtk_dialog_new ();
4235 gtk_window_set_screen (GTK_WINDOW (window),
4236 gtk_widget_get_screen (widget));
4238 g_signal_connect (window, "destroy",
4239 G_CALLBACK (gtk_widget_destroyed),
4242 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4243 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4246 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4247 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4248 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4249 GTK_POLICY_AUTOMATIC,
4250 GTK_POLICY_AUTOMATIC);
4251 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
4252 scrolled_window, TRUE, TRUE, 0);
4253 gtk_widget_show (scrolled_window);
4255 table = gtk_table_new (20, 20, FALSE);
4256 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4257 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4258 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4259 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4260 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4261 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4262 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4263 gtk_widget_show (table);
4265 for (i = 0; i < 20; i++)
4266 for (j = 0; j < 20; j++)
4268 sprintf (buffer, "button (%d,%d)\n", i, j);
4269 button = gtk_toggle_button_new_with_label (buffer);
4270 gtk_table_attach_defaults (GTK_TABLE (table), button,
4272 gtk_widget_show (button);
4276 button = gtk_button_new_with_label ("Close");
4277 g_signal_connect_swapped (button, "clicked",
4278 G_CALLBACK (gtk_widget_destroy),
4280 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4281 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4282 button, TRUE, TRUE, 0);
4283 gtk_widget_grab_default (button);
4284 gtk_widget_show (button);
4286 button = gtk_button_new_with_label ("Reparent Out");
4287 g_signal_connect (button, "clicked",
4288 G_CALLBACK (scrolled_windows_remove),
4290 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4291 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4292 button, TRUE, TRUE, 0);
4293 gtk_widget_grab_default (button);
4294 gtk_widget_show (button);
4296 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4299 if (!GTK_WIDGET_VISIBLE (window))
4300 gtk_widget_show (window);
4302 gtk_widget_destroy (window);
4310 entry_toggle_frame (GtkWidget *checkbutton,
4313 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4314 GTK_TOGGLE_BUTTON(checkbutton)->active);
4318 entry_toggle_sensitive (GtkWidget *checkbutton,
4321 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4325 entry_props_clicked (GtkWidget *button,
4328 GtkWidget *window = create_prop_editor (entry, 0);
4330 gtk_window_set_title (GTK_WINDOW (window), "Entry Properties");
4334 create_entry (GtkWidget *widget)
4336 static GtkWidget *window = NULL;
4340 GtkWidget *has_frame_check;
4341 GtkWidget *sensitive_check;
4342 GtkWidget *entry, *cb;
4344 GtkWidget *separator;
4345 GList *cbitems = NULL;
4349 cbitems = g_list_append(cbitems, "item0");
4350 cbitems = g_list_append(cbitems, "item1 item1");
4351 cbitems = g_list_append(cbitems, "item2 item2 item2");
4352 cbitems = g_list_append(cbitems, "item3 item3 item3 item3");
4353 cbitems = g_list_append(cbitems, "item4 item4 item4 item4 item4");
4354 cbitems = g_list_append(cbitems, "item5 item5 item5 item5 item5 item5");
4355 cbitems = g_list_append(cbitems, "item6 item6 item6 item6 item6");
4356 cbitems = g_list_append(cbitems, "item7 item7 item7 item7");
4357 cbitems = g_list_append(cbitems, "item8 item8 item8");
4358 cbitems = g_list_append(cbitems, "item9 item9");
4360 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4361 gtk_window_set_screen (GTK_WINDOW (window),
4362 gtk_widget_get_screen (widget));
4364 g_signal_connect (window, "destroy",
4365 G_CALLBACK (gtk_widget_destroyed),
4368 gtk_window_set_title (GTK_WINDOW (window), "entry");
4369 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4372 box1 = gtk_vbox_new (FALSE, 0);
4373 gtk_container_add (GTK_CONTAINER (window), box1);
4376 box2 = gtk_vbox_new (FALSE, 10);
4377 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4378 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4380 hbox = gtk_hbox_new (FALSE, 5);
4381 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4383 entry = gtk_entry_new ();
4384 gtk_entry_set_text (GTK_ENTRY (entry), "hello world السلام عليكم");
4385 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4386 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4388 button = gtk_button_new_with_mnemonic ("_Props");
4389 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4390 g_signal_connect (button, "clicked",
4391 G_CALLBACK (entry_props_clicked),
4394 cb = gtk_combo_new ();
4395 gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
4396 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO(cb)->entry), "hello world \n\n\n foo");
4397 gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry),
4399 gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0);
4401 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4402 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4403 g_signal_connect (sensitive_check, "toggled",
4404 G_CALLBACK (entry_toggle_sensitive), entry);
4405 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4407 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4408 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4409 g_signal_connect (has_frame_check, "toggled",
4410 G_CALLBACK (entry_toggle_frame), entry);
4411 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4413 separator = gtk_hseparator_new ();
4414 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4416 box2 = gtk_vbox_new (FALSE, 10);
4417 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4418 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4420 button = gtk_button_new_with_label ("close");
4421 g_signal_connect_swapped (button, "clicked",
4422 G_CALLBACK (gtk_widget_destroy),
4424 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4425 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4426 gtk_widget_grab_default (button);
4429 if (!GTK_WIDGET_VISIBLE (window))
4430 gtk_widget_show_all (window);
4432 gtk_widget_destroy (window);
4439 #define SIZE_GROUP_INITIAL_SIZE 50
4442 size_group_hsize_changed (GtkSpinButton *spin_button,
4445 gtk_widget_set_size_request (GTK_BIN (button)->child,
4446 gtk_spin_button_get_value_as_int (spin_button),
4451 size_group_vsize_changed (GtkSpinButton *spin_button,
4454 gtk_widget_set_size_request (GTK_BIN (button)->child,
4456 gtk_spin_button_get_value_as_int (spin_button));
4460 create_size_group_window (GdkScreen *screen,
4461 GtkSizeGroup *master_size_group)
4465 GtkWidget *main_button;
4467 GtkWidget *spin_button;
4469 GtkSizeGroup *hgroup1;
4470 GtkSizeGroup *hgroup2;
4471 GtkSizeGroup *vgroup1;
4472 GtkSizeGroup *vgroup2;
4474 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4480 gtk_window_set_screen (GTK_WINDOW (window), screen);
4482 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
4484 g_signal_connect (window, "response",
4485 G_CALLBACK (gtk_widget_destroy),
4488 table = gtk_table_new (2, 2, FALSE);
4489 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
4491 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4492 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4493 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4494 gtk_widget_set_size_request (table, 250, 250);
4496 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4497 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4498 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4499 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4501 main_button = gtk_button_new_with_label ("X");
4503 gtk_table_attach (GTK_TABLE (table), main_button,
4505 GTK_EXPAND, GTK_EXPAND,
4507 gtk_size_group_add_widget (master_size_group, main_button);
4508 gtk_size_group_add_widget (hgroup1, main_button);
4509 gtk_size_group_add_widget (vgroup1, main_button);
4510 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
4511 SIZE_GROUP_INITIAL_SIZE,
4512 SIZE_GROUP_INITIAL_SIZE);
4514 button = gtk_button_new ();
4515 gtk_table_attach (GTK_TABLE (table), button,
4517 GTK_EXPAND, GTK_EXPAND,
4519 gtk_size_group_add_widget (vgroup1, button);
4520 gtk_size_group_add_widget (vgroup2, button);
4522 button = gtk_button_new ();
4523 gtk_table_attach (GTK_TABLE (table), button,
4525 GTK_EXPAND, GTK_EXPAND,
4527 gtk_size_group_add_widget (hgroup1, button);
4528 gtk_size_group_add_widget (hgroup2, button);
4530 button = gtk_button_new ();
4531 gtk_table_attach (GTK_TABLE (table), button,
4533 GTK_EXPAND, GTK_EXPAND,
4535 gtk_size_group_add_widget (hgroup2, button);
4536 gtk_size_group_add_widget (vgroup2, button);
4538 g_object_unref (hgroup1);
4539 g_object_unref (hgroup2);
4540 g_object_unref (vgroup1);
4541 g_object_unref (vgroup2);
4543 hbox = gtk_hbox_new (FALSE, 5);
4544 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
4546 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4547 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4548 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4549 g_signal_connect (spin_button, "value_changed",
4550 G_CALLBACK (size_group_hsize_changed), main_button);
4552 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4553 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4554 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4555 g_signal_connect (spin_button, "value_changed",
4556 G_CALLBACK (size_group_vsize_changed), main_button);
4562 create_size_groups (GtkWidget *widget)
4564 static GtkWidget *window1 = NULL;
4565 static GtkWidget *window2 = NULL;
4566 static GtkSizeGroup *master_size_group;
4568 if (!master_size_group)
4569 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4573 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4576 g_signal_connect (window1, "destroy",
4577 G_CALLBACK (gtk_widget_destroyed),
4583 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4586 g_signal_connect (window2, "destroy",
4587 G_CALLBACK (gtk_widget_destroyed),
4591 if (GTK_WIDGET_VISIBLE (window1) && GTK_WIDGET_VISIBLE (window2))
4593 gtk_widget_destroy (window1);
4594 gtk_widget_destroy (window2);
4598 if (!GTK_WIDGET_VISIBLE (window1))
4599 gtk_widget_show_all (window1);
4600 if (!GTK_WIDGET_VISIBLE (window2))
4601 gtk_widget_show_all (window2);
4609 static GtkWidget *spinner1;
4612 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4614 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
4618 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4620 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
4624 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4626 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4627 gtk_spin_button_get_value_as_int (spin));
4631 get_value (GtkWidget *widget, gpointer data)
4635 GtkSpinButton *spin;
4637 spin = GTK_SPIN_BUTTON (spinner1);
4638 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4639 if (GPOINTER_TO_INT (data) == 1)
4640 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4642 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
4643 gtk_label_set_text (label, buf);
4647 get_spin_value (GtkWidget *widget, gpointer data)
4651 GtkSpinButton *spin;
4653 spin = GTK_SPIN_BUTTON (widget);
4654 label = GTK_LABEL (data);
4656 buffer = g_strdup_printf ("%0.*f", spin->digits,
4657 gtk_spin_button_get_value (spin));
4658 gtk_label_set_text (label, buffer);
4664 spin_button_time_output_func (GtkSpinButton *spin_button)
4666 static gchar buf[6];
4670 hours = spin_button->adjustment->value / 60.0;
4671 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4672 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4673 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4674 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4679 spin_button_month_input_func (GtkSpinButton *spin_button,
4683 static gchar *month[12] = { "January", "February", "March", "April",
4684 "May", "June", "July", "August",
4685 "September", "October", "November", "December" };
4687 gboolean found = FALSE;
4689 for (i = 1; i <= 12; i++)
4691 tmp1 = g_ascii_strup (month[i - 1], -1);
4692 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4693 if (strstr (tmp1, tmp2) == tmp1)
4703 return GTK_INPUT_ERROR;
4705 *new_val = (gdouble) i;
4710 spin_button_month_output_func (GtkSpinButton *spin_button)
4713 static gchar *month[12] = { "January", "February", "March", "April",
4714 "May", "June", "July", "August", "September",
4715 "October", "November", "December" };
4717 for (i = 1; i <= 12; i++)
4718 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
4720 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4721 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4727 spin_button_hex_input_func (GtkSpinButton *spin_button,
4734 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4735 res = strtol(buf, &err, 16);
4738 return GTK_INPUT_ERROR;
4744 spin_button_hex_output_func (GtkSpinButton *spin_button)
4746 static gchar buf[7];
4749 val = (gint) spin_button->adjustment->value;
4750 if (fabs (val) < 1e-5)
4751 sprintf (buf, "0x00");
4753 sprintf (buf, "0x%.2X", val);
4754 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4755 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4760 create_spins (GtkWidget *widget)
4762 static GtkWidget *window = NULL;
4765 GtkWidget *main_vbox;
4768 GtkWidget *spinner2;
4772 GtkWidget *val_label;
4777 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4778 gtk_window_set_screen (GTK_WINDOW (window),
4779 gtk_widget_get_screen (widget));
4781 g_signal_connect (window, "destroy",
4782 G_CALLBACK (gtk_widget_destroyed),
4785 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4787 main_vbox = gtk_vbox_new (FALSE, 5);
4788 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4789 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4791 frame = gtk_frame_new ("Not accelerated");
4792 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4794 vbox = gtk_vbox_new (FALSE, 0);
4795 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4796 gtk_container_add (GTK_CONTAINER (frame), vbox);
4798 /* Time, month, hex spinners */
4800 hbox = gtk_hbox_new (FALSE, 0);
4801 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4803 vbox2 = gtk_vbox_new (FALSE, 0);
4804 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4806 label = gtk_label_new ("Time :");
4807 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4808 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4810 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4811 spinner = gtk_spin_button_new (adj, 0, 0);
4812 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4813 g_signal_connect (spinner,
4815 G_CALLBACK (spin_button_time_output_func),
4817 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4818 gtk_widget_set_size_request (spinner, 55, -1);
4819 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4821 vbox2 = gtk_vbox_new (FALSE, 0);
4822 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4824 label = gtk_label_new ("Month :");
4825 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4826 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4828 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4830 spinner = gtk_spin_button_new (adj, 0, 0);
4831 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4832 GTK_UPDATE_IF_VALID);
4833 g_signal_connect (spinner,
4835 G_CALLBACK (spin_button_month_input_func),
4837 g_signal_connect (spinner,
4839 G_CALLBACK (spin_button_month_output_func),
4841 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4842 gtk_widget_set_size_request (spinner, 85, -1);
4843 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4845 vbox2 = gtk_vbox_new (FALSE, 0);
4846 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4848 label = gtk_label_new ("Hex :");
4849 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4850 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4852 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4853 spinner = gtk_spin_button_new (adj, 0, 0);
4854 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4855 g_signal_connect (spinner,
4857 G_CALLBACK (spin_button_hex_input_func),
4859 g_signal_connect (spinner,
4861 G_CALLBACK (spin_button_hex_output_func),
4863 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4864 gtk_widget_set_size_request (spinner, 55, -1);
4865 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4867 frame = gtk_frame_new ("Accelerated");
4868 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4870 vbox = gtk_vbox_new (FALSE, 0);
4871 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4872 gtk_container_add (GTK_CONTAINER (frame), vbox);
4874 hbox = gtk_hbox_new (FALSE, 0);
4875 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4877 vbox2 = gtk_vbox_new (FALSE, 0);
4878 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4880 label = gtk_label_new ("Value :");
4881 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4882 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4884 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
4886 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
4887 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4888 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4890 vbox2 = gtk_vbox_new (FALSE, 0);
4891 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4893 label = gtk_label_new ("Digits :");
4894 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4895 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4897 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4898 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
4899 g_signal_connect (adj, "value_changed",
4900 G_CALLBACK (change_digits),
4902 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4904 hbox = gtk_hbox_new (FALSE, 0);
4905 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4907 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4908 g_signal_connect (button, "clicked",
4909 G_CALLBACK (toggle_snap),
4911 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4912 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4914 button = gtk_check_button_new_with_label ("Numeric only input mode");
4915 g_signal_connect (button, "clicked",
4916 G_CALLBACK (toggle_numeric),
4918 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4919 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4921 val_label = gtk_label_new ("");
4923 hbox = gtk_hbox_new (FALSE, 0);
4924 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4926 button = gtk_button_new_with_label ("Value as Int");
4927 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4928 g_signal_connect (button, "clicked",
4929 G_CALLBACK (get_value),
4930 GINT_TO_POINTER (1));
4931 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4933 button = gtk_button_new_with_label ("Value as Float");
4934 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4935 g_signal_connect (button, "clicked",
4936 G_CALLBACK (get_value),
4937 GINT_TO_POINTER (2));
4938 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4940 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4941 gtk_label_set_text (GTK_LABEL (val_label), "0");
4943 frame = gtk_frame_new ("Using Convenience Constructor");
4944 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4946 hbox = gtk_hbox_new (FALSE, 0);
4947 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4948 gtk_container_add (GTK_CONTAINER (frame), hbox);
4950 val_label = gtk_label_new ("0.0");
4952 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4953 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4954 g_signal_connect (spinner, "value_changed",
4955 G_CALLBACK (get_spin_value), val_label);
4956 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4957 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4959 hbox = gtk_hbox_new (FALSE, 0);
4960 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4962 button = gtk_button_new_with_label ("Close");
4963 g_signal_connect_swapped (button, "clicked",
4964 G_CALLBACK (gtk_widget_destroy),
4966 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4969 if (!GTK_WIDGET_VISIBLE (window))
4970 gtk_widget_show_all (window);
4972 gtk_widget_destroy (window);
4981 cursor_expose_event (GtkWidget *widget,
4985 GtkDrawingArea *darea;
4986 GdkDrawable *drawable;
4993 g_return_val_if_fail (widget != NULL, TRUE);
4994 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
4996 darea = GTK_DRAWING_AREA (widget);
4997 drawable = widget->window;
4998 white_gc = widget->style->white_gc;
4999 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5000 black_gc = widget->style->black_gc;
5001 max_width = widget->allocation.width;
5002 max_height = widget->allocation.height;
5004 gdk_draw_rectangle (drawable, white_gc,
5011 gdk_draw_rectangle (drawable, black_gc,
5018 gdk_draw_rectangle (drawable, gray_gc,
5029 set_cursor (GtkWidget *spinner,
5038 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5041 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5043 class = gtk_type_class (GDK_TYPE_CURSOR_TYPE);
5044 vals = class->values;
5046 while (vals && vals->value != c)
5049 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5051 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5053 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5054 gdk_window_set_cursor (widget->window, cursor);
5055 gdk_cursor_unref (cursor);
5059 cursor_event (GtkWidget *widget,
5061 GtkSpinButton *spinner)
5063 if ((event->type == GDK_BUTTON_PRESS) &&
5064 ((event->button.button == 1) ||
5065 (event->button.button == 3)))
5067 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5068 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5076 create_cursors (GtkWidget *widget)
5078 static GtkWidget *window = NULL;
5081 GtkWidget *main_vbox;
5092 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5093 gtk_window_set_screen (GTK_WINDOW (window),
5094 gtk_widget_get_screen (widget));
5096 g_signal_connect (window, "destroy",
5097 G_CALLBACK (gtk_widget_destroyed),
5100 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5102 main_vbox = gtk_vbox_new (FALSE, 5);
5103 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5104 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5107 gtk_widget_new (gtk_vbox_get_type (),
5108 "GtkBox::homogeneous", FALSE,
5109 "GtkBox::spacing", 5,
5110 "GtkContainer::border_width", 10,
5111 "GtkWidget::parent", main_vbox,
5112 "GtkWidget::visible", TRUE,
5115 hbox = gtk_hbox_new (FALSE, 0);
5116 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5117 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5119 label = gtk_label_new ("Cursor Value : ");
5120 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5121 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5123 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5127 spinner = gtk_spin_button_new (adj, 0, 0);
5128 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5131 gtk_widget_new (gtk_frame_get_type (),
5132 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5133 "GtkFrame::label_xalign", 0.5,
5134 "GtkFrame::label", "Cursor Area",
5135 "GtkContainer::border_width", 10,
5136 "GtkWidget::parent", vbox,
5137 "GtkWidget::visible", TRUE,
5140 darea = gtk_drawing_area_new ();
5141 gtk_widget_set_size_request (darea, 80, 80);
5142 gtk_container_add (GTK_CONTAINER (frame), darea);
5143 g_signal_connect (darea,
5145 G_CALLBACK (cursor_expose_event),
5147 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5148 g_signal_connect (darea,
5149 "button_press_event",
5150 G_CALLBACK (cursor_event),
5152 gtk_widget_show (darea);
5154 g_signal_connect (spinner, "changed",
5155 G_CALLBACK (set_cursor),
5158 label = gtk_widget_new (GTK_TYPE_LABEL,
5163 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5166 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5169 gtk_widget_new (gtk_hseparator_get_type (),
5170 "GtkWidget::visible", TRUE,
5172 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5174 hbox = gtk_hbox_new (FALSE, 0);
5175 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5176 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5178 button = gtk_button_new_with_label ("Close");
5179 g_signal_connect_swapped (button, "clicked",
5180 G_CALLBACK (gtk_widget_destroy),
5182 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5184 gtk_widget_show_all (window);
5186 set_cursor (spinner, darea);
5189 gtk_widget_destroy (window);
5197 list_add (GtkWidget *widget,
5202 GtkWidget *list_item;
5203 GtkContainer *container;
5205 container = GTK_CONTAINER (list);
5207 sprintf (buffer, "added item %d", i++);
5208 list_item = gtk_list_item_new_with_label (buffer);
5209 gtk_widget_show (list_item);
5211 gtk_container_add (container, list_item);
5215 list_remove (GtkWidget *widget,
5218 GList *clear_list = NULL;
5219 GList *sel_row = NULL;
5222 if (list->selection_mode == GTK_SELECTION_EXTENDED)
5226 item = GTK_CONTAINER (list)->focus_child;
5227 if (!item && list->selection)
5228 item = list->selection->data;
5232 work = g_list_find (list->children, item);
5233 for (sel_row = work; sel_row; sel_row = sel_row->next)
5234 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
5239 for (sel_row = work; sel_row; sel_row = sel_row->prev)
5240 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
5246 for (work = list->selection; work; work = work->next)
5247 clear_list = g_list_prepend (clear_list, work->data);
5249 clear_list = g_list_reverse (clear_list);
5250 gtk_list_remove_items (GTK_LIST (list), clear_list);
5251 g_list_free (clear_list);
5253 if (list->selection_mode == GTK_SELECTION_EXTENDED && sel_row)
5254 gtk_list_select_child (list, GTK_WIDGET(sel_row->data));
5258 list_clear (GtkWidget *widget,
5261 gtk_list_clear_items (GTK_LIST (list), 0, -1);
5264 static gchar *selection_mode_items[] =
5271 static const GtkSelectionMode selection_modes[] = {
5272 GTK_SELECTION_SINGLE,
5273 GTK_SELECTION_BROWSE,
5274 GTK_SELECTION_MULTIPLE
5277 static GtkWidget *list_omenu;
5280 list_toggle_sel_mode (GtkWidget *widget, gpointer data)
5285 list = GTK_LIST (data);
5287 if (!GTK_WIDGET_MAPPED (widget))
5290 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
5292 gtk_list_set_selection_mode (list, selection_modes[i]);
5296 create_list (GtkWidget *widget)
5298 static GtkWidget *window = NULL;
5306 GtkWidget *scrolled_win;
5309 GtkWidget *separator;
5312 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5314 gtk_window_set_screen (GTK_WINDOW (window),
5315 gtk_widget_get_screen (widget));
5317 g_signal_connect (window, "destroy",
5318 G_CALLBACK (gtk_widget_destroyed),
5321 gtk_window_set_title (GTK_WINDOW (window), "list");
5322 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5324 vbox = gtk_vbox_new (FALSE, 0);
5325 gtk_container_add (GTK_CONTAINER (window), vbox);
5327 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
5328 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
5329 gtk_widget_set_size_request (scrolled_win, -1, 300);
5330 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
5331 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
5332 GTK_POLICY_AUTOMATIC,
5333 GTK_POLICY_AUTOMATIC);
5335 list = gtk_list_new ();
5336 gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE);
5337 gtk_scrolled_window_add_with_viewport
5338 (GTK_SCROLLED_WINDOW (scrolled_win), list);
5339 gtk_container_set_focus_vadjustment
5340 (GTK_CONTAINER (list),
5341 gtk_scrolled_window_get_vadjustment
5342 (GTK_SCROLLED_WINDOW (scrolled_win)));
5343 gtk_container_set_focus_hadjustment
5344 (GTK_CONTAINER (list),
5345 gtk_scrolled_window_get_hadjustment
5346 (GTK_SCROLLED_WINDOW (scrolled_win)));
5348 if ((infile = fopen("../gtk/gtkenums.h", "r")))
5354 while (fgets (buffer, 256, infile))
5356 if ((pos = strchr (buffer, '\n')))
5358 item = gtk_list_item_new_with_label (buffer);
5359 gtk_container_add (GTK_CONTAINER (list), item);
5366 hbox = gtk_hbox_new (TRUE, 5);
5367 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5368 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5370 button = gtk_button_new_with_label ("Insert Row");
5371 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5372 g_signal_connect (button, "clicked",
5373 G_CALLBACK (list_add),
5376 button = gtk_button_new_with_label ("Clear List");
5377 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5378 g_signal_connect (button, "clicked",
5379 G_CALLBACK (list_clear),
5382 button = gtk_button_new_with_label ("Remove Selection");
5383 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5384 g_signal_connect (button, "clicked",
5385 G_CALLBACK (list_remove),
5388 cbox = gtk_hbox_new (FALSE, 0);
5389 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
5391 hbox = gtk_hbox_new (FALSE, 5);
5392 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5393 gtk_box_pack_start (GTK_BOX (cbox), hbox, TRUE, FALSE, 0);
5395 label = gtk_label_new ("Selection Mode :");
5396 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5398 list_omenu = build_option_menu (selection_mode_items, 3, 3,
5399 list_toggle_sel_mode,
5401 gtk_box_pack_start (GTK_BOX (hbox), list_omenu, FALSE, TRUE, 0);
5403 separator = gtk_hseparator_new ();
5404 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
5406 cbox = gtk_hbox_new (FALSE, 0);
5407 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
5409 button = gtk_button_new_with_label ("close");
5410 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5411 gtk_box_pack_start (GTK_BOX (cbox), button, TRUE, TRUE, 0);
5412 g_signal_connect_swapped (button, "clicked",
5413 G_CALLBACK (gtk_widget_destroy),
5416 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5417 gtk_widget_grab_default (button);
5420 if (!GTK_WIDGET_VISIBLE (window))
5421 gtk_widget_show_all (window);
5423 gtk_widget_destroy (window);
5430 static char * book_open_xpm[] = {
5453 static char * book_closed_xpm[] = {
5478 static char * mini_page_xpm[] = {
5501 static char * gtk_mini_xpm[] = {
5541 #define TESTGTK_CLIST_COLUMNS 12
5542 static gint clist_rows = 0;
5543 static GtkWidget *clist_omenu;
5546 add1000_clist (GtkWidget *widget, gpointer data)
5549 char text[TESTGTK_CLIST_COLUMNS][50];
5550 char *texts[TESTGTK_CLIST_COLUMNS];
5555 clist = GTK_CLIST (data);
5557 pixmap = gdk_pixmap_create_from_xpm_d (clist->clist_window,
5559 >K_WIDGET (data)->style->white,
5562 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5565 sprintf (text[i], "Column %d", i);
5569 sprintf (text[1], "Right");
5570 sprintf (text[2], "Center");
5572 gtk_clist_freeze (GTK_CLIST (data));
5573 for (i = 0; i < 1000; i++)
5575 sprintf (text[0], "CListRow %d", rand() % 10000);
5576 row = gtk_clist_append (clist, texts);
5577 gtk_clist_set_pixtext (clist, row, 3, "gtk+", 5, pixmap, mask);
5580 gtk_clist_thaw (GTK_CLIST (data));
5582 g_object_unref (pixmap);
5583 g_object_unref (mask);
5587 add10000_clist (GtkWidget *widget, gpointer data)
5590 char text[TESTGTK_CLIST_COLUMNS][50];
5591 char *texts[TESTGTK_CLIST_COLUMNS];
5593 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5596 sprintf (text[i], "Column %d", i);
5599 sprintf (text[1], "Right");
5600 sprintf (text[2], "Center");
5602 gtk_clist_freeze (GTK_CLIST (data));
5603 for (i = 0; i < 10000; i++)
5605 sprintf (text[0], "CListRow %d", rand() % 10000);
5606 gtk_clist_append (GTK_CLIST (data), texts);
5608 gtk_clist_thaw (GTK_CLIST (data));
5612 clear_clist (GtkWidget *widget, gpointer data)
5614 gtk_clist_clear (GTK_CLIST (data));
5618 void clist_remove_selection (GtkWidget *widget, GtkCList *clist)
5620 gtk_clist_freeze (clist);
5622 while (clist->selection)
5627 row = GPOINTER_TO_INT (clist->selection->data);
5629 gtk_clist_remove (clist, row);
5631 if (clist->selection_mode == GTK_SELECTION_BROWSE)
5635 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
5636 clist->focus_row >= 0)
5637 gtk_clist_select_row (clist, clist->focus_row, -1);
5639 gtk_clist_thaw (clist);
5642 void toggle_title_buttons (GtkWidget *widget, GtkCList *clist)
5644 if (GTK_TOGGLE_BUTTON (widget)->active)
5645 gtk_clist_column_titles_show (clist);
5647 gtk_clist_column_titles_hide (clist);
5650 void toggle_reorderable (GtkWidget *widget, GtkCList *clist)
5652 gtk_clist_set_reorderable (clist, GTK_TOGGLE_BUTTON (widget)->active);
5656 insert_row_clist (GtkWidget *widget, gpointer data)
5658 static char *text[] =
5660 "This", "is an", "inserted", "row.",
5661 "This", "is an", "inserted", "row.",
5662 "This", "is an", "inserted", "row."
5665 static GtkStyle *style1 = NULL;
5666 static GtkStyle *style2 = NULL;
5667 static GtkStyle *style3 = NULL;
5670 if (GTK_CLIST (data)->focus_row >= 0)
5671 row = gtk_clist_insert (GTK_CLIST (data), GTK_CLIST (data)->focus_row,
5674 row = gtk_clist_prepend (GTK_CLIST (data), text);
5688 style1 = gtk_style_copy (GTK_WIDGET (data)->style);
5689 style1->base[GTK_STATE_NORMAL] = col1;
5690 style1->base[GTK_STATE_SELECTED] = col2;
5692 style2 = gtk_style_copy (GTK_WIDGET (data)->style);
5693 style2->fg[GTK_STATE_NORMAL] = col1;
5694 style2->fg[GTK_STATE_SELECTED] = col2;
5696 style3 = gtk_style_copy (GTK_WIDGET (data)->style);
5697 style3->fg[GTK_STATE_NORMAL] = col1;
5698 style3->base[GTK_STATE_NORMAL] = col2;
5699 pango_font_description_free (style3->font_desc);
5700 style3->font_desc = pango_font_description_from_string ("courier 12");
5703 gtk_clist_set_cell_style (GTK_CLIST (data), row, 3, style1);
5704 gtk_clist_set_cell_style (GTK_CLIST (data), row, 4, style2);
5705 gtk_clist_set_cell_style (GTK_CLIST (data), row, 0, style3);
5711 clist_warning_test (GtkWidget *button,
5715 static gboolean add_remove = FALSE;
5717 add_remove = !add_remove;
5719 child = gtk_label_new ("Test");
5720 g_object_ref (child);
5721 gtk_object_sink (GTK_OBJECT (child));
5724 gtk_container_add (GTK_CONTAINER (clist), child);
5727 child->parent = clist;
5728 gtk_container_remove (GTK_CONTAINER (clist), child);
5729 child->parent = NULL;
5732 gtk_widget_destroy (child);
5733 gtk_widget_unref (child);
5737 undo_selection (GtkWidget *button, GtkCList *clist)
5739 gtk_clist_undo_selection (clist);
5743 clist_toggle_sel_mode (GtkWidget *widget, gpointer data)
5748 clist = GTK_CLIST (data);
5750 if (!GTK_WIDGET_MAPPED (widget))
5753 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
5755 gtk_clist_set_selection_mode (clist, selection_modes[i]);
5759 clist_click_column (GtkCList *clist, gint column, gpointer data)
5762 gtk_clist_set_column_visibility (clist, column, FALSE);
5763 else if (column == clist->sort_column)
5765 if (clist->sort_type == GTK_SORT_ASCENDING)
5766 clist->sort_type = GTK_SORT_DESCENDING;
5768 clist->sort_type = GTK_SORT_ASCENDING;
5771 gtk_clist_set_sort_column (clist, column);
5773 gtk_clist_sort (clist);
5777 create_clist (GtkWidget *widget)
5780 static GtkWidget *window = NULL;
5782 static char *titles[] =
5784 "auto resize", "not resizeable", "max width 100", "min width 50",
5785 "hide column", "Title 5", "Title 6", "Title 7",
5786 "Title 8", "Title 9", "Title 10", "Title 11"
5789 char text[TESTGTK_CLIST_COLUMNS][50];
5790 char *texts[TESTGTK_CLIST_COLUMNS];
5796 GtkWidget *separator;
5797 GtkWidget *scrolled_win;
5800 GtkWidget *undo_button;
5810 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5811 gtk_window_set_screen (GTK_WINDOW (window),
5812 gtk_widget_get_screen (widget));
5814 g_signal_connect (window, "destroy",
5815 G_CALLBACK (gtk_widget_destroyed), &window);
5817 gtk_window_set_title (GTK_WINDOW (window), "clist");
5818 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5820 vbox = gtk_vbox_new (FALSE, 0);
5821 gtk_container_add (GTK_CONTAINER (window), vbox);
5823 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
5824 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
5825 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
5826 GTK_POLICY_AUTOMATIC,
5827 GTK_POLICY_AUTOMATIC);
5829 /* create GtkCList here so we have a pointer to throw at the
5830 * button callbacks -- more is done with it later */
5831 clist = gtk_clist_new_with_titles (TESTGTK_CLIST_COLUMNS, titles);
5832 gtk_container_add (GTK_CONTAINER (scrolled_win), clist);
5833 g_signal_connect (clist, "click_column",
5834 G_CALLBACK (clist_click_column), NULL);
5836 /* control buttons */
5837 hbox = gtk_hbox_new (FALSE, 5);
5838 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5839 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
5841 button = gtk_button_new_with_label ("Insert Row");
5842 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5843 g_signal_connect (button, "clicked",
5844 G_CALLBACK (insert_row_clist), clist);
5846 button = gtk_button_new_with_label ("Add 1,000 Rows With Pixmaps");
5847 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5848 g_signal_connect (button, "clicked",
5849 G_CALLBACK (add1000_clist), clist);
5851 button = gtk_button_new_with_label ("Add 10,000 Rows");
5852 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5853 g_signal_connect (button, "clicked",
5854 G_CALLBACK (add10000_clist), clist);
5856 /* second layer of buttons */
5857 hbox = gtk_hbox_new (FALSE, 5);
5858 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5859 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
5861 button = gtk_button_new_with_label ("Clear List");
5862 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5863 g_signal_connect (button, "clicked",
5864 G_CALLBACK (clear_clist), clist);
5866 button = gtk_button_new_with_label ("Remove Selection");
5867 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5868 g_signal_connect (button, "clicked",
5869 G_CALLBACK (clist_remove_selection), clist);
5871 undo_button = gtk_button_new_with_label ("Undo Selection");
5872 gtk_box_pack_start (GTK_BOX (hbox), undo_button, TRUE, TRUE, 0);
5873 g_signal_connect (undo_button, "clicked",
5874 G_CALLBACK (undo_selection), clist);
5876 button = gtk_button_new_with_label ("Warning Test");
5877 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5878 g_signal_connect (button, "clicked",
5879 G_CALLBACK (clist_warning_test), clist);
5881 /* third layer of buttons */
5882 hbox = gtk_hbox_new (FALSE, 5);
5883 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5884 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
5886 check = gtk_check_button_new_with_label ("Show Title Buttons");
5887 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
5888 g_signal_connect (check, "clicked",
5889 G_CALLBACK (toggle_title_buttons), clist);
5890 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
5892 check = gtk_check_button_new_with_label ("Reorderable");
5893 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
5894 g_signal_connect (check, "clicked",
5895 G_CALLBACK (toggle_reorderable), clist);
5896 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
5898 label = gtk_label_new ("Selection Mode :");
5899 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5901 clist_omenu = build_option_menu (selection_mode_items, 3, 3,
5902 clist_toggle_sel_mode,
5904 gtk_box_pack_start (GTK_BOX (hbox), clist_omenu, FALSE, TRUE, 0);
5907 * the rest of the clist configuration
5910 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
5911 gtk_clist_set_row_height (GTK_CLIST (clist), 18);
5912 gtk_widget_set_size_request (clist, -1, 300);
5914 for (i = 1; i < TESTGTK_CLIST_COLUMNS; i++)
5915 gtk_clist_set_column_width (GTK_CLIST (clist), i, 80);
5917 gtk_clist_set_column_auto_resize (GTK_CLIST (clist), 0, TRUE);
5918 gtk_clist_set_column_resizeable (GTK_CLIST (clist), 1, FALSE);
5919 gtk_clist_set_column_max_width (GTK_CLIST (clist), 2, 100);
5920 gtk_clist_set_column_min_width (GTK_CLIST (clist), 3, 50);
5921 gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
5922 gtk_clist_set_column_justification (GTK_CLIST (clist), 1,
5924 gtk_clist_set_column_justification (GTK_CLIST (clist), 2,
5925 GTK_JUSTIFY_CENTER);
5927 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5930 sprintf (text[i], "Column %d", i);
5933 sprintf (text[1], "Right");
5934 sprintf (text[2], "Center");
5943 style = gtk_style_new ();
5944 style->fg[GTK_STATE_NORMAL] = col1;
5945 style->base[GTK_STATE_NORMAL] = col2;
5947 pango_font_description_set_size (style->font_desc, 14 * PANGO_SCALE);
5948 pango_font_description_set_weight (style->font_desc, PANGO_WEIGHT_BOLD);
5950 for (i = 0; i < 10; i++)
5952 sprintf (text[0], "CListRow %d", clist_rows++);
5953 gtk_clist_append (GTK_CLIST (clist), texts);
5958 gtk_clist_set_row_style (GTK_CLIST (clist), i, style);
5961 gtk_clist_set_cell_style (GTK_CLIST (clist), i, i % 4, style);
5966 gtk_style_unref (style);
5968 separator = gtk_hseparator_new ();
5969 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
5971 hbox = gtk_hbox_new (FALSE, 0);
5972 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5974 button = gtk_button_new_with_label ("close");
5975 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5976 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5977 g_signal_connect_swapped (button, "clicked",
5978 G_CALLBACK (gtk_widget_destroy),
5981 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5982 gtk_widget_grab_default (button);
5985 if (!GTK_WIDGET_VISIBLE (window))
5986 gtk_widget_show_all (window);
5990 gtk_widget_destroy (window);
6008 static gint books = 0;
6009 static gint pages = 0;
6011 static GtkWidget *book_label;
6012 static GtkWidget *page_label;
6013 static GtkWidget *sel_label;
6014 static GtkWidget *vis_label;
6015 static GtkWidget *omenu1;
6016 static GtkWidget *omenu2;
6017 static GtkWidget *omenu3;
6018 static GtkWidget *omenu4;
6019 static GtkWidget *spin1;
6020 static GtkWidget *spin2;
6021 static GtkWidget *spin3;
6022 static gint line_style;
6025 static CTreePixmaps *
6026 get_ctree_pixmaps (GtkCTree *ctree)
6028 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (ctree));
6029 CTreePixmaps *pixmaps = g_object_get_data (G_OBJECT (screen), "ctree-pixmaps");
6033 GdkColormap *colormap = gdk_screen_get_rgb_colormap (screen);
6034 pixmaps = g_new (CTreePixmaps, 1);
6036 pixmaps->pixmap1 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6038 NULL, book_closed_xpm);
6039 pixmaps->pixmap2 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6041 NULL, book_open_xpm);
6042 pixmaps->pixmap3 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6044 NULL, mini_page_xpm);
6046 g_object_set_data (G_OBJECT (screen), "ctree-pixmaps", pixmaps);
6052 void after_press (GtkCTree *ctree, gpointer data)
6056 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
6057 gtk_label_set_text (GTK_LABEL (sel_label), buf);
6059 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
6060 gtk_label_set_text (GTK_LABEL (vis_label), buf);
6062 sprintf (buf, "%d", books);
6063 gtk_label_set_text (GTK_LABEL (book_label), buf);
6065 sprintf (buf, "%d", pages);
6066 gtk_label_set_text (GTK_LABEL (page_label), buf);
6069 void after_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent,
6070 GtkCTreeNode *sibling, gpointer data)
6076 gtk_ctree_get_node_info (ctree, child, &source,
6077 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6079 gtk_ctree_get_node_info (ctree, parent, &target1,
6080 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6082 gtk_ctree_get_node_info (ctree, sibling, &target2,
6083 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6085 g_print ("Moving \"%s\" to \"%s\" with sibling \"%s\".\n", source,
6086 (parent) ? target1 : "nil", (sibling) ? target2 : "nil");
6089 void count_items (GtkCTree *ctree, GtkCTreeNode *list)
6091 if (GTK_CTREE_ROW (list)->is_leaf)
6097 void expand_all (GtkWidget *widget, GtkCTree *ctree)
6099 gtk_ctree_expand_recursive (ctree, NULL);
6100 after_press (ctree, NULL);
6103 void collapse_all (GtkWidget *widget, GtkCTree *ctree)
6105 gtk_ctree_collapse_recursive (ctree, NULL);
6106 after_press (ctree, NULL);
6109 void select_all (GtkWidget *widget, GtkCTree *ctree)
6111 gtk_ctree_select_recursive (ctree, NULL);
6112 after_press (ctree, NULL);
6115 void change_style (GtkWidget *widget, GtkCTree *ctree)
6117 static GtkStyle *style1 = NULL;
6118 static GtkStyle *style2 = NULL;
6124 if (GTK_CLIST (ctree)->focus_row >= 0)
6125 node = GTK_CTREE_NODE
6126 (g_list_nth (GTK_CLIST (ctree)->row_list,GTK_CLIST (ctree)->focus_row));
6128 node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list);
6142 style1 = gtk_style_new ();
6143 style1->base[GTK_STATE_NORMAL] = col1;
6144 style1->fg[GTK_STATE_SELECTED] = col2;
6146 style2 = gtk_style_new ();
6147 style2->base[GTK_STATE_SELECTED] = col2;
6148 style2->fg[GTK_STATE_NORMAL] = col1;
6149 style2->base[GTK_STATE_NORMAL] = col2;
6150 pango_font_description_free (style2->font_desc);
6151 style2->font_desc = pango_font_description_from_string ("courier 30");
6154 gtk_ctree_node_set_cell_style (ctree, node, 1, style1);
6155 gtk_ctree_node_set_cell_style (ctree, node, 0, style2);
6157 if (GTK_CTREE_ROW (node)->children)
6158 gtk_ctree_node_set_row_style (ctree, GTK_CTREE_ROW (node)->children,
6162 void unselect_all (GtkWidget *widget, GtkCTree *ctree)
6164 gtk_ctree_unselect_recursive (ctree, NULL);
6165 after_press (ctree, NULL);
6168 void remove_selection (GtkWidget *widget, GtkCTree *ctree)
6173 clist = GTK_CLIST (ctree);
6175 gtk_clist_freeze (clist);
6177 while (clist->selection)
6179 node = clist->selection->data;
6181 if (GTK_CTREE_ROW (node)->is_leaf)
6184 gtk_ctree_post_recursive (ctree, node,
6185 (GtkCTreeFunc) count_items, NULL);
6187 gtk_ctree_remove_node (ctree, node);
6189 if (clist->selection_mode == GTK_SELECTION_BROWSE)
6193 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
6194 clist->focus_row >= 0)
6196 node = gtk_ctree_node_nth (ctree, clist->focus_row);
6199 gtk_ctree_select (ctree, node);
6202 gtk_clist_thaw (clist);
6203 after_press (ctree, NULL);
6206 struct _ExportStruct {
6212 typedef struct _ExportStruct ExportStruct;
6215 gnode2ctree (GtkCTree *ctree,
6218 GtkCTreeNode *cnode,
6222 GdkPixmap *pixmap_closed;
6223 GdkBitmap *mask_closed;
6224 GdkPixmap *pixmap_opened;
6225 GdkBitmap *mask_opened;
6226 CTreePixmaps *pixmaps;
6228 if (!cnode || !gnode || (!(es = gnode->data)))
6231 pixmaps = get_ctree_pixmaps (ctree);
6235 pixmap_closed = pixmaps->pixmap3;
6236 mask_closed = pixmaps->mask3;
6237 pixmap_opened = NULL;
6242 pixmap_closed = pixmaps->pixmap1;
6243 mask_closed = pixmaps->mask1;
6244 pixmap_opened = pixmaps->pixmap2;
6245 mask_opened = pixmaps->mask2;
6248 gtk_ctree_set_node_info (ctree, cnode, es->tree, 2, pixmap_closed,
6249 mask_closed, pixmap_opened, mask_opened,
6250 es->is_leaf, (depth < 3));
6251 gtk_ctree_node_set_text (ctree, cnode, 1, es->info);
6259 ctree2gnode (GtkCTree *ctree,
6262 GtkCTreeNode *cnode,
6267 if (!cnode || !gnode)
6270 es = g_new (ExportStruct, 1);
6272 es->is_leaf = GTK_CTREE_ROW (cnode)->is_leaf;
6273 es->tree = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[0])->text;
6274 es->info = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[1])->text;
6278 void export_ctree (GtkWidget *widget, GtkCTree *ctree)
6280 char *title[] = { "Tree" , "Info" };
6281 static GtkWidget *export_window = NULL;
6282 static GtkCTree *export_ctree;
6284 GtkWidget *scrolled_win;
6292 export_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6294 gtk_window_set_screen (GTK_WINDOW (export_window),
6295 gtk_widget_get_screen (widget));
6297 g_signal_connect (export_window, "destroy",
6298 G_CALLBACK (gtk_widget_destroyed),
6301 gtk_window_set_title (GTK_WINDOW (export_window), "exported ctree");
6302 gtk_container_set_border_width (GTK_CONTAINER (export_window), 5);
6304 vbox = gtk_vbox_new (FALSE, 0);
6305 gtk_container_add (GTK_CONTAINER (export_window), vbox);
6307 button = gtk_button_new_with_label ("Close");
6308 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, TRUE, 0);
6310 g_signal_connect_swapped (button, "clicked",
6311 G_CALLBACK (gtk_widget_destroy),
6314 sep = gtk_hseparator_new ();
6315 gtk_box_pack_end (GTK_BOX (vbox), sep, FALSE, TRUE, 10);
6317 export_ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
6318 gtk_ctree_set_line_style (export_ctree, GTK_CTREE_LINES_DOTTED);
6320 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6321 gtk_container_add (GTK_CONTAINER (scrolled_win),
6322 GTK_WIDGET (export_ctree));
6323 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6324 GTK_POLICY_AUTOMATIC,
6325 GTK_POLICY_AUTOMATIC);
6326 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6327 gtk_clist_set_selection_mode (GTK_CLIST (export_ctree),
6328 GTK_SELECTION_EXTENDED);
6329 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 0, 200);
6330 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 1, 200);
6331 gtk_widget_set_size_request (GTK_WIDGET (export_ctree), 300, 200);
6334 if (!GTK_WIDGET_VISIBLE (export_window))
6335 gtk_widget_show_all (export_window);
6337 gtk_clist_clear (GTK_CLIST (export_ctree));
6339 node = GTK_CTREE_NODE (g_list_nth (GTK_CLIST (ctree)->row_list,
6340 GTK_CLIST (ctree)->focus_row));
6344 gnode = gtk_ctree_export_to_gnode (ctree, NULL, NULL, node,
6348 gtk_ctree_insert_gnode (export_ctree, NULL, NULL, gnode,
6350 g_node_destroy (gnode);
6354 void change_indent (GtkWidget *widget, GtkCTree *ctree)
6356 gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
6359 void change_spacing (GtkWidget *widget, GtkCTree *ctree)
6361 gtk_ctree_set_spacing (ctree, GTK_ADJUSTMENT (widget)->value);
6364 void change_row_height (GtkWidget *widget, GtkCList *clist)
6366 gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value);
6369 void set_background (GtkCTree *ctree, GtkCTreeNode *node, gpointer data)
6371 GtkStyle *style = NULL;
6376 if (ctree->line_style != GTK_CTREE_LINES_TABBED)
6378 if (!GTK_CTREE_ROW (node)->is_leaf)
6379 style = GTK_CTREE_ROW (node)->row.data;
6380 else if (GTK_CTREE_ROW (node)->parent)
6381 style = GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data;
6384 gtk_ctree_node_set_row_style (ctree, node, style);
6388 ctree_toggle_line_style (GtkWidget *widget, gpointer data)
6393 ctree = GTK_CTREE (data);
6395 if (!GTK_WIDGET_MAPPED (widget))
6398 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6400 if ((ctree->line_style == GTK_CTREE_LINES_TABBED &&
6401 ((GtkCTreeLineStyle) i) != GTK_CTREE_LINES_TABBED) ||
6402 (ctree->line_style != GTK_CTREE_LINES_TABBED &&
6403 ((GtkCTreeLineStyle) i) == GTK_CTREE_LINES_TABBED))
6404 gtk_ctree_pre_recursive (ctree, NULL, set_background, NULL);
6405 gtk_ctree_set_line_style (ctree, i);
6410 ctree_toggle_expander_style (GtkWidget *widget, gpointer data)
6415 ctree = GTK_CTREE (data);
6417 if (!GTK_WIDGET_MAPPED (widget))
6420 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6422 gtk_ctree_set_expander_style (ctree, (GtkCTreeExpanderStyle) i);
6426 ctree_toggle_justify (GtkWidget *widget, gpointer data)
6431 ctree = GTK_CTREE (data);
6433 if (!GTK_WIDGET_MAPPED (widget))
6436 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6438 gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column,
6439 (GtkJustification) i);
6443 ctree_toggle_sel_mode (GtkWidget *widget, gpointer data)
6448 ctree = GTK_CTREE (data);
6450 if (!GTK_WIDGET_MAPPED (widget))
6453 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6455 gtk_clist_set_selection_mode (GTK_CLIST (ctree), selection_modes[i]);
6456 after_press (ctree, NULL);
6459 void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
6460 gint num_books, gint num_pages, GtkCTreeNode *parent)
6465 GtkCTreeNode *sibling;
6466 CTreePixmaps *pixmaps;
6473 pixmaps = get_ctree_pixmaps (ctree);
6475 for (i = num_pages + num_books; i > num_books; i--)
6478 sprintf (buf1, "Page %02d", (gint) rand() % 100);
6479 sprintf (buf2, "Item %d-%d", cur_depth, i);
6480 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
6481 pixmaps->pixmap3, pixmaps->mask3, NULL, NULL,
6484 if (parent && ctree->line_style == GTK_CTREE_LINES_TABBED)
6485 gtk_ctree_node_set_row_style (ctree, sibling,
6486 GTK_CTREE_ROW (parent)->row.style);
6489 if (cur_depth == depth)
6492 for (i = num_books; i > 0; i--)
6497 sprintf (buf1, "Book %02d", (gint) rand() % 100);
6498 sprintf (buf2, "Item %d-%d", cur_depth, i);
6499 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
6500 pixmaps->pixmap1, pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2,
6503 style = gtk_style_new ();
6504 switch (cur_depth % 3)
6507 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
6508 style->base[GTK_STATE_NORMAL].green = 0;
6509 style->base[GTK_STATE_NORMAL].blue = 65535 - ((i * 10000) % 65535);
6512 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
6513 style->base[GTK_STATE_NORMAL].green = 65535 - ((i * 10000) % 65535);
6514 style->base[GTK_STATE_NORMAL].blue = 0;
6517 style->base[GTK_STATE_NORMAL].red = 65535 - ((i * 10000) % 65535);
6518 style->base[GTK_STATE_NORMAL].green = 0;
6519 style->base[GTK_STATE_NORMAL].blue = 10000 * (cur_depth % 6);
6522 gtk_ctree_node_set_row_data_full (ctree, sibling, style,
6523 (GtkDestroyNotify) gtk_style_unref);
6525 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
6526 gtk_ctree_node_set_row_style (ctree, sibling, style);
6528 build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages,
6533 void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
6536 gchar label1[] = "Root";
6537 gchar label2[] = "";
6538 GtkCTreeNode *parent;
6541 CTreePixmaps *pixmaps;
6543 pixmaps = get_ctree_pixmaps (ctree);
6548 d = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
6549 b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
6550 p = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin3));
6552 n = ((pow (b, d) - 1) / (b - 1)) * (p + 1);
6556 g_print ("%d total items? Try less\n",n);
6560 gtk_clist_freeze (GTK_CLIST (ctree));
6561 gtk_clist_clear (GTK_CLIST (ctree));
6566 parent = gtk_ctree_insert_node (ctree, NULL, NULL, text, 5, pixmaps->pixmap1,
6567 pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2, FALSE, TRUE);
6569 style = gtk_style_new ();
6570 style->base[GTK_STATE_NORMAL].red = 0;
6571 style->base[GTK_STATE_NORMAL].green = 45000;
6572 style->base[GTK_STATE_NORMAL].blue = 55000;
6573 gtk_ctree_node_set_row_data_full (ctree, parent, style,
6574 (GtkDestroyNotify) gtk_style_unref);
6576 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
6577 gtk_ctree_node_set_row_style (ctree, parent, style);
6579 build_recursive (ctree, 1, d, b, p, parent);
6580 gtk_clist_thaw (GTK_CLIST (ctree));
6581 after_press (ctree, NULL);
6585 ctree_click_column (GtkCTree *ctree, gint column, gpointer data)
6589 clist = GTK_CLIST (ctree);
6591 if (column == clist->sort_column)
6593 if (clist->sort_type == GTK_SORT_ASCENDING)
6594 clist->sort_type = GTK_SORT_DESCENDING;
6596 clist->sort_type = GTK_SORT_ASCENDING;
6599 gtk_clist_set_sort_column (clist, column);
6601 gtk_ctree_sort_recursive (ctree, NULL);
6604 void create_ctree (GtkWidget *widget)
6606 static GtkWidget *window = NULL;
6607 GtkTooltips *tooltips;
6609 GtkWidget *scrolled_win;
6622 char *title[] = { "Tree" , "Info" };
6625 static gchar *items1[] =
6633 static gchar *items2[] =
6641 static gchar *items3[] =
6649 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6650 gtk_window_set_screen (GTK_WINDOW (window),
6651 gtk_widget_get_screen (widget));
6653 g_signal_connect (window, "destroy",
6654 G_CALLBACK (gtk_widget_destroyed),
6657 gtk_window_set_title (GTK_WINDOW (window), "GtkCTree");
6658 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6660 tooltips = gtk_tooltips_new ();
6661 g_object_ref (tooltips);
6662 gtk_object_sink (GTK_OBJECT (tooltips));
6664 g_object_set_data_full (G_OBJECT (window), "tooltips", tooltips,
6667 vbox = gtk_vbox_new (FALSE, 0);
6668 gtk_container_add (GTK_CONTAINER (window), vbox);
6670 hbox = gtk_hbox_new (FALSE, 5);
6671 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6672 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6674 label = gtk_label_new ("Depth :");
6675 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6677 adj = (GtkAdjustment *) gtk_adjustment_new (4, 1, 10, 1, 5, 0);
6678 spin1 = gtk_spin_button_new (adj, 0, 0);
6679 gtk_box_pack_start (GTK_BOX (hbox), spin1, FALSE, TRUE, 5);
6681 label = gtk_label_new ("Books :");
6682 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6684 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
6685 spin2 = gtk_spin_button_new (adj, 0, 0);
6686 gtk_box_pack_start (GTK_BOX (hbox), spin2, FALSE, TRUE, 5);
6688 label = gtk_label_new ("Pages :");
6689 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6691 adj = (GtkAdjustment *) gtk_adjustment_new (5, 1, 20, 1, 5, 0);
6692 spin3 = gtk_spin_button_new (adj, 0, 0);
6693 gtk_box_pack_start (GTK_BOX (hbox), spin3, FALSE, TRUE, 5);
6695 button = gtk_button_new_with_label ("Close");
6696 gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6698 g_signal_connect_swapped (button, "clicked",
6699 G_CALLBACK (gtk_widget_destroy),
6702 button = gtk_button_new_with_label ("Rebuild Tree");
6703 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6705 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6706 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6707 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6708 GTK_POLICY_AUTOMATIC,
6710 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6712 ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
6713 gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (ctree));
6715 gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
6716 gtk_clist_set_column_width (GTK_CLIST (ctree), 1, 200);
6717 gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_EXTENDED);
6718 gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
6719 line_style = GTK_CTREE_LINES_DOTTED;
6721 g_signal_connect (button, "clicked",
6722 G_CALLBACK (rebuild_tree), ctree);
6723 g_signal_connect (ctree, "click_column",
6724 G_CALLBACK (ctree_click_column), NULL);
6726 g_signal_connect_after (ctree, "button_press_event",
6727 G_CALLBACK (after_press), NULL);
6728 g_signal_connect_after (ctree, "button_release_event",
6729 G_CALLBACK (after_press), NULL);
6730 g_signal_connect_after (ctree, "tree_move",
6731 G_CALLBACK (after_move), NULL);
6732 g_signal_connect_after (ctree, "end_selection",
6733 G_CALLBACK (after_press), NULL);
6734 g_signal_connect_after (ctree, "toggle_focus_row",
6735 G_CALLBACK (after_press), NULL);
6736 g_signal_connect_after (ctree, "select_all",
6737 G_CALLBACK (after_press), NULL);
6738 g_signal_connect_after (ctree, "unselect_all",
6739 G_CALLBACK (after_press), NULL);
6740 g_signal_connect_after (ctree, "scroll_vertical",
6741 G_CALLBACK (after_press), NULL);
6743 bbox = gtk_hbox_new (FALSE, 5);
6744 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
6745 gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, TRUE, 0);
6747 mbox = gtk_vbox_new (TRUE, 5);
6748 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
6750 label = gtk_label_new ("Row Height :");
6751 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
6753 label = gtk_label_new ("Indent :");
6754 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
6756 label = gtk_label_new ("Spacing :");
6757 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
6759 mbox = gtk_vbox_new (TRUE, 5);
6760 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
6762 adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0);
6763 spinner = gtk_spin_button_new (adj, 0, 0);
6764 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
6765 gtk_tooltips_set_tip (tooltips, spinner,
6766 "Row height of list items", NULL);
6767 g_signal_connect (adj, "value_changed",
6768 G_CALLBACK (change_row_height), ctree);
6769 gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value);
6771 adj = (GtkAdjustment *) gtk_adjustment_new (20, 0, 60, 1, 10, 0);
6772 spinner = gtk_spin_button_new (adj, 0, 0);
6773 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
6774 gtk_tooltips_set_tip (tooltips, spinner, "Tree Indentation.", NULL);
6775 g_signal_connect (adj, "value_changed",
6776 G_CALLBACK (change_indent), ctree);
6778 adj = (GtkAdjustment *) gtk_adjustment_new (5, 0, 60, 1, 10, 0);
6779 spinner = gtk_spin_button_new (adj, 0, 0);
6780 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
6781 gtk_tooltips_set_tip (tooltips, spinner, "Tree Spacing.", NULL);
6782 g_signal_connect (adj, "value_changed",
6783 G_CALLBACK (change_spacing), ctree);
6785 mbox = gtk_vbox_new (TRUE, 5);
6786 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
6788 hbox = gtk_hbox_new (FALSE, 5);
6789 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
6791 button = gtk_button_new_with_label ("Expand All");
6792 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6793 g_signal_connect (button, "clicked",
6794 G_CALLBACK (expand_all), ctree);
6796 button = gtk_button_new_with_label ("Collapse All");
6797 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6798 g_signal_connect (button, "clicked",
6799 G_CALLBACK (collapse_all), ctree);
6801 button = gtk_button_new_with_label ("Change Style");
6802 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6803 g_signal_connect (button, "clicked",
6804 G_CALLBACK (change_style), ctree);
6806 button = gtk_button_new_with_label ("Export Tree");
6807 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6808 g_signal_connect (button, "clicked",
6809 G_CALLBACK (export_ctree), ctree);
6811 hbox = gtk_hbox_new (FALSE, 5);
6812 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
6814 button = gtk_button_new_with_label ("Select All");
6815 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6816 g_signal_connect (button, "clicked",
6817 G_CALLBACK (select_all), ctree);
6819 button = gtk_button_new_with_label ("Unselect All");
6820 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6821 g_signal_connect (button, "clicked",
6822 G_CALLBACK (unselect_all), ctree);
6824 button = gtk_button_new_with_label ("Remove Selection");
6825 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6826 g_signal_connect (button, "clicked",
6827 G_CALLBACK (remove_selection), ctree);
6829 check = gtk_check_button_new_with_label ("Reorderable");
6830 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
6831 gtk_tooltips_set_tip (tooltips, check,
6832 "Tree items can be reordered by dragging.", NULL);
6833 g_signal_connect (check, "clicked",
6834 G_CALLBACK (toggle_reorderable), ctree);
6835 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
6837 hbox = gtk_hbox_new (TRUE, 5);
6838 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
6840 omenu1 = build_option_menu (items1, 4, 2,
6841 ctree_toggle_line_style,
6843 gtk_box_pack_start (GTK_BOX (hbox), omenu1, FALSE, TRUE, 0);
6844 gtk_tooltips_set_tip (tooltips, omenu1, "The tree's line style.", NULL);
6846 omenu2 = build_option_menu (items2, 4, 1,
6847 ctree_toggle_expander_style,
6849 gtk_box_pack_start (GTK_BOX (hbox), omenu2, FALSE, TRUE, 0);
6850 gtk_tooltips_set_tip (tooltips, omenu2, "The tree's expander style.",
6853 omenu3 = build_option_menu (items3, 2, 0,
6854 ctree_toggle_justify, ctree);
6855 gtk_box_pack_start (GTK_BOX (hbox), omenu3, FALSE, TRUE, 0);
6856 gtk_tooltips_set_tip (tooltips, omenu3, "The tree's justification.",
6859 omenu4 = build_option_menu (selection_mode_items, 3, 3,
6860 ctree_toggle_sel_mode, ctree);
6861 gtk_box_pack_start (GTK_BOX (hbox), omenu4, FALSE, TRUE, 0);
6862 gtk_tooltips_set_tip (tooltips, omenu4, "The list's selection mode.",
6865 gtk_widget_realize (window);
6867 gtk_widget_set_size_request (GTK_WIDGET (ctree), -1, 300);
6869 frame = gtk_frame_new (NULL);
6870 gtk_container_set_border_width (GTK_CONTAINER (frame), 0);
6871 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
6872 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
6874 hbox = gtk_hbox_new (TRUE, 2);
6875 gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
6876 gtk_container_add (GTK_CONTAINER (frame), hbox);
6878 frame = gtk_frame_new (NULL);
6879 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6880 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6882 hbox2 = gtk_hbox_new (FALSE, 0);
6883 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6884 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6886 label = gtk_label_new ("Books :");
6887 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6889 sprintf (buf, "%d", books);
6890 book_label = gtk_label_new (buf);
6891 gtk_box_pack_end (GTK_BOX (hbox2), book_label, FALSE, TRUE, 5);
6893 frame = gtk_frame_new (NULL);
6894 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6895 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6897 hbox2 = gtk_hbox_new (FALSE, 0);
6898 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6899 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6901 label = gtk_label_new ("Pages :");
6902 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6904 sprintf (buf, "%d", pages);
6905 page_label = gtk_label_new (buf);
6906 gtk_box_pack_end (GTK_BOX (hbox2), page_label, FALSE, TRUE, 5);
6908 frame = gtk_frame_new (NULL);
6909 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6910 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6912 hbox2 = gtk_hbox_new (FALSE, 0);
6913 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6914 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6916 label = gtk_label_new ("Selected :");
6917 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6919 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
6920 sel_label = gtk_label_new (buf);
6921 gtk_box_pack_end (GTK_BOX (hbox2), sel_label, FALSE, TRUE, 5);
6923 frame = gtk_frame_new (NULL);
6924 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6925 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6927 hbox2 = gtk_hbox_new (FALSE, 0);
6928 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6929 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6931 label = gtk_label_new ("Visible :");
6932 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6934 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
6935 vis_label = gtk_label_new (buf);
6936 gtk_box_pack_end (GTK_BOX (hbox2), vis_label, FALSE, TRUE, 5);
6938 rebuild_tree (NULL, ctree);
6941 if (!GTK_WIDGET_VISIBLE (window))
6942 gtk_widget_show_all (window);
6944 gtk_widget_destroy (window);
6952 color_selection_ok (GtkWidget *w,
6953 GtkColorSelectionDialog *cs)
6955 GtkColorSelection *colorsel;
6958 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6960 gtk_color_selection_get_color(colorsel,color);
6961 gtk_color_selection_set_color(colorsel,color);
6965 color_selection_changed (GtkWidget *w,
6966 GtkColorSelectionDialog *cs)
6968 GtkColorSelection *colorsel;
6971 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6972 gtk_color_selection_get_color(colorsel,color);
6976 opacity_toggled_cb (GtkWidget *w,
6977 GtkColorSelectionDialog *cs)
6979 GtkColorSelection *colorsel;
6981 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6982 gtk_color_selection_set_has_opacity_control (colorsel,
6983 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
6987 palette_toggled_cb (GtkWidget *w,
6988 GtkColorSelectionDialog *cs)
6990 GtkColorSelection *colorsel;
6992 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6993 gtk_color_selection_set_has_palette (colorsel,
6994 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
6998 create_color_selection (GtkWidget *widget)
7000 static GtkWidget *window = NULL;
7004 GtkWidget *options_hbox;
7005 GtkWidget *check_button;
7007 window = gtk_color_selection_dialog_new ("color selection dialog");
7008 gtk_window_set_screen (GTK_WINDOW (window),
7009 gtk_widget_get_screen (widget));
7011 gtk_widget_show (GTK_COLOR_SELECTION_DIALOG (window)->help_button);
7013 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
7015 g_signal_connect (window, "destroy",
7016 G_CALLBACK(gtk_widget_destroyed),
7019 options_hbox = gtk_hbox_new (FALSE, 0);
7020 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), options_hbox, FALSE, FALSE, 0);
7021 gtk_container_set_border_width (GTK_CONTAINER (options_hbox), 10);
7023 check_button = gtk_check_button_new_with_label ("Show Opacity");
7024 gtk_box_pack_start (GTK_BOX (options_hbox), check_button, FALSE, FALSE, 0);
7025 g_signal_connect (check_button, "toggled",
7026 G_CALLBACK (opacity_toggled_cb), window);
7028 check_button = gtk_check_button_new_with_label ("Show Palette");
7029 gtk_box_pack_end (GTK_BOX (options_hbox), check_button, FALSE, FALSE, 0);
7030 g_signal_connect (check_button, "toggled",
7031 G_CALLBACK (palette_toggled_cb), window);
7033 g_signal_connect (GTK_COLOR_SELECTION_DIALOG (window)->colorsel,
7035 G_CALLBACK (color_selection_changed),
7038 g_signal_connect (GTK_COLOR_SELECTION_DIALOG (window)->ok_button,
7040 G_CALLBACK (color_selection_ok),
7043 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (window)->cancel_button,
7045 G_CALLBACK (gtk_widget_destroy),
7049 if (!GTK_WIDGET_VISIBLE (window))
7050 gtk_widget_show_all (window);
7052 gtk_widget_destroy (window);
7060 show_fileops (GtkWidget *widget,
7061 GtkFileSelection *fs)
7065 show_ops = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7068 gtk_file_selection_show_fileop_buttons (fs);
7070 gtk_file_selection_hide_fileop_buttons (fs);
7074 select_multiple (GtkWidget *widget,
7075 GtkFileSelection *fs)
7077 gboolean select_multiple;
7079 select_multiple = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7080 gtk_file_selection_set_select_multiple (fs, select_multiple);
7084 file_selection_ok (GtkFileSelection *fs)
7089 selections = gtk_file_selection_get_selections (fs);
7091 for (i = 0; selections[i] != NULL; i++)
7092 g_print ("%s\n", selections[i]);
7094 g_strfreev (selections);
7096 gtk_widget_destroy (GTK_WIDGET (fs));
7100 create_file_selection (GtkWidget *widget)
7102 static GtkWidget *window = NULL;
7107 window = gtk_file_selection_new ("file selection dialog");
7108 gtk_window_set_screen (GTK_WINDOW (window),
7109 gtk_widget_get_screen (widget));
7111 gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window));
7113 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
7115 g_signal_connect (window, "destroy",
7116 G_CALLBACK (gtk_widget_destroyed),
7119 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->ok_button,
7121 G_CALLBACK (file_selection_ok),
7123 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->cancel_button,
7125 G_CALLBACK (gtk_widget_destroy),
7128 button = gtk_check_button_new_with_label ("Show Fileops");
7129 g_signal_connect (button, "toggled",
7130 G_CALLBACK (show_fileops),
7132 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
7133 button, FALSE, FALSE, 0);
7134 gtk_widget_show (button);
7136 button = gtk_check_button_new_with_label ("Select Multiple");
7137 g_signal_connect (button, "clicked",
7138 G_CALLBACK (select_multiple),
7140 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
7141 button, FALSE, FALSE, 0);
7142 gtk_widget_show (button);
7145 if (!GTK_WIDGET_VISIBLE (window))
7146 gtk_widget_show (window);
7148 gtk_widget_destroy (window);
7152 flipping_toggled_cb (GtkWidget *widget, gpointer data)
7154 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7155 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
7157 gtk_widget_set_default_direction (new_direction);
7161 set_direction_recurse (GtkWidget *widget,
7164 GtkTextDirection *dir = data;
7166 gtk_widget_set_direction (widget, *dir);
7167 if (GTK_IS_CONTAINER (widget))
7168 gtk_container_foreach (GTK_CONTAINER (widget),
7169 set_direction_recurse,
7174 create_forward_back (const char *title,
7175 GtkTextDirection text_dir)
7177 GtkWidget *frame = gtk_frame_new (title);
7178 GtkWidget *bbox = gtk_hbutton_box_new ();
7179 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
7180 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
7182 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
7184 gtk_container_add (GTK_CONTAINER (frame), bbox);
7185 gtk_container_add (GTK_CONTAINER (bbox), back_button);
7186 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
7188 set_direction_recurse (frame, &text_dir);
7194 create_flipping (GtkWidget *widget)
7196 static GtkWidget *window = NULL;
7197 GtkWidget *check_button, *button;
7201 window = gtk_dialog_new ();
7203 gtk_window_set_screen (GTK_WINDOW (window),
7204 gtk_widget_get_screen (widget));
7206 g_signal_connect (window, "destroy",
7207 G_CALLBACK (gtk_widget_destroyed),
7210 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
7212 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
7213 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7214 check_button, TRUE, TRUE, 0);
7216 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7217 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
7220 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7221 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
7224 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7225 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
7228 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
7229 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
7231 g_signal_connect (check_button, "toggled",
7232 G_CALLBACK (flipping_toggled_cb), FALSE);
7234 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
7236 button = gtk_button_new_with_label ("Close");
7237 g_signal_connect_swapped (button, "clicked",
7238 G_CALLBACK (gtk_widget_destroy), window);
7239 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
7240 button, TRUE, TRUE, 0);
7243 if (!GTK_WIDGET_VISIBLE (window))
7244 gtk_widget_show_all (window);
7246 gtk_widget_destroy (window);
7254 make_focus_table (GList **list)
7259 table = gtk_table_new (5, 5, FALSE);
7272 widget = gtk_entry_new ();
7274 widget = gtk_button_new_with_label ("Foo");
7276 *list = g_list_prepend (*list, widget);
7278 gtk_table_attach (GTK_TABLE (table),
7282 GTK_EXPAND | GTK_FILL,
7283 GTK_EXPAND | GTK_FILL,
7292 *list = g_list_reverse (*list);
7298 create_focus (GtkWidget *widget)
7300 static GtkWidget *window = NULL;
7308 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
7314 gtk_window_set_screen (GTK_WINDOW (window),
7315 gtk_widget_get_screen (widget));
7317 g_signal_connect (window, "destroy",
7318 G_CALLBACK (gtk_widget_destroyed),
7321 g_signal_connect (window, "response",
7322 G_CALLBACK (gtk_widget_destroy),
7325 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
7327 frame = gtk_frame_new ("Weird tab focus chain");
7329 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7330 frame, TRUE, TRUE, 0);
7332 table = make_focus_table (&list);
7334 gtk_container_add (GTK_CONTAINER (frame), table);
7336 gtk_container_set_focus_chain (GTK_CONTAINER (table),
7341 frame = gtk_frame_new ("Default tab focus chain");
7343 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7344 frame, TRUE, TRUE, 0);
7347 table = make_focus_table (&list);
7351 gtk_container_add (GTK_CONTAINER (frame), table);
7354 if (!GTK_WIDGET_VISIBLE (window))
7355 gtk_widget_show_all (window);
7357 gtk_widget_destroy (window);
7365 font_selection_ok (GtkWidget *w,
7366 GtkFontSelectionDialog *fs)
7368 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
7370 g_print ("%s\n", s);
7372 gtk_widget_destroy (GTK_WIDGET (fs));
7376 create_font_selection (GtkWidget *widget)
7378 static GtkWidget *window = NULL;
7382 window = gtk_font_selection_dialog_new ("Font Selection Dialog");
7384 gtk_window_set_screen (GTK_WINDOW (window),
7385 gtk_widget_get_screen (widget));
7387 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
7389 g_signal_connect (window, "destroy",
7390 G_CALLBACK (gtk_widget_destroyed),
7393 g_signal_connect (GTK_FONT_SELECTION_DIALOG (window)->ok_button,
7394 "clicked", G_CALLBACK (font_selection_ok),
7395 GTK_FONT_SELECTION_DIALOG (window));
7396 g_signal_connect_swapped (GTK_FONT_SELECTION_DIALOG (window)->cancel_button,
7397 "clicked", G_CALLBACK (gtk_widget_destroy),
7401 if (!GTK_WIDGET_VISIBLE (window))
7402 gtk_widget_show (window);
7404 gtk_widget_destroy (window);
7411 static GtkWidget *dialog_window = NULL;
7414 label_toggle (GtkWidget *widget,
7419 *label = gtk_label_new ("Dialog Test");
7420 g_signal_connect (*label,
7422 G_CALLBACK (gtk_widget_destroyed),
7424 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
7425 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
7426 *label, TRUE, TRUE, 0);
7427 gtk_widget_show (*label);
7430 gtk_widget_destroy (*label);
7433 #define RESPONSE_TOGGLE_SEPARATOR 1
7436 print_response (GtkWidget *dialog,
7440 g_print ("response signal received (%d)\n", response_id);
7442 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
7444 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
7445 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
7450 create_dialog (GtkWidget *widget)
7452 static GtkWidget *label;
7457 /* This is a terrible example; it's much simpler to create
7458 * dialogs than this. Don't use testgtk for example code,
7462 dialog_window = gtk_dialog_new ();
7463 gtk_window_set_screen (GTK_WINDOW (dialog_window),
7464 gtk_widget_get_screen (widget));
7466 g_signal_connect (dialog_window,
7468 G_CALLBACK (print_response),
7471 g_signal_connect (dialog_window, "destroy",
7472 G_CALLBACK (gtk_widget_destroyed),
7475 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
7476 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
7478 button = gtk_button_new_with_label ("OK");
7479 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7480 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7481 button, TRUE, TRUE, 0);
7482 gtk_widget_grab_default (button);
7483 gtk_widget_show (button);
7485 button = gtk_button_new_with_label ("Toggle");
7486 g_signal_connect (button, "clicked",
7487 G_CALLBACK (label_toggle),
7489 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7490 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7491 button, TRUE, TRUE, 0);
7492 gtk_widget_show (button);
7496 button = gtk_button_new_with_label ("Separator");
7498 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7500 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
7502 RESPONSE_TOGGLE_SEPARATOR);
7503 gtk_widget_show (button);
7506 if (!GTK_WIDGET_VISIBLE (dialog_window))
7507 gtk_widget_show (dialog_window);
7509 gtk_widget_destroy (dialog_window);
7512 /* Display & Screen test
7518 GtkWidget *radio_dpy;
7519 GtkWidget *toplevel;
7520 GtkWidget *dialog_window;
7521 GList *valid_display_list;
7522 } ScreenDisplaySelection;
7525 display_name_cmp (gconstpointer a,
7528 return g_ascii_strcasecmp (a,b);
7532 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
7535 GdkDisplay *display = gtk_widget_get_display (widget);
7537 GdkScreen *new_screen = NULL;
7538 GdkScreen *current_screen = gtk_widget_get_screen (widget);
7540 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
7542 display_name = g_strdup (gtk_entry_get_text (data->entry));
7543 display = gdk_display_open (display_name);
7547 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
7548 GTK_DIALOG_DESTROY_WITH_PARENT,
7551 "The display :\n%s\ncannot be opened",
7553 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
7554 gtk_widget_show (dialog);
7555 g_signal_connect (dialog, "response",
7556 G_CALLBACK (gtk_widget_destroy),
7561 if (!g_list_find_custom (data->valid_display_list,
7564 data->valid_display_list = g_list_append (data->valid_display_list,
7567 new_screen = gdk_display_get_default_screen (display);
7572 gint number_of_screens = gdk_display_get_n_screens (display);
7573 gint screen_num = gdk_screen_get_number (current_screen);
7574 if ((screen_num +1) < number_of_screens)
7575 new_screen = gdk_display_get_screen (display, screen_num + 1);
7577 new_screen = gdk_display_get_screen (display, 0);
7582 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
7583 gtk_widget_destroy (data->dialog_window);
7588 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
7590 gtk_widget_destroy (data);
7594 create_display_screen (GtkWidget *widget)
7596 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
7597 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
7599 ScreenDisplaySelection *scr_dpy_data;
7600 GdkScreen *screen = gtk_widget_get_screen (widget);
7601 static GList *valid_display_list = NULL;
7603 GdkDisplay *display = gdk_screen_get_display (screen);
7605 window = gtk_widget_new (gtk_window_get_type (),
7608 "type", GTK_WINDOW_TOPLEVEL,
7610 "Screen or Display selection",
7611 "border_width", 10, NULL);
7612 g_signal_connect (window, "destroy",
7613 G_CALLBACK (gtk_widget_destroy), NULL);
7615 vbox = gtk_vbox_new (FALSE, 3);
7616 gtk_container_add (GTK_CONTAINER (window), vbox);
7618 frame = gtk_frame_new ("Select screen or display");
7619 gtk_container_add (GTK_CONTAINER (vbox), frame);
7621 table = gtk_table_new (2, 2, TRUE);
7622 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
7623 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
7625 gtk_container_add (GTK_CONTAINER (frame), table);
7627 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
7628 if (gdk_display_get_n_screens(display) > 1)
7629 radio_scr = gtk_radio_button_new_with_label
7630 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
7633 radio_scr = gtk_radio_button_new_with_label
7634 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
7635 "only one screen on the current display");
7636 gtk_widget_set_sensitive (radio_scr, FALSE);
7638 combo_dpy = gtk_combo_new ();
7639 if (!valid_display_list)
7640 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
7642 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
7644 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
7645 "<hostname>:<X Server Num>.<Screen Num>");
7647 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
7648 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
7649 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
7651 bbox = gtk_hbutton_box_new ();
7652 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
7653 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
7655 gtk_container_add (GTK_CONTAINER (vbox), bbox);
7657 gtk_container_add (GTK_CONTAINER (bbox), applyb);
7658 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
7660 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
7662 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
7663 scr_dpy_data->radio_dpy = radio_dpy;
7664 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
7665 scr_dpy_data->dialog_window = window;
7666 scr_dpy_data->valid_display_list = valid_display_list;
7668 g_signal_connect (cancelb, "clicked",
7669 G_CALLBACK (screen_display_destroy_diag), window);
7670 g_signal_connect (applyb, "clicked",
7671 G_CALLBACK (screen_display_check), scr_dpy_data);
7672 gtk_widget_show_all (window);
7677 static gboolean event_watcher_enter_id = 0;
7678 static gboolean event_watcher_leave_id = 0;
7681 event_watcher (GSignalInvocationHint *ihint,
7682 guint n_param_values,
7683 const GValue *param_values,
7686 g_print ("Watch: \"%s\" emitted for %s\n",
7687 g_signal_name (ihint->signal_id),
7688 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
7694 event_watcher_down (void)
7696 if (event_watcher_enter_id)
7700 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7701 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
7702 event_watcher_enter_id = 0;
7703 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7704 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
7705 event_watcher_leave_id = 0;
7710 event_watcher_toggle (void)
7712 if (event_watcher_enter_id)
7713 event_watcher_down ();
7718 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7719 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7720 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7721 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7726 create_event_watcher (GtkWidget *widget)
7732 dialog_window = gtk_dialog_new ();
7733 gtk_window_set_screen (GTK_WINDOW (dialog_window),
7734 gtk_widget_get_screen (widget));
7736 g_signal_connect (dialog_window, "destroy",
7737 G_CALLBACK (gtk_widget_destroyed),
7739 g_signal_connect (dialog_window, "destroy",
7740 G_CALLBACK (event_watcher_down),
7743 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
7744 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
7745 gtk_widget_set_size_request (dialog_window, 200, 110);
7747 button = gtk_toggle_button_new_with_label ("Activate Watch");
7748 g_signal_connect (button, "clicked",
7749 G_CALLBACK (event_watcher_toggle),
7751 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
7752 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
7753 button, TRUE, TRUE, 0);
7754 gtk_widget_show (button);
7756 button = gtk_button_new_with_label ("Close");
7757 g_signal_connect_swapped (button, "clicked",
7758 G_CALLBACK (gtk_widget_destroy),
7760 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7761 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7762 button, TRUE, TRUE, 0);
7763 gtk_widget_grab_default (button);
7764 gtk_widget_show (button);
7767 if (!GTK_WIDGET_VISIBLE (dialog_window))
7768 gtk_widget_show (dialog_window);
7770 gtk_widget_destroy (dialog_window);
7778 reformat_value (GtkScale *scale,
7781 return g_strdup_printf ("-->%0.*g<--",
7782 gtk_scale_get_digits (scale), value);
7786 create_range_controls (GtkWidget *widget)
7788 static GtkWidget *window = NULL;
7792 GtkWidget *scrollbar;
7794 GtkWidget *separator;
7795 GtkObject *adjustment;
7800 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7802 gtk_window_set_screen (GTK_WINDOW (window),
7803 gtk_widget_get_screen (widget));
7805 g_signal_connect (window, "destroy",
7806 G_CALLBACK (gtk_widget_destroyed),
7809 gtk_window_set_title (GTK_WINDOW (window), "range controls");
7810 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7813 box1 = gtk_vbox_new (FALSE, 0);
7814 gtk_container_add (GTK_CONTAINER (window), box1);
7815 gtk_widget_show (box1);
7818 box2 = gtk_vbox_new (FALSE, 10);
7819 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7820 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
7821 gtk_widget_show (box2);
7824 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
7826 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7827 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
7828 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
7829 gtk_scale_set_digits (GTK_SCALE (scale), 1);
7830 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7831 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7832 gtk_widget_show (scale);
7834 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
7835 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
7836 GTK_UPDATE_CONTINUOUS);
7837 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
7838 gtk_widget_show (scrollbar);
7840 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7841 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7842 g_signal_connect (scale,
7844 G_CALLBACK (reformat_value),
7846 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7847 gtk_widget_show (scale);
7849 hbox = gtk_hbox_new (FALSE, 0);
7851 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7852 gtk_widget_set_size_request (scale, -1, 200);
7853 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7854 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7855 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7856 gtk_widget_show (scale);
7858 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7859 gtk_widget_set_size_request (scale, -1, 200);
7860 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7861 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7862 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
7863 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7864 gtk_widget_show (scale);
7866 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7867 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7868 g_signal_connect (scale,
7870 G_CALLBACK (reformat_value),
7872 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7873 gtk_widget_show (scale);
7876 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
7877 gtk_widget_show (hbox);
7879 separator = gtk_hseparator_new ();
7880 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7881 gtk_widget_show (separator);
7884 box2 = gtk_vbox_new (FALSE, 10);
7885 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7886 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7887 gtk_widget_show (box2);
7890 button = gtk_button_new_with_label ("close");
7891 g_signal_connect_swapped (button, "clicked",
7892 G_CALLBACK (gtk_widget_destroy),
7894 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7895 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7896 gtk_widget_grab_default (button);
7897 gtk_widget_show (button);
7900 if (!GTK_WIDGET_VISIBLE (window))
7901 gtk_widget_show (window);
7903 gtk_widget_destroy (window);
7911 create_rulers (GtkWidget *widget)
7913 static GtkWidget *window = NULL;
7919 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7921 gtk_window_set_screen (GTK_WINDOW (window),
7922 gtk_widget_get_screen (widget));
7924 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
7926 g_signal_connect (window, "destroy",
7927 G_CALLBACK (gtk_widget_destroyed),
7930 gtk_window_set_title (GTK_WINDOW (window), "rulers");
7931 gtk_widget_set_size_request (window, 300, 300);
7932 gtk_widget_set_events (window,
7933 GDK_POINTER_MOTION_MASK
7934 | GDK_POINTER_MOTION_HINT_MASK);
7935 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7937 table = gtk_table_new (2, 2, FALSE);
7938 gtk_container_add (GTK_CONTAINER (window), table);
7939 gtk_widget_show (table);
7941 ruler = gtk_hruler_new ();
7942 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
7943 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
7945 g_signal_connect_swapped (window,
7946 "motion_notify_event",
7947 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7950 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
7951 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
7952 gtk_widget_show (ruler);
7955 ruler = gtk_vruler_new ();
7956 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
7958 g_signal_connect_swapped (window,
7959 "motion_notify_event",
7960 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7963 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
7964 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
7965 gtk_widget_show (ruler);
7968 if (!GTK_WIDGET_VISIBLE (window))
7969 gtk_widget_show (window);
7971 gtk_widget_destroy (window);
7975 text_toggle_editable (GtkWidget *checkbutton,
7978 gtk_text_set_editable(GTK_TEXT(text),
7979 GTK_TOGGLE_BUTTON(checkbutton)->active);
7983 text_toggle_word_wrap (GtkWidget *checkbutton,
7986 gtk_text_set_word_wrap(GTK_TEXT(text),
7987 GTK_TOGGLE_BUTTON(checkbutton)->active);
7994 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
7995 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
7996 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
7997 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
7998 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
7999 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
8000 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
8001 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
8004 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
8010 text_insert_random (GtkWidget *w, GtkText *text)
8014 for (i=0; i<10; i++)
8016 c = 'A' + rand() % ('Z' - 'A');
8017 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
8018 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
8023 create_text (GtkWidget *widget)
8027 static GtkWidget *window = NULL;
8033 GtkWidget *separator;
8034 GtkWidget *scrolled_window;
8041 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8042 gtk_window_set_screen (GTK_WINDOW (window),
8043 gtk_widget_get_screen (widget));
8045 gtk_widget_set_name (window, "text window");
8046 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
8047 gtk_widget_set_size_request (window, 500, 500);
8049 g_signal_connect (window, "destroy",
8050 G_CALLBACK (gtk_widget_destroyed),
8053 gtk_window_set_title (GTK_WINDOW (window), "test");
8054 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8057 box1 = gtk_vbox_new (FALSE, 0);
8058 gtk_container_add (GTK_CONTAINER (window), box1);
8059 gtk_widget_show (box1);
8062 box2 = gtk_vbox_new (FALSE, 10);
8063 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8064 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
8065 gtk_widget_show (box2);
8068 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
8069 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
8070 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
8073 gtk_widget_show (scrolled_window);
8075 text = gtk_text_new (NULL, NULL);
8076 gtk_text_set_editable (GTK_TEXT (text), TRUE);
8077 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
8078 gtk_widget_grab_focus (text);
8079 gtk_widget_show (text);
8082 gtk_text_freeze (GTK_TEXT (text));
8084 for (i=0; i<ntext_colors; i++)
8086 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
8087 text_colors[i].name, -1);
8088 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
8090 for (j=0; j<ntext_colors; j++)
8092 gtk_text_insert (GTK_TEXT (text), NULL,
8093 &text_colors[j].color, &text_colors[i].color,
8096 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
8099 infile = fopen("testgtk.c", "r");
8104 int nbytes_read, nbytes_alloc;
8107 nbytes_alloc = 1024;
8108 buffer = g_new (char, nbytes_alloc);
8112 if (nbytes_alloc < nbytes_read + 1024)
8115 buffer = g_realloc (buffer, nbytes_alloc);
8117 len = fread (buffer + nbytes_read, 1, 1024, infile);
8123 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
8124 NULL, buffer, nbytes_read);
8129 gtk_text_thaw (GTK_TEXT (text));
8131 hbox = gtk_hbutton_box_new ();
8132 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
8133 gtk_widget_show (hbox);
8135 check = gtk_check_button_new_with_label("Editable");
8136 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
8137 g_signal_connect (check, "toggled",
8138 G_CALLBACK (text_toggle_editable), text);
8139 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
8140 gtk_widget_show (check);
8142 check = gtk_check_button_new_with_label("Wrap Words");
8143 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
8144 g_signal_connect (check, "toggled",
8145 G_CALLBACK (text_toggle_word_wrap), text);
8146 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
8147 gtk_widget_show (check);
8149 separator = gtk_hseparator_new ();
8150 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
8151 gtk_widget_show (separator);
8154 box2 = gtk_vbox_new (FALSE, 10);
8155 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8156 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8157 gtk_widget_show (box2);
8160 button = gtk_button_new_with_label ("insert random");
8161 g_signal_connect (button, "clicked",
8162 G_CALLBACK (text_insert_random),
8164 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8165 gtk_widget_show (button);
8167 button = gtk_button_new_with_label ("close");
8168 g_signal_connect_swapped (button, "clicked",
8169 G_CALLBACK (gtk_widget_destroy),
8171 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8172 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8173 gtk_widget_grab_default (button);
8174 gtk_widget_show (button);
8177 if (!GTK_WIDGET_VISIBLE (window))
8178 gtk_widget_show (window);
8180 gtk_widget_destroy (window);
8187 GdkPixbuf *book_open;
8188 GdkPixbuf *book_closed;
8189 GtkWidget *sample_notebook;
8192 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
8194 GtkWidget *page_widget;
8197 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
8199 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
8200 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
8202 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
8203 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
8207 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
8209 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
8210 gint old_page_num = gtk_notebook_get_current_page (notebook);
8212 if (page_num == old_page_num)
8215 set_page_image (notebook, page_num, book_open);
8217 if (old_page_num != -1)
8218 set_page_image (notebook, old_page_num, book_closed);
8222 tab_fill (GtkToggleButton *button, GtkWidget *child)
8225 GtkPackType pack_type;
8227 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8228 &expand, NULL, &pack_type);
8229 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8230 expand, button->active, pack_type);
8234 tab_expand (GtkToggleButton *button, GtkWidget *child)
8237 GtkPackType pack_type;
8239 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8240 NULL, &fill, &pack_type);
8241 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8242 button->active, fill, pack_type);
8246 tab_pack (GtkToggleButton *button, GtkWidget *child)
8252 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8253 &expand, &fill, NULL);
8254 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8255 expand, fill, button->active);
8259 create_pages (GtkNotebook *notebook, gint start, gint end)
8261 GtkWidget *child = NULL;
8266 GtkWidget *label_box;
8267 GtkWidget *menu_box;
8271 char accel_buffer[32];
8273 for (i = start; i <= end; i++)
8275 sprintf (buffer, "Page %d", i);
8276 sprintf (accel_buffer, "Page _%d", i);
8278 child = gtk_frame_new (buffer);
8279 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
8281 vbox = gtk_vbox_new (TRUE,0);
8282 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8283 gtk_container_add (GTK_CONTAINER (child), vbox);
8285 hbox = gtk_hbox_new (TRUE,0);
8286 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
8288 button = gtk_check_button_new_with_label ("Fill Tab");
8289 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8290 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8291 g_signal_connect (button, "toggled",
8292 G_CALLBACK (tab_fill), child);
8294 button = gtk_check_button_new_with_label ("Expand Tab");
8295 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8296 g_signal_connect (button, "toggled",
8297 G_CALLBACK (tab_expand), child);
8299 button = gtk_check_button_new_with_label ("Pack end");
8300 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8301 g_signal_connect (button, "toggled",
8302 G_CALLBACK (tab_pack), child);
8304 button = gtk_button_new_with_label ("Hide Page");
8305 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
8306 g_signal_connect_swapped (button, "clicked",
8307 G_CALLBACK (gtk_widget_hide),
8310 gtk_widget_show_all (child);
8312 label_box = gtk_hbox_new (FALSE, 0);
8313 pixwid = gtk_image_new_from_pixbuf (book_closed);
8314 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
8316 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
8317 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
8318 label = gtk_label_new_with_mnemonic (accel_buffer);
8319 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
8320 gtk_widget_show_all (label_box);
8323 menu_box = gtk_hbox_new (FALSE, 0);
8324 pixwid = gtk_image_new_from_pixbuf (book_closed);
8325 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
8327 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
8328 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
8329 label = gtk_label_new (buffer);
8330 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
8331 gtk_widget_show_all (menu_box);
8333 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
8338 rotate_notebook (GtkButton *button,
8339 GtkNotebook *notebook)
8341 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
8345 show_all_pages (GtkButton *button,
8346 GtkNotebook *notebook)
8348 gtk_container_foreach (GTK_CONTAINER (notebook),
8349 (GtkCallback) gtk_widget_show, NULL);
8353 notebook_type_changed (GtkWidget *optionmenu,
8356 GtkNotebook *notebook;
8366 notebook = GTK_NOTEBOOK (data);
8368 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
8373 /* standard notebook */
8374 gtk_notebook_set_show_tabs (notebook, TRUE);
8375 gtk_notebook_set_show_border (notebook, TRUE);
8376 gtk_notebook_set_scrollable (notebook, FALSE);
8380 /* notabs notebook */
8381 gtk_notebook_set_show_tabs (notebook, FALSE);
8382 gtk_notebook_set_show_border (notebook, TRUE);
8387 gtk_notebook_set_show_tabs (notebook, FALSE);
8388 gtk_notebook_set_show_border (notebook, FALSE);
8393 gtk_notebook_set_show_tabs (notebook, TRUE);
8394 gtk_notebook_set_show_border (notebook, TRUE);
8395 gtk_notebook_set_scrollable (notebook, TRUE);
8396 if (g_list_length (notebook->children) == 5)
8397 create_pages (notebook, 6, 15);
8403 if (g_list_length (notebook->children) == 15)
8404 for (i = 0; i < 10; i++)
8405 gtk_notebook_remove_page (notebook, 5);
8409 notebook_popup (GtkToggleButton *button,
8410 GtkNotebook *notebook)
8413 gtk_notebook_popup_enable (notebook);
8415 gtk_notebook_popup_disable (notebook);
8419 notebook_homogeneous (GtkToggleButton *button,
8420 GtkNotebook *notebook)
8422 g_object_set (G_OBJECT (notebook), "homogeneous", button->active, NULL);
8426 create_notebook (GtkWidget *widget)
8428 static GtkWidget *window = NULL;
8432 GtkWidget *separator;
8436 static gchar *items[] =
8446 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8447 gtk_window_set_screen (GTK_WINDOW (window),
8448 gtk_widget_get_screen (widget));
8450 g_signal_connect (window, "destroy",
8451 G_CALLBACK (gtk_widget_destroyed),
8454 gtk_window_set_title (GTK_WINDOW (window), "notebook");
8455 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8457 box1 = gtk_vbox_new (FALSE, 0);
8458 gtk_container_add (GTK_CONTAINER (window), box1);
8460 sample_notebook = gtk_notebook_new ();
8461 g_signal_connect (sample_notebook, "switch_page",
8462 G_CALLBACK (page_switch), NULL);
8463 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
8464 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
8465 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
8467 gtk_widget_realize (sample_notebook);
8470 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
8473 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
8475 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
8477 separator = gtk_hseparator_new ();
8478 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
8480 box2 = gtk_hbox_new (FALSE, 5);
8481 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8482 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8484 button = gtk_check_button_new_with_label ("popup menu");
8485 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
8486 g_signal_connect (button, "clicked",
8487 G_CALLBACK (notebook_popup),
8490 button = gtk_check_button_new_with_label ("homogeneous tabs");
8491 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
8492 g_signal_connect (button, "clicked",
8493 G_CALLBACK (notebook_homogeneous),
8496 box2 = gtk_hbox_new (FALSE, 5);
8497 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8498 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8500 label = gtk_label_new ("Notebook Style :");
8501 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
8503 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
8504 notebook_type_changed,
8506 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
8508 button = gtk_button_new_with_label ("Show all Pages");
8509 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
8510 g_signal_connect (button, "clicked",
8511 G_CALLBACK (show_all_pages), sample_notebook);
8513 box2 = gtk_hbox_new (TRUE, 10);
8514 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8515 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8517 button = gtk_button_new_with_label ("prev");
8518 g_signal_connect_swapped (button, "clicked",
8519 G_CALLBACK (gtk_notebook_prev_page),
8521 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8523 button = gtk_button_new_with_label ("next");
8524 g_signal_connect_swapped (button, "clicked",
8525 G_CALLBACK (gtk_notebook_next_page),
8527 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8529 button = gtk_button_new_with_label ("rotate");
8530 g_signal_connect (button, "clicked",
8531 G_CALLBACK (rotate_notebook), sample_notebook);
8532 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8534 separator = gtk_hseparator_new ();
8535 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
8537 button = gtk_button_new_with_label ("close");
8538 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
8539 g_signal_connect_swapped (button, "clicked",
8540 G_CALLBACK (gtk_widget_destroy),
8542 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
8543 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8544 gtk_widget_grab_default (button);
8547 if (!GTK_WIDGET_VISIBLE (window))
8548 gtk_widget_show_all (window);
8550 gtk_widget_destroy (window);
8558 toggle_resize (GtkWidget *widget, GtkWidget *child)
8560 GtkPaned *paned = GTK_PANED (child->parent);
8561 gboolean is_child1 = (child == paned->child1);
8562 gboolean resize, shrink;
8564 resize = is_child1 ? paned->child1_resize : paned->child2_resize;
8565 shrink = is_child1 ? paned->child1_shrink : paned->child2_shrink;
8567 gtk_widget_ref (child);
8568 gtk_container_remove (GTK_CONTAINER (child->parent), child);
8570 gtk_paned_pack1 (paned, child, !resize, shrink);
8572 gtk_paned_pack2 (paned, child, !resize, shrink);
8573 gtk_widget_unref (child);
8577 toggle_shrink (GtkWidget *widget, GtkWidget *child)
8579 GtkPaned *paned = GTK_PANED (child->parent);
8580 gboolean is_child1 = (child == paned->child1);
8581 gboolean resize, shrink;
8583 resize = is_child1 ? paned->child1_resize : paned->child2_resize;
8584 shrink = is_child1 ? paned->child1_shrink : paned->child2_shrink;
8586 gtk_widget_ref (child);
8587 gtk_container_remove (GTK_CONTAINER (child->parent), child);
8589 gtk_paned_pack1 (paned, child, resize, !shrink);
8591 gtk_paned_pack2 (paned, child, resize, !shrink);
8592 gtk_widget_unref (child);
8596 paned_props_clicked (GtkWidget *button,
8599 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
8601 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
8605 create_pane_options (GtkPaned *paned,
8606 const gchar *frame_label,
8607 const gchar *label1,
8608 const gchar *label2)
8614 GtkWidget *check_button;
8616 frame = gtk_frame_new (frame_label);
8617 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
8619 table = gtk_table_new (4, 2, 4);
8620 gtk_container_add (GTK_CONTAINER (frame), table);
8622 label = gtk_label_new (label1);
8623 gtk_table_attach_defaults (GTK_TABLE (table), label,
8626 check_button = gtk_check_button_new_with_label ("Resize");
8627 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8629 g_signal_connect (check_button, "toggled",
8630 G_CALLBACK (toggle_resize),
8633 check_button = gtk_check_button_new_with_label ("Shrink");
8634 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8636 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8638 g_signal_connect (check_button, "toggled",
8639 G_CALLBACK (toggle_shrink),
8642 label = gtk_label_new (label2);
8643 gtk_table_attach_defaults (GTK_TABLE (table), label,
8646 check_button = gtk_check_button_new_with_label ("Resize");
8647 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8649 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8651 g_signal_connect (check_button, "toggled",
8652 G_CALLBACK (toggle_resize),
8655 check_button = gtk_check_button_new_with_label ("Shrink");
8656 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8658 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8660 g_signal_connect (check_button, "toggled",
8661 G_CALLBACK (toggle_shrink),
8664 button = gtk_button_new_with_mnemonic ("_Properties");
8665 gtk_table_attach_defaults (GTK_TABLE (table), button,
8667 g_signal_connect (button, "clicked",
8668 G_CALLBACK (paned_props_clicked),
8675 create_panes (GtkWidget *widget)
8677 static GtkWidget *window = NULL;
8686 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8688 gtk_window_set_screen (GTK_WINDOW (window),
8689 gtk_widget_get_screen (widget));
8691 g_signal_connect (window, "destroy",
8692 G_CALLBACK (gtk_widget_destroyed),
8695 gtk_window_set_title (GTK_WINDOW (window), "Panes");
8696 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8698 vbox = gtk_vbox_new (FALSE, 0);
8699 gtk_container_add (GTK_CONTAINER (window), vbox);
8701 vpaned = gtk_vpaned_new ();
8702 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
8703 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
8705 hpaned = gtk_hpaned_new ();
8706 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
8708 frame = gtk_frame_new (NULL);
8709 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8710 gtk_widget_set_size_request (frame, 60, 60);
8711 gtk_paned_add1 (GTK_PANED (hpaned), frame);
8713 button = gtk_button_new_with_label ("Hi there");
8714 gtk_container_add (GTK_CONTAINER(frame), button);
8716 frame = gtk_frame_new (NULL);
8717 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8718 gtk_widget_set_size_request (frame, 80, 60);
8719 gtk_paned_add2 (GTK_PANED (hpaned), frame);
8721 frame = gtk_frame_new (NULL);
8722 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8723 gtk_widget_set_size_request (frame, 60, 80);
8724 gtk_paned_add2 (GTK_PANED (vpaned), frame);
8726 /* Now create toggle buttons to control sizing */
8728 gtk_box_pack_start (GTK_BOX (vbox),
8729 create_pane_options (GTK_PANED (hpaned),
8735 gtk_box_pack_start (GTK_BOX (vbox),
8736 create_pane_options (GTK_PANED (vpaned),
8742 gtk_widget_show_all (vbox);
8745 if (!GTK_WIDGET_VISIBLE (window))
8746 gtk_widget_show (window);
8748 gtk_widget_destroy (window);
8752 * Paned keyboard navigation
8756 paned_keyboard_window1 (GtkWidget *widget)
8779 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8780 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
8781 gtk_window_set_screen (GTK_WINDOW (window1),
8782 gtk_widget_get_screen (widget));
8784 hpaned1 = gtk_hpaned_new ();
8785 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
8787 frame1 = gtk_frame_new (NULL);
8788 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
8789 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
8791 vbox1 = gtk_vbox_new (FALSE, 0);
8792 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
8794 button7 = gtk_button_new_with_label ("button7");
8795 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
8797 button8 = gtk_button_new_with_label ("button8");
8798 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
8800 button9 = gtk_button_new_with_label ("button9");
8801 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
8803 vpaned1 = gtk_vpaned_new ();
8804 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
8806 frame2 = gtk_frame_new (NULL);
8807 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
8808 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
8810 frame5 = gtk_frame_new (NULL);
8811 gtk_container_add (GTK_CONTAINER (frame2), frame5);
8813 hbox1 = gtk_hbox_new (FALSE, 0);
8814 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
8816 button5 = gtk_button_new_with_label ("button5");
8817 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
8819 button6 = gtk_button_new_with_label ("button6");
8820 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
8822 frame3 = gtk_frame_new (NULL);
8823 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
8824 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
8826 frame4 = gtk_frame_new ("Buttons");
8827 gtk_container_add (GTK_CONTAINER (frame3), frame4);
8828 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
8830 table1 = gtk_table_new (2, 2, FALSE);
8831 gtk_container_add (GTK_CONTAINER (frame4), table1);
8832 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
8834 button1 = gtk_button_new_with_label ("button1");
8835 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
8836 (GtkAttachOptions) (GTK_FILL),
8837 (GtkAttachOptions) (0), 0, 0);
8839 button2 = gtk_button_new_with_label ("button2");
8840 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
8841 (GtkAttachOptions) (GTK_FILL),
8842 (GtkAttachOptions) (0), 0, 0);
8844 button3 = gtk_button_new_with_label ("button3");
8845 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
8846 (GtkAttachOptions) (GTK_FILL),
8847 (GtkAttachOptions) (0), 0, 0);
8849 button4 = gtk_button_new_with_label ("button4");
8850 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
8851 (GtkAttachOptions) (GTK_FILL),
8852 (GtkAttachOptions) (0), 0, 0);
8858 paned_keyboard_window2 (GtkWidget *widget)
8863 GtkWidget *button13;
8867 GtkWidget *button12;
8869 GtkWidget *button11;
8870 GtkWidget *button10;
8872 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8873 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
8875 gtk_window_set_screen (GTK_WINDOW (window2),
8876 gtk_widget_get_screen (widget));
8878 hpaned2 = gtk_hpaned_new ();
8879 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
8881 frame6 = gtk_frame_new (NULL);
8882 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
8883 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
8885 button13 = gtk_button_new_with_label ("button13");
8886 gtk_container_add (GTK_CONTAINER (frame6), button13);
8888 hbox2 = gtk_hbox_new (FALSE, 0);
8889 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
8891 vpaned2 = gtk_vpaned_new ();
8892 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
8894 frame7 = gtk_frame_new (NULL);
8895 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
8896 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
8898 button12 = gtk_button_new_with_label ("button12");
8899 gtk_container_add (GTK_CONTAINER (frame7), button12);
8901 frame8 = gtk_frame_new (NULL);
8902 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
8903 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
8905 button11 = gtk_button_new_with_label ("button11");
8906 gtk_container_add (GTK_CONTAINER (frame8), button11);
8908 button10 = gtk_button_new_with_label ("button10");
8909 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
8915 paned_keyboard_window3 (GtkWidget *widget)
8922 GtkWidget *button14;
8925 GtkWidget *button15;
8928 GtkWidget *button16;
8930 GtkWidget *button17;
8932 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8933 g_object_set_data (G_OBJECT (window3), "window3", window3);
8934 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
8936 gtk_window_set_screen (GTK_WINDOW (window3),
8937 gtk_widget_get_screen (widget));
8940 vbox2 = gtk_vbox_new (FALSE, 0);
8941 gtk_container_add (GTK_CONTAINER (window3), vbox2);
8943 label1 = gtk_label_new ("Three panes nested inside each other");
8944 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
8946 hpaned3 = gtk_hpaned_new ();
8947 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
8949 frame9 = gtk_frame_new (NULL);
8950 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
8951 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
8953 button14 = gtk_button_new_with_label ("button14");
8954 gtk_container_add (GTK_CONTAINER (frame9), button14);
8956 hpaned4 = gtk_hpaned_new ();
8957 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
8959 frame10 = gtk_frame_new (NULL);
8960 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
8961 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
8963 button15 = gtk_button_new_with_label ("button15");
8964 gtk_container_add (GTK_CONTAINER (frame10), button15);
8966 hpaned5 = gtk_hpaned_new ();
8967 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
8969 frame11 = gtk_frame_new (NULL);
8970 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
8971 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
8973 button16 = gtk_button_new_with_label ("button16");
8974 gtk_container_add (GTK_CONTAINER (frame11), button16);
8976 frame12 = gtk_frame_new (NULL);
8977 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
8978 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
8980 button17 = gtk_button_new_with_label ("button17");
8981 gtk_container_add (GTK_CONTAINER (frame12), button17);
8987 paned_keyboard_window4 (GtkWidget *widget)
8994 GtkWidget *button19;
8995 GtkWidget *button18;
8998 GtkWidget *button21;
8999 GtkWidget *button20;
9001 GtkWidget *button23;
9002 GtkWidget *button22;
9004 GtkWidget *button25;
9005 GtkWidget *button24;
9007 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9008 g_object_set_data (G_OBJECT (window4), "window4", window4);
9009 gtk_window_set_title (GTK_WINDOW (window4), "window4");
9011 gtk_window_set_screen (GTK_WINDOW (window4),
9012 gtk_widget_get_screen (widget));
9014 vbox3 = gtk_vbox_new (FALSE, 0);
9015 gtk_container_add (GTK_CONTAINER (window4), vbox3);
9017 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
9018 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
9019 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
9021 hpaned6 = gtk_hpaned_new ();
9022 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
9024 vpaned3 = gtk_vpaned_new ();
9025 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
9027 button19 = gtk_button_new_with_label ("button19");
9028 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
9030 button18 = gtk_button_new_with_label ("button18");
9031 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
9033 hbox3 = gtk_hbox_new (FALSE, 0);
9034 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
9036 vpaned4 = gtk_vpaned_new ();
9037 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
9039 button21 = gtk_button_new_with_label ("button21");
9040 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
9042 button20 = gtk_button_new_with_label ("button20");
9043 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
9045 vpaned5 = gtk_vpaned_new ();
9046 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
9048 button23 = gtk_button_new_with_label ("button23");
9049 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
9051 button22 = gtk_button_new_with_label ("button22");
9052 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
9054 vpaned6 = gtk_vpaned_new ();
9055 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
9057 button25 = gtk_button_new_with_label ("button25");
9058 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
9060 button24 = gtk_button_new_with_label ("button24");
9061 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
9067 create_paned_keyboard_navigation (GtkWidget *widget)
9069 static GtkWidget *window1 = NULL;
9070 static GtkWidget *window2 = NULL;
9071 static GtkWidget *window3 = NULL;
9072 static GtkWidget *window4 = NULL;
9075 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
9077 gtk_widget_destroy (window1);
9078 gtk_widget_destroy (window2);
9079 gtk_widget_destroy (window3);
9080 gtk_widget_destroy (window4);
9085 window1 = paned_keyboard_window1 (widget);
9086 g_signal_connect (window1, "destroy",
9087 G_CALLBACK (gtk_widget_destroyed),
9093 window2 = paned_keyboard_window2 (widget);
9094 g_signal_connect (window2, "destroy",
9095 G_CALLBACK (gtk_widget_destroyed),
9101 window3 = paned_keyboard_window3 (widget);
9102 g_signal_connect (window3, "destroy",
9103 G_CALLBACK (gtk_widget_destroyed),
9109 window4 = paned_keyboard_window4 (widget);
9110 g_signal_connect (window4, "destroy",
9111 G_CALLBACK (gtk_widget_destroyed),
9115 if (GTK_WIDGET_VISIBLE (window1))
9116 gtk_widget_destroy (GTK_WIDGET (window1));
9118 gtk_widget_show_all (GTK_WIDGET (window1));
9120 if (GTK_WIDGET_VISIBLE (window2))
9121 gtk_widget_destroy (GTK_WIDGET (window2));
9123 gtk_widget_show_all (GTK_WIDGET (window2));
9125 if (GTK_WIDGET_VISIBLE (window3))
9126 gtk_widget_destroy (GTK_WIDGET (window3));
9128 gtk_widget_show_all (GTK_WIDGET (window3));
9130 if (GTK_WIDGET_VISIBLE (window4))
9131 gtk_widget_destroy (GTK_WIDGET (window4));
9133 gtk_widget_show_all (GTK_WIDGET (window4));
9141 typedef struct _cursoroffset {gint x,y;} CursorOffset;
9144 shape_pressed (GtkWidget *widget, GdkEventButton *event)
9148 /* ignore double and triple click */
9149 if (event->type != GDK_BUTTON_PRESS)
9152 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9153 p->x = (int) event->x;
9154 p->y = (int) event->y;
9156 gtk_grab_add (widget);
9157 gdk_pointer_grab (widget->window, TRUE,
9158 GDK_BUTTON_RELEASE_MASK |
9159 GDK_BUTTON_MOTION_MASK |
9160 GDK_POINTER_MOTION_HINT_MASK,
9165 shape_released (GtkWidget *widget)
9167 gtk_grab_remove (widget);
9168 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9173 shape_motion (GtkWidget *widget,
9174 GdkEventMotion *event)
9178 GdkModifierType mask;
9180 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9183 * Can't use event->x / event->y here
9184 * because I need absolute coordinates.
9186 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
9187 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
9191 shape_create_icon (GdkScreen *screen,
9202 CursorOffset* icon_pos;
9204 GdkBitmap *gdk_pixmap_mask;
9205 GdkPixmap *gdk_pixmap;
9208 style = gtk_widget_get_default_style ();
9209 gc = style->black_gc;
9212 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
9214 window = gtk_window_new (window_type);
9215 gtk_window_set_screen (GTK_WINDOW (window), screen);
9217 fixed = gtk_fixed_new ();
9218 gtk_widget_set_size_request (fixed, 100, 100);
9219 gtk_container_add (GTK_CONTAINER (window), fixed);
9220 gtk_widget_show (fixed);
9222 gtk_widget_set_events (window,
9223 gtk_widget_get_events (window) |
9224 GDK_BUTTON_MOTION_MASK |
9225 GDK_POINTER_MOTION_HINT_MASK |
9226 GDK_BUTTON_PRESS_MASK);
9228 gtk_widget_realize (window);
9229 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
9230 &style->bg[GTK_STATE_NORMAL],
9233 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
9234 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
9235 gtk_widget_show (pixmap);
9237 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
9239 g_object_unref (gdk_pixmap_mask);
9240 g_object_unref (gdk_pixmap);
9242 g_signal_connect (window, "button_press_event",
9243 G_CALLBACK (shape_pressed), NULL);
9244 g_signal_connect (window, "button_release_event",
9245 G_CALLBACK (shape_released), NULL);
9246 g_signal_connect (window, "motion_notify_event",
9247 G_CALLBACK (shape_motion), NULL);
9249 icon_pos = g_new (CursorOffset, 1);
9250 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
9252 gtk_widget_set_uposition (window, x, y);
9253 gtk_widget_show (window);
9259 create_shapes (GtkWidget *widget)
9261 /* Variables used by the Drag/Drop and Shape Window demos */
9262 static GtkWidget *modeller = NULL;
9263 static GtkWidget *sheets = NULL;
9264 static GtkWidget *rings = NULL;
9265 static GtkWidget *with_region = NULL;
9266 GdkScreen *screen = gtk_widget_get_screen (widget);
9268 if (!(file_exists ("Modeller.xpm") &&
9269 file_exists ("FilesQueue.xpm") &&
9270 file_exists ("3DRings.xpm")))
9276 modeller = shape_create_icon (screen, "Modeller.xpm",
9277 440, 140, 0,0, GTK_WINDOW_POPUP);
9279 g_signal_connect (modeller, "destroy",
9280 G_CALLBACK (gtk_widget_destroyed),
9284 gtk_widget_destroy (modeller);
9288 sheets = shape_create_icon (screen, "FilesQueue.xpm",
9289 580, 170, 0,0, GTK_WINDOW_POPUP);
9291 g_signal_connect (sheets, "destroy",
9292 G_CALLBACK (gtk_widget_destroyed),
9297 gtk_widget_destroy (sheets);
9301 rings = shape_create_icon (screen, "3DRings.xpm",
9302 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9304 g_signal_connect (rings, "destroy",
9305 G_CALLBACK (gtk_widget_destroyed),
9309 gtk_widget_destroy (rings);
9316 with_region = shape_create_icon (screen, "3DRings.xpm",
9317 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9319 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
9321 g_signal_connect (with_region, "destroy",
9322 G_CALLBACK (gtk_widget_destroyed),
9325 /* reset shape from mask to a region */
9328 region = gdk_region_new ();
9340 gdk_region_union_with_rect (region, &rect);
9348 gdk_window_shape_combine_region (with_region->window,
9353 gtk_widget_destroy (with_region);
9361 create_wmhints (GtkWidget *widget)
9363 static GtkWidget *window = NULL;
9365 GtkWidget *separator;
9374 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9376 gtk_window_set_screen (GTK_WINDOW (window),
9377 gtk_widget_get_screen (widget));
9379 g_signal_connect (window, "destroy",
9380 G_CALLBACK (gtk_widget_destroyed),
9383 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
9384 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9386 gtk_widget_realize (window);
9388 circles = gdk_bitmap_create_from_data (window->window,
9392 gdk_window_set_icon (window->window, NULL,
9395 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
9397 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
9398 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
9400 box1 = gtk_vbox_new (FALSE, 0);
9401 gtk_container_add (GTK_CONTAINER (window), box1);
9402 gtk_widget_show (box1);
9404 label = gtk_label_new ("Try iconizing me!");
9405 gtk_widget_set_size_request (label, 150, 50);
9406 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
9407 gtk_widget_show (label);
9410 separator = gtk_hseparator_new ();
9411 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9412 gtk_widget_show (separator);
9415 box2 = gtk_vbox_new (FALSE, 10);
9416 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9417 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9418 gtk_widget_show (box2);
9421 button = gtk_button_new_with_label ("close");
9423 g_signal_connect_swapped (button, "clicked",
9424 G_CALLBACK (gtk_widget_destroy),
9427 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9428 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9429 gtk_widget_grab_default (button);
9430 gtk_widget_show (button);
9433 if (!GTK_WIDGET_VISIBLE (window))
9434 gtk_widget_show (window);
9436 gtk_widget_destroy (window);
9441 * Window state tracking
9445 window_state_callback (GtkWidget *widget,
9446 GdkEventWindowState *event,
9449 GtkWidget *label = data;
9452 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
9453 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
9454 "withdrawn" : "not withdrawn", ", ",
9455 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
9456 "iconified" : "not iconified", ", ",
9457 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
9458 "sticky" : "not sticky", ", ",
9459 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
9460 "maximized" : "not maximized", ", ",
9461 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
9462 "fullscreen" : "not fullscreen",
9465 gtk_label_set_text (GTK_LABEL (label), msg);
9473 tracking_label (GtkWidget *window)
9479 hbox = gtk_hbox_new (FALSE, 5);
9481 g_signal_connect_object (hbox,
9483 G_CALLBACK (gtk_widget_destroy),
9487 label = gtk_label_new ("<no window state events received>");
9488 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
9489 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
9491 g_signal_connect (window,
9492 "window_state_event",
9493 G_CALLBACK (window_state_callback),
9496 button = gtk_button_new_with_label ("Deiconify");
9497 g_signal_connect_object (button,
9499 G_CALLBACK (gtk_window_deiconify),
9502 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9504 button = gtk_button_new_with_label ("Iconify");
9505 g_signal_connect_object (button,
9507 G_CALLBACK (gtk_window_iconify),
9510 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9512 button = gtk_button_new_with_label ("Fullscreen");
9513 g_signal_connect_object (button,
9515 G_CALLBACK (gtk_window_fullscreen),
9518 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9520 button = gtk_button_new_with_label ("Unfullscreen");
9521 g_signal_connect_object (button,
9523 G_CALLBACK (gtk_window_unfullscreen),
9526 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9528 button = gtk_button_new_with_label ("Present");
9529 g_signal_connect_object (button,
9531 G_CALLBACK (gtk_window_present),
9534 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9536 button = gtk_button_new_with_label ("Show");
9537 g_signal_connect_object (button,
9539 G_CALLBACK (gtk_widget_show),
9542 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9544 gtk_widget_show_all (hbox);
9550 get_state_controls (GtkWidget *window)
9555 vbox = gtk_vbox_new (FALSE, 0);
9557 button = gtk_button_new_with_label ("Stick");
9558 g_signal_connect_object (button,
9560 G_CALLBACK (gtk_window_stick),
9563 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9565 button = gtk_button_new_with_label ("Unstick");
9566 g_signal_connect_object (button,
9568 G_CALLBACK (gtk_window_unstick),
9571 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9573 button = gtk_button_new_with_label ("Maximize");
9574 g_signal_connect_object (button,
9576 G_CALLBACK (gtk_window_maximize),
9579 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9581 button = gtk_button_new_with_label ("Unmaximize");
9582 g_signal_connect_object (button,
9584 G_CALLBACK (gtk_window_unmaximize),
9587 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9589 button = gtk_button_new_with_label ("Iconify");
9590 g_signal_connect_object (button,
9592 G_CALLBACK (gtk_window_iconify),
9595 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9597 button = gtk_button_new_with_label ("Fullscreen");
9598 g_signal_connect_object (button,
9600 G_CALLBACK (gtk_window_fullscreen),
9603 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9605 button = gtk_button_new_with_label ("Unfullscreen");
9606 g_signal_connect_object (button,
9608 G_CALLBACK (gtk_window_unfullscreen),
9611 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9613 button = gtk_button_new_with_label ("Hide (withdraw)");
9614 g_signal_connect_object (button,
9616 G_CALLBACK (gtk_widget_hide),
9619 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9621 gtk_widget_show_all (vbox);
9627 create_window_states (GtkWidget *widget)
9629 static GtkWidget *window = NULL;
9632 GtkWidget *iconified;
9634 GtkWidget *controls;
9638 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9639 gtk_window_set_screen (GTK_WINDOW (window),
9640 gtk_widget_get_screen (widget));
9642 g_signal_connect (window, "destroy",
9643 G_CALLBACK (gtk_widget_destroyed),
9646 gtk_window_set_title (GTK_WINDOW (window), "Window states");
9648 box1 = gtk_vbox_new (FALSE, 0);
9649 gtk_container_add (GTK_CONTAINER (window), box1);
9651 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9653 gtk_window_set_screen (GTK_WINDOW (iconified),
9654 gtk_widget_get_screen (widget));
9656 g_signal_connect_object (iconified, "destroy",
9657 G_CALLBACK (gtk_widget_destroy),
9660 gtk_window_iconify (GTK_WINDOW (iconified));
9661 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
9662 controls = get_state_controls (iconified);
9663 gtk_container_add (GTK_CONTAINER (iconified), controls);
9665 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9667 gtk_window_set_screen (GTK_WINDOW (normal),
9668 gtk_widget_get_screen (widget));
9670 g_signal_connect_object (normal, "destroy",
9671 G_CALLBACK (gtk_widget_destroy),
9675 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
9676 controls = get_state_controls (normal);
9677 gtk_container_add (GTK_CONTAINER (normal), controls);
9679 label = tracking_label (iconified);
9680 gtk_container_add (GTK_CONTAINER (box1), label);
9682 label = tracking_label (normal);
9683 gtk_container_add (GTK_CONTAINER (box1), label);
9685 gtk_widget_show_all (iconified);
9686 gtk_widget_show_all (normal);
9687 gtk_widget_show_all (box1);
9690 if (!GTK_WIDGET_VISIBLE (window))
9691 gtk_widget_show (window);
9693 gtk_widget_destroy (window);
9701 configure_event_callback (GtkWidget *widget,
9702 GdkEventConfigure *event,
9705 GtkWidget *label = data;
9709 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
9711 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
9713 event->x, event->y, event->width, event->height,
9716 gtk_label_set_text (GTK_LABEL (label), msg);
9724 get_ints (GtkWidget *window,
9731 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
9732 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
9734 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
9735 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
9739 set_size_callback (GtkWidget *widget,
9744 get_ints (data, &w, &h);
9746 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
9750 unset_default_size_callback (GtkWidget *widget,
9753 gtk_window_set_default_size (g_object_get_data (data, "target"),
9758 set_default_size_callback (GtkWidget *widget,
9763 get_ints (data, &w, &h);
9765 gtk_window_set_default_size (g_object_get_data (data, "target"),
9770 unset_size_request_callback (GtkWidget *widget,
9773 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9778 set_size_request_callback (GtkWidget *widget,
9783 get_ints (data, &w, &h);
9785 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9790 set_location_callback (GtkWidget *widget,
9795 get_ints (data, &x, &y);
9797 gtk_window_move (g_object_get_data (data, "target"), x, y);
9801 move_to_position_callback (GtkWidget *widget,
9807 window = g_object_get_data (data, "target");
9809 gtk_window_get_position (window, &x, &y);
9811 gtk_window_move (window, x, y);
9815 set_geometry_callback (GtkWidget *entry,
9821 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
9823 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
9825 if (!gtk_window_parse_geometry (target, text))
9826 g_print ("Bad geometry string '%s'\n", text);
9832 allow_shrink_callback (GtkWidget *widget,
9835 g_object_set (G_OBJECT (g_object_get_data (data, "target")),
9837 GTK_TOGGLE_BUTTON (widget)->active,
9842 allow_grow_callback (GtkWidget *widget,
9845 g_object_set (G_OBJECT (g_object_get_data (data, "target")),
9847 GTK_TOGGLE_BUTTON (widget)->active,
9852 gravity_selected (GtkWidget *widget,
9855 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
9856 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
9860 pos_selected (GtkWidget *widget,
9863 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
9864 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
9868 move_gravity_window_to_current_position (GtkWidget *widget,
9874 window = GTK_WINDOW (data);
9876 gtk_window_get_position (window, &x, &y);
9878 gtk_window_move (window, x, y);
9882 get_screen_corner (GtkWindow *window,
9887 GdkScreen * screen = gtk_window_get_screen (window);
9889 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
9891 switch (gtk_window_get_gravity (window))
9893 case GDK_GRAVITY_SOUTH_EAST:
9894 *x = gdk_screen_get_width (screen) - w;
9895 *y = gdk_screen_get_height (screen) - h;
9898 case GDK_GRAVITY_NORTH_EAST:
9899 *x = gdk_screen_get_width (screen) - w;
9903 case GDK_GRAVITY_SOUTH_WEST:
9905 *y = gdk_screen_get_height (screen) - h;
9908 case GDK_GRAVITY_NORTH_WEST:
9913 case GDK_GRAVITY_SOUTH:
9914 *x = (gdk_screen_get_width (screen) - w) / 2;
9915 *y = gdk_screen_get_height (screen) - h;
9918 case GDK_GRAVITY_NORTH:
9919 *x = (gdk_screen_get_width (screen) - w) / 2;
9923 case GDK_GRAVITY_WEST:
9925 *y = (gdk_screen_get_height (screen) - h) / 2;
9928 case GDK_GRAVITY_EAST:
9929 *x = gdk_screen_get_width (screen) - w;
9930 *y = (gdk_screen_get_height (screen) - h) / 2;
9933 case GDK_GRAVITY_CENTER:
9934 *x = (gdk_screen_get_width (screen) - w) / 2;
9935 *y = (gdk_screen_get_height (screen) - h) / 2;
9938 case GDK_GRAVITY_STATIC:
9939 /* pick some random numbers */
9945 g_assert_not_reached ();
9951 move_gravity_window_to_starting_position (GtkWidget *widget,
9957 window = GTK_WINDOW (data);
9959 get_screen_corner (window,
9962 gtk_window_move (window, x, y);
9966 make_gravity_window (GtkWidget *destroy_with,
9975 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9977 gtk_window_set_screen (GTK_WINDOW (window),
9978 gtk_widget_get_screen (destroy_with));
9980 vbox = gtk_vbox_new (FALSE, 0);
9981 gtk_widget_show (vbox);
9983 gtk_container_add (GTK_CONTAINER (window), vbox);
9984 gtk_window_set_title (GTK_WINDOW (window), title);
9985 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
9987 g_signal_connect_object (destroy_with,
9989 G_CALLBACK (gtk_widget_destroy),
9994 button = gtk_button_new_with_mnemonic ("_Move to current position");
9996 g_signal_connect (button, "clicked",
9997 G_CALLBACK (move_gravity_window_to_current_position),
10000 gtk_container_add (GTK_CONTAINER (vbox), button);
10001 gtk_widget_show (button);
10003 button = gtk_button_new_with_mnemonic ("Move to _starting position");
10005 g_signal_connect (button, "clicked",
10006 G_CALLBACK (move_gravity_window_to_starting_position),
10009 gtk_container_add (GTK_CONTAINER (vbox), button);
10010 gtk_widget_show (button);
10012 /* Pretend this is the result of --geometry.
10013 * DO NOT COPY THIS CODE unless you are setting --geometry results,
10014 * and in that case you probably should just use gtk_window_parse_geometry().
10015 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
10016 * you are parsing --geometry or equivalent.
10018 gtk_window_set_geometry_hints (GTK_WINDOW (window),
10020 GDK_HINT_USER_POS);
10022 gtk_window_set_default_size (GTK_WINDOW (window),
10025 get_screen_corner (GTK_WINDOW (window), &x, &y);
10027 gtk_window_move (GTK_WINDOW (window),
10034 do_gravity_test (GtkWidget *widget,
10037 GtkWidget *destroy_with = data;
10040 /* We put a window at each gravity point on the screen. */
10041 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
10043 gtk_widget_show (window);
10045 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
10047 gtk_widget_show (window);
10049 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
10051 gtk_widget_show (window);
10053 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
10055 gtk_widget_show (window);
10057 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
10059 gtk_widget_show (window);
10061 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
10063 gtk_widget_show (window);
10066 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
10068 gtk_widget_show (window);
10071 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
10073 gtk_widget_show (window);
10075 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
10077 gtk_widget_show (window);
10079 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
10081 gtk_widget_show (window);
10085 window_controls (GtkWidget *window)
10087 GtkWidget *control_window;
10092 GtkAdjustment *adj;
10098 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10100 gtk_window_set_screen (GTK_WINDOW (control_window),
10101 gtk_widget_get_screen (window));
10103 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
10105 g_object_set_data (G_OBJECT (control_window),
10109 g_signal_connect_object (control_window,
10111 G_CALLBACK (gtk_widget_destroy),
10113 G_CONNECT_SWAPPED);
10115 vbox = gtk_vbox_new (FALSE, 5);
10117 gtk_container_add (GTK_CONTAINER (control_window), vbox);
10119 label = gtk_label_new ("<no configure events>");
10120 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10122 g_signal_connect (window,
10124 G_CALLBACK (configure_event_callback),
10127 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10129 spin = gtk_spin_button_new (adj, 0, 0);
10131 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10133 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
10135 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10137 spin = gtk_spin_button_new (adj, 0, 0);
10139 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10141 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
10143 entry = gtk_entry_new ();
10144 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10146 g_signal_connect (entry, "changed",
10147 G_CALLBACK (set_geometry_callback),
10150 button = gtk_button_new_with_label ("Show gravity test windows");
10151 g_signal_connect_swapped (button,
10153 G_CALLBACK (do_gravity_test),
10155 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10157 button = gtk_button_new_with_label ("Reshow with initial size");
10158 g_signal_connect_object (button,
10160 G_CALLBACK (gtk_window_reshow_with_initial_size),
10162 G_CONNECT_SWAPPED);
10163 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10165 button = gtk_button_new_with_label ("Queue resize");
10166 g_signal_connect_object (button,
10168 G_CALLBACK (gtk_widget_queue_resize),
10170 G_CONNECT_SWAPPED);
10171 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10173 button = gtk_button_new_with_label ("Resize");
10174 g_signal_connect (button,
10176 G_CALLBACK (set_size_callback),
10178 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10180 button = gtk_button_new_with_label ("Set default size");
10181 g_signal_connect (button,
10183 G_CALLBACK (set_default_size_callback),
10185 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10187 button = gtk_button_new_with_label ("Unset default size");
10188 g_signal_connect (button,
10190 G_CALLBACK (unset_default_size_callback),
10192 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10194 button = gtk_button_new_with_label ("Set size request");
10195 g_signal_connect (button,
10197 G_CALLBACK (set_size_request_callback),
10199 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10201 button = gtk_button_new_with_label ("Unset size request");
10202 g_signal_connect (button,
10204 G_CALLBACK (unset_size_request_callback),
10206 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10208 button = gtk_button_new_with_label ("Move");
10209 g_signal_connect (button,
10211 G_CALLBACK (set_location_callback),
10213 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10215 button = gtk_button_new_with_label ("Move to current position");
10216 g_signal_connect (button,
10218 G_CALLBACK (move_to_position_callback),
10220 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10222 button = gtk_check_button_new_with_label ("Allow shrink");
10223 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10224 g_signal_connect (button,
10226 G_CALLBACK (allow_shrink_callback),
10228 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10230 button = gtk_check_button_new_with_label ("Allow grow");
10231 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
10232 g_signal_connect (button,
10234 G_CALLBACK (allow_grow_callback),
10236 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10238 button = gtk_button_new_with_mnemonic ("_Show");
10239 g_signal_connect_object (button,
10241 G_CALLBACK (gtk_widget_show),
10243 G_CONNECT_SWAPPED);
10244 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10246 button = gtk_button_new_with_mnemonic ("_Hide");
10247 g_signal_connect_object (button,
10249 G_CALLBACK (gtk_widget_hide),
10251 G_CONNECT_SWAPPED);
10252 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10254 menu = gtk_menu_new ();
10260 static gchar *names[] = {
10261 "GDK_GRAVITY_NORTH_WEST",
10262 "GDK_GRAVITY_NORTH",
10263 "GDK_GRAVITY_NORTH_EAST",
10264 "GDK_GRAVITY_WEST",
10265 "GDK_GRAVITY_CENTER",
10266 "GDK_GRAVITY_EAST",
10267 "GDK_GRAVITY_SOUTH_WEST",
10268 "GDK_GRAVITY_SOUTH",
10269 "GDK_GRAVITY_SOUTH_EAST",
10270 "GDK_GRAVITY_STATIC",
10274 g_assert (names[i]);
10276 mi = gtk_menu_item_new_with_label (names[i]);
10278 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10283 gtk_widget_show_all (menu);
10285 om = gtk_option_menu_new ();
10286 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10289 g_signal_connect (om,
10291 G_CALLBACK (gravity_selected),
10294 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10297 menu = gtk_menu_new ();
10303 static gchar *names[] = {
10304 "GTK_WIN_POS_NONE",
10305 "GTK_WIN_POS_CENTER",
10306 "GTK_WIN_POS_MOUSE",
10307 "GTK_WIN_POS_CENTER_ALWAYS",
10308 "GTK_WIN_POS_CENTER_ON_PARENT",
10312 g_assert (names[i]);
10314 mi = gtk_menu_item_new_with_label (names[i]);
10316 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10321 gtk_widget_show_all (menu);
10323 om = gtk_option_menu_new ();
10324 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10327 g_signal_connect (om,
10329 G_CALLBACK (pos_selected),
10332 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10334 gtk_widget_show_all (vbox);
10336 return control_window;
10340 create_window_sizing (GtkWidget *widget)
10342 static GtkWidget *window = NULL;
10343 static GtkWidget *target_window = NULL;
10345 if (!target_window)
10349 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10350 gtk_window_set_screen (GTK_WINDOW (target_window),
10351 gtk_widget_get_screen (widget));
10352 label = gtk_label_new (NULL);
10353 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");
10354 gtk_container_add (GTK_CONTAINER (target_window), label);
10355 gtk_widget_show (label);
10357 g_signal_connect (target_window, "destroy",
10358 G_CALLBACK (gtk_widget_destroyed),
10361 window = window_controls (target_window);
10363 g_signal_connect (window, "destroy",
10364 G_CALLBACK (gtk_widget_destroyed),
10367 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
10370 /* don't show target window by default, we want to allow testing
10371 * of behavior on first show.
10374 if (!GTK_WIDGET_VISIBLE (window))
10375 gtk_widget_show (window);
10377 gtk_widget_destroy (window);
10384 typedef struct _ProgressData {
10387 GtkWidget *block_spin;
10388 GtkWidget *x_align_spin;
10389 GtkWidget *y_align_spin;
10390 GtkWidget *step_spin;
10391 GtkWidget *act_blocks_spin;
10400 progress_timeout (gpointer data)
10403 GtkAdjustment *adj;
10405 adj = GTK_PROGRESS (data)->adjustment;
10407 new_val = adj->value + 1;
10408 if (new_val > adj->upper)
10409 new_val = adj->lower;
10411 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
10417 destroy_progress (GtkWidget *widget,
10418 ProgressData **pdata)
10420 gtk_timeout_remove ((*pdata)->timer);
10421 (*pdata)->timer = 0;
10422 (*pdata)->window = NULL;
10428 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
10430 ProgressData *pdata;
10433 pdata = (ProgressData *) data;
10435 if (!GTK_WIDGET_MAPPED (widget))
10438 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10440 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
10441 (GtkProgressBarOrientation) i);
10445 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
10447 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
10448 GTK_TOGGLE_BUTTON (widget)->active);
10449 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
10450 gtk_widget_set_sensitive (pdata->x_align_spin,
10451 GTK_TOGGLE_BUTTON (widget)->active);
10452 gtk_widget_set_sensitive (pdata->y_align_spin,
10453 GTK_TOGGLE_BUTTON (widget)->active);
10457 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
10459 ProgressData *pdata;
10462 pdata = (ProgressData *) data;
10464 if (!GTK_WIDGET_MAPPED (widget))
10467 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10470 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
10472 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10474 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
10475 (GtkProgressBarStyle) i);
10479 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
10483 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
10484 sprintf (buf, "???");
10486 sprintf (buf, "%.0f%%", 100 *
10487 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
10488 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
10492 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
10494 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
10495 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10496 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
10500 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
10502 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
10503 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
10507 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
10509 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10510 gtk_spin_button_get_value_as_int
10511 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
10515 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
10517 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
10518 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
10519 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
10523 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
10525 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
10526 GTK_TOGGLE_BUTTON (widget)->active);
10527 gtk_widget_set_sensitive (pdata->step_spin,
10528 GTK_TOGGLE_BUTTON (widget)->active);
10529 gtk_widget_set_sensitive (pdata->act_blocks_spin,
10530 GTK_TOGGLE_BUTTON (widget)->active);
10534 entry_changed (GtkWidget *widget, ProgressData *pdata)
10536 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10537 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
10541 create_progress_bar (GtkWidget *widget)
10552 GtkAdjustment *adj;
10553 static ProgressData *pdata = NULL;
10555 static gchar *items1[] =
10563 static gchar *items2[] =
10570 pdata = g_new0 (ProgressData, 1);
10572 if (!pdata->window)
10574 pdata->window = gtk_dialog_new ();
10576 gtk_window_set_screen (GTK_WINDOW (pdata->window),
10577 gtk_widget_get_screen (widget));
10579 gtk_window_set_resizable (GTK_WINDOW (pdata->window), FALSE);
10581 g_signal_connect (pdata->window, "destroy",
10582 G_CALLBACK (destroy_progress),
10587 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
10588 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
10590 vbox = gtk_vbox_new (FALSE, 5);
10591 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10592 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
10593 vbox, FALSE, TRUE, 0);
10595 frame = gtk_frame_new ("Progress");
10596 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10598 vbox2 = gtk_vbox_new (FALSE, 5);
10599 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10601 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10602 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10604 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
10605 g_signal_connect (adj, "value_changed",
10606 G_CALLBACK (progress_value_changed), pdata);
10608 pdata->pbar = gtk_widget_new (GTK_TYPE_PROGRESS_BAR,
10611 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10612 "%v from [%l,%u] (=%p%%)");
10613 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
10614 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
10616 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10617 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10619 hbox = gtk_hbox_new (FALSE, 5);
10620 gtk_container_add (GTK_CONTAINER (align), hbox);
10621 label = gtk_label_new ("Label updated by user :");
10622 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10623 pdata->label = gtk_label_new ("");
10624 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
10626 frame = gtk_frame_new ("Options");
10627 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10629 vbox2 = gtk_vbox_new (FALSE, 5);
10630 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10632 tab = gtk_table_new (7, 2, FALSE);
10633 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
10635 label = gtk_label_new ("Orientation :");
10636 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
10637 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10639 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10641 pdata->omenu1 = build_option_menu (items1, 4, 0,
10642 progressbar_toggle_orientation,
10644 hbox = gtk_hbox_new (FALSE, 0);
10645 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
10646 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10648 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
10650 check = gtk_check_button_new_with_label ("Show text");
10651 g_signal_connect (check, "clicked",
10652 G_CALLBACK (toggle_show_text),
10654 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
10655 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10658 hbox = gtk_hbox_new (FALSE, 0);
10659 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
10660 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10663 label = gtk_label_new ("Format : ");
10664 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10666 pdata->entry = gtk_entry_new ();
10667 g_signal_connect (pdata->entry, "changed",
10668 G_CALLBACK (entry_changed),
10670 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
10671 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
10672 gtk_widget_set_size_request (pdata->entry, 100, -1);
10673 gtk_widget_set_sensitive (pdata->entry, FALSE);
10675 label = gtk_label_new ("Text align :");
10676 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
10677 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10679 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10681 hbox = gtk_hbox_new (FALSE, 0);
10682 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
10683 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10686 label = gtk_label_new ("x :");
10687 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10689 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10690 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
10691 g_signal_connect (adj, "value_changed",
10692 G_CALLBACK (adjust_align), pdata);
10693 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
10694 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
10696 label = gtk_label_new ("y :");
10697 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10699 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10700 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
10701 g_signal_connect (adj, "value_changed",
10702 G_CALLBACK (adjust_align), pdata);
10703 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
10704 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
10706 label = gtk_label_new ("Bar Style :");
10707 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 3, 4,
10708 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10710 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10712 pdata->omenu2 = build_option_menu (items2, 2, 0,
10713 progressbar_toggle_bar_style,
10715 hbox = gtk_hbox_new (FALSE, 0);
10716 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 3, 4,
10717 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10719 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
10721 label = gtk_label_new ("Block count :");
10722 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 4, 5,
10723 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10725 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10727 hbox = gtk_hbox_new (FALSE, 0);
10728 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 4, 5,
10729 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10731 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
10732 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
10733 g_signal_connect (adj, "value_changed",
10734 G_CALLBACK (adjust_blocks), pdata);
10735 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
10736 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10738 check = gtk_check_button_new_with_label ("Activity mode");
10739 g_signal_connect (check, "clicked",
10740 G_CALLBACK (toggle_activity_mode), pdata);
10741 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 5, 6,
10742 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10745 hbox = gtk_hbox_new (FALSE, 0);
10746 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 5, 6,
10747 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10749 label = gtk_label_new ("Step size : ");
10750 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10751 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
10752 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
10753 g_signal_connect (adj, "value_changed",
10754 G_CALLBACK (adjust_step), pdata);
10755 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
10756 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
10758 hbox = gtk_hbox_new (FALSE, 0);
10759 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 6, 7,
10760 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10762 label = gtk_label_new ("Blocks : ");
10763 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10764 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
10765 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
10766 g_signal_connect (adj, "value_changed",
10767 G_CALLBACK (adjust_act_blocks), pdata);
10768 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
10770 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
10772 button = gtk_button_new_with_label ("close");
10773 g_signal_connect_swapped (button, "clicked",
10774 G_CALLBACK (gtk_widget_destroy),
10776 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
10777 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
10778 button, TRUE, TRUE, 0);
10779 gtk_widget_grab_default (button);
10782 if (!GTK_WIDGET_VISIBLE (pdata->window))
10783 gtk_widget_show_all (pdata->window);
10785 gtk_widget_destroy (pdata->window);
10797 GtkWidget *res_widget;
10801 find_widget (GtkWidget *widget, FindWidgetData *data)
10803 GtkAllocation new_allocation;
10807 new_allocation = widget->allocation;
10809 if (data->found || !GTK_WIDGET_MAPPED (widget))
10812 /* Note that in the following code, we only count the
10813 * position as being inside a WINDOW widget if it is inside
10814 * widget->window; points that are outside of widget->window
10815 * but within the allocation are not counted. This is consistent
10816 * with the way we highlight drag targets.
10818 if (!GTK_WIDGET_NO_WINDOW (widget))
10820 new_allocation.x = 0;
10821 new_allocation.y = 0;
10824 if (widget->parent && !data->first)
10826 GdkWindow *window = widget->window;
10827 while (window != widget->parent->window)
10829 gint tx, ty, twidth, theight;
10830 gdk_drawable_get_size (window, &twidth, &theight);
10832 if (new_allocation.x < 0)
10834 new_allocation.width += new_allocation.x;
10835 new_allocation.x = 0;
10837 if (new_allocation.y < 0)
10839 new_allocation.height += new_allocation.y;
10840 new_allocation.y = 0;
10842 if (new_allocation.x + new_allocation.width > twidth)
10843 new_allocation.width = twidth - new_allocation.x;
10844 if (new_allocation.y + new_allocation.height > theight)
10845 new_allocation.height = theight - new_allocation.y;
10847 gdk_window_get_position (window, &tx, &ty);
10848 new_allocation.x += tx;
10850 new_allocation.y += ty;
10853 window = gdk_window_get_parent (window);
10857 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
10858 (data->x < new_allocation.x + new_allocation.width) &&
10859 (data->y < new_allocation.y + new_allocation.height))
10861 /* First, check if the drag is in a valid drop site in
10862 * one of our children
10864 if (GTK_IS_CONTAINER (widget))
10866 FindWidgetData new_data = *data;
10868 new_data.x -= x_offset;
10869 new_data.y -= y_offset;
10870 new_data.found = FALSE;
10871 new_data.first = FALSE;
10873 gtk_container_forall (GTK_CONTAINER (widget),
10874 (GtkCallback)find_widget,
10877 data->found = new_data.found;
10879 data->res_widget = new_data.res_widget;
10882 /* If not, and this widget is registered as a drop site, check to
10883 * emit "drag_motion" to check if we are actually in
10888 data->found = TRUE;
10889 data->res_widget = widget;
10895 find_widget_at_pointer (GdkDisplay *display)
10897 GtkWidget *widget = NULL;
10898 GdkWindow *pointer_window;
10900 FindWidgetData data;
10902 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
10904 if (pointer_window)
10905 gdk_window_get_user_data (pointer_window, (gpointer*) &widget);
10909 gdk_window_get_pointer (widget->window,
10914 data.found = FALSE;
10917 find_widget (widget, &data);
10919 return data.res_widget;
10925 struct PropertiesData {
10926 GtkWidget **window;
10933 destroy_properties (GtkWidget *widget,
10934 struct PropertiesData *data)
10938 *data->window = NULL;
10939 data->window = NULL;
10944 gdk_cursor_unref (data->cursor);
10945 data->cursor = NULL;
10950 g_signal_handler_disconnect (widget, data->handler);
10958 property_query_event (GtkWidget *widget,
10960 struct PropertiesData *data)
10962 GtkWidget *res_widget = NULL;
10964 if (!data->in_query)
10967 if (event->type == GDK_BUTTON_RELEASE)
10969 gtk_grab_remove (widget);
10970 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10973 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
10976 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
10977 gtk_widget_get_screen (widget));
10978 create_prop_editor (G_OBJECT (res_widget), 0);
10981 data->in_query = FALSE;
10988 query_properties (GtkButton *button,
10989 struct PropertiesData *data)
10993 g_signal_connect (button, "event",
10994 G_CALLBACK (property_query_event), data);
10998 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
11001 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
11003 GDK_BUTTON_RELEASE_MASK,
11008 gtk_grab_add (GTK_WIDGET (button));
11010 data->in_query = TRUE;
11014 create_properties (GtkWidget *widget)
11016 static GtkWidget *window = NULL;
11020 struct PropertiesData *data;
11022 data = g_new (struct PropertiesData, 1);
11023 data->window = &window;
11024 data->in_query = FALSE;
11025 data->cursor = NULL;
11030 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11032 gtk_window_set_screen (GTK_WINDOW (window),
11033 gtk_widget_get_screen (widget));
11035 data->handler = g_signal_connect (window, "destroy",
11036 G_CALLBACK (destroy_properties),
11039 gtk_window_set_title (GTK_WINDOW (window), "test properties");
11040 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11042 vbox = gtk_vbox_new (FALSE, 1);
11043 gtk_container_add (GTK_CONTAINER (window), vbox);
11045 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
11046 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
11048 button = gtk_button_new_with_label ("Query properties");
11049 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
11050 g_signal_connect (button, "clicked",
11051 G_CALLBACK (query_properties),
11055 if (!GTK_WIDGET_VISIBLE (window))
11056 gtk_widget_show_all (window);
11058 gtk_widget_destroy (window);
11067 static int color_idle = 0;
11070 color_idle_func (GtkWidget *preview)
11072 static int count = 1;
11076 for (i = 0; i < 256; i++)
11078 for (j = 0, k = 0; j < 256; j++)
11080 buf[k+0] = i + count;
11082 buf[k+2] = j + count;
11086 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11091 gtk_widget_queue_draw (preview);
11092 gdk_window_process_updates (preview->window, TRUE);
11098 color_preview_destroy (GtkWidget *widget,
11099 GtkWidget **window)
11101 gtk_idle_remove (color_idle);
11108 create_color_preview (GtkWidget *widget)
11110 static GtkWidget *window = NULL;
11111 GtkWidget *preview;
11117 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11119 gtk_window_set_screen (GTK_WINDOW (window),
11120 gtk_widget_get_screen (widget));
11122 g_signal_connect (window, "destroy",
11123 G_CALLBACK (color_preview_destroy),
11126 gtk_window_set_title (GTK_WINDOW (window), "test");
11127 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11129 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
11130 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11131 gtk_container_add (GTK_CONTAINER (window), preview);
11133 for (i = 0; i < 256; i++)
11135 for (j = 0, k = 0; j < 256; j++)
11143 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11146 color_idle = gtk_idle_add ((GtkFunction) color_idle_func, preview);
11149 if (!GTK_WIDGET_VISIBLE (window))
11150 gtk_widget_show_all (window);
11152 gtk_widget_destroy (window);
11159 static int gray_idle = 0;
11162 gray_idle_func (GtkWidget *preview)
11164 static int count = 1;
11168 for (i = 0; i < 256; i++)
11170 for (j = 0; j < 256; j++)
11171 buf[j] = i + j + count;
11173 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11178 gtk_widget_draw (preview, NULL);
11184 gray_preview_destroy (GtkWidget *widget,
11185 GtkWidget **window)
11187 gtk_idle_remove (gray_idle);
11194 create_gray_preview (GtkWidget *widget)
11196 static GtkWidget *window = NULL;
11197 GtkWidget *preview;
11203 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11205 gtk_window_set_screen (GTK_WINDOW (window),
11206 gtk_widget_get_screen (widget));
11208 g_signal_connect (window, "destroy",
11209 G_CALLBACK (gray_preview_destroy),
11212 gtk_window_set_title (GTK_WINDOW (window), "test");
11213 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11215 preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
11216 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11217 gtk_container_add (GTK_CONTAINER (window), preview);
11219 for (i = 0; i < 256; i++)
11221 for (j = 0; j < 256; j++)
11224 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11227 gray_idle = gtk_idle_add ((GtkFunction) gray_idle_func, preview);
11230 if (!GTK_WIDGET_VISIBLE (window))
11231 gtk_widget_show_all (window);
11233 gtk_widget_destroy (window);
11242 selection_test_received (GtkWidget *list, GtkSelectionData *data)
11245 GtkWidget *list_item;
11249 if (data->length < 0)
11251 g_print ("Selection retrieval failed\n");
11254 if (data->type != GDK_SELECTION_TYPE_ATOM)
11256 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
11260 /* Clear out any current list items */
11262 gtk_list_clear_items (GTK_LIST(list), 0, -1);
11264 /* Add new items to list */
11266 atoms = (GdkAtom *)data->data;
11269 l = data->length / sizeof (GdkAtom);
11270 for (i = 0; i < l; i++)
11273 name = gdk_atom_name (atoms[i]);
11276 list_item = gtk_list_item_new_with_label (name);
11280 list_item = gtk_list_item_new_with_label ("(bad atom)");
11282 gtk_widget_show (list_item);
11283 item_list = g_list_append (item_list, list_item);
11286 gtk_list_append_items (GTK_LIST (list), item_list);
11292 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
11294 static GdkAtom targets_atom = GDK_NONE;
11296 if (targets_atom == GDK_NONE)
11297 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
11299 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
11304 create_selection_test (GtkWidget *widget)
11306 static GtkWidget *window = NULL;
11309 GtkWidget *scrolled_win;
11315 window = gtk_dialog_new ();
11317 gtk_window_set_screen (GTK_WINDOW (window),
11318 gtk_widget_get_screen (widget));
11320 g_signal_connect (window, "destroy",
11321 G_CALLBACK (gtk_widget_destroyed),
11324 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
11325 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11327 /* Create the list */
11329 vbox = gtk_vbox_new (FALSE, 5);
11330 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11331 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
11334 label = gtk_label_new ("Gets available targets for current selection");
11335 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11337 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
11338 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
11339 GTK_POLICY_AUTOMATIC,
11340 GTK_POLICY_AUTOMATIC);
11341 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
11342 gtk_widget_set_size_request (scrolled_win, 100, 200);
11344 list = gtk_list_new ();
11345 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
11347 g_signal_connect (list, "selection_received",
11348 G_CALLBACK (selection_test_received), NULL);
11350 /* .. And create some buttons */
11351 button = gtk_button_new_with_label ("Get Targets");
11352 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11353 button, TRUE, TRUE, 0);
11355 g_signal_connect (button, "clicked",
11356 G_CALLBACK (selection_test_get_targets), list);
11358 button = gtk_button_new_with_label ("Quit");
11359 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11360 button, TRUE, TRUE, 0);
11362 g_signal_connect_swapped (button, "clicked",
11363 G_CALLBACK (gtk_widget_destroy),
11367 if (!GTK_WIDGET_VISIBLE (window))
11368 gtk_widget_show_all (window);
11370 gtk_widget_destroy (window);
11378 create_gamma_curve (GtkWidget *widget)
11380 static GtkWidget *window = NULL, *curve;
11381 static int count = 0;
11388 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11389 gtk_window_set_screen (GTK_WINDOW (window),
11390 gtk_widget_get_screen (widget));
11392 gtk_window_set_title (GTK_WINDOW (window), "test");
11393 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11395 g_signal_connect (window, "destroy",
11396 G_CALLBACK(gtk_widget_destroyed),
11399 curve = gtk_gamma_curve_new ();
11400 gtk_container_add (GTK_CONTAINER (window), curve);
11401 gtk_widget_show (curve);
11404 max = 127 + (count % 2)*128;
11405 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11407 for (i = 0; i < max; ++i)
11408 vec[i] = (127 / sqrt (max)) * sqrt (i);
11409 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11412 if (!GTK_WIDGET_VISIBLE (window))
11413 gtk_widget_show (window);
11414 else if (count % 4 == 3)
11416 gtk_widget_destroy (window);
11427 static int scroll_test_pos = 0.0;
11430 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
11431 GtkAdjustment *adj)
11434 gint imin, imax, jmin, jmax;
11436 imin = (event->area.x) / 10;
11437 imax = (event->area.x + event->area.width + 9) / 10;
11439 jmin = ((int)adj->value + event->area.y) / 10;
11440 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
11442 gdk_window_clear_area (widget->window,
11443 event->area.x, event->area.y,
11444 event->area.width, event->area.height);
11446 for (i=imin; i<imax; i++)
11447 for (j=jmin; j<jmax; j++)
11449 gdk_draw_rectangle (widget->window,
11450 widget->style->black_gc,
11452 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
11458 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
11459 GtkAdjustment *adj)
11461 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
11462 -adj->page_increment / 2:
11463 adj->page_increment / 2);
11464 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
11465 gtk_adjustment_set_value (adj, new_value);
11471 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
11472 GtkAdjustment *adj)
11474 adj->page_increment = 0.9 * widget->allocation.height;
11475 adj->page_size = widget->allocation.height;
11477 g_signal_emit_by_name (adj, "changed");
11481 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
11483 /* gint source_min = (int)adj->value - scroll_test_pos; */
11486 dy = scroll_test_pos - (int)adj->value;
11487 scroll_test_pos = adj->value;
11489 if (!GTK_WIDGET_DRAWABLE (widget))
11491 gdk_window_scroll (widget->window, 0, dy);
11492 gdk_window_process_updates (widget->window, FALSE);
11497 create_scroll_test (GtkWidget *widget)
11499 static GtkWidget *window = NULL;
11501 GtkWidget *drawing_area;
11502 GtkWidget *scrollbar;
11504 GtkAdjustment *adj;
11505 GdkGeometry geometry;
11506 GdkWindowHints geometry_mask;
11510 window = gtk_dialog_new ();
11512 gtk_window_set_screen (GTK_WINDOW (window),
11513 gtk_widget_get_screen (widget));
11515 g_signal_connect (window, "destroy",
11516 G_CALLBACK (gtk_widget_destroyed),
11519 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
11520 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11522 hbox = gtk_hbox_new (FALSE, 0);
11523 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
11525 gtk_widget_show (hbox);
11527 drawing_area = gtk_drawing_area_new ();
11528 gtk_widget_set_size_request (drawing_area, 200, 200);
11529 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
11530 gtk_widget_show (drawing_area);
11532 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
11534 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
11535 scroll_test_pos = 0.0;
11537 scrollbar = gtk_vscrollbar_new (adj);
11538 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
11539 gtk_widget_show (scrollbar);
11541 g_signal_connect (drawing_area, "expose_event",
11542 G_CALLBACK (scroll_test_expose), adj);
11543 g_signal_connect (drawing_area, "configure_event",
11544 G_CALLBACK (scroll_test_configure), adj);
11545 g_signal_connect (drawing_area, "scroll_event",
11546 G_CALLBACK (scroll_test_scroll), adj);
11548 g_signal_connect (adj, "value_changed",
11549 G_CALLBACK (scroll_test_adjustment_changed),
11552 /* .. And create some buttons */
11554 button = gtk_button_new_with_label ("Quit");
11555 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11556 button, TRUE, TRUE, 0);
11558 g_signal_connect_swapped (button, "clicked",
11559 G_CALLBACK (gtk_widget_destroy),
11561 gtk_widget_show (button);
11563 /* Set up gridded geometry */
11565 geometry_mask = GDK_HINT_MIN_SIZE |
11566 GDK_HINT_BASE_SIZE |
11567 GDK_HINT_RESIZE_INC;
11569 geometry.min_width = 20;
11570 geometry.min_height = 20;
11571 geometry.base_width = 0;
11572 geometry.base_height = 0;
11573 geometry.width_inc = 10;
11574 geometry.height_inc = 10;
11576 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11577 drawing_area, &geometry, geometry_mask);
11580 if (!GTK_WIDGET_VISIBLE (window))
11581 gtk_widget_show (window);
11583 gtk_widget_destroy (window);
11590 static int timer = 0;
11593 timeout_test (GtkWidget *label)
11595 static int count = 0;
11596 static char buffer[32];
11598 sprintf (buffer, "count: %d", ++count);
11599 gtk_label_set_text (GTK_LABEL (label), buffer);
11605 start_timeout_test (GtkWidget *widget,
11610 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
11615 stop_timeout_test (GtkWidget *widget,
11620 gtk_timeout_remove (timer);
11626 destroy_timeout_test (GtkWidget *widget,
11627 GtkWidget **window)
11629 stop_timeout_test (NULL, NULL);
11635 create_timeout_test (GtkWidget *widget)
11637 static GtkWidget *window = NULL;
11643 window = gtk_dialog_new ();
11645 gtk_window_set_screen (GTK_WINDOW (window),
11646 gtk_widget_get_screen (widget));
11648 g_signal_connect (window, "destroy",
11649 G_CALLBACK (destroy_timeout_test),
11652 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
11653 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11655 label = gtk_label_new ("count: 0");
11656 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11657 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11658 label, TRUE, TRUE, 0);
11659 gtk_widget_show (label);
11661 button = gtk_button_new_with_label ("close");
11662 g_signal_connect_swapped (button, "clicked",
11663 G_CALLBACK (gtk_widget_destroy),
11665 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11666 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11667 button, TRUE, TRUE, 0);
11668 gtk_widget_grab_default (button);
11669 gtk_widget_show (button);
11671 button = gtk_button_new_with_label ("start");
11672 g_signal_connect (button, "clicked",
11673 G_CALLBACK(start_timeout_test),
11675 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11676 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11677 button, TRUE, TRUE, 0);
11678 gtk_widget_show (button);
11680 button = gtk_button_new_with_label ("stop");
11681 g_signal_connect (button, "clicked",
11682 G_CALLBACK (stop_timeout_test),
11684 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11685 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11686 button, TRUE, TRUE, 0);
11687 gtk_widget_show (button);
11690 if (!GTK_WIDGET_VISIBLE (window))
11691 gtk_widget_show (window);
11693 gtk_widget_destroy (window);
11700 static int idle_id = 0;
11703 idle_test (GtkWidget *label)
11705 static int count = 0;
11706 static char buffer[32];
11708 sprintf (buffer, "count: %d", ++count);
11709 gtk_label_set_text (GTK_LABEL (label), buffer);
11715 start_idle_test (GtkWidget *widget,
11720 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
11725 stop_idle_test (GtkWidget *widget,
11730 gtk_idle_remove (idle_id);
11736 destroy_idle_test (GtkWidget *widget,
11737 GtkWidget **window)
11739 stop_idle_test (NULL, NULL);
11745 toggle_idle_container (GObject *button,
11746 GtkContainer *container)
11748 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
11752 create_idle_test (GtkWidget *widget)
11754 static GtkWidget *window = NULL;
11757 GtkWidget *container;
11761 GtkWidget *button2;
11765 window = gtk_dialog_new ();
11767 gtk_window_set_screen (GTK_WINDOW (window),
11768 gtk_widget_get_screen (widget));
11770 g_signal_connect (window, "destroy",
11771 G_CALLBACK (destroy_idle_test),
11774 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
11775 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11777 label = gtk_label_new ("count: 0");
11778 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11779 gtk_widget_show (label);
11782 gtk_widget_new (GTK_TYPE_HBOX,
11784 /* "GtkContainer::child", gtk_widget_new (GTK_TYPE_HBOX,
11785 * "GtkWidget::visible", TRUE,
11790 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11791 container, TRUE, TRUE, 0);
11794 gtk_widget_new (GTK_TYPE_FRAME,
11796 "label", "Label Container",
11798 "parent", GTK_DIALOG (window)->vbox,
11801 gtk_widget_new (GTK_TYPE_VBOX,
11806 g_object_connect (gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11807 "label", "Resize-Parent",
11808 "user_data", (void*)GTK_RESIZE_PARENT,
11812 "signal::clicked", toggle_idle_container, container,
11814 button = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11815 "label", "Resize-Queue",
11816 "user_data", (void*)GTK_RESIZE_QUEUE,
11821 g_object_connect (button,
11822 "signal::clicked", toggle_idle_container, container,
11824 button2 = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11825 "label", "Resize-Immediate",
11826 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
11828 g_object_connect (button2,
11829 "signal::clicked", toggle_idle_container, container,
11831 g_object_set (button2,
11837 button = gtk_button_new_with_label ("close");
11838 g_signal_connect_swapped (button, "clicked",
11839 G_CALLBACK (gtk_widget_destroy),
11841 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11842 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11843 button, TRUE, TRUE, 0);
11844 gtk_widget_grab_default (button);
11845 gtk_widget_show (button);
11847 button = gtk_button_new_with_label ("start");
11848 g_signal_connect (button, "clicked",
11849 G_CALLBACK (start_idle_test),
11851 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11852 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11853 button, TRUE, TRUE, 0);
11854 gtk_widget_show (button);
11856 button = gtk_button_new_with_label ("stop");
11857 g_signal_connect (button, "clicked",
11858 G_CALLBACK (stop_idle_test),
11860 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11861 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11862 button, TRUE, TRUE, 0);
11863 gtk_widget_show (button);
11866 if (!GTK_WIDGET_VISIBLE (window))
11867 gtk_widget_show (window);
11869 gtk_widget_destroy (window);
11877 reload_all_rc_files (void)
11879 static GdkAtom atom_rcfiles = GDK_NONE;
11881 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
11885 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
11887 for(i = 0; i < 5; i++)
11888 send_event->client.data.l[i] = 0;
11889 send_event->client.data_format = 32;
11890 send_event->client.message_type = atom_rcfiles;
11891 gdk_event_send_clientmessage_toall (send_event);
11893 gdk_event_free (send_event);
11897 create_rc_file (GtkWidget *widget)
11899 static GtkWidget *window = NULL;
11907 window = gtk_dialog_new ();
11909 gtk_window_set_screen (GTK_WINDOW (window),
11910 gtk_widget_get_screen (widget));
11912 g_signal_connect (window, "destroy",
11913 G_CALLBACK (gtk_widget_destroyed),
11916 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
11917 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
11919 vbox = gtk_vbox_new (FALSE, 0);
11920 gtk_container_add (GTK_CONTAINER (frame), vbox);
11922 label = gtk_label_new ("This label should be red");
11923 gtk_widget_set_name (label, "testgtk-red-label");
11924 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11926 label = gtk_label_new ("This label should be green");
11927 gtk_widget_set_name (label, "testgtk-green-label");
11928 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11930 label = gtk_label_new ("This label should be blue");
11931 gtk_widget_set_name (label, "testgtk-blue-label");
11932 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11934 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
11935 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11937 button = gtk_button_new_with_label ("Reload");
11938 g_signal_connect (button, "clicked",
11939 G_CALLBACK (gtk_rc_reparse_all), NULL);
11940 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11941 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11942 button, TRUE, TRUE, 0);
11943 gtk_widget_grab_default (button);
11945 button = gtk_button_new_with_label ("Reload All");
11946 g_signal_connect (button, "clicked",
11947 G_CALLBACK (reload_all_rc_files), NULL);
11948 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11949 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11950 button, TRUE, TRUE, 0);
11952 button = gtk_button_new_with_label ("Close");
11953 g_signal_connect_swapped (button, "clicked",
11954 G_CALLBACK (gtk_widget_destroy),
11956 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11957 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11958 button, TRUE, TRUE, 0);
11961 if (!GTK_WIDGET_VISIBLE (window))
11962 gtk_widget_show_all (window);
11964 gtk_widget_destroy (window);
11968 * Test of recursive mainloop
11972 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
11979 create_mainloop (GtkWidget *widget)
11981 static GtkWidget *window = NULL;
11987 window = gtk_dialog_new ();
11989 gtk_window_set_screen (GTK_WINDOW (window),
11990 gtk_widget_get_screen (widget));
11992 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
11994 g_signal_connect (window, "destroy",
11995 G_CALLBACK (mainloop_destroyed),
11998 label = gtk_label_new ("In recursive main loop...");
11999 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
12001 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
12003 gtk_widget_show (label);
12005 button = gtk_button_new_with_label ("Leave");
12006 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
12009 g_signal_connect_swapped (button, "clicked",
12010 G_CALLBACK (gtk_widget_destroy),
12013 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12014 gtk_widget_grab_default (button);
12016 gtk_widget_show (button);
12019 if (!GTK_WIDGET_VISIBLE (window))
12021 gtk_widget_show (window);
12023 g_print ("create_mainloop: start\n");
12025 g_print ("create_mainloop: done\n");
12028 gtk_widget_destroy (window);
12032 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
12037 gint imin, imax, jmin, jmax;
12039 layout = GTK_LAYOUT (widget);
12041 if (event->window != layout->bin_window)
12044 imin = (event->area.x) / 10;
12045 imax = (event->area.x + event->area.width + 9) / 10;
12047 jmin = (event->area.y) / 10;
12048 jmax = (event->area.y + event->area.height + 9) / 10;
12050 for (i=imin; i<imax; i++)
12051 for (j=jmin; j<jmax; j++)
12053 gdk_draw_rectangle (layout->bin_window,
12054 widget->style->black_gc,
12062 void create_layout (GtkWidget *widget)
12064 static GtkWidget *window = NULL;
12066 GtkWidget *scrolledwindow;
12075 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12076 gtk_window_set_screen (GTK_WINDOW (window),
12077 gtk_widget_get_screen (widget));
12079 g_signal_connect (window, "destroy",
12080 G_CALLBACK (gtk_widget_destroyed),
12083 gtk_window_set_title (GTK_WINDOW (window), "Layout");
12084 gtk_widget_set_size_request (window, 200, 200);
12086 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
12087 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
12089 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
12090 GTK_CORNER_TOP_RIGHT);
12092 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
12094 layout = gtk_layout_new (NULL, NULL);
12095 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
12097 /* We set step sizes here since GtkLayout does not set
12100 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
12101 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
12103 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
12104 g_signal_connect (layout, "expose_event",
12105 G_CALLBACK (layout_expose_handler), NULL);
12107 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
12109 for (i=0 ; i < 16 ; i++)
12110 for (j=0 ; j < 16 ; j++)
12112 sprintf(buf, "Button %d, %d", i, j);
12114 button = gtk_button_new_with_label (buf);
12116 button = gtk_label_new (buf);
12118 gtk_layout_put (GTK_LAYOUT (layout), button,
12122 for (i=16; i < 1280; i++)
12124 sprintf(buf, "Button %d, %d", i, 0);
12126 button = gtk_button_new_with_label (buf);
12128 button = gtk_label_new (buf);
12130 gtk_layout_put (GTK_LAYOUT (layout), button,
12135 if (!GTK_WIDGET_VISIBLE (window))
12136 gtk_widget_show_all (window);
12138 gtk_widget_destroy (window);
12142 create_styles (GtkWidget *widget)
12144 static GtkWidget *window = NULL;
12149 static GdkColor red = { 0, 0xffff, 0, 0 };
12150 static GdkColor green = { 0, 0, 0xffff, 0 };
12151 static GdkColor blue = { 0, 0, 0, 0xffff };
12152 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
12153 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
12154 PangoFontDescription *font_desc;
12156 GtkRcStyle *rc_style;
12160 window = gtk_dialog_new ();
12161 gtk_window_set_screen (GTK_WINDOW (window),
12162 gtk_widget_get_screen (widget));
12164 g_signal_connect (window, "destroy",
12165 G_CALLBACK (gtk_widget_destroyed),
12169 button = gtk_button_new_with_label ("Close");
12170 g_signal_connect_swapped (button, "clicked",
12171 G_CALLBACK (gtk_widget_destroy),
12173 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12174 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12175 button, TRUE, TRUE, 0);
12176 gtk_widget_show (button);
12178 vbox = gtk_vbox_new (FALSE, 5);
12179 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
12180 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
12182 label = gtk_label_new ("Font:");
12183 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12184 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12186 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
12188 button = gtk_button_new_with_label ("Some Text");
12189 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
12190 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12192 label = gtk_label_new ("Foreground:");
12193 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12194 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12196 button = gtk_button_new_with_label ("Some Text");
12197 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
12198 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12200 label = gtk_label_new ("Background:");
12201 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12202 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12204 button = gtk_button_new_with_label ("Some Text");
12205 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
12206 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12208 label = gtk_label_new ("Text:");
12209 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12210 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12212 entry = gtk_entry_new ();
12213 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12214 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
12215 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12217 label = gtk_label_new ("Base:");
12218 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12219 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12221 entry = gtk_entry_new ();
12222 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12223 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
12224 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12226 label = gtk_label_new ("Multiple:");
12227 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12228 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12230 button = gtk_button_new_with_label ("Some Text");
12232 rc_style = gtk_rc_style_new ();
12234 rc_style->font_desc = pango_font_description_copy (font_desc);
12235 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
12236 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
12237 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
12238 rc_style->fg[GTK_STATE_NORMAL] = yellow;
12239 rc_style->bg[GTK_STATE_NORMAL] = blue;
12240 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
12241 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
12242 rc_style->fg[GTK_STATE_ACTIVE] = red;
12243 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
12244 rc_style->xthickness = 5;
12245 rc_style->ythickness = 5;
12247 gtk_widget_modify_style (button, rc_style);
12248 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
12250 g_object_unref (rc_style);
12252 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12255 if (!GTK_WIDGET_VISIBLE (window))
12256 gtk_widget_show_all (window);
12258 gtk_widget_destroy (window);
12262 * Main Window and Exit
12266 do_exit (GtkWidget *widget, GtkWidget *window)
12268 gtk_widget_destroy (window);
12274 void (*func) (GtkWidget *widget);
12275 gboolean do_not_benchmark;
12278 { "big windows", create_big_windows },
12279 { "button box", create_button_box },
12280 { "buttons", create_buttons },
12281 { "check buttons", create_check_buttons },
12282 { "clist", create_clist},
12283 { "color selection", create_color_selection },
12284 { "ctree", create_ctree },
12285 { "cursors", create_cursors },
12286 { "dialog", create_dialog },
12287 { "display & screen", create_display_screen },
12288 { "entry", create_entry },
12289 { "event watcher", create_event_watcher },
12290 { "file selection", create_file_selection },
12291 { "flipping", create_flipping },
12292 { "focus", create_focus },
12293 { "font selection", create_font_selection },
12294 { "gamma curve", create_gamma_curve, TRUE },
12295 { "gridded geometry", create_gridded_geometry, TRUE },
12296 { "handle box", create_handle_box },
12297 { "image from drawable", create_get_image },
12298 { "image", create_image },
12299 { "item factory", create_item_factory },
12300 { "key lookup", create_key_lookup },
12301 { "labels", create_labels },
12302 { "layout", create_layout },
12303 { "list", create_list },
12304 { "menus", create_menus },
12305 { "message dialog", create_message_dialog },
12306 { "modal window", create_modal_window, TRUE },
12307 { "notebook", create_notebook },
12308 { "panes", create_panes },
12309 { "paned keyboard", create_paned_keyboard_navigation },
12310 { "pixmap", create_pixmap },
12311 { "preview color", create_color_preview, TRUE },
12312 { "preview gray", create_gray_preview, TRUE },
12313 { "progress bar", create_progress_bar },
12314 { "properties", create_properties },
12315 { "radio buttons", create_radio_buttons },
12316 { "range controls", create_range_controls },
12317 { "rc file", create_rc_file },
12318 { "reparent", create_reparent },
12319 { "resize grips", create_resize_grips },
12320 { "rulers", create_rulers },
12321 { "saved position", create_saved_position },
12322 { "scrolled windows", create_scrolled_windows },
12323 { "shapes", create_shapes },
12324 { "size groups", create_size_groups },
12325 { "spinbutton", create_spins },
12326 { "statusbar", create_statusbar },
12327 { "styles", create_styles },
12328 { "test idle", create_idle_test },
12329 { "test mainloop", create_mainloop, TRUE },
12330 { "test scrolling", create_scroll_test },
12331 { "test selection", create_selection_test },
12332 { "test timeout", create_timeout_test },
12333 { "text", create_text },
12334 { "toggle buttons", create_toggle_buttons },
12335 { "toolbar", create_toolbar },
12336 { "tooltips", create_tooltips },
12337 { "tree", create_tree_mode_window},
12338 { "WM hints", create_wmhints },
12339 { "window sizing", create_window_sizing },
12340 { "window states", create_window_states }
12342 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
12345 create_main_window (void)
12350 GtkWidget *scrolled_window;
12354 GtkWidget *separator;
12355 GdkGeometry geometry;
12358 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12359 gtk_widget_set_name (window, "main window");
12360 gtk_widget_set_uposition (window, 20, 20);
12361 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
12363 geometry.min_width = -1;
12364 geometry.min_height = -1;
12365 geometry.max_width = -1;
12366 geometry.max_height = G_MAXSHORT;
12367 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
12369 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
12371 g_signal_connect (window, "destroy",
12372 G_CALLBACK (gtk_main_quit),
12374 g_signal_connect (window, "delete-event",
12375 G_CALLBACK (gtk_false),
12378 box1 = gtk_vbox_new (FALSE, 0);
12379 gtk_container_add (GTK_CONTAINER (window), box1);
12381 if (gtk_micro_version > 0)
12386 gtk_micro_version);
12391 gtk_minor_version);
12393 label = gtk_label_new (buffer);
12394 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
12395 gtk_widget_set_name (label, "testgtk-version-label");
12397 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
12398 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
12399 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
12401 GTK_POLICY_AUTOMATIC);
12402 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
12404 box2 = gtk_vbox_new (FALSE, 0);
12405 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12406 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
12407 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
12408 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
12409 gtk_widget_show (box2);
12411 for (i = 0; i < nbuttons; i++)
12413 button = gtk_button_new_with_label (buttons[i].label);
12414 if (buttons[i].func)
12415 g_signal_connect (button,
12417 G_CALLBACK(buttons[i].func),
12420 gtk_widget_set_sensitive (button, FALSE);
12421 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12424 separator = gtk_hseparator_new ();
12425 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
12427 box2 = gtk_vbox_new (FALSE, 10);
12428 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12429 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
12431 button = gtk_button_new_with_mnemonic ("_Close");
12432 g_signal_connect (button, "clicked",
12433 G_CALLBACK (do_exit),
12435 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12436 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12437 gtk_widget_grab_default (button);
12439 gtk_widget_show_all (window);
12445 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
12446 G_FILE_TEST_EXISTS))
12448 putenv ("GDK_PIXBUF_MODULE_FILE=../gdk-pixbuf/gdk-pixbuf.loaders");
12449 putenv ("GTK_IM_MODULE_FILE=../modules/input/gtk.immodules");
12454 pad (const char *str, int to)
12456 static char buf[256];
12457 int len = strlen (str);
12460 for (i = 0; i < to; i++)
12465 memcpy (buf, str, len);
12471 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
12473 fn (widget); /* on */
12474 while (g_main_context_iteration (NULL, FALSE));
12475 fn (widget); /* off */
12476 while (g_main_context_iteration (NULL, FALSE));
12480 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
12486 static gboolean printed_headers = FALSE;
12488 if (!printed_headers) {
12489 g_print ("Test Iters First Other\n");
12490 g_print ("-------------------- ----- ---------- ----------\n");
12491 printed_headers = TRUE;
12494 g_get_current_time (&tv0);
12495 bench_iteration (widget, fn);
12496 g_get_current_time (&tv1);
12498 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12499 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12501 g_get_current_time (&tv0);
12502 for (n = 0; n < num - 1; n++)
12503 bench_iteration (widget, fn);
12504 g_get_current_time (&tv1);
12505 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12506 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12508 g_print ("%s %5d ", pad (name, 20), num);
12510 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
12512 g_print ("%10.1f\n", dt_first);
12516 do_bench (char* what, int num)
12520 void (* fn) (GtkWidget *widget);
12522 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12524 if (g_ascii_strcasecmp (what, "ALL") == 0)
12526 for (i = 0; i < nbuttons; i++)
12528 if (!buttons[i].do_not_benchmark)
12529 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
12536 for (i = 0; i < nbuttons; i++)
12538 if (strcmp (buttons[i].label, what) == 0)
12540 fn = buttons[i].func;
12546 g_print ("Can't bench: \"%s\" not found.\n", what);
12548 do_real_bench (widget, fn, buttons[i].label, num);
12555 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
12560 main (int argc, char *argv[])
12562 GtkBindingSet *binding_set;
12564 gboolean done_benchmarks = FALSE;
12566 srand (time (NULL));
12570 /* Check to see if we are being run from the correct
12573 if (file_exists ("testgtkrc"))
12574 gtk_rc_add_default_file ("testgtkrc");
12576 g_set_application_name ("GTK+ Test Program");
12578 gtk_init (&argc, &argv);
12582 for (i = 1; i < argc; i++)
12584 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
12591 nextarg = strchr (argv[i], '=');
12602 count = strchr (nextarg, ':');
12605 what = g_strndup (nextarg, count - nextarg);
12607 num = atoi (count);
12612 what = g_strdup (nextarg);
12614 do_bench (what, num ? num : 1);
12615 done_benchmarks = TRUE;
12620 if (done_benchmarks)
12625 binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_WIDGET));
12626 gtk_binding_entry_add_signal (binding_set,
12627 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
12630 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
12632 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
12636 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
12637 " fg[NORMAL] = \"#ff0000\"\n"
12638 " font = \"Sans 18\"\n"
12640 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
12642 create_main_window ();
12648 while (g_main_context_pending (NULL))
12649 g_main_context_iteration (NULL, FALSE);
12652 while (g_main_context_pending (NULL))
12653 g_main_context_iteration (NULL, FALSE);