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/.
27 #undef GTK_DISABLE_DEPRECATED
43 #define GTK_ENABLE_BROKEN
46 #include "gdk/gdkkeysyms.h"
49 #define sleep(n) _sleep(n)
52 #include "prop-editor.h"
54 #include "circles.xbm"
58 file_exists (const char *filename)
62 return stat (filename, &statbuf) == 0;
66 shape_create_icon (GdkScreen *screen,
75 build_option_menu (gchar *items[],
78 void (*func)(GtkWidget *widget, gpointer data),
81 /* macro, structure and variables used by tree window demos */
82 #define DEFAULT_NUMBER_OF_ITEM 3
83 #define DEFAULT_RECURSION_LEVEL 3
86 GSList* selection_mode_group;
87 GtkWidget* single_button;
88 GtkWidget* browse_button;
89 GtkWidget* multiple_button;
90 GtkWidget* draw_line_button;
91 GtkWidget* view_line_button;
92 GtkWidget* no_root_item_button;
93 GtkWidget* nb_item_spinner;
94 GtkWidget* recursion_spinner;
95 } sTreeSampleSelection;
97 typedef struct sTreeButtons {
99 GtkWidget* add_button;
100 GtkWidget* remove_button;
101 GtkWidget* subtree_button;
103 /* end of tree section */
106 build_option_menu (gchar *items[],
109 void (*func)(GtkWidget *widget, gpointer data),
114 GtkWidget *menu_item;
118 omenu = gtk_option_menu_new ();
119 g_signal_connect (omenu, "changed",
120 G_CALLBACK (func), data);
122 menu = gtk_menu_new ();
125 for (i = 0; i < num_items; i++)
127 menu_item = gtk_radio_menu_item_new_with_label (group, items[i]);
128 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menu_item));
129 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
131 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
132 gtk_widget_show (menu_item);
135 gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
136 gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), history);
142 destroy_tooltips (GtkWidget *widget, GtkWindow **window)
144 GtkTooltips *tt = g_object_get_data (G_OBJECT (*window), "tooltips");
151 * Big windows and guffaw scrolling
155 pattern_expose (GtkWidget *widget,
156 GdkEventExpose *event,
160 GdkWindow *window = event->window;
162 color = g_object_get_data (G_OBJECT (window), "pattern-color");
165 GdkGC *tmp_gc = gdk_gc_new (window);
166 gdk_gc_set_rgb_fg_color (tmp_gc, color);
168 gdk_draw_rectangle (window, tmp_gc, TRUE,
169 event->area.x, event->area.y,
170 event->area.width, event->area.height);
172 g_object_unref (tmp_gc);
179 pattern_set_bg (GtkWidget *widget,
183 static const GdkColor colors[] = {
184 { 0, 0x4444, 0x4444, 0xffff },
185 { 0, 0x8888, 0x8888, 0xffff },
186 { 0, 0xaaaa, 0xaaaa, 0xffff }
189 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
190 gdk_window_set_user_data (child, widget);
194 create_pattern (GtkWidget *widget,
205 while (2 * h <= height)
210 while (2 * w <= width)
212 if ((i + j) % 2 == 0)
217 GdkWindowAttr attributes;
219 attributes.window_type = GDK_WINDOW_CHILD;
222 attributes.width = w;
223 attributes.height = h;
224 attributes.wclass = GDK_INPUT_OUTPUT;
225 attributes.event_mask = GDK_EXPOSURE_MASK;
226 attributes.visual = gtk_widget_get_visual (widget);
227 attributes.colormap = gtk_widget_get_colormap (widget);
229 child = gdk_window_new (parent, &attributes,
230 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
232 pattern_set_bg (widget, child, level);
235 create_pattern (widget, child, level + 1, w, h);
237 gdk_window_show (child);
247 #define PATTERN_SIZE (1 << 18)
250 pattern_hadj_changed (GtkAdjustment *adj,
253 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
254 gint new_value = adj->value;
256 if (GTK_WIDGET_REALIZED (darea))
258 gdk_window_scroll (darea->window, *old_value - new_value, 0);
259 *old_value = new_value;
264 pattern_vadj_changed (GtkAdjustment *adj,
267 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
268 gint new_value = adj->value;
270 if (GTK_WIDGET_REALIZED (darea))
272 gdk_window_scroll (darea->window, 0, *old_value - new_value);
273 *old_value = new_value;
278 pattern_realize (GtkWidget *widget,
281 pattern_set_bg (widget, widget->window, 0);
282 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
286 create_big_windows (GtkWidget *widget)
288 static GtkWidget *window = NULL;
289 GtkWidget *darea, *table, *scrollbar;
293 static gint current_x;
294 static gint current_y;
301 window = gtk_dialog_new_with_buttons ("Big Windows",
307 gtk_window_set_screen (GTK_WINDOW (window),
308 gtk_widget_get_screen (widget));
310 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
312 g_signal_connect (window, "destroy",
313 G_CALLBACK (gtk_widget_destroyed),
316 g_signal_connect (window, "response",
317 G_CALLBACK (gtk_widget_destroy),
320 table = gtk_table_new (2, 2, FALSE);
321 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
322 table, TRUE, TRUE, 0);
324 darea = gtk_drawing_area_new ();
326 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
327 g_signal_connect (hadj, "value_changed",
328 G_CALLBACK (pattern_hadj_changed), darea);
329 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
331 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
332 g_signal_connect (vadj, "value_changed",
333 G_CALLBACK (pattern_vadj_changed), darea);
334 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
336 g_signal_connect (darea, "realize",
337 G_CALLBACK (pattern_realize),
339 g_signal_connect (darea, "expose_event",
340 G_CALLBACK (pattern_expose),
343 eventbox = gtk_event_box_new ();
344 gtk_table_attach (GTK_TABLE (table), eventbox,
346 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
349 gtk_container_add (GTK_CONTAINER (eventbox), darea);
351 scrollbar = gtk_hscrollbar_new (hadj);
352 gtk_table_attach (GTK_TABLE (table), scrollbar,
354 GTK_FILL | GTK_EXPAND, GTK_FILL,
357 scrollbar = gtk_vscrollbar_new (vadj);
358 gtk_table_attach (GTK_TABLE (table), scrollbar,
360 GTK_FILL, GTK_EXPAND | GTK_FILL,
365 if (!GTK_WIDGET_VISIBLE (window))
366 gtk_widget_show_all (window);
368 gtk_widget_hide (window);
376 button_window (GtkWidget *widget,
379 if (!GTK_WIDGET_VISIBLE (button))
380 gtk_widget_show (button);
382 gtk_widget_hide (button);
386 create_buttons (GtkWidget *widget)
388 static GtkWidget *window = NULL;
392 GtkWidget *button[10];
393 GtkWidget *separator;
397 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
398 gtk_window_set_screen (GTK_WINDOW (window),
399 gtk_widget_get_screen (widget));
401 g_signal_connect (window, "destroy",
402 G_CALLBACK (gtk_widget_destroyed),
405 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
406 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
408 box1 = gtk_vbox_new (FALSE, 0);
409 gtk_container_add (GTK_CONTAINER (window), box1);
411 table = gtk_table_new (3, 3, FALSE);
412 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
413 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
414 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
415 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
417 button[0] = gtk_button_new_with_label ("button1");
418 button[1] = gtk_button_new_with_mnemonic ("_button2");
419 button[2] = gtk_button_new_with_mnemonic ("_button3");
420 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
421 button[4] = gtk_button_new_with_label ("button5");
422 button[5] = gtk_button_new_with_label ("button6");
423 button[6] = gtk_button_new_with_label ("button7");
424 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
425 button[8] = gtk_button_new_with_label ("button9");
427 g_signal_connect (button[0], "clicked",
428 G_CALLBACK (button_window),
431 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
432 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
434 g_signal_connect (button[1], "clicked",
435 G_CALLBACK (button_window),
438 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
439 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
441 g_signal_connect (button[2], "clicked",
442 G_CALLBACK (button_window),
444 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
445 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
447 g_signal_connect (button[3], "clicked",
448 G_CALLBACK (button_window),
450 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
451 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
453 g_signal_connect (button[4], "clicked",
454 G_CALLBACK (button_window),
456 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
457 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
459 g_signal_connect (button[5], "clicked",
460 G_CALLBACK (button_window),
462 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
463 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
465 g_signal_connect (button[6], "clicked",
466 G_CALLBACK (button_window),
468 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
469 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
471 g_signal_connect (button[7], "clicked",
472 G_CALLBACK (button_window),
474 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
475 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
477 g_signal_connect (button[8], "clicked",
478 G_CALLBACK (button_window),
480 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
481 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
483 separator = gtk_hseparator_new ();
484 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
486 box2 = gtk_vbox_new (FALSE, 10);
487 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
488 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
490 button[9] = gtk_button_new_with_label ("close");
491 g_signal_connect_swapped (button[9], "clicked",
492 G_CALLBACK (gtk_widget_destroy),
494 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
495 GTK_WIDGET_SET_FLAGS (button[9], GTK_CAN_DEFAULT);
496 gtk_widget_grab_default (button[9]);
499 if (!GTK_WIDGET_VISIBLE (window))
500 gtk_widget_show_all (window);
502 gtk_widget_destroy (window);
510 create_toggle_buttons (GtkWidget *widget)
512 static GtkWidget *window = NULL;
516 GtkWidget *separator;
520 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
521 gtk_window_set_screen (GTK_WINDOW (window),
522 gtk_widget_get_screen (widget));
524 g_signal_connect (window, "destroy",
525 G_CALLBACK (gtk_widget_destroyed),
528 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
529 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
531 box1 = gtk_vbox_new (FALSE, 0);
532 gtk_container_add (GTK_CONTAINER (window), box1);
534 box2 = gtk_vbox_new (FALSE, 10);
535 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
536 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
538 button = gtk_toggle_button_new_with_label ("button1");
539 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
541 button = gtk_toggle_button_new_with_label ("button2");
542 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
544 button = gtk_toggle_button_new_with_label ("button3");
545 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
547 button = gtk_toggle_button_new_with_label ("inconsistent");
548 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
549 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
551 separator = gtk_hseparator_new ();
552 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
554 box2 = gtk_vbox_new (FALSE, 10);
555 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
556 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
558 button = gtk_button_new_with_label ("close");
559 g_signal_connect_swapped (button, "clicked",
560 G_CALLBACK (gtk_widget_destroy),
562 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
563 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
564 gtk_widget_grab_default (button);
567 if (!GTK_WIDGET_VISIBLE (window))
568 gtk_widget_show_all (window);
570 gtk_widget_destroy (window);
574 create_widget_grid (GType widget_type)
577 GtkWidget *group_widget = NULL;
580 table = gtk_table_new (FALSE, 3, 3);
582 for (i = 0; i < 5; i++)
584 for (j = 0; j < 5; j++)
589 if (i == 0 && j == 0)
595 tmp = g_strdup_printf ("%d", j);
596 widget = gtk_label_new (tmp);
601 tmp = g_strdup_printf ("%c", 'A' + i - 1);
602 widget = gtk_label_new (tmp);
607 widget = g_object_new (widget_type, NULL);
609 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
612 group_widget = widget;
614 g_object_set (widget, "group", group_widget, NULL);
619 gtk_table_attach (GTK_TABLE (table), widget,
634 create_check_buttons (GtkWidget *widget)
636 static GtkWidget *window = NULL;
640 GtkWidget *separator;
645 window = gtk_dialog_new_with_buttons ("Check Buttons",
651 gtk_window_set_screen (GTK_WINDOW (window),
652 gtk_widget_get_screen (widget));
654 g_signal_connect (window, "destroy",
655 G_CALLBACK (gtk_widget_destroyed),
657 g_signal_connect (window, "response",
658 G_CALLBACK (gtk_widget_destroy),
661 box1 = GTK_DIALOG (window)->vbox;
663 box2 = gtk_vbox_new (FALSE, 10);
664 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
665 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
667 button = gtk_check_button_new_with_mnemonic ("_button1");
668 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
670 button = gtk_check_button_new_with_label ("button2");
671 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
673 button = gtk_check_button_new_with_label ("button3");
674 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
676 button = gtk_check_button_new_with_label ("inconsistent");
677 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
678 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
680 separator = gtk_hseparator_new ();
681 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
683 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
684 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
685 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
688 if (!GTK_WIDGET_VISIBLE (window))
689 gtk_widget_show_all (window);
691 gtk_widget_destroy (window);
699 create_radio_buttons (GtkWidget *widget)
701 static GtkWidget *window = NULL;
705 GtkWidget *separator;
710 window = gtk_dialog_new_with_buttons ("Radio Buttons",
716 gtk_window_set_screen (GTK_WINDOW (window),
717 gtk_widget_get_screen (widget));
719 g_signal_connect (window, "destroy",
720 G_CALLBACK (gtk_widget_destroyed),
722 g_signal_connect (window, "response",
723 G_CALLBACK (gtk_widget_destroy),
726 box1 = GTK_DIALOG (window)->vbox;
728 box2 = gtk_vbox_new (FALSE, 10);
729 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
730 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
732 button = gtk_radio_button_new_with_label (NULL, "button1");
733 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
735 button = gtk_radio_button_new_with_label (
736 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
738 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
739 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
741 button = gtk_radio_button_new_with_label (
742 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
744 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
746 button = gtk_radio_button_new_with_label (
747 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
749 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
750 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
752 separator = gtk_hseparator_new ();
753 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
755 box2 = gtk_vbox_new (FALSE, 10);
756 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
757 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
759 button = gtk_radio_button_new_with_label (NULL, "button4");
760 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
761 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
763 button = gtk_radio_button_new_with_label (
764 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
766 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
767 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
768 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
770 button = gtk_radio_button_new_with_label (
771 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
773 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
774 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
776 separator = gtk_hseparator_new ();
777 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
779 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
780 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
781 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
784 if (!GTK_WIDGET_VISIBLE (window))
785 gtk_widget_show_all (window);
787 gtk_widget_destroy (window);
795 create_bbox (gint horizontal,
806 frame = gtk_frame_new (title);
809 bbox = gtk_hbutton_box_new ();
811 bbox = gtk_vbutton_box_new ();
813 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
814 gtk_container_add (GTK_CONTAINER (frame), bbox);
816 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
817 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
818 gtk_button_box_set_child_size (GTK_BUTTON_BOX (bbox), child_w, child_h);
820 button = gtk_button_new_with_label ("OK");
821 gtk_container_add (GTK_CONTAINER (bbox), button);
823 button = gtk_button_new_with_label ("Cancel");
824 gtk_container_add (GTK_CONTAINER (bbox), button);
826 button = gtk_button_new_with_label ("Help");
827 gtk_container_add (GTK_CONTAINER (bbox), button);
833 create_button_box (GtkWidget *widget)
835 static GtkWidget* window = NULL;
836 GtkWidget *main_vbox;
839 GtkWidget *frame_horz;
840 GtkWidget *frame_vert;
844 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
845 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
846 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
848 g_signal_connect (window, "destroy",
849 G_CALLBACK (gtk_widget_destroyed),
852 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
854 main_vbox = gtk_vbox_new (FALSE, 0);
855 gtk_container_add (GTK_CONTAINER (window), main_vbox);
857 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
858 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
860 vbox = gtk_vbox_new (FALSE, 0);
861 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
862 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
864 gtk_box_pack_start (GTK_BOX (vbox),
865 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
868 gtk_box_pack_start (GTK_BOX (vbox),
869 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
872 gtk_box_pack_start (GTK_BOX (vbox),
873 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
876 gtk_box_pack_start (GTK_BOX (vbox),
877 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
880 frame_vert = gtk_frame_new ("Vertical Button Boxes");
881 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
883 hbox = gtk_hbox_new (FALSE, 0);
884 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
885 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
887 gtk_box_pack_start (GTK_BOX (hbox),
888 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
891 gtk_box_pack_start (GTK_BOX (hbox),
892 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
895 gtk_box_pack_start (GTK_BOX (hbox),
896 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
899 gtk_box_pack_start (GTK_BOX (hbox),
900 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
904 if (!GTK_WIDGET_VISIBLE (window))
905 gtk_widget_show_all (window);
907 gtk_widget_destroy (window);
915 new_pixmap (char *filename,
917 GdkColor *background)
923 if (strcmp (filename, "test.xpm") == 0 ||
924 !file_exists (filename))
926 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask,
931 pixmap = gdk_pixmap_create_from_xpm (window, &mask,
935 wpixmap = gtk_image_new_from_pixmap (pixmap, mask);
942 set_toolbar_small_stock (GtkWidget *widget,
945 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
949 set_toolbar_large_stock (GtkWidget *widget,
952 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
956 set_toolbar_horizontal (GtkWidget *widget,
959 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_HORIZONTAL);
963 set_toolbar_vertical (GtkWidget *widget,
966 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_VERTICAL);
970 set_toolbar_icons (GtkWidget *widget,
973 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
977 set_toolbar_text (GtkWidget *widget,
980 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
984 set_toolbar_both (GtkWidget *widget,
987 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
991 set_toolbar_both_horiz (GtkWidget *widget,
994 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
998 set_toolbar_enable (GtkWidget *widget,
1001 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), TRUE);
1005 set_toolbar_disable (GtkWidget *widget,
1008 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), FALSE);
1012 create_toolbar (GtkWidget *widget)
1014 static GtkWidget *window = NULL;
1020 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1021 gtk_window_set_screen (GTK_WINDOW (window),
1022 gtk_widget_get_screen (widget));
1024 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1025 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
1027 g_signal_connect (window, "destroy",
1028 G_CALLBACK (gtk_widget_destroyed),
1031 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1032 gtk_widget_realize (window);
1034 toolbar = gtk_toolbar_new ();
1036 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1038 "Stock icon: New", "Toolbar/New",
1039 G_CALLBACK (set_toolbar_small_stock), toolbar, -1);
1041 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1043 "Stock icon: Open", "Toolbar/Open",
1044 G_CALLBACK (set_toolbar_large_stock), toolbar, -1);
1046 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1047 "Horizontal", "Horizontal toolbar layout", "Toolbar/Horizontal",
1048 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1049 G_CALLBACK (set_toolbar_horizontal), toolbar);
1050 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1051 "Vertical", "Vertical toolbar layout", "Toolbar/Vertical",
1052 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1053 G_CALLBACK (set_toolbar_vertical), toolbar);
1055 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1057 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1058 "Icons", "Only show toolbar icons", "Toolbar/IconsOnly",
1059 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1060 G_CALLBACK (set_toolbar_icons), toolbar);
1061 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1062 "Text", "Only show toolbar text", "Toolbar/TextOnly",
1063 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1064 G_CALLBACK (set_toolbar_text), toolbar);
1065 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1066 "Both", "Show toolbar icons and text", "Toolbar/Both",
1067 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1068 G_CALLBACK (set_toolbar_both), toolbar);
1069 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1070 "Both (horizontal)",
1071 "Show toolbar icons and text in a horizontal fashion",
1072 "Toolbar/BothHoriz",
1073 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1074 G_CALLBACK (set_toolbar_both_horiz), toolbar);
1076 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1078 entry = gtk_entry_new ();
1080 gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), entry, "This is an unusable GtkEntry ;)", "Hey don't click me!!!");
1082 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1085 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1087 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1088 "Enable", "Enable tooltips", NULL,
1089 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1090 G_CALLBACK (set_toolbar_enable), toolbar);
1091 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1092 "Disable", "Disable tooltips", NULL,
1093 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1094 G_CALLBACK (set_toolbar_disable), toolbar);
1096 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1098 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1099 "Frobate", "Frobate tooltip", NULL,
1100 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1102 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1103 "Baz", "Baz tooltip", NULL,
1104 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1107 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1109 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1110 "Blah", "Blah tooltip", NULL,
1111 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1113 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1114 "Bar", "Bar tooltip", NULL,
1115 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1118 gtk_container_add (GTK_CONTAINER (window), toolbar);
1121 if (!GTK_WIDGET_VISIBLE (window))
1122 gtk_widget_show_all (window);
1124 gtk_widget_destroy (window);
1128 make_toolbar (GtkWidget *window)
1132 if (!GTK_WIDGET_REALIZED (window))
1133 gtk_widget_realize (window);
1135 toolbar = gtk_toolbar_new ();
1137 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1138 "Horizontal", "Horizontal toolbar layout", NULL,
1139 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1140 G_CALLBACK (set_toolbar_horizontal), toolbar);
1141 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1142 "Vertical", "Vertical toolbar layout", NULL,
1143 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1144 G_CALLBACK (set_toolbar_vertical), toolbar);
1146 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1148 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1149 "Icons", "Only show toolbar icons", NULL,
1150 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1151 G_CALLBACK (set_toolbar_icons), toolbar);
1152 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1153 "Text", "Only show toolbar text", NULL,
1154 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1155 G_CALLBACK (set_toolbar_text), toolbar);
1156 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1157 "Both", "Show toolbar icons and text", NULL,
1158 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1159 G_CALLBACK (set_toolbar_both), toolbar);
1161 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1163 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1164 "Woot", "Woot woot woot", NULL,
1165 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1167 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1168 "Blah", "Blah blah blah", "Toolbar/Big",
1169 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1172 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1174 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1175 "Enable", "Enable tooltips", NULL,
1176 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1177 G_CALLBACK (set_toolbar_enable), toolbar);
1178 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1179 "Disable", "Disable tooltips", NULL,
1180 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1181 G_CALLBACK (set_toolbar_disable), toolbar);
1183 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1185 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1186 "Hoo", "Hoo tooltip", NULL,
1187 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1189 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1190 "Woo", "Woo tooltip", NULL,
1191 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1201 static guint statusbar_counter = 1;
1204 statusbar_push (GtkWidget *button,
1205 GtkStatusbar *statusbar)
1209 sprintf (text, "something %d", statusbar_counter++);
1211 gtk_statusbar_push (statusbar, 1, text);
1215 statusbar_pop (GtkWidget *button,
1216 GtkStatusbar *statusbar)
1218 gtk_statusbar_pop (statusbar, 1);
1222 statusbar_steal (GtkWidget *button,
1223 GtkStatusbar *statusbar)
1225 gtk_statusbar_remove (statusbar, 1, 4);
1229 statusbar_popped (GtkStatusbar *statusbar,
1233 if (!statusbar->messages)
1234 statusbar_counter = 1;
1238 statusbar_contexts (GtkStatusbar *statusbar)
1242 string = "any context";
1243 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1245 gtk_statusbar_get_context_id (statusbar, string));
1247 string = "idle messages";
1248 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1250 gtk_statusbar_get_context_id (statusbar, string));
1252 string = "some text";
1253 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1255 gtk_statusbar_get_context_id (statusbar, string));
1257 string = "hit the mouse";
1258 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1260 gtk_statusbar_get_context_id (statusbar, string));
1262 string = "hit the mouse2";
1263 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1265 gtk_statusbar_get_context_id (statusbar, string));
1269 create_statusbar (GtkWidget *widget)
1271 static GtkWidget *window = NULL;
1275 GtkWidget *separator;
1276 GtkWidget *statusbar;
1280 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1281 gtk_window_set_screen (GTK_WINDOW (window),
1282 gtk_widget_get_screen (widget));
1284 g_signal_connect (window, "destroy",
1285 G_CALLBACK (gtk_widget_destroyed),
1288 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1289 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1291 box1 = gtk_vbox_new (FALSE, 0);
1292 gtk_container_add (GTK_CONTAINER (window), box1);
1294 box2 = gtk_vbox_new (FALSE, 10);
1295 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1296 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1298 statusbar = gtk_statusbar_new ();
1299 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1300 g_signal_connect (statusbar,
1302 G_CALLBACK (statusbar_popped),
1305 button = gtk_widget_new (gtk_button_get_type (),
1306 "label", "push something",
1310 g_object_connect (button,
1311 "signal::clicked", statusbar_push, statusbar,
1314 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1319 "signal_after::clicked", statusbar_pop, statusbar,
1322 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1323 "label", "steal #4",
1327 "signal_after::clicked", statusbar_steal, statusbar,
1330 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1331 "label", "test contexts",
1335 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1338 separator = gtk_hseparator_new ();
1339 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1341 box2 = gtk_vbox_new (FALSE, 10);
1342 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1343 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1345 button = gtk_button_new_with_label ("close");
1346 g_signal_connect_swapped (button, "clicked",
1347 G_CALLBACK (gtk_widget_destroy),
1349 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1350 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1351 gtk_widget_grab_default (button);
1354 if (!GTK_WIDGET_VISIBLE (window))
1355 gtk_widget_show_all (window);
1357 gtk_widget_destroy (window);
1365 cb_tree_destroy_event(GtkWidget* w)
1367 sTreeButtons* tree_buttons;
1369 /* free buttons structure associate at this tree */
1370 tree_buttons = g_object_get_data (G_OBJECT (w), "user_data");
1371 g_free (tree_buttons);
1375 cb_add_new_item(GtkWidget* w, GtkTree* tree)
1377 sTreeButtons* tree_buttons;
1378 GList* selected_list;
1379 GtkWidget* selected_item;
1381 GtkWidget* item_new;
1384 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1386 selected_list = GTK_TREE_SELECTION_OLD(tree);
1388 if(selected_list == NULL)
1390 /* there is no item in tree */
1391 subtree = GTK_WIDGET(tree);
1395 /* list can have only one element */
1396 selected_item = GTK_WIDGET(selected_list->data);
1398 subtree = GTK_TREE_ITEM_SUBTREE(selected_item);
1402 /* current selected item have not subtree ... create it */
1403 subtree = gtk_tree_new();
1404 gtk_tree_item_set_subtree(GTK_TREE_ITEM(selected_item),
1409 /* at this point, we know which subtree will be used to add new item */
1410 /* create a new item */
1411 sprintf(buffer, "item add %d", tree_buttons->nb_item_add);
1412 item_new = gtk_tree_item_new_with_label(buffer);
1413 gtk_tree_append(GTK_TREE(subtree), item_new);
1414 gtk_widget_show(item_new);
1416 tree_buttons->nb_item_add++;
1420 cb_remove_item(GtkWidget*w, GtkTree* tree)
1422 GList* selected_list;
1425 selected_list = GTK_TREE_SELECTION_OLD(tree);
1429 while (selected_list)
1431 clear_list = g_list_prepend (clear_list, selected_list->data);
1432 selected_list = selected_list->next;
1435 clear_list = g_list_reverse (clear_list);
1436 gtk_tree_remove_items(tree, clear_list);
1438 g_list_free (clear_list);
1442 cb_remove_subtree(GtkWidget*w, GtkTree* tree)
1444 GList* selected_list;
1447 selected_list = GTK_TREE_SELECTION_OLD(tree);
1451 item = GTK_TREE_ITEM (selected_list->data);
1453 gtk_tree_item_remove_subtree (item);
1458 cb_tree_changed(GtkTree* tree)
1460 sTreeButtons* tree_buttons;
1461 GList* selected_list;
1464 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1466 selected_list = GTK_TREE_SELECTION_OLD(tree);
1467 nb_selected = g_list_length(selected_list);
1469 if(nb_selected == 0)
1471 if(tree->children == NULL)
1472 gtk_widget_set_sensitive(tree_buttons->add_button, TRUE);
1474 gtk_widget_set_sensitive(tree_buttons->add_button, FALSE);
1475 gtk_widget_set_sensitive(tree_buttons->remove_button, FALSE);
1476 gtk_widget_set_sensitive(tree_buttons->subtree_button, FALSE);
1480 gtk_widget_set_sensitive(tree_buttons->remove_button, TRUE);
1481 gtk_widget_set_sensitive(tree_buttons->add_button, (nb_selected == 1));
1482 gtk_widget_set_sensitive(tree_buttons->subtree_button, (nb_selected == 1));
1487 create_subtree(GtkWidget* item, guint level, guint nb_item_max, guint recursion_level_max)
1489 GtkWidget* item_subtree;
1490 GtkWidget* item_new;
1495 if(level == recursion_level_max) return;
1499 /* query with no root item */
1501 item_subtree = item;
1506 /* query with no root item */
1507 /* create subtree and associate it with current item */
1508 item_subtree = gtk_tree_new();
1512 for(nb_item = 0; nb_item < nb_item_max; nb_item++)
1514 sprintf(buffer, "item %d-%d", level, nb_item);
1515 item_new = gtk_tree_item_new_with_label(buffer);
1516 gtk_tree_append(GTK_TREE(item_subtree), item_new);
1517 create_subtree(item_new, level+1, nb_item_max, recursion_level_max);
1518 gtk_widget_show(item_new);
1522 gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), item_subtree);
1526 create_tree_sample(GdkScreen *screen, guint selection_mode,
1527 guint draw_line, guint view_line, guint no_root_item,
1528 guint nb_item_max, guint recursion_level_max)
1533 GtkWidget* separator;
1535 GtkWidget* scrolled_win;
1536 GtkWidget* root_tree;
1537 GtkWidget* root_item;
1538 sTreeButtons* tree_buttons;
1540 /* create tree buttons struct */
1541 if ((tree_buttons = g_malloc (sizeof (sTreeButtons))) == NULL)
1543 g_error("can't allocate memory for tree structure !\n");
1546 tree_buttons->nb_item_add = 0;
1548 /* create top level window */
1549 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1550 gtk_window_set_screen (GTK_WINDOW (window), screen);
1551 gtk_window_set_title(GTK_WINDOW(window), "Tree Sample");
1552 g_signal_connect (window, "destroy",
1553 G_CALLBACK (cb_tree_destroy_event), NULL);
1554 g_object_set_data (G_OBJECT (window), "user_data", tree_buttons);
1556 box1 = gtk_vbox_new(FALSE, 0);
1557 gtk_container_add(GTK_CONTAINER(window), box1);
1558 gtk_widget_show(box1);
1560 /* create tree box */
1561 box2 = gtk_vbox_new(FALSE, 0);
1562 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
1563 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1564 gtk_widget_show(box2);
1566 /* create scrolled window */
1567 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
1568 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
1569 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1570 gtk_box_pack_start (GTK_BOX (box2), scrolled_win, TRUE, TRUE, 0);
1571 gtk_widget_set_size_request (scrolled_win, 200, 200);
1572 gtk_widget_show (scrolled_win);
1574 /* create root tree widget */
1575 root_tree = gtk_tree_new();
1576 g_signal_connect (root_tree, "selection_changed",
1577 G_CALLBACK (cb_tree_changed),
1579 g_object_set_data (G_OBJECT (root_tree), "user_data", tree_buttons);
1580 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), root_tree);
1581 gtk_tree_set_selection_mode(GTK_TREE(root_tree), selection_mode);
1582 gtk_tree_set_view_lines(GTK_TREE(root_tree), draw_line);
1583 gtk_tree_set_view_mode(GTK_TREE(root_tree), !view_line);
1584 gtk_widget_show(root_tree);
1588 /* set root tree to subtree function with root item variable */
1589 root_item = GTK_WIDGET(root_tree);
1593 /* create root tree item widget */
1594 root_item = gtk_tree_item_new_with_label("root item");
1595 gtk_tree_append(GTK_TREE(root_tree), root_item);
1596 gtk_widget_show(root_item);
1598 create_subtree(root_item, -no_root_item, nb_item_max, recursion_level_max);
1600 box2 = gtk_vbox_new(FALSE, 0);
1601 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1602 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1603 gtk_widget_show(box2);
1605 button = gtk_button_new_with_label("Add Item");
1606 gtk_widget_set_sensitive(button, FALSE);
1607 g_signal_connect (button, "clicked",
1608 G_CALLBACK (cb_add_new_item),
1610 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1611 gtk_widget_show(button);
1612 tree_buttons->add_button = button;
1614 button = gtk_button_new_with_label("Remove Item(s)");
1615 gtk_widget_set_sensitive(button, FALSE);
1616 g_signal_connect (button, "clicked",
1617 G_CALLBACK (cb_remove_item),
1619 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1620 gtk_widget_show(button);
1621 tree_buttons->remove_button = button;
1623 button = gtk_button_new_with_label("Remove Subtree");
1624 gtk_widget_set_sensitive(button, FALSE);
1625 g_signal_connect (button, "clicked",
1626 G_CALLBACK (cb_remove_subtree),
1628 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1629 gtk_widget_show(button);
1630 tree_buttons->subtree_button = button;
1632 /* create separator */
1633 separator = gtk_hseparator_new();
1634 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
1635 gtk_widget_show(separator);
1637 /* create button box */
1638 box2 = gtk_vbox_new(FALSE, 0);
1639 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1640 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1641 gtk_widget_show(box2);
1643 button = gtk_button_new_with_label("Close");
1644 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1645 g_signal_connect_swapped (button, "clicked",
1646 G_CALLBACK (gtk_widget_destroy),
1648 gtk_widget_show(button);
1650 gtk_widget_show(window);
1654 cb_create_tree(GtkWidget* w)
1656 guint selection_mode = GTK_SELECTION_SINGLE;
1661 guint recursion_level;
1663 /* get selection mode choice */
1664 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.single_button)->active)
1665 selection_mode = GTK_SELECTION_SINGLE;
1667 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.browse_button)->active)
1668 selection_mode = GTK_SELECTION_BROWSE;
1670 selection_mode = GTK_SELECTION_MULTIPLE;
1672 /* get options choice */
1673 draw_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.draw_line_button)->active;
1674 view_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.view_line_button)->active;
1675 no_root_item = GTK_TOGGLE_BUTTON(sTreeSampleSelection.no_root_item_button)->active;
1678 nb_item = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.nb_item_spinner));
1679 recursion_level = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.recursion_spinner));
1681 if (pow (nb_item, recursion_level) > 10000)
1683 g_print ("%g total items? That will take a very long time. Try less\n",
1684 pow (nb_item, recursion_level));
1688 create_tree_sample(gtk_widget_get_screen (w),
1689 selection_mode, draw_line,
1690 view_line, no_root_item, nb_item, recursion_level);
1694 create_tree_mode_window(GtkWidget *widget)
1696 static GtkWidget* window;
1704 GtkWidget* separator;
1711 /* create toplevel window */
1712 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1713 gtk_window_set_screen (GTK_WINDOW (window),
1714 gtk_widget_get_screen (widget));
1715 gtk_window_set_title(GTK_WINDOW(window), "Set Tree Parameters");
1716 g_signal_connect (window, "destroy",
1717 G_CALLBACK (gtk_widget_destroyed),
1719 box1 = gtk_vbox_new(FALSE, 0);
1720 gtk_container_add(GTK_CONTAINER(window), box1);
1722 /* create upper box - selection box */
1723 box2 = gtk_vbox_new(FALSE, 5);
1724 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
1725 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1727 box3 = gtk_hbox_new(FALSE, 5);
1728 gtk_box_pack_start(GTK_BOX(box2), box3, TRUE, TRUE, 0);
1730 /* create selection mode frame */
1731 frame = gtk_frame_new("Selection Mode");
1732 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
1734 box4 = gtk_vbox_new(FALSE, 0);
1735 gtk_container_add(GTK_CONTAINER(frame), box4);
1736 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1738 /* create radio button */
1739 button = gtk_radio_button_new_with_label(NULL, "SINGLE");
1740 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1741 sTreeSampleSelection.single_button = button;
1743 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1745 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1746 sTreeSampleSelection.browse_button = button;
1748 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1750 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1751 sTreeSampleSelection.multiple_button = button;
1753 sTreeSampleSelection.selection_mode_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
1755 /* create option mode frame */
1756 frame = gtk_frame_new("Options");
1757 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
1759 box4 = gtk_vbox_new(FALSE, 0);
1760 gtk_container_add(GTK_CONTAINER(frame), box4);
1761 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1763 /* create check button */
1764 button = gtk_check_button_new_with_label("Draw line");
1765 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1766 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
1767 sTreeSampleSelection.draw_line_button = button;
1769 button = gtk_check_button_new_with_label("View Line mode");
1770 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1771 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
1772 sTreeSampleSelection.view_line_button = button;
1774 button = gtk_check_button_new_with_label("Without Root item");
1775 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1776 sTreeSampleSelection.no_root_item_button = button;
1778 /* create recursion parameter */
1779 frame = gtk_frame_new("Size Parameters");
1780 gtk_box_pack_start(GTK_BOX(box2), frame, TRUE, TRUE, 0);
1782 box4 = gtk_hbox_new(FALSE, 5);
1783 gtk_container_add(GTK_CONTAINER(frame), box4);
1784 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1786 /* create number of item spin button */
1787 box5 = gtk_hbox_new(FALSE, 5);
1788 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
1790 label = gtk_label_new("Number of items : ");
1791 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1792 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
1794 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_NUMBER_OF_ITEM, 1.0, 255.0, 1.0,
1796 spinner = gtk_spin_button_new (adj, 0, 0);
1797 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
1798 sTreeSampleSelection.nb_item_spinner = spinner;
1800 /* create recursion level spin button */
1801 box5 = gtk_hbox_new(FALSE, 5);
1802 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
1804 label = gtk_label_new("Depth : ");
1805 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1806 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
1808 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_RECURSION_LEVEL, 0.0, 255.0, 1.0,
1810 spinner = gtk_spin_button_new (adj, 0, 0);
1811 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
1812 sTreeSampleSelection.recursion_spinner = spinner;
1814 /* create horizontal separator */
1815 separator = gtk_hseparator_new();
1816 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
1818 /* create bottom button box */
1819 box2 = gtk_hbox_new(TRUE, 10);
1820 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1821 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1823 button = gtk_button_new_with_label("Create Tree");
1824 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1825 g_signal_connect (button, "clicked",
1826 G_CALLBACK (cb_create_tree), NULL);
1828 button = gtk_button_new_with_label("Close");
1829 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1830 g_signal_connect_swapped (button, "clicked",
1831 G_CALLBACK (gtk_widget_destroy),
1834 if (!GTK_WIDGET_VISIBLE (window))
1835 gtk_widget_show_all (window);
1837 gtk_widget_destroy (window);
1843 #define GRID_SIZE 20
1844 #define DEFAULT_GEOMETRY "10x10"
1847 gridded_geometry_expose (GtkWidget *widget,
1848 GdkEventExpose *event)
1852 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
1853 0, 0, widget->allocation.width, widget->allocation.height);
1855 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
1856 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
1858 if ((i + j) % 2 == 0)
1859 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
1860 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1867 gridded_geometry_subresponse (GtkDialog *dialog,
1869 gchar *geometry_string)
1871 if (response_id == GTK_RESPONSE_NONE)
1873 gtk_widget_destroy (GTK_WIDGET (dialog));
1877 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1879 g_print ("Can't parse geometry string %s\n", geometry_string);
1880 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1886 gridded_geometry_response (GtkDialog *dialog,
1890 if (response_id == GTK_RESPONSE_NONE)
1892 gtk_widget_destroy (GTK_WIDGET (dialog));
1896 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1897 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1899 GtkWidget *drawing_area;
1901 GdkGeometry geometry;
1903 window = gtk_dialog_new_with_buttons (title,
1906 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1909 gtk_window_set_screen (GTK_WINDOW (window),
1910 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1912 g_signal_connect (window, "response",
1913 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1915 box = gtk_vbox_new (FALSE, 0);
1916 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), box, TRUE, TRUE, 0);
1918 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1920 drawing_area = gtk_drawing_area_new ();
1921 g_signal_connect (drawing_area, "expose_event",
1922 G_CALLBACK (gridded_geometry_expose), NULL);
1923 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1925 /* Gross hack to work around bug 68668... if we set the size request
1926 * large enough, then the current
1928 * request_of_window - request_of_geometry_widget
1930 * method of getting the base size works more or less works.
1932 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1934 geometry.base_width = 0;
1935 geometry.base_height = 0;
1936 geometry.min_width = 2 * GRID_SIZE;
1937 geometry.min_height = 2 * GRID_SIZE;
1938 geometry.width_inc = GRID_SIZE;
1939 geometry.height_inc = GRID_SIZE;
1941 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1943 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1945 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1947 g_print ("Can't parse geometry string %s\n", geometry_string);
1948 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1951 gtk_widget_show_all (window);
1956 create_gridded_geometry (GtkWidget *widget)
1958 static GtkWidget *window = NULL;
1964 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1967 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1970 gtk_window_set_screen (GTK_WINDOW (window),
1971 gtk_widget_get_screen (widget));
1973 label = gtk_label_new ("Geometry string:");
1974 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0);
1976 entry = gtk_entry_new ();
1977 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1978 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), entry, FALSE, FALSE, 0);
1980 g_signal_connect (window, "response",
1981 G_CALLBACK (gridded_geometry_response), entry);
1982 g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
1984 gtk_widget_show_all (window);
1987 gtk_widget_destroy (window);
1995 handle_box_child_signal (GtkHandleBox *hb,
1997 const gchar *action)
1999 printf ("%s: child <%s> %sed\n",
2000 g_type_name (G_OBJECT_TYPE (hb)),
2001 g_type_name (G_OBJECT_TYPE (child)),
2006 create_handle_box (GtkWidget *widget)
2008 static GtkWidget* window = NULL;
2009 GtkWidget *handle_box;
2010 GtkWidget *handle_box2;
2015 GtkWidget *separator;
2019 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2021 gtk_window_set_screen (GTK_WINDOW (window),
2022 gtk_widget_get_screen (widget));
2024 gtk_window_set_title (GTK_WINDOW (window),
2026 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
2028 g_signal_connect (window, "destroy",
2029 G_CALLBACK (gtk_widget_destroyed),
2032 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
2034 vbox = gtk_vbox_new (FALSE, 0);
2035 gtk_container_add (GTK_CONTAINER (window), vbox);
2036 gtk_widget_show (vbox);
2038 label = gtk_label_new ("Above");
2039 gtk_container_add (GTK_CONTAINER (vbox), label);
2040 gtk_widget_show (label);
2042 separator = gtk_hseparator_new ();
2043 gtk_container_add (GTK_CONTAINER (vbox), separator);
2044 gtk_widget_show (separator);
2046 hbox = gtk_hbox_new (FALSE, 10);
2047 gtk_container_add (GTK_CONTAINER (vbox), hbox);
2048 gtk_widget_show (hbox);
2050 separator = gtk_hseparator_new ();
2051 gtk_container_add (GTK_CONTAINER (vbox), separator);
2052 gtk_widget_show (separator);
2054 label = gtk_label_new ("Below");
2055 gtk_container_add (GTK_CONTAINER (vbox), label);
2056 gtk_widget_show (label);
2058 handle_box = gtk_handle_box_new ();
2059 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2060 g_signal_connect (handle_box,
2062 G_CALLBACK (handle_box_child_signal),
2064 g_signal_connect (handle_box,
2066 G_CALLBACK (handle_box_child_signal),
2068 gtk_widget_show (handle_box);
2070 toolbar = make_toolbar (window);
2072 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2073 gtk_widget_show (toolbar);
2075 handle_box = gtk_handle_box_new ();
2076 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2077 g_signal_connect (handle_box,
2079 G_CALLBACK (handle_box_child_signal),
2081 g_signal_connect (handle_box,
2083 G_CALLBACK (handle_box_child_signal),
2085 gtk_widget_show (handle_box);
2087 handle_box2 = gtk_handle_box_new ();
2088 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2089 g_signal_connect (handle_box2,
2091 G_CALLBACK (handle_box_child_signal),
2093 g_signal_connect (handle_box2,
2095 G_CALLBACK (handle_box_child_signal),
2097 gtk_widget_show (handle_box2);
2099 label = gtk_label_new ("Fooo!");
2100 gtk_container_add (GTK_CONTAINER (handle_box2), label);
2101 gtk_widget_show (label);
2104 if (!GTK_WIDGET_VISIBLE (window))
2105 gtk_widget_show (window);
2107 gtk_widget_destroy (window);
2111 * Test for getting an image from a drawable
2122 take_snapshot (GtkWidget *button,
2125 struct GetImageData *gid = data;
2126 GdkRectangle visible;
2128 int height_fraction;
2131 GdkColor color = { 0, 30000, 0, 0 };
2132 GdkRectangle target;
2135 /* Do some begin_paint_rect on some random rects, draw some
2136 * distinctive stuff into those rects, then take the snapshot.
2137 * figure out whether any rects were overlapped and report to
2141 visible = gid->sw->allocation;
2143 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2144 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2146 width_fraction = visible.width / 4;
2147 height_fraction = visible.height / 4;
2149 gc = gdk_gc_new (gid->src->window);
2150 black_gc = gid->src->style->black_gc;
2152 gdk_gc_set_rgb_fg_color (gc, &color);
2155 target.x = visible.x + width_fraction;
2156 target.y = visible.y + height_fraction * 3;
2157 target.width = width_fraction;
2158 target.height = height_fraction / 2;
2160 gdk_window_begin_paint_rect (gid->src->window,
2163 gdk_draw_rectangle (gid->src->window,
2167 target.width, target.height);
2169 gdk_draw_rectangle (gid->src->window,
2172 target.x + 10, target.y + 10,
2173 target.width - 20, target.height - 20);
2175 target.x = visible.x + width_fraction;
2176 target.y = visible.y + height_fraction;
2177 target.width = width_fraction;
2178 target.height = height_fraction;
2180 gdk_window_begin_paint_rect (gid->src->window,
2183 gdk_draw_rectangle (gid->src->window,
2187 target.width, target.height);
2189 gdk_draw_rectangle (gid->src->window,
2192 target.x + 10, target.y + 10,
2193 target.width - 20, target.height - 20);
2195 target.x = visible.x + width_fraction * 3;
2196 target.y = visible.y + height_fraction;
2197 target.width = width_fraction / 2;
2198 target.height = height_fraction;
2200 gdk_window_begin_paint_rect (gid->src->window,
2203 gdk_draw_rectangle (gid->src->window,
2207 target.width, target.height);
2209 gdk_draw_rectangle (gid->src->window,
2212 target.x + 10, target.y + 10,
2213 target.width - 20, target.height - 20);
2215 target.x = visible.x + width_fraction * 2;
2216 target.y = visible.y + height_fraction * 2;
2217 target.width = width_fraction / 4;
2218 target.height = height_fraction / 4;
2220 gdk_window_begin_paint_rect (gid->src->window,
2223 gdk_draw_rectangle (gid->src->window,
2227 target.width, target.height);
2229 gdk_draw_rectangle (gid->src->window,
2232 target.x + 10, target.y + 10,
2233 target.width - 20, target.height - 20);
2235 target.x += target.width / 2;
2236 target.y += target.width / 2;
2238 gdk_window_begin_paint_rect (gid->src->window,
2241 gdk_draw_rectangle (gid->src->window,
2245 target.width, target.height);
2247 gdk_draw_rectangle (gid->src->window,
2250 target.x + 10, target.y + 10,
2251 target.width - 20, target.height - 20);
2253 /* Screen shot area */
2255 target.x = visible.x + width_fraction * 1.5;
2256 target.y = visible.y + height_fraction * 1.5;
2257 target.width = width_fraction * 2;
2258 target.height = height_fraction * 2;
2260 shot = gdk_drawable_get_image (gid->src->window,
2262 target.width, target.height);
2264 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2267 g_object_unref (shot);
2269 gdk_window_end_paint (gid->src->window);
2270 gdk_window_end_paint (gid->src->window);
2271 gdk_window_end_paint (gid->src->window);
2272 gdk_window_end_paint (gid->src->window);
2273 gdk_window_end_paint (gid->src->window);
2275 gdk_draw_rectangle (gid->src->window,
2276 gid->src->style->black_gc,
2279 target.width, target.height);
2281 g_object_unref (gc);
2285 image_source_expose (GtkWidget *da,
2286 GdkEventExpose *event,
2289 int x = event->area.x;
2290 GdkColor red = { 0, 65535, 0, 0 };
2291 GdkColor green = { 0, 0, 65535, 0 };
2292 GdkColor blue = { 0, 0, 0, 65535 };
2295 gc = gdk_gc_new (event->window);
2297 while (x < (event->area.x + event->area.width))
2304 gdk_gc_set_rgb_fg_color (gc, &red);
2310 gdk_gc_set_rgb_fg_color (gc, &green);
2316 gdk_gc_set_rgb_fg_color (gc, &blue);
2320 g_assert_not_reached ();
2324 gdk_draw_line (event->window,
2327 x, event->area.y + event->area.height);
2332 g_object_unref (gc);
2338 create_get_image (GtkWidget *widget)
2340 static GtkWidget *window = NULL;
2343 gtk_widget_destroy (window);
2352 struct GetImageData *gid;
2354 gid = g_new (struct GetImageData, 1);
2356 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2358 gtk_window_set_screen (GTK_WINDOW (window),
2359 gtk_widget_get_screen (widget));
2361 g_signal_connect (window,
2363 G_CALLBACK (gtk_widget_destroyed),
2366 g_object_set_data_full (G_OBJECT (window),
2367 "testgtk-get-image-data",
2371 vbox = gtk_vbox_new (FALSE, 0);
2373 gtk_container_add (GTK_CONTAINER (window), vbox);
2375 sw = gtk_scrolled_window_new (NULL, NULL);
2376 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2377 GTK_POLICY_AUTOMATIC,
2378 GTK_POLICY_AUTOMATIC);
2382 gtk_widget_set_size_request (sw, 400, 400);
2384 src = gtk_drawing_area_new ();
2385 gtk_widget_set_size_request (src, 10000, 10000);
2387 g_signal_connect (src,
2389 G_CALLBACK (image_source_expose),
2394 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2397 gtk_box_pack_start (GTK_BOX (vbox),
2401 hbox = gtk_hbox_new (FALSE, 3);
2403 snap = gtk_widget_new (GTK_TYPE_IMAGE, NULL);
2407 sw = gtk_scrolled_window_new (NULL, NULL);
2408 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2409 GTK_POLICY_AUTOMATIC,
2410 GTK_POLICY_AUTOMATIC);
2411 gtk_widget_set_size_request (sw, 300, 300);
2413 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2415 gtk_box_pack_end (GTK_BOX (hbox), sw, FALSE, FALSE, 5);
2417 button = gtk_button_new_with_label ("Get image from drawable");
2419 g_signal_connect (button,
2421 G_CALLBACK (take_snapshot),
2424 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
2426 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2428 gtk_widget_show_all (window);
2436 sensitivity_toggled (GtkWidget *toggle,
2439 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2443 create_sensitivity_control (GtkWidget *widget)
2447 button = gtk_toggle_button_new_with_label ("Sensitive");
2449 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2450 GTK_WIDGET_IS_SENSITIVE (widget));
2452 g_signal_connect (button,
2454 G_CALLBACK (sensitivity_toggled),
2457 gtk_widget_show_all (button);
2463 set_selectable_recursive (GtkWidget *widget,
2466 if (GTK_IS_CONTAINER (widget))
2471 children = gtk_container_get_children (GTK_CONTAINER (widget));
2475 set_selectable_recursive (tmp->data, setting);
2479 g_list_free (children);
2481 else if (GTK_IS_LABEL (widget))
2483 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2488 selectable_toggled (GtkWidget *toggle,
2491 set_selectable_recursive (widget,
2492 GTK_TOGGLE_BUTTON (toggle)->active);
2496 create_selectable_control (GtkWidget *widget)
2500 button = gtk_toggle_button_new_with_label ("Selectable");
2502 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2505 g_signal_connect (button,
2507 G_CALLBACK (selectable_toggled),
2510 gtk_widget_show_all (button);
2515 void create_labels (GtkWidget *widget)
2517 static GtkWidget *window = NULL;
2526 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2528 gtk_window_set_screen (GTK_WINDOW (window),
2529 gtk_widget_get_screen (widget));
2531 g_signal_connect (window, "destroy",
2532 G_CALLBACK (gtk_widget_destroyed),
2535 gtk_window_set_title (GTK_WINDOW (window), "Label");
2537 vbox = gtk_vbox_new (FALSE, 5);
2539 hbox = gtk_hbox_new (FALSE, 5);
2540 gtk_container_add (GTK_CONTAINER (window), vbox);
2542 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2544 button = create_sensitivity_control (hbox);
2546 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2548 button = create_selectable_control (hbox);
2550 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2552 vbox = gtk_vbox_new (FALSE, 5);
2554 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2555 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2557 frame = gtk_frame_new ("Normal Label");
2558 label = gtk_label_new ("This is a Normal label");
2559 gtk_container_add (GTK_CONTAINER (frame), label);
2560 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2562 frame = gtk_frame_new ("Multi-line Label");
2563 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2564 gtk_container_add (GTK_CONTAINER (frame), label);
2565 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2567 frame = gtk_frame_new ("Left Justified Label");
2568 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2569 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2570 gtk_container_add (GTK_CONTAINER (frame), label);
2571 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2573 frame = gtk_frame_new ("Right Justified Label");
2574 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2575 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2576 gtk_container_add (GTK_CONTAINER (frame), label);
2577 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2579 frame = gtk_frame_new ("Internationalized Label");
2580 label = gtk_label_new (NULL);
2581 gtk_label_set_markup (GTK_LABEL (label),
2582 "French (Fran\303\247ais) Bonjour, Salut\n"
2583 "Korean (\355\225\234\352\270\200) \354\225\210\353\205\225\355\225\230\354\204\270\354\232\224, \354\225\210\353\205\225\355\225\230\354\213\255\353\213\210\352\271\214\n"
2584 "Russian (\320\240\321\203\321\201\321\201\320\272\320\270\320\271) \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265!\n"
2585 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2586 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2587 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2588 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2589 gtk_container_add (GTK_CONTAINER (frame), label);
2590 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2592 frame = gtk_frame_new ("Bidirection Label");
2593 label = gtk_label_new ("Arabic \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205\n"
2594 "Hebrew \327\251\327\234\327\225\327\235");
2595 gtk_widget_set_direction (label, GTK_TEXT_DIR_RTL);
2596 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2597 gtk_container_add (GTK_CONTAINER (frame), label);
2598 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2600 vbox = gtk_vbox_new (FALSE, 5);
2601 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2602 frame = gtk_frame_new ("Line wrapped label");
2603 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2604 "up the entire "/* big space to test spacing */\
2605 "width allocated to it, but automatically wraps the words to fit. "\
2606 "The time has come, for all good men, to come to the aid of their party. "\
2607 "The sixth sheik's six sheep's sick.\n"\
2608 " It supports multiple paragraphs correctly, and correctly adds "\
2609 "many extra spaces. ");
2611 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2612 gtk_container_add (GTK_CONTAINER (frame), label);
2613 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2615 frame = gtk_frame_new ("Filled, wrapped label");
2616 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2617 "up the entire width allocated to it. Here is a seneance to prove "\
2618 "my point. Here is another sentence. "\
2619 "Here comes the sun, do de do de do.\n"\
2620 " This is a new paragraph.\n"\
2621 " This is another newer, longer, better paragraph. It is coming to an end, "\
2623 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2624 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2625 gtk_container_add (GTK_CONTAINER (frame), label);
2626 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2628 frame = gtk_frame_new ("Underlined label");
2629 label = gtk_label_new ("This label is underlined!\n"
2630 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2631 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2632 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2633 gtk_container_add (GTK_CONTAINER (frame), label);
2634 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2636 frame = gtk_frame_new ("Markup label");
2637 label = gtk_label_new (NULL);
2639 /* There's also a gtk_label_set_markup() without accel if you
2640 * don't have an accelerator key
2642 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2643 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2644 "<b>markup</b> _such as "
2645 "<big><i>Big Italics</i></big>\n"
2646 "<tt>Monospace font</tt>\n"
2647 "<u>Underline!</u>\n"
2649 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2650 "and nothing on this line,\n"
2653 "or even on this one\n"
2654 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2655 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2656 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2658 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2660 gtk_container_add (GTK_CONTAINER (frame), label);
2661 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2664 if (!GTK_WIDGET_VISIBLE (window))
2665 gtk_widget_show_all (window);
2667 gtk_widget_destroy (window);
2675 reparent_label (GtkWidget *widget,
2676 GtkWidget *new_parent)
2680 label = g_object_get_data (G_OBJECT (widget), "user_data");
2682 gtk_widget_reparent (label, new_parent);
2686 set_parent_signal (GtkWidget *child,
2687 GtkWidget *old_parent,
2690 g_print ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2691 g_type_name (G_OBJECT_TYPE (child)),
2692 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
2693 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2694 GPOINTER_TO_INT (func_data));
2698 create_reparent (GtkWidget *widget)
2700 static GtkWidget *window = NULL;
2707 GtkWidget *separator;
2708 GtkWidget *event_box;
2712 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2714 gtk_window_set_screen (GTK_WINDOW (window),
2715 gtk_widget_get_screen (widget));
2717 g_signal_connect (window, "destroy",
2718 G_CALLBACK (gtk_widget_destroyed),
2721 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2722 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2724 box1 = gtk_vbox_new (FALSE, 0);
2725 gtk_container_add (GTK_CONTAINER (window), box1);
2727 box2 = gtk_hbox_new (FALSE, 5);
2728 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2729 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2731 label = gtk_label_new ("Hello World");
2733 frame = gtk_frame_new ("Frame 1");
2734 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2736 box3 = gtk_vbox_new (FALSE, 5);
2737 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2738 gtk_container_add (GTK_CONTAINER (frame), box3);
2740 button = gtk_button_new_with_label ("switch");
2741 g_object_set_data (G_OBJECT (button), "user_data", label);
2742 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2744 event_box = gtk_event_box_new ();
2745 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2746 gtk_container_add (GTK_CONTAINER (event_box), label);
2748 g_signal_connect (button, "clicked",
2749 G_CALLBACK (reparent_label),
2752 g_signal_connect (label, "parent_set",
2753 G_CALLBACK (set_parent_signal),
2754 GINT_TO_POINTER (42));
2756 frame = gtk_frame_new ("Frame 2");
2757 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2759 box3 = gtk_vbox_new (FALSE, 5);
2760 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2761 gtk_container_add (GTK_CONTAINER (frame), box3);
2763 button = gtk_button_new_with_label ("switch");
2764 g_object_set_data (G_OBJECT (button), "user_data", label);
2765 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2767 event_box = gtk_event_box_new ();
2768 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2770 g_signal_connect (button, "clicked",
2771 G_CALLBACK (reparent_label),
2774 separator = gtk_hseparator_new ();
2775 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2777 box2 = gtk_vbox_new (FALSE, 10);
2778 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2779 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2781 button = gtk_button_new_with_label ("close");
2782 g_signal_connect_swapped (button, "clicked",
2783 G_CALLBACK (gtk_widget_destroy), window);
2784 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2785 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
2786 gtk_widget_grab_default (button);
2789 if (!GTK_WIDGET_VISIBLE (window))
2790 gtk_widget_show_all (window);
2792 gtk_widget_destroy (window);
2799 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2801 if (event->type == GDK_BUTTON_PRESS)
2803 if (event->button == 1)
2804 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2805 event->button, event->x_root, event->y_root,
2807 else if (event->button == 2)
2808 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2809 event->button, event->x_root, event->y_root,
2816 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
2818 gtk_paint_resize_grip (area->style,
2820 GTK_WIDGET_STATE (area),
2826 area->allocation.width,
2827 area->allocation.height);
2833 create_resize_grips (GtkWidget *widget)
2835 static GtkWidget *window = NULL;
2837 GtkWidget *hbox, *vbox;
2840 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2842 gtk_window_set_screen (GTK_WINDOW (window),
2843 gtk_widget_get_screen (widget));
2845 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2847 g_signal_connect (window, "destroy",
2848 G_CALLBACK (gtk_widget_destroyed),
2851 vbox = gtk_vbox_new (FALSE, 0);
2852 gtk_container_add (GTK_CONTAINER (window), vbox);
2854 hbox = gtk_hbox_new (FALSE, 0);
2855 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2858 area = gtk_drawing_area_new ();
2859 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2860 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2861 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2862 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2863 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2864 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2867 area = gtk_drawing_area_new ();
2868 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2869 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2870 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2871 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2872 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2873 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2876 area = gtk_drawing_area_new ();
2877 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2878 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2879 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2880 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2881 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2882 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2884 hbox = gtk_hbox_new (FALSE, 0);
2885 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2888 area = gtk_drawing_area_new ();
2889 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2890 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2891 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2892 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2893 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2894 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2897 area = gtk_drawing_area_new ();
2898 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2901 area = gtk_drawing_area_new ();
2902 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2903 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2904 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2905 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2906 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2907 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2910 hbox = gtk_hbox_new (FALSE, 0);
2911 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2914 area = gtk_drawing_area_new ();
2915 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2916 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2917 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2918 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2919 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2920 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2922 area = gtk_drawing_area_new ();
2923 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2924 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2925 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2926 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2927 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2928 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2931 area = gtk_drawing_area_new ();
2932 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2933 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2934 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2935 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2936 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2937 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2940 if (!GTK_WIDGET_VISIBLE (window))
2941 gtk_widget_show_all (window);
2943 gtk_widget_destroy (window);
2949 gint upositionx = 0;
2950 gint upositiony = 0;
2953 uposition_configure (GtkWidget *window)
2959 lx = g_object_get_data (G_OBJECT (window), "x");
2960 ly = g_object_get_data (G_OBJECT (window), "y");
2962 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
2963 sprintf (buffer, "%d", upositionx);
2964 gtk_label_set_text (lx, buffer);
2965 sprintf (buffer, "%d", upositiony);
2966 gtk_label_set_text (ly, buffer);
2972 uposition_stop_configure (GtkToggleButton *toggle,
2976 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2978 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2982 create_saved_position (GtkWidget *widget)
2984 static GtkWidget *window = NULL;
2989 GtkWidget *main_vbox;
2997 window = g_object_connect (gtk_widget_new (GTK_TYPE_WINDOW,
2998 "type", GTK_WINDOW_TOPLEVEL,
2999 "title", "Saved Position",
3001 "signal::configure_event", uposition_configure, NULL,
3004 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3006 gtk_window_set_screen (GTK_WINDOW (window),
3007 gtk_widget_get_screen (widget));
3010 g_signal_connect (window, "destroy",
3011 G_CALLBACK (gtk_widget_destroyed),
3014 main_vbox = gtk_vbox_new (FALSE, 5);
3015 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3016 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3019 gtk_widget_new (gtk_vbox_get_type (),
3020 "GtkBox::homogeneous", FALSE,
3021 "GtkBox::spacing", 5,
3022 "GtkContainer::border_width", 10,
3023 "GtkWidget::parent", main_vbox,
3024 "GtkWidget::visible", TRUE,
3025 "child", g_object_connect (gtk_widget_new (GTK_TYPE_TOGGLE_BUTTON,
3026 "label", "Stop Events",
3030 "signal::clicked", uposition_stop_configure, window,
3034 hbox = gtk_hbox_new (FALSE, 0);
3035 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3036 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3038 label = gtk_label_new ("X Origin : ");
3039 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3040 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3042 x_label = gtk_label_new ("");
3043 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3044 g_object_set_data (G_OBJECT (window), "x", x_label);
3046 hbox = gtk_hbox_new (FALSE, 0);
3047 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3048 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3050 label = gtk_label_new ("Y Origin : ");
3051 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3052 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3054 y_label = gtk_label_new ("");
3055 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3056 g_object_set_data (G_OBJECT (window), "y", y_label);
3059 gtk_widget_new (gtk_hseparator_get_type (),
3060 "GtkWidget::visible", TRUE,
3062 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3064 hbox = gtk_hbox_new (FALSE, 0);
3065 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3066 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3068 button = gtk_button_new_with_label ("Close");
3069 g_signal_connect_swapped (button, "clicked",
3070 G_CALLBACK (gtk_widget_destroy),
3072 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3073 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3074 gtk_widget_grab_default (button);
3076 gtk_widget_show_all (window);
3079 gtk_widget_destroy (window);
3087 create_pixmap (GtkWidget *widget)
3089 static GtkWidget *window = NULL;
3095 GtkWidget *separator;
3096 GtkWidget *pixmapwid;
3100 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3102 gtk_window_set_screen (GTK_WINDOW (window),
3103 gtk_widget_get_screen (widget));
3105 g_signal_connect (window, "destroy",
3106 G_CALLBACK (gtk_widget_destroyed),
3109 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3110 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3111 gtk_widget_realize(window);
3113 box1 = gtk_vbox_new (FALSE, 0);
3114 gtk_container_add (GTK_CONTAINER (window), box1);
3116 box2 = gtk_vbox_new (FALSE, 10);
3117 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3118 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3120 button = gtk_button_new ();
3121 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3123 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3125 label = gtk_label_new ("Pixmap\ntest");
3126 box3 = gtk_hbox_new (FALSE, 0);
3127 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3128 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3129 gtk_container_add (GTK_CONTAINER (box3), label);
3130 gtk_container_add (GTK_CONTAINER (button), box3);
3132 button = gtk_button_new ();
3133 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3135 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3137 label = gtk_label_new ("Pixmap\ntest");
3138 box3 = gtk_hbox_new (FALSE, 0);
3139 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3140 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3141 gtk_container_add (GTK_CONTAINER (box3), label);
3142 gtk_container_add (GTK_CONTAINER (button), box3);
3144 gtk_widget_set_sensitive (button, FALSE);
3146 separator = gtk_hseparator_new ();
3147 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3149 box2 = gtk_vbox_new (FALSE, 10);
3150 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3151 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3153 button = gtk_button_new_with_label ("close");
3154 g_signal_connect_swapped (button, "clicked",
3155 G_CALLBACK (gtk_widget_destroy),
3157 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3158 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3159 gtk_widget_grab_default (button);
3162 if (!GTK_WIDGET_VISIBLE (window))
3163 gtk_widget_show_all (window);
3165 gtk_widget_destroy (window);
3169 tips_query_widget_entered (GtkTipsQuery *tips_query,
3171 const gchar *tip_text,
3172 const gchar *tip_private,
3175 if (GTK_TOGGLE_BUTTON (toggle)->active)
3177 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3178 /* don't let GtkTipsQuery reset its label */
3179 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3184 tips_query_widget_selected (GtkWidget *tips_query,
3186 const gchar *tip_text,
3187 const gchar *tip_private,
3188 GdkEventButton *event,
3192 g_print ("Help \"%s\" requested for <%s>\n",
3193 tip_private ? tip_private : "None",
3194 g_type_name (G_OBJECT_TYPE (widget)));
3199 create_tooltips (GtkWidget *widget)
3201 static GtkWidget *window = NULL;
3208 GtkWidget *tips_query;
3209 GtkWidget *separator;
3210 GtkTooltips *tooltips;
3215 gtk_widget_new (gtk_window_get_type (),
3216 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3217 "GtkContainer::border_width", 0,
3218 "GtkWindow::title", "Tooltips",
3219 "GtkWindow::allow_shrink", TRUE,
3220 "GtkWindow::allow_grow", FALSE,
3223 gtk_window_set_screen (GTK_WINDOW (window),
3224 gtk_widget_get_screen (widget));
3226 g_signal_connect (window, "destroy",
3227 G_CALLBACK (destroy_tooltips),
3230 tooltips=gtk_tooltips_new();
3231 g_object_ref (tooltips);
3232 gtk_object_sink (GTK_OBJECT (tooltips));
3233 g_object_set_data (G_OBJECT (window), "tooltips", tooltips);
3235 box1 = gtk_vbox_new (FALSE, 0);
3236 gtk_container_add (GTK_CONTAINER (window), box1);
3238 box2 = gtk_vbox_new (FALSE, 10);
3239 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3240 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3242 button = gtk_toggle_button_new_with_label ("button1");
3243 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3245 gtk_tooltips_set_tip (tooltips,
3248 "ContextHelp/buttons/1");
3250 button = gtk_toggle_button_new_with_label ("button2");
3251 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3253 gtk_tooltips_set_tip (tooltips,
3255 "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.",
3256 "ContextHelp/buttons/2_long");
3258 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3259 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3261 gtk_tooltips_set_tip (tooltips,
3263 "Toggle TipsQuery view.",
3267 gtk_widget_new (gtk_vbox_get_type (),
3268 "homogeneous", FALSE,
3274 tips_query = gtk_tips_query_new ();
3277 gtk_widget_new (gtk_button_get_type (),
3282 g_object_connect (button,
3283 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3285 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3286 gtk_tooltips_set_tip (tooltips,
3288 "Start the Tooltips Inspector",
3289 "ContextHelp/buttons/?");
3292 g_object_set (g_object_connect (tips_query,
3293 "signal::widget_entered", tips_query_widget_entered, toggle,
3294 "signal::widget_selected", tips_query_widget_selected, NULL,
3301 frame = gtk_widget_new (gtk_frame_get_type (),
3302 "label", "ToolTips Inspector",
3303 "label_xalign", (double) 0.5,
3309 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3311 separator = gtk_hseparator_new ();
3312 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3314 box2 = gtk_vbox_new (FALSE, 10);
3315 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3316 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3318 button = gtk_button_new_with_label ("close");
3319 g_signal_connect_swapped (button, "clicked",
3320 G_CALLBACK (gtk_widget_destroy),
3322 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3323 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3324 gtk_widget_grab_default (button);
3326 gtk_tooltips_set_tip (tooltips, button, "Push this button to close window", "ContextHelp/buttons/Close");
3329 if (!GTK_WIDGET_VISIBLE (window))
3330 gtk_widget_show_all (window);
3332 gtk_widget_destroy (window);
3340 pack_image (GtkWidget *box,
3344 gtk_box_pack_start (GTK_BOX (box),
3345 gtk_label_new (text),
3348 gtk_box_pack_start (GTK_BOX (box),
3354 create_image (GtkWidget *widget)
3356 static GtkWidget *window = NULL;
3364 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3366 gtk_window_set_screen (GTK_WINDOW (window),
3367 gtk_widget_get_screen (widget));
3369 /* this is bogus for testing drawing when allocation < request,
3370 * don't copy into real code
3372 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
3374 g_signal_connect (window, "destroy",
3375 G_CALLBACK (gtk_widget_destroyed),
3378 vbox = gtk_vbox_new (FALSE, 5);
3380 gtk_container_add (GTK_CONTAINER (window), vbox);
3382 pack_image (vbox, "Stock Warning Dialog",
3383 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3384 GTK_ICON_SIZE_DIALOG));
3386 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
3387 gtk_widget_get_colormap (window),
3392 pack_image (vbox, "Pixmap",
3393 gtk_image_new_from_pixmap (pixmap, mask));
3396 if (!GTK_WIDGET_VISIBLE (window))
3397 gtk_widget_show_all (window);
3399 gtk_widget_destroy (window);
3407 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3410 GtkWidget *menuitem;
3419 menu = gtk_menu_new ();
3420 gtk_menu_set_screen (GTK_MENU (menu), screen);
3426 menuitem = gtk_tearoff_menu_item_new ();
3427 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3428 gtk_widget_show (menuitem);
3431 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3432 GTK_ICON_SIZE_MENU);
3433 gtk_widget_show (image);
3434 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3435 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3436 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3437 gtk_widget_show (menuitem);
3439 for (i = 0, j = 1; i < length; i++, j++)
3441 sprintf (buf, "item %2d - %d", depth, j);
3443 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3444 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3448 gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
3451 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3452 gtk_widget_show (menuitem);
3454 gtk_widget_set_sensitive (menuitem, FALSE);
3457 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3461 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3462 create_menu (screen, depth - 1, 5, TRUE));
3469 create_menus (GtkWidget *widget)
3471 static GtkWidget *window = NULL;
3475 GtkWidget *optionmenu;
3476 GtkWidget *separator;
3482 GtkWidget *menuitem;
3483 GtkAccelGroup *accel_group;
3485 GdkScreen *screen = gtk_widget_get_screen (widget);
3487 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3489 gtk_window_set_screen (GTK_WINDOW (window), screen);
3491 g_signal_connect (window, "destroy",
3492 G_CALLBACK (gtk_widget_destroyed),
3494 g_signal_connect (window, "delete-event",
3495 G_CALLBACK (gtk_true),
3498 accel_group = gtk_accel_group_new ();
3499 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3501 gtk_window_set_title (GTK_WINDOW (window), "menus");
3502 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3505 box1 = gtk_vbox_new (FALSE, 0);
3506 gtk_container_add (GTK_CONTAINER (window), box1);
3507 gtk_widget_show (box1);
3509 menubar = gtk_menu_bar_new ();
3510 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3511 gtk_widget_show (menubar);
3513 menu = create_menu (screen, 2, 50, TRUE);
3515 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3516 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3517 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3518 gtk_widget_show (menuitem);
3520 menuitem = gtk_menu_item_new_with_label ("foo");
3521 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3522 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3523 gtk_widget_show (menuitem);
3525 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3526 GTK_ICON_SIZE_MENU);
3527 gtk_widget_show (image);
3528 menuitem = gtk_image_menu_item_new_with_label ("Help");
3529 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3530 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3531 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3532 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3533 gtk_widget_show (menuitem);
3535 menubar = gtk_menu_bar_new ();
3536 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3537 gtk_widget_show (menubar);
3539 menu = create_menu (screen, 2, 10, TRUE);
3541 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3542 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3543 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3544 gtk_widget_show (menuitem);
3546 box2 = gtk_vbox_new (FALSE, 10);
3547 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3548 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3549 gtk_widget_show (box2);
3551 menu = create_menu (screen, 1, 5, FALSE);
3552 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3554 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3555 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3556 gtk_widget_show (menuitem);
3558 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3559 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3560 gtk_widget_show (menuitem);
3561 gtk_widget_add_accelerator (menuitem,
3567 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3568 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3569 gtk_widget_show (menuitem);
3570 gtk_widget_add_accelerator (menuitem,
3575 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3576 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3577 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3578 gtk_widget_show (menuitem);
3579 gtk_widget_add_accelerator (menuitem,
3585 gtk_widget_add_accelerator (menuitem,
3592 optionmenu = gtk_option_menu_new ();
3593 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
3594 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
3595 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3596 gtk_widget_show (optionmenu);
3598 separator = gtk_hseparator_new ();
3599 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3600 gtk_widget_show (separator);
3602 box2 = gtk_vbox_new (FALSE, 10);
3603 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3604 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3605 gtk_widget_show (box2);
3607 button = gtk_button_new_with_label ("close");
3608 g_signal_connect_swapped (button, "clicked",
3609 G_CALLBACK (gtk_widget_destroy),
3611 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3612 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3613 gtk_widget_grab_default (button);
3614 gtk_widget_show (button);
3617 if (!GTK_WIDGET_VISIBLE (window))
3618 gtk_widget_show (window);
3620 gtk_widget_destroy (window);
3624 gtk_ifactory_cb (gpointer callback_data,
3625 guint callback_action,
3628 g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
3631 /* GdkPixbuf RGBA C-Source image dump */
3633 static const guint8 apple[] =
3635 /* Pixbuf magic (0x47646b50) */
3637 /* length: header (24) + pixel_data (2304) */
3639 /* pixdata_type (0x1010002) */
3641 /* rowstride (96) */
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\0\0"
3653 "\0\0\0\0\0\0\0\0\0\0\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\26\24"
3655 "\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"
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`m"
3657 "[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"
3658 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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`l[Blza\373s\202d\354w\206g\372p~c"
3660 "\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"
3661 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3662 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3663 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3664 "\0\0\0\0\0\0\0\0\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"
3665 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3666 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3667 "\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["
3668 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3669 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3670 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3671 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3672 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3673 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3674 "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"
3675 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3676 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3677 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3678 "\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"
3679 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3680 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3681 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3682 "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"
3683 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3684 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3685 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3686 "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"
3687 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3688 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3689 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3690 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3691 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3692 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3693 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3694 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3695 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3696 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3697 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3698 "\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>"
3699 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3700 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3701 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3702 "\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"
3703 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3704 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3705 "\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"
3706 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3707 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3708 "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"
3709 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3710 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3711 "\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"
3712 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3713 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3714 "\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"
3715 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3716 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3717 "\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"
3718 "\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"
3719 "\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"
3720 "\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"
3721 "\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"
3722 "\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"
3723 "\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"
3724 "\0\0\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"
3725 "\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"
3726 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3730 dump_accels (gpointer callback_data,
3731 guint callback_action,
3734 gtk_accel_map_save_fd (1 /* stdout */);
3737 static GtkItemFactoryEntry menu_items[] =
3739 { "/_File", NULL, 0, 0, "<Branch>" },
3740 { "/File/tearoff1", NULL, gtk_ifactory_cb, 0, "<Tearoff>" },
3741 { "/File/_New", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_NEW },
3742 { "/File/_Open", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
3743 { "/File/_Save", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
3744 { "/File/Save _As...", "<control>A", gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
3745 { "/File/_Dump \"_Accels\"", NULL, dump_accels, 0 },
3746 { "/File/\\/Test__Escaping/And\\/\n\tWei\\\\rdly",
3747 NULL, gtk_ifactory_cb, 0 },
3748 { "/File/sep1", NULL, gtk_ifactory_cb, 0, "<Separator>" },
3749 { "/File/_Quit", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
3751 { "/_Preferences", NULL, 0, 0, "<Branch>" },
3752 { "/_Preferences/_Color", NULL, 0, 0, "<Branch>" },
3753 { "/_Preferences/Color/_Red", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
3754 { "/_Preferences/Color/_Green", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
3755 { "/_Preferences/Color/_Blue", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
3756 { "/_Preferences/_Shape", NULL, 0, 0, "<Branch>" },
3757 { "/_Preferences/Shape/_Square", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
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/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
3761 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
3762 { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple },
3763 { "/_Preferences/Coffee", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3764 { "/_Preferences/Toast", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3765 { "/_Preferences/Marshmallow Froot Loops", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3767 /* For testing deletion of menus */
3768 { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
3769 { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
3770 { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
3772 { "/_Help", NULL, 0, 0, "<LastBranch>" },
3773 { "/Help/_Help", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_HELP},
3774 { "/Help/_About", NULL, gtk_ifactory_cb, 0 },
3778 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
3781 create_item_factory (GtkWidget *widget)
3783 static GtkWidget *window = NULL;
3789 GtkWidget *separator;
3792 GtkAccelGroup *accel_group;
3793 GtkItemFactory *item_factory;
3794 GtkTooltips *tooltips;
3796 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3798 gtk_window_set_screen (GTK_WINDOW (window),
3799 gtk_widget_get_screen (widget));
3801 g_signal_connect (window, "destroy",
3802 G_CALLBACK(gtk_widget_destroyed),
3804 g_signal_connect (window, "delete-event",
3805 G_CALLBACK (gtk_true),
3808 accel_group = gtk_accel_group_new ();
3809 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
3810 g_object_set_data_full (G_OBJECT (window),
3814 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3815 gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
3816 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3817 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
3819 /* preselect /Preferences/Shape/Oval over the other radios
3821 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3822 "/Preferences/Shape/Oval")),
3825 /* preselect /Preferences/Coffee
3827 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3828 "/Preferences/Coffee")),
3831 /* preselect /Preferences/Marshmallow Froot Loops and set it insensitive
3833 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3834 "/Preferences/Marshmallow Froot Loops")),
3836 gtk_widget_set_sensitive (GTK_WIDGET (gtk_item_factory_get_item (item_factory,
3837 "/Preferences/Marshmallow Froot Loops")),
3840 /* Test how tooltips (ugh) work on menu items
3842 tooltips = gtk_tooltips_new ();
3843 g_object_ref (tooltips);
3844 gtk_object_sink (GTK_OBJECT (tooltips));
3845 g_object_set_data_full (G_OBJECT (window), "testgtk-tooltips",
3846 tooltips, (GDestroyNotify)g_object_unref);
3848 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/New"),
3849 "Create a new file", NULL);
3850 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Open"),
3851 "Open a file", NULL);
3852 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Save"),
3854 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/Preferences/Color"),
3855 "Modify color", NULL);
3857 box1 = gtk_vbox_new (FALSE, 0);
3858 gtk_container_add (GTK_CONTAINER (window), box1);
3860 gtk_box_pack_start (GTK_BOX (box1),
3861 gtk_item_factory_get_widget (item_factory, "<main>"),
3864 label = gtk_label_new ("Type\n<alt>\nto start");
3865 gtk_widget_set_size_request (label, 200, 200);
3866 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
3867 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
3870 separator = gtk_hseparator_new ();
3871 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3874 box2 = gtk_vbox_new (FALSE, 10);
3875 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3876 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3878 button = gtk_button_new_with_label ("close");
3879 g_signal_connect_swapped (button, "clicked",
3880 G_CALLBACK (gtk_widget_destroy),
3882 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3883 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3884 gtk_widget_grab_default (button);
3886 gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
3888 gtk_widget_show_all (window);
3891 gtk_widget_destroy (window);
3895 accel_button_new (GtkAccelGroup *accel_group,
3900 GdkModifierType modifiers;
3904 gtk_accelerator_parse (accel, &keyval, &modifiers);
3907 button = gtk_button_new ();
3908 gtk_widget_add_accelerator (button, "activate", accel_group,
3909 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3911 label = gtk_accel_label_new (text);
3912 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3913 gtk_widget_show (label);
3915 gtk_container_add (GTK_CONTAINER (button), label);
3921 create_key_lookup (GtkWidget *widget)
3923 static GtkWidget *window = NULL;
3927 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3930 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3931 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3934 gtk_window_set_screen (GTK_WINDOW (window),
3935 gtk_widget_get_screen (widget));
3937 /* We have to expand it so the accel labels will draw their labels
3939 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3941 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3943 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3944 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3945 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3946 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3947 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3948 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3949 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3950 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3951 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3952 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3953 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3954 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3955 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3956 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3957 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3958 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3959 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3960 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3961 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3962 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3964 g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
3965 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
3967 gtk_widget_show_all (window);
3970 gtk_widget_destroy (window);
3979 cmw_destroy_cb(GtkWidget *widget)
3981 /* This is needed to get out of gtk_main */
3988 cmw_color (GtkWidget *widget, GtkWidget *parent)
3992 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3994 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3996 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4000 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4002 /* And mark it as a transient dialog */
4003 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4005 g_signal_connect (csd, "destroy",
4006 G_CALLBACK (cmw_destroy_cb), NULL);
4008 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4009 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4010 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4011 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4013 /* wait until destroy calls gtk_main_quit */
4014 gtk_widget_show (csd);
4019 cmw_file (GtkWidget *widget, GtkWidget *parent)
4023 fs = gtk_file_selection_new("This is a modal file selection dialog");
4025 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4028 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4030 /* And mark it as a transient dialog */
4031 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4033 g_signal_connect (fs, "destroy",
4034 G_CALLBACK (cmw_destroy_cb), NULL);
4036 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4037 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4038 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4039 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4041 /* wait until destroy calls gtk_main_quit */
4042 gtk_widget_show (fs);
4049 create_modal_window (GtkWidget *widget)
4051 GtkWidget *window = NULL;
4052 GtkWidget *box1,*box2;
4054 GtkWidget *btnColor,*btnFile,*btnClose;
4056 /* Create modal window (Here you can use any window descendent )*/
4057 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4058 gtk_window_set_screen (GTK_WINDOW (window),
4059 gtk_widget_get_screen (widget));
4061 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4063 /* Set window as modal */
4064 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4066 /* Create widgets */
4067 box1 = gtk_vbox_new (FALSE,5);
4068 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4069 box2 = gtk_vbox_new (TRUE,5);
4070 btnColor = gtk_button_new_with_label ("Color");
4071 btnFile = gtk_button_new_with_label ("File Selection");
4072 btnClose = gtk_button_new_with_label ("Close");
4075 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4076 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4079 gtk_container_add (GTK_CONTAINER (window), box1);
4080 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4081 gtk_container_add (GTK_CONTAINER (frame1), box2);
4082 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4083 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4084 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4085 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4087 /* connect signals */
4088 g_signal_connect_swapped (btnClose, "clicked",
4089 G_CALLBACK (gtk_widget_destroy), window);
4091 g_signal_connect (window, "destroy",
4092 G_CALLBACK (cmw_destroy_cb), NULL);
4094 g_signal_connect (btnColor, "clicked",
4095 G_CALLBACK (cmw_color), window);
4096 g_signal_connect (btnFile, "clicked",
4097 G_CALLBACK (cmw_file), window);
4100 gtk_widget_show_all (window);
4102 /* wait until dialog get destroyed */
4111 make_message_dialog (GdkScreen *screen,
4113 GtkMessageType type,
4114 GtkButtonsType buttons,
4115 guint default_response)
4119 gtk_widget_destroy (*dialog);
4124 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4125 "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.)");
4127 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4129 g_signal_connect_swapped (*dialog,
4131 G_CALLBACK (gtk_widget_destroy),
4134 g_signal_connect (*dialog,
4136 G_CALLBACK (gtk_widget_destroyed),
4139 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4141 gtk_widget_show (*dialog);
4145 create_message_dialog (GtkWidget *widget)
4147 static GtkWidget *info = NULL;
4148 static GtkWidget *warning = NULL;
4149 static GtkWidget *error = NULL;
4150 static GtkWidget *question = NULL;
4151 GdkScreen *screen = gtk_widget_get_screen (widget);
4153 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4154 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_OK);
4155 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4156 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_YES);
4163 static GtkWidget *sw_parent = NULL;
4164 static GtkWidget *sw_float_parent;
4165 static guint sw_destroyed_handler = 0;
4168 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4170 gtk_widget_reparent (scrollwin, sw_parent);
4172 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4173 sw_float_parent = NULL;
4175 sw_destroyed_handler = 0;
4181 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4183 gtk_widget_destroy (sw_float_parent);
4185 sw_float_parent = NULL;
4187 sw_destroyed_handler = 0;
4191 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4195 gtk_widget_reparent (scrollwin, sw_parent);
4196 gtk_widget_destroy (sw_float_parent);
4198 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4199 sw_float_parent = NULL;
4201 sw_destroyed_handler = 0;
4205 sw_parent = scrollwin->parent;
4206 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4207 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4208 gtk_widget_get_screen (widget));
4210 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4212 gtk_widget_reparent (scrollwin, sw_float_parent);
4213 gtk_widget_show (sw_float_parent);
4215 sw_destroyed_handler =
4216 g_signal_connect (sw_parent, "destroy",
4217 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4218 g_signal_connect (sw_float_parent, "delete_event",
4219 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4224 create_scrolled_windows (GtkWidget *widget)
4226 static GtkWidget *window;
4227 GtkWidget *scrolled_window;
4235 window = gtk_dialog_new ();
4237 gtk_window_set_screen (GTK_WINDOW (window),
4238 gtk_widget_get_screen (widget));
4240 g_signal_connect (window, "destroy",
4241 G_CALLBACK (gtk_widget_destroyed),
4244 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4245 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4248 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4249 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4250 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4251 GTK_POLICY_AUTOMATIC,
4252 GTK_POLICY_AUTOMATIC);
4253 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
4254 scrolled_window, TRUE, TRUE, 0);
4255 gtk_widget_show (scrolled_window);
4257 table = gtk_table_new (20, 20, FALSE);
4258 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4259 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4260 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4261 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4262 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4263 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4264 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4265 gtk_widget_show (table);
4267 for (i = 0; i < 20; i++)
4268 for (j = 0; j < 20; j++)
4270 sprintf (buffer, "button (%d,%d)\n", i, j);
4271 button = gtk_toggle_button_new_with_label (buffer);
4272 gtk_table_attach_defaults (GTK_TABLE (table), button,
4274 gtk_widget_show (button);
4278 button = gtk_button_new_with_label ("Close");
4279 g_signal_connect_swapped (button, "clicked",
4280 G_CALLBACK (gtk_widget_destroy),
4282 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4283 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4284 button, TRUE, TRUE, 0);
4285 gtk_widget_grab_default (button);
4286 gtk_widget_show (button);
4288 button = gtk_button_new_with_label ("Reparent Out");
4289 g_signal_connect (button, "clicked",
4290 G_CALLBACK (scrolled_windows_remove),
4292 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4293 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4294 button, TRUE, TRUE, 0);
4295 gtk_widget_grab_default (button);
4296 gtk_widget_show (button);
4298 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4301 if (!GTK_WIDGET_VISIBLE (window))
4302 gtk_widget_show (window);
4304 gtk_widget_destroy (window);
4312 entry_toggle_frame (GtkWidget *checkbutton,
4315 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4316 GTK_TOGGLE_BUTTON(checkbutton)->active);
4320 entry_toggle_sensitive (GtkWidget *checkbutton,
4323 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4327 entry_props_clicked (GtkWidget *button,
4330 GtkWidget *window = create_prop_editor (entry, 0);
4332 gtk_window_set_title (GTK_WINDOW (window), "Entry Properties");
4336 create_entry (GtkWidget *widget)
4338 static GtkWidget *window = NULL;
4342 GtkWidget *has_frame_check;
4343 GtkWidget *sensitive_check;
4344 GtkWidget *entry, *cb;
4346 GtkWidget *separator;
4347 GList *cbitems = NULL;
4351 cbitems = g_list_append(cbitems, "item0");
4352 cbitems = g_list_append(cbitems, "item1 item1");
4353 cbitems = g_list_append(cbitems, "item2 item2 item2");
4354 cbitems = g_list_append(cbitems, "item3 item3 item3 item3");
4355 cbitems = g_list_append(cbitems, "item4 item4 item4 item4 item4");
4356 cbitems = g_list_append(cbitems, "item5 item5 item5 item5 item5 item5");
4357 cbitems = g_list_append(cbitems, "item6 item6 item6 item6 item6");
4358 cbitems = g_list_append(cbitems, "item7 item7 item7 item7");
4359 cbitems = g_list_append(cbitems, "item8 item8 item8");
4360 cbitems = g_list_append(cbitems, "item9 item9");
4362 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4363 gtk_window_set_screen (GTK_WINDOW (window),
4364 gtk_widget_get_screen (widget));
4366 g_signal_connect (window, "destroy",
4367 G_CALLBACK (gtk_widget_destroyed),
4370 gtk_window_set_title (GTK_WINDOW (window), "entry");
4371 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4374 box1 = gtk_vbox_new (FALSE, 0);
4375 gtk_container_add (GTK_CONTAINER (window), box1);
4378 box2 = gtk_vbox_new (FALSE, 10);
4379 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4380 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4382 hbox = gtk_hbox_new (FALSE, 5);
4383 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4385 entry = gtk_entry_new ();
4386 gtk_entry_set_text (GTK_ENTRY (entry), "hello world \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205");
4387 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4388 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4390 button = gtk_button_new_with_mnemonic ("_Props");
4391 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4392 g_signal_connect (button, "clicked",
4393 G_CALLBACK (entry_props_clicked),
4396 cb = gtk_combo_new ();
4397 gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
4398 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO(cb)->entry), "hello world \n\n\n foo");
4399 gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry),
4401 gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0);
4403 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4404 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4405 g_signal_connect (sensitive_check, "toggled",
4406 G_CALLBACK (entry_toggle_sensitive), entry);
4407 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4409 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4410 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4411 g_signal_connect (has_frame_check, "toggled",
4412 G_CALLBACK (entry_toggle_frame), entry);
4413 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4415 separator = gtk_hseparator_new ();
4416 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4418 box2 = gtk_vbox_new (FALSE, 10);
4419 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4420 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4422 button = gtk_button_new_with_label ("close");
4423 g_signal_connect_swapped (button, "clicked",
4424 G_CALLBACK (gtk_widget_destroy),
4426 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4427 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4428 gtk_widget_grab_default (button);
4431 if (!GTK_WIDGET_VISIBLE (window))
4432 gtk_widget_show_all (window);
4434 gtk_widget_destroy (window);
4441 #define SIZE_GROUP_INITIAL_SIZE 50
4444 size_group_hsize_changed (GtkSpinButton *spin_button,
4447 gtk_widget_set_size_request (GTK_BIN (button)->child,
4448 gtk_spin_button_get_value_as_int (spin_button),
4453 size_group_vsize_changed (GtkSpinButton *spin_button,
4456 gtk_widget_set_size_request (GTK_BIN (button)->child,
4458 gtk_spin_button_get_value_as_int (spin_button));
4462 create_size_group_window (GdkScreen *screen,
4463 GtkSizeGroup *master_size_group)
4467 GtkWidget *main_button;
4469 GtkWidget *spin_button;
4471 GtkSizeGroup *hgroup1;
4472 GtkSizeGroup *hgroup2;
4473 GtkSizeGroup *vgroup1;
4474 GtkSizeGroup *vgroup2;
4476 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4482 gtk_window_set_screen (GTK_WINDOW (window), screen);
4484 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
4486 g_signal_connect (window, "response",
4487 G_CALLBACK (gtk_widget_destroy),
4490 table = gtk_table_new (2, 2, FALSE);
4491 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
4493 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4494 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4495 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4496 gtk_widget_set_size_request (table, 250, 250);
4498 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4499 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4500 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4501 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4503 main_button = gtk_button_new_with_label ("X");
4505 gtk_table_attach (GTK_TABLE (table), main_button,
4507 GTK_EXPAND, GTK_EXPAND,
4509 gtk_size_group_add_widget (master_size_group, main_button);
4510 gtk_size_group_add_widget (hgroup1, main_button);
4511 gtk_size_group_add_widget (vgroup1, main_button);
4512 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
4513 SIZE_GROUP_INITIAL_SIZE,
4514 SIZE_GROUP_INITIAL_SIZE);
4516 button = gtk_button_new ();
4517 gtk_table_attach (GTK_TABLE (table), button,
4519 GTK_EXPAND, GTK_EXPAND,
4521 gtk_size_group_add_widget (vgroup1, button);
4522 gtk_size_group_add_widget (vgroup2, button);
4524 button = gtk_button_new ();
4525 gtk_table_attach (GTK_TABLE (table), button,
4527 GTK_EXPAND, GTK_EXPAND,
4529 gtk_size_group_add_widget (hgroup1, button);
4530 gtk_size_group_add_widget (hgroup2, button);
4532 button = gtk_button_new ();
4533 gtk_table_attach (GTK_TABLE (table), button,
4535 GTK_EXPAND, GTK_EXPAND,
4537 gtk_size_group_add_widget (hgroup2, button);
4538 gtk_size_group_add_widget (vgroup2, button);
4540 g_object_unref (hgroup1);
4541 g_object_unref (hgroup2);
4542 g_object_unref (vgroup1);
4543 g_object_unref (vgroup2);
4545 hbox = gtk_hbox_new (FALSE, 5);
4546 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
4548 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4549 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4550 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4551 g_signal_connect (spin_button, "value_changed",
4552 G_CALLBACK (size_group_hsize_changed), main_button);
4554 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4555 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4556 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4557 g_signal_connect (spin_button, "value_changed",
4558 G_CALLBACK (size_group_vsize_changed), main_button);
4564 create_size_groups (GtkWidget *widget)
4566 static GtkWidget *window1 = NULL;
4567 static GtkWidget *window2 = NULL;
4568 static GtkSizeGroup *master_size_group;
4570 if (!master_size_group)
4571 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4575 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4578 g_signal_connect (window1, "destroy",
4579 G_CALLBACK (gtk_widget_destroyed),
4585 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4588 g_signal_connect (window2, "destroy",
4589 G_CALLBACK (gtk_widget_destroyed),
4593 if (GTK_WIDGET_VISIBLE (window1) && GTK_WIDGET_VISIBLE (window2))
4595 gtk_widget_destroy (window1);
4596 gtk_widget_destroy (window2);
4600 if (!GTK_WIDGET_VISIBLE (window1))
4601 gtk_widget_show_all (window1);
4602 if (!GTK_WIDGET_VISIBLE (window2))
4603 gtk_widget_show_all (window2);
4611 static GtkWidget *spinner1;
4614 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4616 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
4620 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4622 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
4626 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4628 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4629 gtk_spin_button_get_value_as_int (spin));
4633 get_value (GtkWidget *widget, gpointer data)
4637 GtkSpinButton *spin;
4639 spin = GTK_SPIN_BUTTON (spinner1);
4640 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4641 if (GPOINTER_TO_INT (data) == 1)
4642 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4644 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
4645 gtk_label_set_text (label, buf);
4649 get_spin_value (GtkWidget *widget, gpointer data)
4653 GtkSpinButton *spin;
4655 spin = GTK_SPIN_BUTTON (widget);
4656 label = GTK_LABEL (data);
4658 buffer = g_strdup_printf ("%0.*f", spin->digits,
4659 gtk_spin_button_get_value (spin));
4660 gtk_label_set_text (label, buffer);
4666 spin_button_time_output_func (GtkSpinButton *spin_button)
4668 static gchar buf[6];
4672 hours = spin_button->adjustment->value / 60.0;
4673 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4674 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4675 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4676 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4681 spin_button_month_input_func (GtkSpinButton *spin_button,
4685 static gchar *month[12] = { "January", "February", "March", "April",
4686 "May", "June", "July", "August",
4687 "September", "October", "November", "December" };
4689 gboolean found = FALSE;
4691 for (i = 1; i <= 12; i++)
4693 tmp1 = g_ascii_strup (month[i - 1], -1);
4694 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4695 if (strstr (tmp1, tmp2) == tmp1)
4705 return GTK_INPUT_ERROR;
4707 *new_val = (gdouble) i;
4712 spin_button_month_output_func (GtkSpinButton *spin_button)
4715 static gchar *month[12] = { "January", "February", "March", "April",
4716 "May", "June", "July", "August", "September",
4717 "October", "November", "December" };
4719 for (i = 1; i <= 12; i++)
4720 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
4722 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4723 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4729 spin_button_hex_input_func (GtkSpinButton *spin_button,
4736 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4737 res = strtol(buf, &err, 16);
4740 return GTK_INPUT_ERROR;
4746 spin_button_hex_output_func (GtkSpinButton *spin_button)
4748 static gchar buf[7];
4751 val = (gint) spin_button->adjustment->value;
4752 if (fabs (val) < 1e-5)
4753 sprintf (buf, "0x00");
4755 sprintf (buf, "0x%.2X", val);
4756 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4757 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4762 create_spins (GtkWidget *widget)
4764 static GtkWidget *window = NULL;
4767 GtkWidget *main_vbox;
4770 GtkWidget *spinner2;
4774 GtkWidget *val_label;
4779 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4780 gtk_window_set_screen (GTK_WINDOW (window),
4781 gtk_widget_get_screen (widget));
4783 g_signal_connect (window, "destroy",
4784 G_CALLBACK (gtk_widget_destroyed),
4787 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4789 main_vbox = gtk_vbox_new (FALSE, 5);
4790 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4791 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4793 frame = gtk_frame_new ("Not accelerated");
4794 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4796 vbox = gtk_vbox_new (FALSE, 0);
4797 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4798 gtk_container_add (GTK_CONTAINER (frame), vbox);
4800 /* Time, month, hex spinners */
4802 hbox = gtk_hbox_new (FALSE, 0);
4803 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4805 vbox2 = gtk_vbox_new (FALSE, 0);
4806 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4808 label = gtk_label_new ("Time :");
4809 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4810 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4812 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4813 spinner = gtk_spin_button_new (adj, 0, 0);
4814 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4815 g_signal_connect (spinner,
4817 G_CALLBACK (spin_button_time_output_func),
4819 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4820 gtk_widget_set_size_request (spinner, 55, -1);
4821 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4823 vbox2 = gtk_vbox_new (FALSE, 0);
4824 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4826 label = gtk_label_new ("Month :");
4827 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4828 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4830 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4832 spinner = gtk_spin_button_new (adj, 0, 0);
4833 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4834 GTK_UPDATE_IF_VALID);
4835 g_signal_connect (spinner,
4837 G_CALLBACK (spin_button_month_input_func),
4839 g_signal_connect (spinner,
4841 G_CALLBACK (spin_button_month_output_func),
4843 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4844 gtk_widget_set_size_request (spinner, 85, -1);
4845 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4847 vbox2 = gtk_vbox_new (FALSE, 0);
4848 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4850 label = gtk_label_new ("Hex :");
4851 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4852 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4854 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4855 spinner = gtk_spin_button_new (adj, 0, 0);
4856 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4857 g_signal_connect (spinner,
4859 G_CALLBACK (spin_button_hex_input_func),
4861 g_signal_connect (spinner,
4863 G_CALLBACK (spin_button_hex_output_func),
4865 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4866 gtk_widget_set_size_request (spinner, 55, -1);
4867 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4869 frame = gtk_frame_new ("Accelerated");
4870 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4872 vbox = gtk_vbox_new (FALSE, 0);
4873 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4874 gtk_container_add (GTK_CONTAINER (frame), vbox);
4876 hbox = gtk_hbox_new (FALSE, 0);
4877 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4879 vbox2 = gtk_vbox_new (FALSE, 0);
4880 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4882 label = gtk_label_new ("Value :");
4883 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4884 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4886 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
4888 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
4889 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4890 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4892 vbox2 = gtk_vbox_new (FALSE, 0);
4893 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4895 label = gtk_label_new ("Digits :");
4896 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4897 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4899 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4900 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
4901 g_signal_connect (adj, "value_changed",
4902 G_CALLBACK (change_digits),
4904 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4906 hbox = gtk_hbox_new (FALSE, 0);
4907 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4909 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4910 g_signal_connect (button, "clicked",
4911 G_CALLBACK (toggle_snap),
4913 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4914 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4916 button = gtk_check_button_new_with_label ("Numeric only input mode");
4917 g_signal_connect (button, "clicked",
4918 G_CALLBACK (toggle_numeric),
4920 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4921 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4923 val_label = gtk_label_new ("");
4925 hbox = gtk_hbox_new (FALSE, 0);
4926 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4928 button = gtk_button_new_with_label ("Value as Int");
4929 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4930 g_signal_connect (button, "clicked",
4931 G_CALLBACK (get_value),
4932 GINT_TO_POINTER (1));
4933 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4935 button = gtk_button_new_with_label ("Value as Float");
4936 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4937 g_signal_connect (button, "clicked",
4938 G_CALLBACK (get_value),
4939 GINT_TO_POINTER (2));
4940 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4942 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4943 gtk_label_set_text (GTK_LABEL (val_label), "0");
4945 frame = gtk_frame_new ("Using Convenience Constructor");
4946 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4948 hbox = gtk_hbox_new (FALSE, 0);
4949 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4950 gtk_container_add (GTK_CONTAINER (frame), hbox);
4952 val_label = gtk_label_new ("0.0");
4954 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4955 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4956 g_signal_connect (spinner, "value_changed",
4957 G_CALLBACK (get_spin_value), val_label);
4958 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4959 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4961 hbox = gtk_hbox_new (FALSE, 0);
4962 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4964 button = gtk_button_new_with_label ("Close");
4965 g_signal_connect_swapped (button, "clicked",
4966 G_CALLBACK (gtk_widget_destroy),
4968 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4971 if (!GTK_WIDGET_VISIBLE (window))
4972 gtk_widget_show_all (window);
4974 gtk_widget_destroy (window);
4983 cursor_expose_event (GtkWidget *widget,
4987 GtkDrawingArea *darea;
4988 GdkDrawable *drawable;
4995 g_return_val_if_fail (widget != NULL, TRUE);
4996 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
4998 darea = GTK_DRAWING_AREA (widget);
4999 drawable = widget->window;
5000 white_gc = widget->style->white_gc;
5001 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5002 black_gc = widget->style->black_gc;
5003 max_width = widget->allocation.width;
5004 max_height = widget->allocation.height;
5006 gdk_draw_rectangle (drawable, white_gc,
5013 gdk_draw_rectangle (drawable, black_gc,
5020 gdk_draw_rectangle (drawable, gray_gc,
5031 set_cursor (GtkWidget *spinner,
5040 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5043 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5045 class = gtk_type_class (GDK_TYPE_CURSOR_TYPE);
5046 vals = class->values;
5048 while (vals && vals->value != c)
5051 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5053 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5055 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5056 gdk_window_set_cursor (widget->window, cursor);
5057 gdk_cursor_unref (cursor);
5061 cursor_event (GtkWidget *widget,
5063 GtkSpinButton *spinner)
5065 if ((event->type == GDK_BUTTON_PRESS) &&
5066 ((event->button.button == 1) ||
5067 (event->button.button == 3)))
5069 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5070 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5078 create_cursors (GtkWidget *widget)
5080 static GtkWidget *window = NULL;
5083 GtkWidget *main_vbox;
5094 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5095 gtk_window_set_screen (GTK_WINDOW (window),
5096 gtk_widget_get_screen (widget));
5098 g_signal_connect (window, "destroy",
5099 G_CALLBACK (gtk_widget_destroyed),
5102 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5104 main_vbox = gtk_vbox_new (FALSE, 5);
5105 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5106 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5109 gtk_widget_new (gtk_vbox_get_type (),
5110 "GtkBox::homogeneous", FALSE,
5111 "GtkBox::spacing", 5,
5112 "GtkContainer::border_width", 10,
5113 "GtkWidget::parent", main_vbox,
5114 "GtkWidget::visible", TRUE,
5117 hbox = gtk_hbox_new (FALSE, 0);
5118 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5119 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5121 label = gtk_label_new ("Cursor Value : ");
5122 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5123 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5125 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5129 spinner = gtk_spin_button_new (adj, 0, 0);
5130 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5133 gtk_widget_new (gtk_frame_get_type (),
5134 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5135 "GtkFrame::label_xalign", 0.5,
5136 "GtkFrame::label", "Cursor Area",
5137 "GtkContainer::border_width", 10,
5138 "GtkWidget::parent", vbox,
5139 "GtkWidget::visible", TRUE,
5142 darea = gtk_drawing_area_new ();
5143 gtk_widget_set_size_request (darea, 80, 80);
5144 gtk_container_add (GTK_CONTAINER (frame), darea);
5145 g_signal_connect (darea,
5147 G_CALLBACK (cursor_expose_event),
5149 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5150 g_signal_connect (darea,
5151 "button_press_event",
5152 G_CALLBACK (cursor_event),
5154 gtk_widget_show (darea);
5156 g_signal_connect (spinner, "changed",
5157 G_CALLBACK (set_cursor),
5160 label = gtk_widget_new (GTK_TYPE_LABEL,
5165 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5168 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5171 gtk_widget_new (gtk_hseparator_get_type (),
5172 "GtkWidget::visible", TRUE,
5174 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5176 hbox = gtk_hbox_new (FALSE, 0);
5177 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5178 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5180 button = gtk_button_new_with_label ("Close");
5181 g_signal_connect_swapped (button, "clicked",
5182 G_CALLBACK (gtk_widget_destroy),
5184 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5186 gtk_widget_show_all (window);
5188 set_cursor (spinner, darea);
5191 gtk_widget_destroy (window);
5199 list_add (GtkWidget *widget,
5204 GtkWidget *list_item;
5205 GtkContainer *container;
5207 container = GTK_CONTAINER (list);
5209 sprintf (buffer, "added item %d", i++);
5210 list_item = gtk_list_item_new_with_label (buffer);
5211 gtk_widget_show (list_item);
5213 gtk_container_add (container, list_item);
5217 list_remove (GtkWidget *widget,
5220 GList *clear_list = NULL;
5221 GList *sel_row = NULL;
5224 if (list->selection_mode == GTK_SELECTION_EXTENDED)
5228 item = GTK_CONTAINER (list)->focus_child;
5229 if (!item && list->selection)
5230 item = list->selection->data;
5234 work = g_list_find (list->children, item);
5235 for (sel_row = work; sel_row; sel_row = sel_row->next)
5236 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
5241 for (sel_row = work; sel_row; sel_row = sel_row->prev)
5242 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
5248 for (work = list->selection; work; work = work->next)
5249 clear_list = g_list_prepend (clear_list, work->data);
5251 clear_list = g_list_reverse (clear_list);
5252 gtk_list_remove_items (GTK_LIST (list), clear_list);
5253 g_list_free (clear_list);
5255 if (list->selection_mode == GTK_SELECTION_EXTENDED && sel_row)
5256 gtk_list_select_child (list, GTK_WIDGET(sel_row->data));
5260 list_clear (GtkWidget *widget,
5263 gtk_list_clear_items (GTK_LIST (list), 0, -1);
5266 static gchar *selection_mode_items[] =
5273 static const GtkSelectionMode selection_modes[] = {
5274 GTK_SELECTION_SINGLE,
5275 GTK_SELECTION_BROWSE,
5276 GTK_SELECTION_MULTIPLE
5279 static GtkWidget *list_omenu;
5282 list_toggle_sel_mode (GtkWidget *widget, gpointer data)
5287 list = GTK_LIST (data);
5289 if (!GTK_WIDGET_MAPPED (widget))
5292 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
5294 gtk_list_set_selection_mode (list, selection_modes[i]);
5298 create_list (GtkWidget *widget)
5300 static GtkWidget *window = NULL;
5308 GtkWidget *scrolled_win;
5311 GtkWidget *separator;
5314 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5316 gtk_window_set_screen (GTK_WINDOW (window),
5317 gtk_widget_get_screen (widget));
5319 g_signal_connect (window, "destroy",
5320 G_CALLBACK (gtk_widget_destroyed),
5323 gtk_window_set_title (GTK_WINDOW (window), "list");
5324 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5326 vbox = gtk_vbox_new (FALSE, 0);
5327 gtk_container_add (GTK_CONTAINER (window), vbox);
5329 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
5330 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
5331 gtk_widget_set_size_request (scrolled_win, -1, 300);
5332 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
5333 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
5334 GTK_POLICY_AUTOMATIC,
5335 GTK_POLICY_AUTOMATIC);
5337 list = gtk_list_new ();
5338 gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE);
5339 gtk_scrolled_window_add_with_viewport
5340 (GTK_SCROLLED_WINDOW (scrolled_win), list);
5341 gtk_container_set_focus_vadjustment
5342 (GTK_CONTAINER (list),
5343 gtk_scrolled_window_get_vadjustment
5344 (GTK_SCROLLED_WINDOW (scrolled_win)));
5345 gtk_container_set_focus_hadjustment
5346 (GTK_CONTAINER (list),
5347 gtk_scrolled_window_get_hadjustment
5348 (GTK_SCROLLED_WINDOW (scrolled_win)));
5350 if ((infile = fopen("../gtk/gtkenums.h", "r")))
5356 while (fgets (buffer, 256, infile))
5358 if ((pos = strchr (buffer, '\n')))
5360 item = gtk_list_item_new_with_label (buffer);
5361 gtk_container_add (GTK_CONTAINER (list), item);
5368 hbox = gtk_hbox_new (TRUE, 5);
5369 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5370 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5372 button = gtk_button_new_with_label ("Insert Row");
5373 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5374 g_signal_connect (button, "clicked",
5375 G_CALLBACK (list_add),
5378 button = gtk_button_new_with_label ("Clear List");
5379 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5380 g_signal_connect (button, "clicked",
5381 G_CALLBACK (list_clear),
5384 button = gtk_button_new_with_label ("Remove Selection");
5385 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5386 g_signal_connect (button, "clicked",
5387 G_CALLBACK (list_remove),
5390 cbox = gtk_hbox_new (FALSE, 0);
5391 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
5393 hbox = gtk_hbox_new (FALSE, 5);
5394 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5395 gtk_box_pack_start (GTK_BOX (cbox), hbox, TRUE, FALSE, 0);
5397 label = gtk_label_new ("Selection Mode :");
5398 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5400 list_omenu = build_option_menu (selection_mode_items, 3, 3,
5401 list_toggle_sel_mode,
5403 gtk_box_pack_start (GTK_BOX (hbox), list_omenu, FALSE, TRUE, 0);
5405 separator = gtk_hseparator_new ();
5406 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
5408 cbox = gtk_hbox_new (FALSE, 0);
5409 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
5411 button = gtk_button_new_with_label ("close");
5412 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5413 gtk_box_pack_start (GTK_BOX (cbox), button, TRUE, TRUE, 0);
5414 g_signal_connect_swapped (button, "clicked",
5415 G_CALLBACK (gtk_widget_destroy),
5418 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5419 gtk_widget_grab_default (button);
5422 if (!GTK_WIDGET_VISIBLE (window))
5423 gtk_widget_show_all (window);
5425 gtk_widget_destroy (window);
5432 static char * book_open_xpm[] = {
5455 static char * book_closed_xpm[] = {
5480 static char * mini_page_xpm[] = {
5503 static char * gtk_mini_xpm[] = {
5543 #define TESTGTK_CLIST_COLUMNS 12
5544 static gint clist_rows = 0;
5545 static GtkWidget *clist_omenu;
5548 add1000_clist (GtkWidget *widget, gpointer data)
5551 char text[TESTGTK_CLIST_COLUMNS][50];
5552 char *texts[TESTGTK_CLIST_COLUMNS];
5557 clist = GTK_CLIST (data);
5559 pixmap = gdk_pixmap_create_from_xpm_d (clist->clist_window,
5561 >K_WIDGET (data)->style->white,
5564 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5567 sprintf (text[i], "Column %d", i);
5571 sprintf (text[1], "Right");
5572 sprintf (text[2], "Center");
5574 gtk_clist_freeze (GTK_CLIST (data));
5575 for (i = 0; i < 1000; i++)
5577 sprintf (text[0], "CListRow %d", rand() % 10000);
5578 row = gtk_clist_append (clist, texts);
5579 gtk_clist_set_pixtext (clist, row, 3, "gtk+", 5, pixmap, mask);
5582 gtk_clist_thaw (GTK_CLIST (data));
5584 g_object_unref (pixmap);
5585 g_object_unref (mask);
5589 add10000_clist (GtkWidget *widget, gpointer data)
5592 char text[TESTGTK_CLIST_COLUMNS][50];
5593 char *texts[TESTGTK_CLIST_COLUMNS];
5595 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5598 sprintf (text[i], "Column %d", i);
5601 sprintf (text[1], "Right");
5602 sprintf (text[2], "Center");
5604 gtk_clist_freeze (GTK_CLIST (data));
5605 for (i = 0; i < 10000; i++)
5607 sprintf (text[0], "CListRow %d", rand() % 10000);
5608 gtk_clist_append (GTK_CLIST (data), texts);
5610 gtk_clist_thaw (GTK_CLIST (data));
5614 clear_clist (GtkWidget *widget, gpointer data)
5616 gtk_clist_clear (GTK_CLIST (data));
5620 void clist_remove_selection (GtkWidget *widget, GtkCList *clist)
5622 gtk_clist_freeze (clist);
5624 while (clist->selection)
5629 row = GPOINTER_TO_INT (clist->selection->data);
5631 gtk_clist_remove (clist, row);
5633 if (clist->selection_mode == GTK_SELECTION_BROWSE)
5637 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
5638 clist->focus_row >= 0)
5639 gtk_clist_select_row (clist, clist->focus_row, -1);
5641 gtk_clist_thaw (clist);
5644 void toggle_title_buttons (GtkWidget *widget, GtkCList *clist)
5646 if (GTK_TOGGLE_BUTTON (widget)->active)
5647 gtk_clist_column_titles_show (clist);
5649 gtk_clist_column_titles_hide (clist);
5652 void toggle_reorderable (GtkWidget *widget, GtkCList *clist)
5654 gtk_clist_set_reorderable (clist, GTK_TOGGLE_BUTTON (widget)->active);
5658 insert_row_clist (GtkWidget *widget, gpointer data)
5660 static char *text[] =
5662 "This", "is an", "inserted", "row.",
5663 "This", "is an", "inserted", "row.",
5664 "This", "is an", "inserted", "row."
5667 static GtkStyle *style1 = NULL;
5668 static GtkStyle *style2 = NULL;
5669 static GtkStyle *style3 = NULL;
5672 if (GTK_CLIST (data)->focus_row >= 0)
5673 row = gtk_clist_insert (GTK_CLIST (data), GTK_CLIST (data)->focus_row,
5676 row = gtk_clist_prepend (GTK_CLIST (data), text);
5690 style1 = gtk_style_copy (GTK_WIDGET (data)->style);
5691 style1->base[GTK_STATE_NORMAL] = col1;
5692 style1->base[GTK_STATE_SELECTED] = col2;
5694 style2 = gtk_style_copy (GTK_WIDGET (data)->style);
5695 style2->fg[GTK_STATE_NORMAL] = col1;
5696 style2->fg[GTK_STATE_SELECTED] = col2;
5698 style3 = gtk_style_copy (GTK_WIDGET (data)->style);
5699 style3->fg[GTK_STATE_NORMAL] = col1;
5700 style3->base[GTK_STATE_NORMAL] = col2;
5701 pango_font_description_free (style3->font_desc);
5702 style3->font_desc = pango_font_description_from_string ("courier 12");
5705 gtk_clist_set_cell_style (GTK_CLIST (data), row, 3, style1);
5706 gtk_clist_set_cell_style (GTK_CLIST (data), row, 4, style2);
5707 gtk_clist_set_cell_style (GTK_CLIST (data), row, 0, style3);
5713 clist_warning_test (GtkWidget *button,
5717 static gboolean add_remove = FALSE;
5719 add_remove = !add_remove;
5721 child = gtk_label_new ("Test");
5722 g_object_ref (child);
5723 gtk_object_sink (GTK_OBJECT (child));
5726 gtk_container_add (GTK_CONTAINER (clist), child);
5729 child->parent = clist;
5730 gtk_container_remove (GTK_CONTAINER (clist), child);
5731 child->parent = NULL;
5734 gtk_widget_destroy (child);
5735 gtk_widget_unref (child);
5739 undo_selection (GtkWidget *button, GtkCList *clist)
5741 gtk_clist_undo_selection (clist);
5745 clist_toggle_sel_mode (GtkWidget *widget, gpointer data)
5750 clist = GTK_CLIST (data);
5752 if (!GTK_WIDGET_MAPPED (widget))
5755 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
5757 gtk_clist_set_selection_mode (clist, selection_modes[i]);
5761 clist_click_column (GtkCList *clist, gint column, gpointer data)
5764 gtk_clist_set_column_visibility (clist, column, FALSE);
5765 else if (column == clist->sort_column)
5767 if (clist->sort_type == GTK_SORT_ASCENDING)
5768 clist->sort_type = GTK_SORT_DESCENDING;
5770 clist->sort_type = GTK_SORT_ASCENDING;
5773 gtk_clist_set_sort_column (clist, column);
5775 gtk_clist_sort (clist);
5779 create_clist (GtkWidget *widget)
5782 static GtkWidget *window = NULL;
5784 static char *titles[] =
5786 "auto resize", "not resizeable", "max width 100", "min width 50",
5787 "hide column", "Title 5", "Title 6", "Title 7",
5788 "Title 8", "Title 9", "Title 10", "Title 11"
5791 char text[TESTGTK_CLIST_COLUMNS][50];
5792 char *texts[TESTGTK_CLIST_COLUMNS];
5798 GtkWidget *separator;
5799 GtkWidget *scrolled_win;
5802 GtkWidget *undo_button;
5812 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5813 gtk_window_set_screen (GTK_WINDOW (window),
5814 gtk_widget_get_screen (widget));
5816 g_signal_connect (window, "destroy",
5817 G_CALLBACK (gtk_widget_destroyed), &window);
5819 gtk_window_set_title (GTK_WINDOW (window), "clist");
5820 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5822 vbox = gtk_vbox_new (FALSE, 0);
5823 gtk_container_add (GTK_CONTAINER (window), vbox);
5825 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
5826 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
5827 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
5828 GTK_POLICY_AUTOMATIC,
5829 GTK_POLICY_AUTOMATIC);
5831 /* create GtkCList here so we have a pointer to throw at the
5832 * button callbacks -- more is done with it later */
5833 clist = gtk_clist_new_with_titles (TESTGTK_CLIST_COLUMNS, titles);
5834 gtk_container_add (GTK_CONTAINER (scrolled_win), clist);
5835 g_signal_connect (clist, "click_column",
5836 G_CALLBACK (clist_click_column), NULL);
5838 /* control buttons */
5839 hbox = gtk_hbox_new (FALSE, 5);
5840 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5841 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
5843 button = gtk_button_new_with_label ("Insert Row");
5844 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5845 g_signal_connect (button, "clicked",
5846 G_CALLBACK (insert_row_clist), clist);
5848 button = gtk_button_new_with_label ("Add 1,000 Rows With Pixmaps");
5849 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5850 g_signal_connect (button, "clicked",
5851 G_CALLBACK (add1000_clist), clist);
5853 button = gtk_button_new_with_label ("Add 10,000 Rows");
5854 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5855 g_signal_connect (button, "clicked",
5856 G_CALLBACK (add10000_clist), clist);
5858 /* second layer of buttons */
5859 hbox = gtk_hbox_new (FALSE, 5);
5860 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5861 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
5863 button = gtk_button_new_with_label ("Clear List");
5864 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5865 g_signal_connect (button, "clicked",
5866 G_CALLBACK (clear_clist), clist);
5868 button = gtk_button_new_with_label ("Remove Selection");
5869 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5870 g_signal_connect (button, "clicked",
5871 G_CALLBACK (clist_remove_selection), clist);
5873 undo_button = gtk_button_new_with_label ("Undo Selection");
5874 gtk_box_pack_start (GTK_BOX (hbox), undo_button, TRUE, TRUE, 0);
5875 g_signal_connect (undo_button, "clicked",
5876 G_CALLBACK (undo_selection), clist);
5878 button = gtk_button_new_with_label ("Warning Test");
5879 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5880 g_signal_connect (button, "clicked",
5881 G_CALLBACK (clist_warning_test), clist);
5883 /* third layer of buttons */
5884 hbox = gtk_hbox_new (FALSE, 5);
5885 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5886 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
5888 check = gtk_check_button_new_with_label ("Show Title Buttons");
5889 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
5890 g_signal_connect (check, "clicked",
5891 G_CALLBACK (toggle_title_buttons), clist);
5892 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
5894 check = gtk_check_button_new_with_label ("Reorderable");
5895 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
5896 g_signal_connect (check, "clicked",
5897 G_CALLBACK (toggle_reorderable), clist);
5898 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
5900 label = gtk_label_new ("Selection Mode :");
5901 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5903 clist_omenu = build_option_menu (selection_mode_items, 3, 3,
5904 clist_toggle_sel_mode,
5906 gtk_box_pack_start (GTK_BOX (hbox), clist_omenu, FALSE, TRUE, 0);
5909 * the rest of the clist configuration
5912 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
5913 gtk_clist_set_row_height (GTK_CLIST (clist), 18);
5914 gtk_widget_set_size_request (clist, -1, 300);
5916 for (i = 1; i < TESTGTK_CLIST_COLUMNS; i++)
5917 gtk_clist_set_column_width (GTK_CLIST (clist), i, 80);
5919 gtk_clist_set_column_auto_resize (GTK_CLIST (clist), 0, TRUE);
5920 gtk_clist_set_column_resizeable (GTK_CLIST (clist), 1, FALSE);
5921 gtk_clist_set_column_max_width (GTK_CLIST (clist), 2, 100);
5922 gtk_clist_set_column_min_width (GTK_CLIST (clist), 3, 50);
5923 gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
5924 gtk_clist_set_column_justification (GTK_CLIST (clist), 1,
5926 gtk_clist_set_column_justification (GTK_CLIST (clist), 2,
5927 GTK_JUSTIFY_CENTER);
5929 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5932 sprintf (text[i], "Column %d", i);
5935 sprintf (text[1], "Right");
5936 sprintf (text[2], "Center");
5945 style = gtk_style_new ();
5946 style->fg[GTK_STATE_NORMAL] = col1;
5947 style->base[GTK_STATE_NORMAL] = col2;
5949 pango_font_description_set_size (style->font_desc, 14 * PANGO_SCALE);
5950 pango_font_description_set_weight (style->font_desc, PANGO_WEIGHT_BOLD);
5952 for (i = 0; i < 10; i++)
5954 sprintf (text[0], "CListRow %d", clist_rows++);
5955 gtk_clist_append (GTK_CLIST (clist), texts);
5960 gtk_clist_set_row_style (GTK_CLIST (clist), i, style);
5963 gtk_clist_set_cell_style (GTK_CLIST (clist), i, i % 4, style);
5968 gtk_style_unref (style);
5970 separator = gtk_hseparator_new ();
5971 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
5973 hbox = gtk_hbox_new (FALSE, 0);
5974 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5976 button = gtk_button_new_with_label ("close");
5977 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5978 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5979 g_signal_connect_swapped (button, "clicked",
5980 G_CALLBACK (gtk_widget_destroy),
5983 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5984 gtk_widget_grab_default (button);
5987 if (!GTK_WIDGET_VISIBLE (window))
5988 gtk_widget_show_all (window);
5992 gtk_widget_destroy (window);
6010 static gint books = 0;
6011 static gint pages = 0;
6013 static GtkWidget *book_label;
6014 static GtkWidget *page_label;
6015 static GtkWidget *sel_label;
6016 static GtkWidget *vis_label;
6017 static GtkWidget *omenu1;
6018 static GtkWidget *omenu2;
6019 static GtkWidget *omenu3;
6020 static GtkWidget *omenu4;
6021 static GtkWidget *spin1;
6022 static GtkWidget *spin2;
6023 static GtkWidget *spin3;
6024 static gint line_style;
6027 static CTreePixmaps *
6028 get_ctree_pixmaps (GtkCTree *ctree)
6030 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (ctree));
6031 CTreePixmaps *pixmaps = g_object_get_data (G_OBJECT (screen), "ctree-pixmaps");
6035 GdkColormap *colormap = gdk_screen_get_rgb_colormap (screen);
6036 pixmaps = g_new (CTreePixmaps, 1);
6038 pixmaps->pixmap1 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6040 NULL, book_closed_xpm);
6041 pixmaps->pixmap2 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6043 NULL, book_open_xpm);
6044 pixmaps->pixmap3 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6046 NULL, mini_page_xpm);
6048 g_object_set_data (G_OBJECT (screen), "ctree-pixmaps", pixmaps);
6054 void after_press (GtkCTree *ctree, gpointer data)
6058 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
6059 gtk_label_set_text (GTK_LABEL (sel_label), buf);
6061 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
6062 gtk_label_set_text (GTK_LABEL (vis_label), buf);
6064 sprintf (buf, "%d", books);
6065 gtk_label_set_text (GTK_LABEL (book_label), buf);
6067 sprintf (buf, "%d", pages);
6068 gtk_label_set_text (GTK_LABEL (page_label), buf);
6071 void after_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent,
6072 GtkCTreeNode *sibling, gpointer data)
6078 gtk_ctree_get_node_info (ctree, child, &source,
6079 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6081 gtk_ctree_get_node_info (ctree, parent, &target1,
6082 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6084 gtk_ctree_get_node_info (ctree, sibling, &target2,
6085 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6087 g_print ("Moving \"%s\" to \"%s\" with sibling \"%s\".\n", source,
6088 (parent) ? target1 : "nil", (sibling) ? target2 : "nil");
6091 void count_items (GtkCTree *ctree, GtkCTreeNode *list)
6093 if (GTK_CTREE_ROW (list)->is_leaf)
6099 void expand_all (GtkWidget *widget, GtkCTree *ctree)
6101 gtk_ctree_expand_recursive (ctree, NULL);
6102 after_press (ctree, NULL);
6105 void collapse_all (GtkWidget *widget, GtkCTree *ctree)
6107 gtk_ctree_collapse_recursive (ctree, NULL);
6108 after_press (ctree, NULL);
6111 void select_all (GtkWidget *widget, GtkCTree *ctree)
6113 gtk_ctree_select_recursive (ctree, NULL);
6114 after_press (ctree, NULL);
6117 void change_style (GtkWidget *widget, GtkCTree *ctree)
6119 static GtkStyle *style1 = NULL;
6120 static GtkStyle *style2 = NULL;
6126 if (GTK_CLIST (ctree)->focus_row >= 0)
6127 node = GTK_CTREE_NODE
6128 (g_list_nth (GTK_CLIST (ctree)->row_list,GTK_CLIST (ctree)->focus_row));
6130 node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list);
6144 style1 = gtk_style_new ();
6145 style1->base[GTK_STATE_NORMAL] = col1;
6146 style1->fg[GTK_STATE_SELECTED] = col2;
6148 style2 = gtk_style_new ();
6149 style2->base[GTK_STATE_SELECTED] = col2;
6150 style2->fg[GTK_STATE_NORMAL] = col1;
6151 style2->base[GTK_STATE_NORMAL] = col2;
6152 pango_font_description_free (style2->font_desc);
6153 style2->font_desc = pango_font_description_from_string ("courier 30");
6156 gtk_ctree_node_set_cell_style (ctree, node, 1, style1);
6157 gtk_ctree_node_set_cell_style (ctree, node, 0, style2);
6159 if (GTK_CTREE_ROW (node)->children)
6160 gtk_ctree_node_set_row_style (ctree, GTK_CTREE_ROW (node)->children,
6164 void unselect_all (GtkWidget *widget, GtkCTree *ctree)
6166 gtk_ctree_unselect_recursive (ctree, NULL);
6167 after_press (ctree, NULL);
6170 void remove_selection (GtkWidget *widget, GtkCTree *ctree)
6175 clist = GTK_CLIST (ctree);
6177 gtk_clist_freeze (clist);
6179 while (clist->selection)
6181 node = clist->selection->data;
6183 if (GTK_CTREE_ROW (node)->is_leaf)
6186 gtk_ctree_post_recursive (ctree, node,
6187 (GtkCTreeFunc) count_items, NULL);
6189 gtk_ctree_remove_node (ctree, node);
6191 if (clist->selection_mode == GTK_SELECTION_BROWSE)
6195 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
6196 clist->focus_row >= 0)
6198 node = gtk_ctree_node_nth (ctree, clist->focus_row);
6201 gtk_ctree_select (ctree, node);
6204 gtk_clist_thaw (clist);
6205 after_press (ctree, NULL);
6208 struct _ExportStruct {
6214 typedef struct _ExportStruct ExportStruct;
6217 gnode2ctree (GtkCTree *ctree,
6220 GtkCTreeNode *cnode,
6224 GdkPixmap *pixmap_closed;
6225 GdkBitmap *mask_closed;
6226 GdkPixmap *pixmap_opened;
6227 GdkBitmap *mask_opened;
6228 CTreePixmaps *pixmaps;
6230 if (!cnode || !gnode || (!(es = gnode->data)))
6233 pixmaps = get_ctree_pixmaps (ctree);
6237 pixmap_closed = pixmaps->pixmap3;
6238 mask_closed = pixmaps->mask3;
6239 pixmap_opened = NULL;
6244 pixmap_closed = pixmaps->pixmap1;
6245 mask_closed = pixmaps->mask1;
6246 pixmap_opened = pixmaps->pixmap2;
6247 mask_opened = pixmaps->mask2;
6250 gtk_ctree_set_node_info (ctree, cnode, es->tree, 2, pixmap_closed,
6251 mask_closed, pixmap_opened, mask_opened,
6252 es->is_leaf, (depth < 3));
6253 gtk_ctree_node_set_text (ctree, cnode, 1, es->info);
6261 ctree2gnode (GtkCTree *ctree,
6264 GtkCTreeNode *cnode,
6269 if (!cnode || !gnode)
6272 es = g_new (ExportStruct, 1);
6274 es->is_leaf = GTK_CTREE_ROW (cnode)->is_leaf;
6275 es->tree = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[0])->text;
6276 es->info = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[1])->text;
6280 void export_ctree (GtkWidget *widget, GtkCTree *ctree)
6282 char *title[] = { "Tree" , "Info" };
6283 static GtkWidget *export_window = NULL;
6284 static GtkCTree *export_ctree;
6286 GtkWidget *scrolled_win;
6294 export_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6296 gtk_window_set_screen (GTK_WINDOW (export_window),
6297 gtk_widget_get_screen (widget));
6299 g_signal_connect (export_window, "destroy",
6300 G_CALLBACK (gtk_widget_destroyed),
6303 gtk_window_set_title (GTK_WINDOW (export_window), "exported ctree");
6304 gtk_container_set_border_width (GTK_CONTAINER (export_window), 5);
6306 vbox = gtk_vbox_new (FALSE, 0);
6307 gtk_container_add (GTK_CONTAINER (export_window), vbox);
6309 button = gtk_button_new_with_label ("Close");
6310 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, TRUE, 0);
6312 g_signal_connect_swapped (button, "clicked",
6313 G_CALLBACK (gtk_widget_destroy),
6316 sep = gtk_hseparator_new ();
6317 gtk_box_pack_end (GTK_BOX (vbox), sep, FALSE, TRUE, 10);
6319 export_ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
6320 gtk_ctree_set_line_style (export_ctree, GTK_CTREE_LINES_DOTTED);
6322 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6323 gtk_container_add (GTK_CONTAINER (scrolled_win),
6324 GTK_WIDGET (export_ctree));
6325 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6326 GTK_POLICY_AUTOMATIC,
6327 GTK_POLICY_AUTOMATIC);
6328 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6329 gtk_clist_set_selection_mode (GTK_CLIST (export_ctree),
6330 GTK_SELECTION_EXTENDED);
6331 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 0, 200);
6332 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 1, 200);
6333 gtk_widget_set_size_request (GTK_WIDGET (export_ctree), 300, 200);
6336 if (!GTK_WIDGET_VISIBLE (export_window))
6337 gtk_widget_show_all (export_window);
6339 gtk_clist_clear (GTK_CLIST (export_ctree));
6341 node = GTK_CTREE_NODE (g_list_nth (GTK_CLIST (ctree)->row_list,
6342 GTK_CLIST (ctree)->focus_row));
6346 gnode = gtk_ctree_export_to_gnode (ctree, NULL, NULL, node,
6350 gtk_ctree_insert_gnode (export_ctree, NULL, NULL, gnode,
6352 g_node_destroy (gnode);
6356 void change_indent (GtkWidget *widget, GtkCTree *ctree)
6358 gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
6361 void change_spacing (GtkWidget *widget, GtkCTree *ctree)
6363 gtk_ctree_set_spacing (ctree, GTK_ADJUSTMENT (widget)->value);
6366 void change_row_height (GtkWidget *widget, GtkCList *clist)
6368 gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value);
6371 void set_background (GtkCTree *ctree, GtkCTreeNode *node, gpointer data)
6373 GtkStyle *style = NULL;
6378 if (ctree->line_style != GTK_CTREE_LINES_TABBED)
6380 if (!GTK_CTREE_ROW (node)->is_leaf)
6381 style = GTK_CTREE_ROW (node)->row.data;
6382 else if (GTK_CTREE_ROW (node)->parent)
6383 style = GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data;
6386 gtk_ctree_node_set_row_style (ctree, node, style);
6390 ctree_toggle_line_style (GtkWidget *widget, gpointer data)
6395 ctree = GTK_CTREE (data);
6397 if (!GTK_WIDGET_MAPPED (widget))
6400 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6402 if ((ctree->line_style == GTK_CTREE_LINES_TABBED &&
6403 ((GtkCTreeLineStyle) i) != GTK_CTREE_LINES_TABBED) ||
6404 (ctree->line_style != GTK_CTREE_LINES_TABBED &&
6405 ((GtkCTreeLineStyle) i) == GTK_CTREE_LINES_TABBED))
6406 gtk_ctree_pre_recursive (ctree, NULL, set_background, NULL);
6407 gtk_ctree_set_line_style (ctree, i);
6412 ctree_toggle_expander_style (GtkWidget *widget, gpointer data)
6417 ctree = GTK_CTREE (data);
6419 if (!GTK_WIDGET_MAPPED (widget))
6422 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6424 gtk_ctree_set_expander_style (ctree, (GtkCTreeExpanderStyle) i);
6428 ctree_toggle_justify (GtkWidget *widget, gpointer data)
6433 ctree = GTK_CTREE (data);
6435 if (!GTK_WIDGET_MAPPED (widget))
6438 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6440 gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column,
6441 (GtkJustification) i);
6445 ctree_toggle_sel_mode (GtkWidget *widget, gpointer data)
6450 ctree = GTK_CTREE (data);
6452 if (!GTK_WIDGET_MAPPED (widget))
6455 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6457 gtk_clist_set_selection_mode (GTK_CLIST (ctree), selection_modes[i]);
6458 after_press (ctree, NULL);
6461 void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
6462 gint num_books, gint num_pages, GtkCTreeNode *parent)
6467 GtkCTreeNode *sibling;
6468 CTreePixmaps *pixmaps;
6475 pixmaps = get_ctree_pixmaps (ctree);
6477 for (i = num_pages + num_books; i > num_books; i--)
6480 sprintf (buf1, "Page %02d", (gint) rand() % 100);
6481 sprintf (buf2, "Item %d-%d", cur_depth, i);
6482 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
6483 pixmaps->pixmap3, pixmaps->mask3, NULL, NULL,
6486 if (parent && ctree->line_style == GTK_CTREE_LINES_TABBED)
6487 gtk_ctree_node_set_row_style (ctree, sibling,
6488 GTK_CTREE_ROW (parent)->row.style);
6491 if (cur_depth == depth)
6494 for (i = num_books; i > 0; i--)
6499 sprintf (buf1, "Book %02d", (gint) rand() % 100);
6500 sprintf (buf2, "Item %d-%d", cur_depth, i);
6501 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
6502 pixmaps->pixmap1, pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2,
6505 style = gtk_style_new ();
6506 switch (cur_depth % 3)
6509 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
6510 style->base[GTK_STATE_NORMAL].green = 0;
6511 style->base[GTK_STATE_NORMAL].blue = 65535 - ((i * 10000) % 65535);
6514 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
6515 style->base[GTK_STATE_NORMAL].green = 65535 - ((i * 10000) % 65535);
6516 style->base[GTK_STATE_NORMAL].blue = 0;
6519 style->base[GTK_STATE_NORMAL].red = 65535 - ((i * 10000) % 65535);
6520 style->base[GTK_STATE_NORMAL].green = 0;
6521 style->base[GTK_STATE_NORMAL].blue = 10000 * (cur_depth % 6);
6524 gtk_ctree_node_set_row_data_full (ctree, sibling, style,
6525 (GtkDestroyNotify) gtk_style_unref);
6527 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
6528 gtk_ctree_node_set_row_style (ctree, sibling, style);
6530 build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages,
6535 void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
6538 gchar label1[] = "Root";
6539 gchar label2[] = "";
6540 GtkCTreeNode *parent;
6543 CTreePixmaps *pixmaps;
6545 pixmaps = get_ctree_pixmaps (ctree);
6550 d = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
6551 b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
6552 p = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin3));
6554 n = ((pow (b, d) - 1) / (b - 1)) * (p + 1);
6558 g_print ("%d total items? Try less\n",n);
6562 gtk_clist_freeze (GTK_CLIST (ctree));
6563 gtk_clist_clear (GTK_CLIST (ctree));
6568 parent = gtk_ctree_insert_node (ctree, NULL, NULL, text, 5, pixmaps->pixmap1,
6569 pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2, FALSE, TRUE);
6571 style = gtk_style_new ();
6572 style->base[GTK_STATE_NORMAL].red = 0;
6573 style->base[GTK_STATE_NORMAL].green = 45000;
6574 style->base[GTK_STATE_NORMAL].blue = 55000;
6575 gtk_ctree_node_set_row_data_full (ctree, parent, style,
6576 (GtkDestroyNotify) gtk_style_unref);
6578 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
6579 gtk_ctree_node_set_row_style (ctree, parent, style);
6581 build_recursive (ctree, 1, d, b, p, parent);
6582 gtk_clist_thaw (GTK_CLIST (ctree));
6583 after_press (ctree, NULL);
6587 ctree_click_column (GtkCTree *ctree, gint column, gpointer data)
6591 clist = GTK_CLIST (ctree);
6593 if (column == clist->sort_column)
6595 if (clist->sort_type == GTK_SORT_ASCENDING)
6596 clist->sort_type = GTK_SORT_DESCENDING;
6598 clist->sort_type = GTK_SORT_ASCENDING;
6601 gtk_clist_set_sort_column (clist, column);
6603 gtk_ctree_sort_recursive (ctree, NULL);
6606 void create_ctree (GtkWidget *widget)
6608 static GtkWidget *window = NULL;
6609 GtkTooltips *tooltips;
6611 GtkWidget *scrolled_win;
6624 char *title[] = { "Tree" , "Info" };
6627 static gchar *items1[] =
6635 static gchar *items2[] =
6643 static gchar *items3[] =
6651 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6652 gtk_window_set_screen (GTK_WINDOW (window),
6653 gtk_widget_get_screen (widget));
6655 g_signal_connect (window, "destroy",
6656 G_CALLBACK (gtk_widget_destroyed),
6659 gtk_window_set_title (GTK_WINDOW (window), "GtkCTree");
6660 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6662 tooltips = gtk_tooltips_new ();
6663 g_object_ref (tooltips);
6664 gtk_object_sink (GTK_OBJECT (tooltips));
6666 g_object_set_data_full (G_OBJECT (window), "tooltips", tooltips,
6669 vbox = gtk_vbox_new (FALSE, 0);
6670 gtk_container_add (GTK_CONTAINER (window), vbox);
6672 hbox = gtk_hbox_new (FALSE, 5);
6673 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6674 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6676 label = gtk_label_new ("Depth :");
6677 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6679 adj = (GtkAdjustment *) gtk_adjustment_new (4, 1, 10, 1, 5, 0);
6680 spin1 = gtk_spin_button_new (adj, 0, 0);
6681 gtk_box_pack_start (GTK_BOX (hbox), spin1, FALSE, TRUE, 5);
6683 label = gtk_label_new ("Books :");
6684 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6686 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
6687 spin2 = gtk_spin_button_new (adj, 0, 0);
6688 gtk_box_pack_start (GTK_BOX (hbox), spin2, FALSE, TRUE, 5);
6690 label = gtk_label_new ("Pages :");
6691 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6693 adj = (GtkAdjustment *) gtk_adjustment_new (5, 1, 20, 1, 5, 0);
6694 spin3 = gtk_spin_button_new (adj, 0, 0);
6695 gtk_box_pack_start (GTK_BOX (hbox), spin3, FALSE, TRUE, 5);
6697 button = gtk_button_new_with_label ("Close");
6698 gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6700 g_signal_connect_swapped (button, "clicked",
6701 G_CALLBACK (gtk_widget_destroy),
6704 button = gtk_button_new_with_label ("Rebuild Tree");
6705 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6707 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6708 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6709 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6710 GTK_POLICY_AUTOMATIC,
6712 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6714 ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
6715 gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (ctree));
6717 gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
6718 gtk_clist_set_column_width (GTK_CLIST (ctree), 1, 200);
6719 gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_EXTENDED);
6720 gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
6721 line_style = GTK_CTREE_LINES_DOTTED;
6723 g_signal_connect (button, "clicked",
6724 G_CALLBACK (rebuild_tree), ctree);
6725 g_signal_connect (ctree, "click_column",
6726 G_CALLBACK (ctree_click_column), NULL);
6728 g_signal_connect_after (ctree, "button_press_event",
6729 G_CALLBACK (after_press), NULL);
6730 g_signal_connect_after (ctree, "button_release_event",
6731 G_CALLBACK (after_press), NULL);
6732 g_signal_connect_after (ctree, "tree_move",
6733 G_CALLBACK (after_move), NULL);
6734 g_signal_connect_after (ctree, "end_selection",
6735 G_CALLBACK (after_press), NULL);
6736 g_signal_connect_after (ctree, "toggle_focus_row",
6737 G_CALLBACK (after_press), NULL);
6738 g_signal_connect_after (ctree, "select_all",
6739 G_CALLBACK (after_press), NULL);
6740 g_signal_connect_after (ctree, "unselect_all",
6741 G_CALLBACK (after_press), NULL);
6742 g_signal_connect_after (ctree, "scroll_vertical",
6743 G_CALLBACK (after_press), NULL);
6745 bbox = gtk_hbox_new (FALSE, 5);
6746 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
6747 gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, TRUE, 0);
6749 mbox = gtk_vbox_new (TRUE, 5);
6750 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
6752 label = gtk_label_new ("Row Height :");
6753 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
6755 label = gtk_label_new ("Indent :");
6756 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
6758 label = gtk_label_new ("Spacing :");
6759 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
6761 mbox = gtk_vbox_new (TRUE, 5);
6762 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
6764 adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0);
6765 spinner = gtk_spin_button_new (adj, 0, 0);
6766 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
6767 gtk_tooltips_set_tip (tooltips, spinner,
6768 "Row height of list items", NULL);
6769 g_signal_connect (adj, "value_changed",
6770 G_CALLBACK (change_row_height), ctree);
6771 gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value);
6773 adj = (GtkAdjustment *) gtk_adjustment_new (20, 0, 60, 1, 10, 0);
6774 spinner = gtk_spin_button_new (adj, 0, 0);
6775 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
6776 gtk_tooltips_set_tip (tooltips, spinner, "Tree Indentation.", NULL);
6777 g_signal_connect (adj, "value_changed",
6778 G_CALLBACK (change_indent), ctree);
6780 adj = (GtkAdjustment *) gtk_adjustment_new (5, 0, 60, 1, 10, 0);
6781 spinner = gtk_spin_button_new (adj, 0, 0);
6782 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
6783 gtk_tooltips_set_tip (tooltips, spinner, "Tree Spacing.", NULL);
6784 g_signal_connect (adj, "value_changed",
6785 G_CALLBACK (change_spacing), ctree);
6787 mbox = gtk_vbox_new (TRUE, 5);
6788 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
6790 hbox = gtk_hbox_new (FALSE, 5);
6791 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
6793 button = gtk_button_new_with_label ("Expand All");
6794 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6795 g_signal_connect (button, "clicked",
6796 G_CALLBACK (expand_all), ctree);
6798 button = gtk_button_new_with_label ("Collapse All");
6799 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6800 g_signal_connect (button, "clicked",
6801 G_CALLBACK (collapse_all), ctree);
6803 button = gtk_button_new_with_label ("Change Style");
6804 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6805 g_signal_connect (button, "clicked",
6806 G_CALLBACK (change_style), ctree);
6808 button = gtk_button_new_with_label ("Export Tree");
6809 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6810 g_signal_connect (button, "clicked",
6811 G_CALLBACK (export_ctree), ctree);
6813 hbox = gtk_hbox_new (FALSE, 5);
6814 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
6816 button = gtk_button_new_with_label ("Select All");
6817 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6818 g_signal_connect (button, "clicked",
6819 G_CALLBACK (select_all), ctree);
6821 button = gtk_button_new_with_label ("Unselect All");
6822 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6823 g_signal_connect (button, "clicked",
6824 G_CALLBACK (unselect_all), ctree);
6826 button = gtk_button_new_with_label ("Remove Selection");
6827 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6828 g_signal_connect (button, "clicked",
6829 G_CALLBACK (remove_selection), ctree);
6831 check = gtk_check_button_new_with_label ("Reorderable");
6832 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
6833 gtk_tooltips_set_tip (tooltips, check,
6834 "Tree items can be reordered by dragging.", NULL);
6835 g_signal_connect (check, "clicked",
6836 G_CALLBACK (toggle_reorderable), ctree);
6837 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
6839 hbox = gtk_hbox_new (TRUE, 5);
6840 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
6842 omenu1 = build_option_menu (items1, 4, 2,
6843 ctree_toggle_line_style,
6845 gtk_box_pack_start (GTK_BOX (hbox), omenu1, FALSE, TRUE, 0);
6846 gtk_tooltips_set_tip (tooltips, omenu1, "The tree's line style.", NULL);
6848 omenu2 = build_option_menu (items2, 4, 1,
6849 ctree_toggle_expander_style,
6851 gtk_box_pack_start (GTK_BOX (hbox), omenu2, FALSE, TRUE, 0);
6852 gtk_tooltips_set_tip (tooltips, omenu2, "The tree's expander style.",
6855 omenu3 = build_option_menu (items3, 2, 0,
6856 ctree_toggle_justify, ctree);
6857 gtk_box_pack_start (GTK_BOX (hbox), omenu3, FALSE, TRUE, 0);
6858 gtk_tooltips_set_tip (tooltips, omenu3, "The tree's justification.",
6861 omenu4 = build_option_menu (selection_mode_items, 3, 3,
6862 ctree_toggle_sel_mode, ctree);
6863 gtk_box_pack_start (GTK_BOX (hbox), omenu4, FALSE, TRUE, 0);
6864 gtk_tooltips_set_tip (tooltips, omenu4, "The list's selection mode.",
6867 gtk_widget_realize (window);
6869 gtk_widget_set_size_request (GTK_WIDGET (ctree), -1, 300);
6871 frame = gtk_frame_new (NULL);
6872 gtk_container_set_border_width (GTK_CONTAINER (frame), 0);
6873 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
6874 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
6876 hbox = gtk_hbox_new (TRUE, 2);
6877 gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
6878 gtk_container_add (GTK_CONTAINER (frame), hbox);
6880 frame = gtk_frame_new (NULL);
6881 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6882 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6884 hbox2 = gtk_hbox_new (FALSE, 0);
6885 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6886 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6888 label = gtk_label_new ("Books :");
6889 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6891 sprintf (buf, "%d", books);
6892 book_label = gtk_label_new (buf);
6893 gtk_box_pack_end (GTK_BOX (hbox2), book_label, FALSE, TRUE, 5);
6895 frame = gtk_frame_new (NULL);
6896 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6897 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6899 hbox2 = gtk_hbox_new (FALSE, 0);
6900 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6901 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6903 label = gtk_label_new ("Pages :");
6904 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6906 sprintf (buf, "%d", pages);
6907 page_label = gtk_label_new (buf);
6908 gtk_box_pack_end (GTK_BOX (hbox2), page_label, FALSE, TRUE, 5);
6910 frame = gtk_frame_new (NULL);
6911 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6912 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6914 hbox2 = gtk_hbox_new (FALSE, 0);
6915 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6916 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6918 label = gtk_label_new ("Selected :");
6919 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6921 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
6922 sel_label = gtk_label_new (buf);
6923 gtk_box_pack_end (GTK_BOX (hbox2), sel_label, FALSE, TRUE, 5);
6925 frame = gtk_frame_new (NULL);
6926 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6927 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6929 hbox2 = gtk_hbox_new (FALSE, 0);
6930 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6931 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6933 label = gtk_label_new ("Visible :");
6934 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6936 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
6937 vis_label = gtk_label_new (buf);
6938 gtk_box_pack_end (GTK_BOX (hbox2), vis_label, FALSE, TRUE, 5);
6940 rebuild_tree (NULL, ctree);
6943 if (!GTK_WIDGET_VISIBLE (window))
6944 gtk_widget_show_all (window);
6946 gtk_widget_destroy (window);
6954 color_selection_ok (GtkWidget *w,
6955 GtkColorSelectionDialog *cs)
6957 GtkColorSelection *colorsel;
6960 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6962 gtk_color_selection_get_color(colorsel,color);
6963 gtk_color_selection_set_color(colorsel,color);
6967 color_selection_changed (GtkWidget *w,
6968 GtkColorSelectionDialog *cs)
6970 GtkColorSelection *colorsel;
6973 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6974 gtk_color_selection_get_color(colorsel,color);
6978 opacity_toggled_cb (GtkWidget *w,
6979 GtkColorSelectionDialog *cs)
6981 GtkColorSelection *colorsel;
6983 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6984 gtk_color_selection_set_has_opacity_control (colorsel,
6985 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
6989 palette_toggled_cb (GtkWidget *w,
6990 GtkColorSelectionDialog *cs)
6992 GtkColorSelection *colorsel;
6994 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6995 gtk_color_selection_set_has_palette (colorsel,
6996 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
7000 create_color_selection (GtkWidget *widget)
7002 static GtkWidget *window = NULL;
7006 GtkWidget *options_hbox;
7007 GtkWidget *check_button;
7009 window = gtk_color_selection_dialog_new ("color selection dialog");
7010 gtk_window_set_screen (GTK_WINDOW (window),
7011 gtk_widget_get_screen (widget));
7013 gtk_widget_show (GTK_COLOR_SELECTION_DIALOG (window)->help_button);
7015 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
7017 g_signal_connect (window, "destroy",
7018 G_CALLBACK(gtk_widget_destroyed),
7021 options_hbox = gtk_hbox_new (FALSE, 0);
7022 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), options_hbox, FALSE, FALSE, 0);
7023 gtk_container_set_border_width (GTK_CONTAINER (options_hbox), 10);
7025 check_button = gtk_check_button_new_with_label ("Show Opacity");
7026 gtk_box_pack_start (GTK_BOX (options_hbox), check_button, FALSE, FALSE, 0);
7027 g_signal_connect (check_button, "toggled",
7028 G_CALLBACK (opacity_toggled_cb), window);
7030 check_button = gtk_check_button_new_with_label ("Show Palette");
7031 gtk_box_pack_end (GTK_BOX (options_hbox), check_button, FALSE, FALSE, 0);
7032 g_signal_connect (check_button, "toggled",
7033 G_CALLBACK (palette_toggled_cb), window);
7035 g_signal_connect (GTK_COLOR_SELECTION_DIALOG (window)->colorsel,
7037 G_CALLBACK (color_selection_changed),
7040 g_signal_connect (GTK_COLOR_SELECTION_DIALOG (window)->ok_button,
7042 G_CALLBACK (color_selection_ok),
7045 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (window)->cancel_button,
7047 G_CALLBACK (gtk_widget_destroy),
7051 if (!GTK_WIDGET_VISIBLE (window))
7052 gtk_widget_show_all (window);
7054 gtk_widget_destroy (window);
7062 show_fileops (GtkWidget *widget,
7063 GtkFileSelection *fs)
7067 show_ops = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7070 gtk_file_selection_show_fileop_buttons (fs);
7072 gtk_file_selection_hide_fileop_buttons (fs);
7076 select_multiple (GtkWidget *widget,
7077 GtkFileSelection *fs)
7079 gboolean select_multiple;
7081 select_multiple = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7082 gtk_file_selection_set_select_multiple (fs, select_multiple);
7086 file_selection_ok (GtkFileSelection *fs)
7091 selections = gtk_file_selection_get_selections (fs);
7093 for (i = 0; selections[i] != NULL; i++)
7094 g_print ("%s\n", selections[i]);
7096 g_strfreev (selections);
7098 gtk_widget_destroy (GTK_WIDGET (fs));
7102 create_file_selection (GtkWidget *widget)
7104 static GtkWidget *window = NULL;
7109 window = gtk_file_selection_new ("file selection dialog");
7110 gtk_window_set_screen (GTK_WINDOW (window),
7111 gtk_widget_get_screen (widget));
7113 gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window));
7115 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
7117 g_signal_connect (window, "destroy",
7118 G_CALLBACK (gtk_widget_destroyed),
7121 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->ok_button,
7123 G_CALLBACK (file_selection_ok),
7125 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->cancel_button,
7127 G_CALLBACK (gtk_widget_destroy),
7130 button = gtk_check_button_new_with_label ("Show Fileops");
7131 g_signal_connect (button, "toggled",
7132 G_CALLBACK (show_fileops),
7134 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
7135 button, FALSE, FALSE, 0);
7136 gtk_widget_show (button);
7138 button = gtk_check_button_new_with_label ("Select Multiple");
7139 g_signal_connect (button, "clicked",
7140 G_CALLBACK (select_multiple),
7142 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
7143 button, FALSE, FALSE, 0);
7144 gtk_widget_show (button);
7147 if (!GTK_WIDGET_VISIBLE (window))
7148 gtk_widget_show (window);
7150 gtk_widget_destroy (window);
7154 flipping_toggled_cb (GtkWidget *widget, gpointer data)
7156 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7157 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
7159 gtk_widget_set_default_direction (new_direction);
7163 set_direction_recurse (GtkWidget *widget,
7166 GtkTextDirection *dir = data;
7168 gtk_widget_set_direction (widget, *dir);
7169 if (GTK_IS_CONTAINER (widget))
7170 gtk_container_foreach (GTK_CONTAINER (widget),
7171 set_direction_recurse,
7176 create_forward_back (const char *title,
7177 GtkTextDirection text_dir)
7179 GtkWidget *frame = gtk_frame_new (title);
7180 GtkWidget *bbox = gtk_hbutton_box_new ();
7181 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
7182 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
7184 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
7186 gtk_container_add (GTK_CONTAINER (frame), bbox);
7187 gtk_container_add (GTK_CONTAINER (bbox), back_button);
7188 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
7190 set_direction_recurse (frame, &text_dir);
7196 create_flipping (GtkWidget *widget)
7198 static GtkWidget *window = NULL;
7199 GtkWidget *check_button, *button;
7203 window = gtk_dialog_new ();
7205 gtk_window_set_screen (GTK_WINDOW (window),
7206 gtk_widget_get_screen (widget));
7208 g_signal_connect (window, "destroy",
7209 G_CALLBACK (gtk_widget_destroyed),
7212 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
7214 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
7215 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7216 check_button, TRUE, TRUE, 0);
7218 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7219 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
7222 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7223 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
7226 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7227 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
7230 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
7231 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
7233 g_signal_connect (check_button, "toggled",
7234 G_CALLBACK (flipping_toggled_cb), FALSE);
7236 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
7238 button = gtk_button_new_with_label ("Close");
7239 g_signal_connect_swapped (button, "clicked",
7240 G_CALLBACK (gtk_widget_destroy), window);
7241 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
7242 button, TRUE, TRUE, 0);
7245 if (!GTK_WIDGET_VISIBLE (window))
7246 gtk_widget_show_all (window);
7248 gtk_widget_destroy (window);
7256 make_focus_table (GList **list)
7261 table = gtk_table_new (5, 5, FALSE);
7274 widget = gtk_entry_new ();
7276 widget = gtk_button_new_with_label ("Foo");
7278 *list = g_list_prepend (*list, widget);
7280 gtk_table_attach (GTK_TABLE (table),
7284 GTK_EXPAND | GTK_FILL,
7285 GTK_EXPAND | GTK_FILL,
7294 *list = g_list_reverse (*list);
7300 create_focus (GtkWidget *widget)
7302 static GtkWidget *window = NULL;
7310 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
7316 gtk_window_set_screen (GTK_WINDOW (window),
7317 gtk_widget_get_screen (widget));
7319 g_signal_connect (window, "destroy",
7320 G_CALLBACK (gtk_widget_destroyed),
7323 g_signal_connect (window, "response",
7324 G_CALLBACK (gtk_widget_destroy),
7327 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
7329 frame = gtk_frame_new ("Weird tab focus chain");
7331 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7332 frame, TRUE, TRUE, 0);
7334 table = make_focus_table (&list);
7336 gtk_container_add (GTK_CONTAINER (frame), table);
7338 gtk_container_set_focus_chain (GTK_CONTAINER (table),
7343 frame = gtk_frame_new ("Default tab focus chain");
7345 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7346 frame, TRUE, TRUE, 0);
7349 table = make_focus_table (&list);
7353 gtk_container_add (GTK_CONTAINER (frame), table);
7356 if (!GTK_WIDGET_VISIBLE (window))
7357 gtk_widget_show_all (window);
7359 gtk_widget_destroy (window);
7367 font_selection_ok (GtkWidget *w,
7368 GtkFontSelectionDialog *fs)
7370 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
7372 g_print ("%s\n", s);
7374 gtk_widget_destroy (GTK_WIDGET (fs));
7378 create_font_selection (GtkWidget *widget)
7380 static GtkWidget *window = NULL;
7384 window = gtk_font_selection_dialog_new ("Font Selection Dialog");
7386 gtk_window_set_screen (GTK_WINDOW (window),
7387 gtk_widget_get_screen (widget));
7389 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
7391 g_signal_connect (window, "destroy",
7392 G_CALLBACK (gtk_widget_destroyed),
7395 g_signal_connect (GTK_FONT_SELECTION_DIALOG (window)->ok_button,
7396 "clicked", G_CALLBACK (font_selection_ok),
7397 GTK_FONT_SELECTION_DIALOG (window));
7398 g_signal_connect_swapped (GTK_FONT_SELECTION_DIALOG (window)->cancel_button,
7399 "clicked", G_CALLBACK (gtk_widget_destroy),
7403 if (!GTK_WIDGET_VISIBLE (window))
7404 gtk_widget_show (window);
7406 gtk_widget_destroy (window);
7413 static GtkWidget *dialog_window = NULL;
7416 label_toggle (GtkWidget *widget,
7421 *label = gtk_label_new ("Dialog Test");
7422 g_signal_connect (*label,
7424 G_CALLBACK (gtk_widget_destroyed),
7426 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
7427 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
7428 *label, TRUE, TRUE, 0);
7429 gtk_widget_show (*label);
7432 gtk_widget_destroy (*label);
7435 #define RESPONSE_TOGGLE_SEPARATOR 1
7438 print_response (GtkWidget *dialog,
7442 g_print ("response signal received (%d)\n", response_id);
7444 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
7446 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
7447 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
7452 create_dialog (GtkWidget *widget)
7454 static GtkWidget *label;
7459 /* This is a terrible example; it's much simpler to create
7460 * dialogs than this. Don't use testgtk for example code,
7464 dialog_window = gtk_dialog_new ();
7465 gtk_window_set_screen (GTK_WINDOW (dialog_window),
7466 gtk_widget_get_screen (widget));
7468 g_signal_connect (dialog_window,
7470 G_CALLBACK (print_response),
7473 g_signal_connect (dialog_window, "destroy",
7474 G_CALLBACK (gtk_widget_destroyed),
7477 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
7478 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
7480 button = gtk_button_new_with_label ("OK");
7481 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7482 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7483 button, TRUE, TRUE, 0);
7484 gtk_widget_grab_default (button);
7485 gtk_widget_show (button);
7487 button = gtk_button_new_with_label ("Toggle");
7488 g_signal_connect (button, "clicked",
7489 G_CALLBACK (label_toggle),
7491 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7492 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7493 button, TRUE, TRUE, 0);
7494 gtk_widget_show (button);
7498 button = gtk_button_new_with_label ("Separator");
7500 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7502 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
7504 RESPONSE_TOGGLE_SEPARATOR);
7505 gtk_widget_show (button);
7508 if (!GTK_WIDGET_VISIBLE (dialog_window))
7509 gtk_widget_show (dialog_window);
7511 gtk_widget_destroy (dialog_window);
7514 /* Display & Screen test
7520 GtkWidget *radio_dpy;
7521 GtkWidget *toplevel;
7522 GtkWidget *dialog_window;
7523 GList *valid_display_list;
7524 } ScreenDisplaySelection;
7527 display_name_cmp (gconstpointer a,
7530 return g_ascii_strcasecmp (a,b);
7534 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
7537 GdkDisplay *display = gtk_widget_get_display (widget);
7539 GdkScreen *new_screen = NULL;
7540 GdkScreen *current_screen = gtk_widget_get_screen (widget);
7542 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
7544 display_name = g_strdup (gtk_entry_get_text (data->entry));
7545 display = gdk_display_open (display_name);
7549 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
7550 GTK_DIALOG_DESTROY_WITH_PARENT,
7553 "The display :\n%s\ncannot be opened",
7555 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
7556 gtk_widget_show (dialog);
7557 g_signal_connect (dialog, "response",
7558 G_CALLBACK (gtk_widget_destroy),
7563 if (!g_list_find_custom (data->valid_display_list,
7566 data->valid_display_list = g_list_append (data->valid_display_list,
7569 new_screen = gdk_display_get_default_screen (display);
7574 gint number_of_screens = gdk_display_get_n_screens (display);
7575 gint screen_num = gdk_screen_get_number (current_screen);
7576 if ((screen_num +1) < number_of_screens)
7577 new_screen = gdk_display_get_screen (display, screen_num + 1);
7579 new_screen = gdk_display_get_screen (display, 0);
7584 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
7585 gtk_widget_destroy (data->dialog_window);
7590 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
7592 gtk_widget_destroy (data);
7596 create_display_screen (GtkWidget *widget)
7598 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
7599 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
7601 ScreenDisplaySelection *scr_dpy_data;
7602 GdkScreen *screen = gtk_widget_get_screen (widget);
7603 static GList *valid_display_list = NULL;
7605 GdkDisplay *display = gdk_screen_get_display (screen);
7607 window = gtk_widget_new (gtk_window_get_type (),
7610 "type", GTK_WINDOW_TOPLEVEL,
7612 "Screen or Display selection",
7613 "border_width", 10, NULL);
7614 g_signal_connect (window, "destroy",
7615 G_CALLBACK (gtk_widget_destroy), NULL);
7617 vbox = gtk_vbox_new (FALSE, 3);
7618 gtk_container_add (GTK_CONTAINER (window), vbox);
7620 frame = gtk_frame_new ("Select screen or display");
7621 gtk_container_add (GTK_CONTAINER (vbox), frame);
7623 table = gtk_table_new (2, 2, TRUE);
7624 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
7625 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
7627 gtk_container_add (GTK_CONTAINER (frame), table);
7629 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
7630 if (gdk_display_get_n_screens(display) > 1)
7631 radio_scr = gtk_radio_button_new_with_label
7632 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
7635 radio_scr = gtk_radio_button_new_with_label
7636 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
7637 "only one screen on the current display");
7638 gtk_widget_set_sensitive (radio_scr, FALSE);
7640 combo_dpy = gtk_combo_new ();
7641 if (!valid_display_list)
7642 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
7644 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
7646 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
7647 "<hostname>:<X Server Num>.<Screen Num>");
7649 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
7650 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
7651 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
7653 bbox = gtk_hbutton_box_new ();
7654 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
7655 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
7657 gtk_container_add (GTK_CONTAINER (vbox), bbox);
7659 gtk_container_add (GTK_CONTAINER (bbox), applyb);
7660 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
7662 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
7664 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
7665 scr_dpy_data->radio_dpy = radio_dpy;
7666 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
7667 scr_dpy_data->dialog_window = window;
7668 scr_dpy_data->valid_display_list = valid_display_list;
7670 g_signal_connect (cancelb, "clicked",
7671 G_CALLBACK (screen_display_destroy_diag), window);
7672 g_signal_connect (applyb, "clicked",
7673 G_CALLBACK (screen_display_check), scr_dpy_data);
7674 gtk_widget_show_all (window);
7679 static gboolean event_watcher_enter_id = 0;
7680 static gboolean event_watcher_leave_id = 0;
7683 event_watcher (GSignalInvocationHint *ihint,
7684 guint n_param_values,
7685 const GValue *param_values,
7688 g_print ("Watch: \"%s\" emitted for %s\n",
7689 g_signal_name (ihint->signal_id),
7690 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
7696 event_watcher_down (void)
7698 if (event_watcher_enter_id)
7702 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7703 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
7704 event_watcher_enter_id = 0;
7705 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7706 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
7707 event_watcher_leave_id = 0;
7712 event_watcher_toggle (void)
7714 if (event_watcher_enter_id)
7715 event_watcher_down ();
7720 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7721 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7722 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7723 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7728 create_event_watcher (GtkWidget *widget)
7734 dialog_window = gtk_dialog_new ();
7735 gtk_window_set_screen (GTK_WINDOW (dialog_window),
7736 gtk_widget_get_screen (widget));
7738 g_signal_connect (dialog_window, "destroy",
7739 G_CALLBACK (gtk_widget_destroyed),
7741 g_signal_connect (dialog_window, "destroy",
7742 G_CALLBACK (event_watcher_down),
7745 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
7746 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
7747 gtk_widget_set_size_request (dialog_window, 200, 110);
7749 button = gtk_toggle_button_new_with_label ("Activate Watch");
7750 g_signal_connect (button, "clicked",
7751 G_CALLBACK (event_watcher_toggle),
7753 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
7754 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
7755 button, TRUE, TRUE, 0);
7756 gtk_widget_show (button);
7758 button = gtk_button_new_with_label ("Close");
7759 g_signal_connect_swapped (button, "clicked",
7760 G_CALLBACK (gtk_widget_destroy),
7762 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7763 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7764 button, TRUE, TRUE, 0);
7765 gtk_widget_grab_default (button);
7766 gtk_widget_show (button);
7769 if (!GTK_WIDGET_VISIBLE (dialog_window))
7770 gtk_widget_show (dialog_window);
7772 gtk_widget_destroy (dialog_window);
7780 reformat_value (GtkScale *scale,
7783 return g_strdup_printf ("-->%0.*g<--",
7784 gtk_scale_get_digits (scale), value);
7788 create_range_controls (GtkWidget *widget)
7790 static GtkWidget *window = NULL;
7794 GtkWidget *scrollbar;
7796 GtkWidget *separator;
7797 GtkObject *adjustment;
7802 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7804 gtk_window_set_screen (GTK_WINDOW (window),
7805 gtk_widget_get_screen (widget));
7807 g_signal_connect (window, "destroy",
7808 G_CALLBACK (gtk_widget_destroyed),
7811 gtk_window_set_title (GTK_WINDOW (window), "range controls");
7812 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7815 box1 = gtk_vbox_new (FALSE, 0);
7816 gtk_container_add (GTK_CONTAINER (window), box1);
7817 gtk_widget_show (box1);
7820 box2 = gtk_vbox_new (FALSE, 10);
7821 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7822 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
7823 gtk_widget_show (box2);
7826 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
7828 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7829 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
7830 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
7831 gtk_scale_set_digits (GTK_SCALE (scale), 1);
7832 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7833 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7834 gtk_widget_show (scale);
7836 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
7837 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
7838 GTK_UPDATE_CONTINUOUS);
7839 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
7840 gtk_widget_show (scrollbar);
7842 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7843 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7844 g_signal_connect (scale,
7846 G_CALLBACK (reformat_value),
7848 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7849 gtk_widget_show (scale);
7851 hbox = gtk_hbox_new (FALSE, 0);
7853 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7854 gtk_widget_set_size_request (scale, -1, 200);
7855 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7856 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7857 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7858 gtk_widget_show (scale);
7860 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7861 gtk_widget_set_size_request (scale, -1, 200);
7862 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7863 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7864 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
7865 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7866 gtk_widget_show (scale);
7868 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7869 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7870 g_signal_connect (scale,
7872 G_CALLBACK (reformat_value),
7874 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7875 gtk_widget_show (scale);
7878 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
7879 gtk_widget_show (hbox);
7881 separator = gtk_hseparator_new ();
7882 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7883 gtk_widget_show (separator);
7886 box2 = gtk_vbox_new (FALSE, 10);
7887 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7888 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7889 gtk_widget_show (box2);
7892 button = gtk_button_new_with_label ("close");
7893 g_signal_connect_swapped (button, "clicked",
7894 G_CALLBACK (gtk_widget_destroy),
7896 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7897 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7898 gtk_widget_grab_default (button);
7899 gtk_widget_show (button);
7902 if (!GTK_WIDGET_VISIBLE (window))
7903 gtk_widget_show (window);
7905 gtk_widget_destroy (window);
7913 create_rulers (GtkWidget *widget)
7915 static GtkWidget *window = NULL;
7921 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7923 gtk_window_set_screen (GTK_WINDOW (window),
7924 gtk_widget_get_screen (widget));
7926 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
7928 g_signal_connect (window, "destroy",
7929 G_CALLBACK (gtk_widget_destroyed),
7932 gtk_window_set_title (GTK_WINDOW (window), "rulers");
7933 gtk_widget_set_size_request (window, 300, 300);
7934 gtk_widget_set_events (window,
7935 GDK_POINTER_MOTION_MASK
7936 | GDK_POINTER_MOTION_HINT_MASK);
7937 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7939 table = gtk_table_new (2, 2, FALSE);
7940 gtk_container_add (GTK_CONTAINER (window), table);
7941 gtk_widget_show (table);
7943 ruler = gtk_hruler_new ();
7944 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
7945 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
7947 g_signal_connect_swapped (window,
7948 "motion_notify_event",
7949 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7952 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
7953 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
7954 gtk_widget_show (ruler);
7957 ruler = gtk_vruler_new ();
7958 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
7960 g_signal_connect_swapped (window,
7961 "motion_notify_event",
7962 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7965 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
7966 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
7967 gtk_widget_show (ruler);
7970 if (!GTK_WIDGET_VISIBLE (window))
7971 gtk_widget_show (window);
7973 gtk_widget_destroy (window);
7977 text_toggle_editable (GtkWidget *checkbutton,
7980 gtk_text_set_editable(GTK_TEXT(text),
7981 GTK_TOGGLE_BUTTON(checkbutton)->active);
7985 text_toggle_word_wrap (GtkWidget *checkbutton,
7988 gtk_text_set_word_wrap(GTK_TEXT(text),
7989 GTK_TOGGLE_BUTTON(checkbutton)->active);
7996 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
7997 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
7998 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
7999 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
8000 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
8001 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
8002 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
8003 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
8006 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
8012 text_insert_random (GtkWidget *w, GtkText *text)
8016 for (i=0; i<10; i++)
8018 c = 'A' + rand() % ('Z' - 'A');
8019 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
8020 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
8025 create_text (GtkWidget *widget)
8029 static GtkWidget *window = NULL;
8035 GtkWidget *separator;
8036 GtkWidget *scrolled_window;
8043 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8044 gtk_window_set_screen (GTK_WINDOW (window),
8045 gtk_widget_get_screen (widget));
8047 gtk_widget_set_name (window, "text window");
8048 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
8049 gtk_widget_set_size_request (window, 500, 500);
8051 g_signal_connect (window, "destroy",
8052 G_CALLBACK (gtk_widget_destroyed),
8055 gtk_window_set_title (GTK_WINDOW (window), "test");
8056 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8059 box1 = gtk_vbox_new (FALSE, 0);
8060 gtk_container_add (GTK_CONTAINER (window), box1);
8061 gtk_widget_show (box1);
8064 box2 = gtk_vbox_new (FALSE, 10);
8065 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8066 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
8067 gtk_widget_show (box2);
8070 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
8071 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
8072 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
8075 gtk_widget_show (scrolled_window);
8077 text = gtk_text_new (NULL, NULL);
8078 gtk_text_set_editable (GTK_TEXT (text), TRUE);
8079 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
8080 gtk_widget_grab_focus (text);
8081 gtk_widget_show (text);
8084 gtk_text_freeze (GTK_TEXT (text));
8086 for (i=0; i<ntext_colors; i++)
8088 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
8089 text_colors[i].name, -1);
8090 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
8092 for (j=0; j<ntext_colors; j++)
8094 gtk_text_insert (GTK_TEXT (text), NULL,
8095 &text_colors[j].color, &text_colors[i].color,
8098 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
8101 infile = fopen("testgtk.c", "r");
8106 int nbytes_read, nbytes_alloc;
8109 nbytes_alloc = 1024;
8110 buffer = g_new (char, nbytes_alloc);
8114 if (nbytes_alloc < nbytes_read + 1024)
8117 buffer = g_realloc (buffer, nbytes_alloc);
8119 len = fread (buffer + nbytes_read, 1, 1024, infile);
8125 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
8126 NULL, buffer, nbytes_read);
8131 gtk_text_thaw (GTK_TEXT (text));
8133 hbox = gtk_hbutton_box_new ();
8134 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
8135 gtk_widget_show (hbox);
8137 check = gtk_check_button_new_with_label("Editable");
8138 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
8139 g_signal_connect (check, "toggled",
8140 G_CALLBACK (text_toggle_editable), text);
8141 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
8142 gtk_widget_show (check);
8144 check = gtk_check_button_new_with_label("Wrap Words");
8145 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
8146 g_signal_connect (check, "toggled",
8147 G_CALLBACK (text_toggle_word_wrap), text);
8148 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
8149 gtk_widget_show (check);
8151 separator = gtk_hseparator_new ();
8152 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
8153 gtk_widget_show (separator);
8156 box2 = gtk_vbox_new (FALSE, 10);
8157 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8158 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8159 gtk_widget_show (box2);
8162 button = gtk_button_new_with_label ("insert random");
8163 g_signal_connect (button, "clicked",
8164 G_CALLBACK (text_insert_random),
8166 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8167 gtk_widget_show (button);
8169 button = gtk_button_new_with_label ("close");
8170 g_signal_connect_swapped (button, "clicked",
8171 G_CALLBACK (gtk_widget_destroy),
8173 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8174 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8175 gtk_widget_grab_default (button);
8176 gtk_widget_show (button);
8179 if (!GTK_WIDGET_VISIBLE (window))
8180 gtk_widget_show (window);
8182 gtk_widget_destroy (window);
8189 GdkPixbuf *book_open;
8190 GdkPixbuf *book_closed;
8191 GtkWidget *sample_notebook;
8194 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
8196 GtkWidget *page_widget;
8199 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
8201 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
8202 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
8204 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
8205 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
8209 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
8211 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
8212 gint old_page_num = gtk_notebook_get_current_page (notebook);
8214 if (page_num == old_page_num)
8217 set_page_image (notebook, page_num, book_open);
8219 if (old_page_num != -1)
8220 set_page_image (notebook, old_page_num, book_closed);
8224 tab_fill (GtkToggleButton *button, GtkWidget *child)
8227 GtkPackType pack_type;
8229 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8230 &expand, NULL, &pack_type);
8231 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8232 expand, button->active, pack_type);
8236 tab_expand (GtkToggleButton *button, GtkWidget *child)
8239 GtkPackType pack_type;
8241 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8242 NULL, &fill, &pack_type);
8243 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8244 button->active, fill, pack_type);
8248 tab_pack (GtkToggleButton *button, GtkWidget *child)
8254 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8255 &expand, &fill, NULL);
8256 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8257 expand, fill, button->active);
8261 create_pages (GtkNotebook *notebook, gint start, gint end)
8263 GtkWidget *child = NULL;
8268 GtkWidget *label_box;
8269 GtkWidget *menu_box;
8273 char accel_buffer[32];
8275 for (i = start; i <= end; i++)
8277 sprintf (buffer, "Page %d", i);
8278 sprintf (accel_buffer, "Page _%d", i);
8280 child = gtk_frame_new (buffer);
8281 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
8283 vbox = gtk_vbox_new (TRUE,0);
8284 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8285 gtk_container_add (GTK_CONTAINER (child), vbox);
8287 hbox = gtk_hbox_new (TRUE,0);
8288 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
8290 button = gtk_check_button_new_with_label ("Fill Tab");
8291 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8292 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8293 g_signal_connect (button, "toggled",
8294 G_CALLBACK (tab_fill), child);
8296 button = gtk_check_button_new_with_label ("Expand Tab");
8297 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8298 g_signal_connect (button, "toggled",
8299 G_CALLBACK (tab_expand), child);
8301 button = gtk_check_button_new_with_label ("Pack end");
8302 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8303 g_signal_connect (button, "toggled",
8304 G_CALLBACK (tab_pack), child);
8306 button = gtk_button_new_with_label ("Hide Page");
8307 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
8308 g_signal_connect_swapped (button, "clicked",
8309 G_CALLBACK (gtk_widget_hide),
8312 gtk_widget_show_all (child);
8314 label_box = gtk_hbox_new (FALSE, 0);
8315 pixwid = gtk_image_new_from_pixbuf (book_closed);
8316 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
8318 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
8319 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
8320 label = gtk_label_new_with_mnemonic (accel_buffer);
8321 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
8322 gtk_widget_show_all (label_box);
8325 menu_box = gtk_hbox_new (FALSE, 0);
8326 pixwid = gtk_image_new_from_pixbuf (book_closed);
8327 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
8329 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
8330 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
8331 label = gtk_label_new (buffer);
8332 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
8333 gtk_widget_show_all (menu_box);
8335 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
8340 rotate_notebook (GtkButton *button,
8341 GtkNotebook *notebook)
8343 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
8347 show_all_pages (GtkButton *button,
8348 GtkNotebook *notebook)
8350 gtk_container_foreach (GTK_CONTAINER (notebook),
8351 (GtkCallback) gtk_widget_show, NULL);
8355 notebook_type_changed (GtkWidget *optionmenu,
8358 GtkNotebook *notebook;
8368 notebook = GTK_NOTEBOOK (data);
8370 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
8375 /* standard notebook */
8376 gtk_notebook_set_show_tabs (notebook, TRUE);
8377 gtk_notebook_set_show_border (notebook, TRUE);
8378 gtk_notebook_set_scrollable (notebook, FALSE);
8382 /* notabs notebook */
8383 gtk_notebook_set_show_tabs (notebook, FALSE);
8384 gtk_notebook_set_show_border (notebook, TRUE);
8389 gtk_notebook_set_show_tabs (notebook, FALSE);
8390 gtk_notebook_set_show_border (notebook, FALSE);
8395 gtk_notebook_set_show_tabs (notebook, TRUE);
8396 gtk_notebook_set_show_border (notebook, TRUE);
8397 gtk_notebook_set_scrollable (notebook, TRUE);
8398 if (g_list_length (notebook->children) == 5)
8399 create_pages (notebook, 6, 15);
8405 if (g_list_length (notebook->children) == 15)
8406 for (i = 0; i < 10; i++)
8407 gtk_notebook_remove_page (notebook, 5);
8411 notebook_popup (GtkToggleButton *button,
8412 GtkNotebook *notebook)
8415 gtk_notebook_popup_enable (notebook);
8417 gtk_notebook_popup_disable (notebook);
8421 notebook_homogeneous (GtkToggleButton *button,
8422 GtkNotebook *notebook)
8424 g_object_set (notebook, "homogeneous", button->active, NULL);
8428 create_notebook (GtkWidget *widget)
8430 static GtkWidget *window = NULL;
8434 GtkWidget *separator;
8438 static gchar *items[] =
8448 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8449 gtk_window_set_screen (GTK_WINDOW (window),
8450 gtk_widget_get_screen (widget));
8452 g_signal_connect (window, "destroy",
8453 G_CALLBACK (gtk_widget_destroyed),
8456 gtk_window_set_title (GTK_WINDOW (window), "notebook");
8457 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8459 box1 = gtk_vbox_new (FALSE, 0);
8460 gtk_container_add (GTK_CONTAINER (window), box1);
8462 sample_notebook = gtk_notebook_new ();
8463 g_signal_connect (sample_notebook, "switch_page",
8464 G_CALLBACK (page_switch), NULL);
8465 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
8466 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
8467 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
8469 gtk_widget_realize (sample_notebook);
8472 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
8475 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
8477 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
8479 separator = gtk_hseparator_new ();
8480 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
8482 box2 = gtk_hbox_new (FALSE, 5);
8483 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8484 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8486 button = gtk_check_button_new_with_label ("popup menu");
8487 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
8488 g_signal_connect (button, "clicked",
8489 G_CALLBACK (notebook_popup),
8492 button = gtk_check_button_new_with_label ("homogeneous tabs");
8493 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
8494 g_signal_connect (button, "clicked",
8495 G_CALLBACK (notebook_homogeneous),
8498 box2 = gtk_hbox_new (FALSE, 5);
8499 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8500 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8502 label = gtk_label_new ("Notebook Style :");
8503 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
8505 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
8506 notebook_type_changed,
8508 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
8510 button = gtk_button_new_with_label ("Show all Pages");
8511 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
8512 g_signal_connect (button, "clicked",
8513 G_CALLBACK (show_all_pages), sample_notebook);
8515 box2 = gtk_hbox_new (TRUE, 10);
8516 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8517 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8519 button = gtk_button_new_with_label ("prev");
8520 g_signal_connect_swapped (button, "clicked",
8521 G_CALLBACK (gtk_notebook_prev_page),
8523 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8525 button = gtk_button_new_with_label ("next");
8526 g_signal_connect_swapped (button, "clicked",
8527 G_CALLBACK (gtk_notebook_next_page),
8529 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8531 button = gtk_button_new_with_label ("rotate");
8532 g_signal_connect (button, "clicked",
8533 G_CALLBACK (rotate_notebook), sample_notebook);
8534 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8536 separator = gtk_hseparator_new ();
8537 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
8539 button = gtk_button_new_with_label ("close");
8540 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
8541 g_signal_connect_swapped (button, "clicked",
8542 G_CALLBACK (gtk_widget_destroy),
8544 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
8545 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8546 gtk_widget_grab_default (button);
8549 if (!GTK_WIDGET_VISIBLE (window))
8550 gtk_widget_show_all (window);
8552 gtk_widget_destroy (window);
8560 toggle_resize (GtkWidget *widget, GtkWidget *child)
8562 GtkPaned *paned = GTK_PANED (child->parent);
8563 gboolean is_child1 = (child == paned->child1);
8564 gboolean resize, shrink;
8566 resize = is_child1 ? paned->child1_resize : paned->child2_resize;
8567 shrink = is_child1 ? paned->child1_shrink : paned->child2_shrink;
8569 gtk_widget_ref (child);
8570 gtk_container_remove (GTK_CONTAINER (child->parent), child);
8572 gtk_paned_pack1 (paned, child, !resize, shrink);
8574 gtk_paned_pack2 (paned, child, !resize, shrink);
8575 gtk_widget_unref (child);
8579 toggle_shrink (GtkWidget *widget, GtkWidget *child)
8581 GtkPaned *paned = GTK_PANED (child->parent);
8582 gboolean is_child1 = (child == paned->child1);
8583 gboolean resize, shrink;
8585 resize = is_child1 ? paned->child1_resize : paned->child2_resize;
8586 shrink = is_child1 ? paned->child1_shrink : paned->child2_shrink;
8588 gtk_widget_ref (child);
8589 gtk_container_remove (GTK_CONTAINER (child->parent), child);
8591 gtk_paned_pack1 (paned, child, resize, !shrink);
8593 gtk_paned_pack2 (paned, child, resize, !shrink);
8594 gtk_widget_unref (child);
8598 paned_props_clicked (GtkWidget *button,
8601 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
8603 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
8607 create_pane_options (GtkPaned *paned,
8608 const gchar *frame_label,
8609 const gchar *label1,
8610 const gchar *label2)
8616 GtkWidget *check_button;
8618 frame = gtk_frame_new (frame_label);
8619 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
8621 table = gtk_table_new (4, 2, 4);
8622 gtk_container_add (GTK_CONTAINER (frame), table);
8624 label = gtk_label_new (label1);
8625 gtk_table_attach_defaults (GTK_TABLE (table), label,
8628 check_button = gtk_check_button_new_with_label ("Resize");
8629 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8631 g_signal_connect (check_button, "toggled",
8632 G_CALLBACK (toggle_resize),
8635 check_button = gtk_check_button_new_with_label ("Shrink");
8636 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8638 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8640 g_signal_connect (check_button, "toggled",
8641 G_CALLBACK (toggle_shrink),
8644 label = gtk_label_new (label2);
8645 gtk_table_attach_defaults (GTK_TABLE (table), label,
8648 check_button = gtk_check_button_new_with_label ("Resize");
8649 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8651 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8653 g_signal_connect (check_button, "toggled",
8654 G_CALLBACK (toggle_resize),
8657 check_button = gtk_check_button_new_with_label ("Shrink");
8658 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8660 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8662 g_signal_connect (check_button, "toggled",
8663 G_CALLBACK (toggle_shrink),
8666 button = gtk_button_new_with_mnemonic ("_Properties");
8667 gtk_table_attach_defaults (GTK_TABLE (table), button,
8669 g_signal_connect (button, "clicked",
8670 G_CALLBACK (paned_props_clicked),
8677 create_panes (GtkWidget *widget)
8679 static GtkWidget *window = NULL;
8688 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8690 gtk_window_set_screen (GTK_WINDOW (window),
8691 gtk_widget_get_screen (widget));
8693 g_signal_connect (window, "destroy",
8694 G_CALLBACK (gtk_widget_destroyed),
8697 gtk_window_set_title (GTK_WINDOW (window), "Panes");
8698 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8700 vbox = gtk_vbox_new (FALSE, 0);
8701 gtk_container_add (GTK_CONTAINER (window), vbox);
8703 vpaned = gtk_vpaned_new ();
8704 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
8705 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
8707 hpaned = gtk_hpaned_new ();
8708 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
8710 frame = gtk_frame_new (NULL);
8711 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8712 gtk_widget_set_size_request (frame, 60, 60);
8713 gtk_paned_add1 (GTK_PANED (hpaned), frame);
8715 button = gtk_button_new_with_label ("Hi there");
8716 gtk_container_add (GTK_CONTAINER(frame), button);
8718 frame = gtk_frame_new (NULL);
8719 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8720 gtk_widget_set_size_request (frame, 80, 60);
8721 gtk_paned_add2 (GTK_PANED (hpaned), frame);
8723 frame = gtk_frame_new (NULL);
8724 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8725 gtk_widget_set_size_request (frame, 60, 80);
8726 gtk_paned_add2 (GTK_PANED (vpaned), frame);
8728 /* Now create toggle buttons to control sizing */
8730 gtk_box_pack_start (GTK_BOX (vbox),
8731 create_pane_options (GTK_PANED (hpaned),
8737 gtk_box_pack_start (GTK_BOX (vbox),
8738 create_pane_options (GTK_PANED (vpaned),
8744 gtk_widget_show_all (vbox);
8747 if (!GTK_WIDGET_VISIBLE (window))
8748 gtk_widget_show (window);
8750 gtk_widget_destroy (window);
8754 * Paned keyboard navigation
8758 paned_keyboard_window1 (GtkWidget *widget)
8781 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8782 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
8783 gtk_window_set_screen (GTK_WINDOW (window1),
8784 gtk_widget_get_screen (widget));
8786 hpaned1 = gtk_hpaned_new ();
8787 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
8789 frame1 = gtk_frame_new (NULL);
8790 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
8791 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
8793 vbox1 = gtk_vbox_new (FALSE, 0);
8794 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
8796 button7 = gtk_button_new_with_label ("button7");
8797 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
8799 button8 = gtk_button_new_with_label ("button8");
8800 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
8802 button9 = gtk_button_new_with_label ("button9");
8803 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
8805 vpaned1 = gtk_vpaned_new ();
8806 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
8808 frame2 = gtk_frame_new (NULL);
8809 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
8810 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
8812 frame5 = gtk_frame_new (NULL);
8813 gtk_container_add (GTK_CONTAINER (frame2), frame5);
8815 hbox1 = gtk_hbox_new (FALSE, 0);
8816 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
8818 button5 = gtk_button_new_with_label ("button5");
8819 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
8821 button6 = gtk_button_new_with_label ("button6");
8822 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
8824 frame3 = gtk_frame_new (NULL);
8825 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
8826 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
8828 frame4 = gtk_frame_new ("Buttons");
8829 gtk_container_add (GTK_CONTAINER (frame3), frame4);
8830 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
8832 table1 = gtk_table_new (2, 2, FALSE);
8833 gtk_container_add (GTK_CONTAINER (frame4), table1);
8834 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
8836 button1 = gtk_button_new_with_label ("button1");
8837 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
8838 (GtkAttachOptions) (GTK_FILL),
8839 (GtkAttachOptions) (0), 0, 0);
8841 button2 = gtk_button_new_with_label ("button2");
8842 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
8843 (GtkAttachOptions) (GTK_FILL),
8844 (GtkAttachOptions) (0), 0, 0);
8846 button3 = gtk_button_new_with_label ("button3");
8847 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
8848 (GtkAttachOptions) (GTK_FILL),
8849 (GtkAttachOptions) (0), 0, 0);
8851 button4 = gtk_button_new_with_label ("button4");
8852 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
8853 (GtkAttachOptions) (GTK_FILL),
8854 (GtkAttachOptions) (0), 0, 0);
8860 paned_keyboard_window2 (GtkWidget *widget)
8865 GtkWidget *button13;
8869 GtkWidget *button12;
8871 GtkWidget *button11;
8872 GtkWidget *button10;
8874 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8875 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
8877 gtk_window_set_screen (GTK_WINDOW (window2),
8878 gtk_widget_get_screen (widget));
8880 hpaned2 = gtk_hpaned_new ();
8881 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
8883 frame6 = gtk_frame_new (NULL);
8884 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
8885 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
8887 button13 = gtk_button_new_with_label ("button13");
8888 gtk_container_add (GTK_CONTAINER (frame6), button13);
8890 hbox2 = gtk_hbox_new (FALSE, 0);
8891 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
8893 vpaned2 = gtk_vpaned_new ();
8894 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
8896 frame7 = gtk_frame_new (NULL);
8897 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
8898 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
8900 button12 = gtk_button_new_with_label ("button12");
8901 gtk_container_add (GTK_CONTAINER (frame7), button12);
8903 frame8 = gtk_frame_new (NULL);
8904 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
8905 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
8907 button11 = gtk_button_new_with_label ("button11");
8908 gtk_container_add (GTK_CONTAINER (frame8), button11);
8910 button10 = gtk_button_new_with_label ("button10");
8911 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
8917 paned_keyboard_window3 (GtkWidget *widget)
8924 GtkWidget *button14;
8927 GtkWidget *button15;
8930 GtkWidget *button16;
8932 GtkWidget *button17;
8934 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8935 g_object_set_data (G_OBJECT (window3), "window3", window3);
8936 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
8938 gtk_window_set_screen (GTK_WINDOW (window3),
8939 gtk_widget_get_screen (widget));
8942 vbox2 = gtk_vbox_new (FALSE, 0);
8943 gtk_container_add (GTK_CONTAINER (window3), vbox2);
8945 label1 = gtk_label_new ("Three panes nested inside each other");
8946 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
8948 hpaned3 = gtk_hpaned_new ();
8949 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
8951 frame9 = gtk_frame_new (NULL);
8952 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
8953 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
8955 button14 = gtk_button_new_with_label ("button14");
8956 gtk_container_add (GTK_CONTAINER (frame9), button14);
8958 hpaned4 = gtk_hpaned_new ();
8959 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
8961 frame10 = gtk_frame_new (NULL);
8962 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
8963 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
8965 button15 = gtk_button_new_with_label ("button15");
8966 gtk_container_add (GTK_CONTAINER (frame10), button15);
8968 hpaned5 = gtk_hpaned_new ();
8969 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
8971 frame11 = gtk_frame_new (NULL);
8972 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
8973 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
8975 button16 = gtk_button_new_with_label ("button16");
8976 gtk_container_add (GTK_CONTAINER (frame11), button16);
8978 frame12 = gtk_frame_new (NULL);
8979 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
8980 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
8982 button17 = gtk_button_new_with_label ("button17");
8983 gtk_container_add (GTK_CONTAINER (frame12), button17);
8989 paned_keyboard_window4 (GtkWidget *widget)
8996 GtkWidget *button19;
8997 GtkWidget *button18;
9000 GtkWidget *button21;
9001 GtkWidget *button20;
9003 GtkWidget *button23;
9004 GtkWidget *button22;
9006 GtkWidget *button25;
9007 GtkWidget *button24;
9009 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9010 g_object_set_data (G_OBJECT (window4), "window4", window4);
9011 gtk_window_set_title (GTK_WINDOW (window4), "window4");
9013 gtk_window_set_screen (GTK_WINDOW (window4),
9014 gtk_widget_get_screen (widget));
9016 vbox3 = gtk_vbox_new (FALSE, 0);
9017 gtk_container_add (GTK_CONTAINER (window4), vbox3);
9019 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
9020 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
9021 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
9023 hpaned6 = gtk_hpaned_new ();
9024 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
9026 vpaned3 = gtk_vpaned_new ();
9027 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
9029 button19 = gtk_button_new_with_label ("button19");
9030 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
9032 button18 = gtk_button_new_with_label ("button18");
9033 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
9035 hbox3 = gtk_hbox_new (FALSE, 0);
9036 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
9038 vpaned4 = gtk_vpaned_new ();
9039 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
9041 button21 = gtk_button_new_with_label ("button21");
9042 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
9044 button20 = gtk_button_new_with_label ("button20");
9045 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
9047 vpaned5 = gtk_vpaned_new ();
9048 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
9050 button23 = gtk_button_new_with_label ("button23");
9051 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
9053 button22 = gtk_button_new_with_label ("button22");
9054 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
9056 vpaned6 = gtk_vpaned_new ();
9057 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
9059 button25 = gtk_button_new_with_label ("button25");
9060 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
9062 button24 = gtk_button_new_with_label ("button24");
9063 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
9069 create_paned_keyboard_navigation (GtkWidget *widget)
9071 static GtkWidget *window1 = NULL;
9072 static GtkWidget *window2 = NULL;
9073 static GtkWidget *window3 = NULL;
9074 static GtkWidget *window4 = NULL;
9077 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
9079 gtk_widget_destroy (window1);
9080 gtk_widget_destroy (window2);
9081 gtk_widget_destroy (window3);
9082 gtk_widget_destroy (window4);
9087 window1 = paned_keyboard_window1 (widget);
9088 g_signal_connect (window1, "destroy",
9089 G_CALLBACK (gtk_widget_destroyed),
9095 window2 = paned_keyboard_window2 (widget);
9096 g_signal_connect (window2, "destroy",
9097 G_CALLBACK (gtk_widget_destroyed),
9103 window3 = paned_keyboard_window3 (widget);
9104 g_signal_connect (window3, "destroy",
9105 G_CALLBACK (gtk_widget_destroyed),
9111 window4 = paned_keyboard_window4 (widget);
9112 g_signal_connect (window4, "destroy",
9113 G_CALLBACK (gtk_widget_destroyed),
9117 if (GTK_WIDGET_VISIBLE (window1))
9118 gtk_widget_destroy (GTK_WIDGET (window1));
9120 gtk_widget_show_all (GTK_WIDGET (window1));
9122 if (GTK_WIDGET_VISIBLE (window2))
9123 gtk_widget_destroy (GTK_WIDGET (window2));
9125 gtk_widget_show_all (GTK_WIDGET (window2));
9127 if (GTK_WIDGET_VISIBLE (window3))
9128 gtk_widget_destroy (GTK_WIDGET (window3));
9130 gtk_widget_show_all (GTK_WIDGET (window3));
9132 if (GTK_WIDGET_VISIBLE (window4))
9133 gtk_widget_destroy (GTK_WIDGET (window4));
9135 gtk_widget_show_all (GTK_WIDGET (window4));
9143 typedef struct _cursoroffset {gint x,y;} CursorOffset;
9146 shape_pressed (GtkWidget *widget, GdkEventButton *event)
9150 /* ignore double and triple click */
9151 if (event->type != GDK_BUTTON_PRESS)
9154 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9155 p->x = (int) event->x;
9156 p->y = (int) event->y;
9158 gtk_grab_add (widget);
9159 gdk_pointer_grab (widget->window, TRUE,
9160 GDK_BUTTON_RELEASE_MASK |
9161 GDK_BUTTON_MOTION_MASK |
9162 GDK_POINTER_MOTION_HINT_MASK,
9167 shape_released (GtkWidget *widget)
9169 gtk_grab_remove (widget);
9170 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9175 shape_motion (GtkWidget *widget,
9176 GdkEventMotion *event)
9180 GdkModifierType mask;
9182 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9185 * Can't use event->x / event->y here
9186 * because I need absolute coordinates.
9188 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
9189 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
9193 shape_create_icon (GdkScreen *screen,
9204 CursorOffset* icon_pos;
9206 GdkBitmap *gdk_pixmap_mask;
9207 GdkPixmap *gdk_pixmap;
9210 style = gtk_widget_get_default_style ();
9211 gc = style->black_gc;
9214 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
9216 window = gtk_window_new (window_type);
9217 gtk_window_set_screen (GTK_WINDOW (window), screen);
9219 fixed = gtk_fixed_new ();
9220 gtk_widget_set_size_request (fixed, 100, 100);
9221 gtk_container_add (GTK_CONTAINER (window), fixed);
9222 gtk_widget_show (fixed);
9224 gtk_widget_set_events (window,
9225 gtk_widget_get_events (window) |
9226 GDK_BUTTON_MOTION_MASK |
9227 GDK_POINTER_MOTION_HINT_MASK |
9228 GDK_BUTTON_PRESS_MASK);
9230 gtk_widget_realize (window);
9231 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
9232 &style->bg[GTK_STATE_NORMAL],
9235 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
9236 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
9237 gtk_widget_show (pixmap);
9239 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
9241 g_object_unref (gdk_pixmap_mask);
9242 g_object_unref (gdk_pixmap);
9244 g_signal_connect (window, "button_press_event",
9245 G_CALLBACK (shape_pressed), NULL);
9246 g_signal_connect (window, "button_release_event",
9247 G_CALLBACK (shape_released), NULL);
9248 g_signal_connect (window, "motion_notify_event",
9249 G_CALLBACK (shape_motion), NULL);
9251 icon_pos = g_new (CursorOffset, 1);
9252 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
9254 gtk_widget_set_uposition (window, x, y);
9255 gtk_widget_show (window);
9261 create_shapes (GtkWidget *widget)
9263 /* Variables used by the Drag/Drop and Shape Window demos */
9264 static GtkWidget *modeller = NULL;
9265 static GtkWidget *sheets = NULL;
9266 static GtkWidget *rings = NULL;
9267 static GtkWidget *with_region = NULL;
9268 GdkScreen *screen = gtk_widget_get_screen (widget);
9270 if (!(file_exists ("Modeller.xpm") &&
9271 file_exists ("FilesQueue.xpm") &&
9272 file_exists ("3DRings.xpm")))
9278 modeller = shape_create_icon (screen, "Modeller.xpm",
9279 440, 140, 0,0, GTK_WINDOW_POPUP);
9281 g_signal_connect (modeller, "destroy",
9282 G_CALLBACK (gtk_widget_destroyed),
9286 gtk_widget_destroy (modeller);
9290 sheets = shape_create_icon (screen, "FilesQueue.xpm",
9291 580, 170, 0,0, GTK_WINDOW_POPUP);
9293 g_signal_connect (sheets, "destroy",
9294 G_CALLBACK (gtk_widget_destroyed),
9299 gtk_widget_destroy (sheets);
9303 rings = shape_create_icon (screen, "3DRings.xpm",
9304 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9306 g_signal_connect (rings, "destroy",
9307 G_CALLBACK (gtk_widget_destroyed),
9311 gtk_widget_destroy (rings);
9318 with_region = shape_create_icon (screen, "3DRings.xpm",
9319 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9321 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
9323 g_signal_connect (with_region, "destroy",
9324 G_CALLBACK (gtk_widget_destroyed),
9327 /* reset shape from mask to a region */
9330 region = gdk_region_new ();
9342 gdk_region_union_with_rect (region, &rect);
9350 gdk_window_shape_combine_region (with_region->window,
9355 gtk_widget_destroy (with_region);
9363 create_wmhints (GtkWidget *widget)
9365 static GtkWidget *window = NULL;
9367 GtkWidget *separator;
9376 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9378 gtk_window_set_screen (GTK_WINDOW (window),
9379 gtk_widget_get_screen (widget));
9381 g_signal_connect (window, "destroy",
9382 G_CALLBACK (gtk_widget_destroyed),
9385 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
9386 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9388 gtk_widget_realize (window);
9390 circles = gdk_bitmap_create_from_data (window->window,
9394 gdk_window_set_icon (window->window, NULL,
9397 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
9399 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
9400 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
9402 box1 = gtk_vbox_new (FALSE, 0);
9403 gtk_container_add (GTK_CONTAINER (window), box1);
9404 gtk_widget_show (box1);
9406 label = gtk_label_new ("Try iconizing me!");
9407 gtk_widget_set_size_request (label, 150, 50);
9408 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
9409 gtk_widget_show (label);
9412 separator = gtk_hseparator_new ();
9413 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9414 gtk_widget_show (separator);
9417 box2 = gtk_vbox_new (FALSE, 10);
9418 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9419 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9420 gtk_widget_show (box2);
9423 button = gtk_button_new_with_label ("close");
9425 g_signal_connect_swapped (button, "clicked",
9426 G_CALLBACK (gtk_widget_destroy),
9429 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9430 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9431 gtk_widget_grab_default (button);
9432 gtk_widget_show (button);
9435 if (!GTK_WIDGET_VISIBLE (window))
9436 gtk_widget_show (window);
9438 gtk_widget_destroy (window);
9443 * Window state tracking
9447 window_state_callback (GtkWidget *widget,
9448 GdkEventWindowState *event,
9451 GtkWidget *label = data;
9454 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
9455 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
9456 "withdrawn" : "not withdrawn", ", ",
9457 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
9458 "iconified" : "not iconified", ", ",
9459 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
9460 "sticky" : "not sticky", ", ",
9461 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
9462 "maximized" : "not maximized", ", ",
9463 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
9464 "fullscreen" : "not fullscreen",
9467 gtk_label_set_text (GTK_LABEL (label), msg);
9475 tracking_label (GtkWidget *window)
9481 hbox = gtk_hbox_new (FALSE, 5);
9483 g_signal_connect_object (hbox,
9485 G_CALLBACK (gtk_widget_destroy),
9489 label = gtk_label_new ("<no window state events received>");
9490 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
9491 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
9493 g_signal_connect (window,
9494 "window_state_event",
9495 G_CALLBACK (window_state_callback),
9498 button = gtk_button_new_with_label ("Deiconify");
9499 g_signal_connect_object (button,
9501 G_CALLBACK (gtk_window_deiconify),
9504 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9506 button = gtk_button_new_with_label ("Iconify");
9507 g_signal_connect_object (button,
9509 G_CALLBACK (gtk_window_iconify),
9512 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9514 button = gtk_button_new_with_label ("Fullscreen");
9515 g_signal_connect_object (button,
9517 G_CALLBACK (gtk_window_fullscreen),
9520 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9522 button = gtk_button_new_with_label ("Unfullscreen");
9523 g_signal_connect_object (button,
9525 G_CALLBACK (gtk_window_unfullscreen),
9528 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9530 button = gtk_button_new_with_label ("Present");
9531 g_signal_connect_object (button,
9533 G_CALLBACK (gtk_window_present),
9536 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9538 button = gtk_button_new_with_label ("Show");
9539 g_signal_connect_object (button,
9541 G_CALLBACK (gtk_widget_show),
9544 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9546 gtk_widget_show_all (hbox);
9552 get_state_controls (GtkWidget *window)
9557 vbox = gtk_vbox_new (FALSE, 0);
9559 button = gtk_button_new_with_label ("Stick");
9560 g_signal_connect_object (button,
9562 G_CALLBACK (gtk_window_stick),
9565 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9567 button = gtk_button_new_with_label ("Unstick");
9568 g_signal_connect_object (button,
9570 G_CALLBACK (gtk_window_unstick),
9573 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9575 button = gtk_button_new_with_label ("Maximize");
9576 g_signal_connect_object (button,
9578 G_CALLBACK (gtk_window_maximize),
9581 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9583 button = gtk_button_new_with_label ("Unmaximize");
9584 g_signal_connect_object (button,
9586 G_CALLBACK (gtk_window_unmaximize),
9589 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9591 button = gtk_button_new_with_label ("Iconify");
9592 g_signal_connect_object (button,
9594 G_CALLBACK (gtk_window_iconify),
9597 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9599 button = gtk_button_new_with_label ("Fullscreen");
9600 g_signal_connect_object (button,
9602 G_CALLBACK (gtk_window_fullscreen),
9605 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9607 button = gtk_button_new_with_label ("Unfullscreen");
9608 g_signal_connect_object (button,
9610 G_CALLBACK (gtk_window_unfullscreen),
9613 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9615 button = gtk_button_new_with_label ("Hide (withdraw)");
9616 g_signal_connect_object (button,
9618 G_CALLBACK (gtk_widget_hide),
9621 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9623 gtk_widget_show_all (vbox);
9629 create_window_states (GtkWidget *widget)
9631 static GtkWidget *window = NULL;
9634 GtkWidget *iconified;
9636 GtkWidget *controls;
9640 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9641 gtk_window_set_screen (GTK_WINDOW (window),
9642 gtk_widget_get_screen (widget));
9644 g_signal_connect (window, "destroy",
9645 G_CALLBACK (gtk_widget_destroyed),
9648 gtk_window_set_title (GTK_WINDOW (window), "Window states");
9650 box1 = gtk_vbox_new (FALSE, 0);
9651 gtk_container_add (GTK_CONTAINER (window), box1);
9653 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9655 gtk_window_set_screen (GTK_WINDOW (iconified),
9656 gtk_widget_get_screen (widget));
9658 g_signal_connect_object (iconified, "destroy",
9659 G_CALLBACK (gtk_widget_destroy),
9662 gtk_window_iconify (GTK_WINDOW (iconified));
9663 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
9664 controls = get_state_controls (iconified);
9665 gtk_container_add (GTK_CONTAINER (iconified), controls);
9667 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9669 gtk_window_set_screen (GTK_WINDOW (normal),
9670 gtk_widget_get_screen (widget));
9672 g_signal_connect_object (normal, "destroy",
9673 G_CALLBACK (gtk_widget_destroy),
9677 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
9678 controls = get_state_controls (normal);
9679 gtk_container_add (GTK_CONTAINER (normal), controls);
9681 label = tracking_label (iconified);
9682 gtk_container_add (GTK_CONTAINER (box1), label);
9684 label = tracking_label (normal);
9685 gtk_container_add (GTK_CONTAINER (box1), label);
9687 gtk_widget_show_all (iconified);
9688 gtk_widget_show_all (normal);
9689 gtk_widget_show_all (box1);
9692 if (!GTK_WIDGET_VISIBLE (window))
9693 gtk_widget_show (window);
9695 gtk_widget_destroy (window);
9703 configure_event_callback (GtkWidget *widget,
9704 GdkEventConfigure *event,
9707 GtkWidget *label = data;
9711 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
9713 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
9715 event->x, event->y, event->width, event->height,
9718 gtk_label_set_text (GTK_LABEL (label), msg);
9726 get_ints (GtkWidget *window,
9733 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
9734 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
9736 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
9737 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
9741 set_size_callback (GtkWidget *widget,
9746 get_ints (data, &w, &h);
9748 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
9752 unset_default_size_callback (GtkWidget *widget,
9755 gtk_window_set_default_size (g_object_get_data (data, "target"),
9760 set_default_size_callback (GtkWidget *widget,
9765 get_ints (data, &w, &h);
9767 gtk_window_set_default_size (g_object_get_data (data, "target"),
9772 unset_size_request_callback (GtkWidget *widget,
9775 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9780 set_size_request_callback (GtkWidget *widget,
9785 get_ints (data, &w, &h);
9787 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9792 set_location_callback (GtkWidget *widget,
9797 get_ints (data, &x, &y);
9799 gtk_window_move (g_object_get_data (data, "target"), x, y);
9803 move_to_position_callback (GtkWidget *widget,
9809 window = g_object_get_data (data, "target");
9811 gtk_window_get_position (window, &x, &y);
9813 gtk_window_move (window, x, y);
9817 set_geometry_callback (GtkWidget *entry,
9823 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
9825 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
9827 if (!gtk_window_parse_geometry (target, text))
9828 g_print ("Bad geometry string '%s'\n", text);
9834 allow_shrink_callback (GtkWidget *widget,
9837 g_object_set (g_object_get_data (data, "target"),
9839 GTK_TOGGLE_BUTTON (widget)->active,
9844 allow_grow_callback (GtkWidget *widget,
9847 g_object_set (g_object_get_data (data, "target"),
9849 GTK_TOGGLE_BUTTON (widget)->active,
9854 gravity_selected (GtkWidget *widget,
9857 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
9858 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
9862 pos_selected (GtkWidget *widget,
9865 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
9866 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
9870 move_gravity_window_to_current_position (GtkWidget *widget,
9876 window = GTK_WINDOW (data);
9878 gtk_window_get_position (window, &x, &y);
9880 gtk_window_move (window, x, y);
9884 get_screen_corner (GtkWindow *window,
9889 GdkScreen * screen = gtk_window_get_screen (window);
9891 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
9893 switch (gtk_window_get_gravity (window))
9895 case GDK_GRAVITY_SOUTH_EAST:
9896 *x = gdk_screen_get_width (screen) - w;
9897 *y = gdk_screen_get_height (screen) - h;
9900 case GDK_GRAVITY_NORTH_EAST:
9901 *x = gdk_screen_get_width (screen) - w;
9905 case GDK_GRAVITY_SOUTH_WEST:
9907 *y = gdk_screen_get_height (screen) - h;
9910 case GDK_GRAVITY_NORTH_WEST:
9915 case GDK_GRAVITY_SOUTH:
9916 *x = (gdk_screen_get_width (screen) - w) / 2;
9917 *y = gdk_screen_get_height (screen) - h;
9920 case GDK_GRAVITY_NORTH:
9921 *x = (gdk_screen_get_width (screen) - w) / 2;
9925 case GDK_GRAVITY_WEST:
9927 *y = (gdk_screen_get_height (screen) - h) / 2;
9930 case GDK_GRAVITY_EAST:
9931 *x = gdk_screen_get_width (screen) - w;
9932 *y = (gdk_screen_get_height (screen) - h) / 2;
9935 case GDK_GRAVITY_CENTER:
9936 *x = (gdk_screen_get_width (screen) - w) / 2;
9937 *y = (gdk_screen_get_height (screen) - h) / 2;
9940 case GDK_GRAVITY_STATIC:
9941 /* pick some random numbers */
9947 g_assert_not_reached ();
9953 move_gravity_window_to_starting_position (GtkWidget *widget,
9959 window = GTK_WINDOW (data);
9961 get_screen_corner (window,
9964 gtk_window_move (window, x, y);
9968 make_gravity_window (GtkWidget *destroy_with,
9977 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9979 gtk_window_set_screen (GTK_WINDOW (window),
9980 gtk_widget_get_screen (destroy_with));
9982 vbox = gtk_vbox_new (FALSE, 0);
9983 gtk_widget_show (vbox);
9985 gtk_container_add (GTK_CONTAINER (window), vbox);
9986 gtk_window_set_title (GTK_WINDOW (window), title);
9987 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
9989 g_signal_connect_object (destroy_with,
9991 G_CALLBACK (gtk_widget_destroy),
9996 button = gtk_button_new_with_mnemonic ("_Move to current position");
9998 g_signal_connect (button, "clicked",
9999 G_CALLBACK (move_gravity_window_to_current_position),
10002 gtk_container_add (GTK_CONTAINER (vbox), button);
10003 gtk_widget_show (button);
10005 button = gtk_button_new_with_mnemonic ("Move to _starting position");
10007 g_signal_connect (button, "clicked",
10008 G_CALLBACK (move_gravity_window_to_starting_position),
10011 gtk_container_add (GTK_CONTAINER (vbox), button);
10012 gtk_widget_show (button);
10014 /* Pretend this is the result of --geometry.
10015 * DO NOT COPY THIS CODE unless you are setting --geometry results,
10016 * and in that case you probably should just use gtk_window_parse_geometry().
10017 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
10018 * you are parsing --geometry or equivalent.
10020 gtk_window_set_geometry_hints (GTK_WINDOW (window),
10022 GDK_HINT_USER_POS);
10024 gtk_window_set_default_size (GTK_WINDOW (window),
10027 get_screen_corner (GTK_WINDOW (window), &x, &y);
10029 gtk_window_move (GTK_WINDOW (window),
10036 do_gravity_test (GtkWidget *widget,
10039 GtkWidget *destroy_with = data;
10042 /* We put a window at each gravity point on the screen. */
10043 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
10045 gtk_widget_show (window);
10047 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
10049 gtk_widget_show (window);
10051 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
10053 gtk_widget_show (window);
10055 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
10057 gtk_widget_show (window);
10059 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
10061 gtk_widget_show (window);
10063 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
10065 gtk_widget_show (window);
10068 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
10070 gtk_widget_show (window);
10073 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
10075 gtk_widget_show (window);
10077 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
10079 gtk_widget_show (window);
10081 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
10083 gtk_widget_show (window);
10087 window_controls (GtkWidget *window)
10089 GtkWidget *control_window;
10094 GtkAdjustment *adj;
10100 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10102 gtk_window_set_screen (GTK_WINDOW (control_window),
10103 gtk_widget_get_screen (window));
10105 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
10107 g_object_set_data (G_OBJECT (control_window),
10111 g_signal_connect_object (control_window,
10113 G_CALLBACK (gtk_widget_destroy),
10115 G_CONNECT_SWAPPED);
10117 vbox = gtk_vbox_new (FALSE, 5);
10119 gtk_container_add (GTK_CONTAINER (control_window), vbox);
10121 label = gtk_label_new ("<no configure events>");
10122 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10124 g_signal_connect (window,
10126 G_CALLBACK (configure_event_callback),
10129 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10131 spin = gtk_spin_button_new (adj, 0, 0);
10133 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10135 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
10137 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10139 spin = gtk_spin_button_new (adj, 0, 0);
10141 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10143 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
10145 entry = gtk_entry_new ();
10146 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10148 g_signal_connect (entry, "changed",
10149 G_CALLBACK (set_geometry_callback),
10152 button = gtk_button_new_with_label ("Show gravity test windows");
10153 g_signal_connect_swapped (button,
10155 G_CALLBACK (do_gravity_test),
10157 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10159 button = gtk_button_new_with_label ("Reshow with initial size");
10160 g_signal_connect_object (button,
10162 G_CALLBACK (gtk_window_reshow_with_initial_size),
10164 G_CONNECT_SWAPPED);
10165 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10167 button = gtk_button_new_with_label ("Queue resize");
10168 g_signal_connect_object (button,
10170 G_CALLBACK (gtk_widget_queue_resize),
10172 G_CONNECT_SWAPPED);
10173 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10175 button = gtk_button_new_with_label ("Resize");
10176 g_signal_connect (button,
10178 G_CALLBACK (set_size_callback),
10180 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10182 button = gtk_button_new_with_label ("Set default size");
10183 g_signal_connect (button,
10185 G_CALLBACK (set_default_size_callback),
10187 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10189 button = gtk_button_new_with_label ("Unset default size");
10190 g_signal_connect (button,
10192 G_CALLBACK (unset_default_size_callback),
10194 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10196 button = gtk_button_new_with_label ("Set size request");
10197 g_signal_connect (button,
10199 G_CALLBACK (set_size_request_callback),
10201 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10203 button = gtk_button_new_with_label ("Unset size request");
10204 g_signal_connect (button,
10206 G_CALLBACK (unset_size_request_callback),
10208 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10210 button = gtk_button_new_with_label ("Move");
10211 g_signal_connect (button,
10213 G_CALLBACK (set_location_callback),
10215 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10217 button = gtk_button_new_with_label ("Move to current position");
10218 g_signal_connect (button,
10220 G_CALLBACK (move_to_position_callback),
10222 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10224 button = gtk_check_button_new_with_label ("Allow shrink");
10225 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10226 g_signal_connect (button,
10228 G_CALLBACK (allow_shrink_callback),
10230 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10232 button = gtk_check_button_new_with_label ("Allow grow");
10233 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
10234 g_signal_connect (button,
10236 G_CALLBACK (allow_grow_callback),
10238 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10240 button = gtk_button_new_with_mnemonic ("_Show");
10241 g_signal_connect_object (button,
10243 G_CALLBACK (gtk_widget_show),
10245 G_CONNECT_SWAPPED);
10246 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10248 button = gtk_button_new_with_mnemonic ("_Hide");
10249 g_signal_connect_object (button,
10251 G_CALLBACK (gtk_widget_hide),
10253 G_CONNECT_SWAPPED);
10254 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10256 menu = gtk_menu_new ();
10262 static gchar *names[] = {
10263 "GDK_GRAVITY_NORTH_WEST",
10264 "GDK_GRAVITY_NORTH",
10265 "GDK_GRAVITY_NORTH_EAST",
10266 "GDK_GRAVITY_WEST",
10267 "GDK_GRAVITY_CENTER",
10268 "GDK_GRAVITY_EAST",
10269 "GDK_GRAVITY_SOUTH_WEST",
10270 "GDK_GRAVITY_SOUTH",
10271 "GDK_GRAVITY_SOUTH_EAST",
10272 "GDK_GRAVITY_STATIC",
10276 g_assert (names[i]);
10278 mi = gtk_menu_item_new_with_label (names[i]);
10280 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10285 gtk_widget_show_all (menu);
10287 om = gtk_option_menu_new ();
10288 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10291 g_signal_connect (om,
10293 G_CALLBACK (gravity_selected),
10296 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10299 menu = gtk_menu_new ();
10305 static gchar *names[] = {
10306 "GTK_WIN_POS_NONE",
10307 "GTK_WIN_POS_CENTER",
10308 "GTK_WIN_POS_MOUSE",
10309 "GTK_WIN_POS_CENTER_ALWAYS",
10310 "GTK_WIN_POS_CENTER_ON_PARENT",
10314 g_assert (names[i]);
10316 mi = gtk_menu_item_new_with_label (names[i]);
10318 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10323 gtk_widget_show_all (menu);
10325 om = gtk_option_menu_new ();
10326 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10329 g_signal_connect (om,
10331 G_CALLBACK (pos_selected),
10334 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10336 gtk_widget_show_all (vbox);
10338 return control_window;
10342 create_window_sizing (GtkWidget *widget)
10344 static GtkWidget *window = NULL;
10345 static GtkWidget *target_window = NULL;
10347 if (!target_window)
10351 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10352 gtk_window_set_screen (GTK_WINDOW (target_window),
10353 gtk_widget_get_screen (widget));
10354 label = gtk_label_new (NULL);
10355 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");
10356 gtk_container_add (GTK_CONTAINER (target_window), label);
10357 gtk_widget_show (label);
10359 g_signal_connect (target_window, "destroy",
10360 G_CALLBACK (gtk_widget_destroyed),
10363 window = window_controls (target_window);
10365 g_signal_connect (window, "destroy",
10366 G_CALLBACK (gtk_widget_destroyed),
10369 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
10372 /* don't show target window by default, we want to allow testing
10373 * of behavior on first show.
10376 if (!GTK_WIDGET_VISIBLE (window))
10377 gtk_widget_show (window);
10379 gtk_widget_destroy (window);
10386 typedef struct _ProgressData {
10389 GtkWidget *block_spin;
10390 GtkWidget *x_align_spin;
10391 GtkWidget *y_align_spin;
10392 GtkWidget *step_spin;
10393 GtkWidget *act_blocks_spin;
10402 progress_timeout (gpointer data)
10405 GtkAdjustment *adj;
10407 adj = GTK_PROGRESS (data)->adjustment;
10409 new_val = adj->value + 1;
10410 if (new_val > adj->upper)
10411 new_val = adj->lower;
10413 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
10419 destroy_progress (GtkWidget *widget,
10420 ProgressData **pdata)
10422 gtk_timeout_remove ((*pdata)->timer);
10423 (*pdata)->timer = 0;
10424 (*pdata)->window = NULL;
10430 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
10432 ProgressData *pdata;
10435 pdata = (ProgressData *) data;
10437 if (!GTK_WIDGET_MAPPED (widget))
10440 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10442 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
10443 (GtkProgressBarOrientation) i);
10447 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
10449 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
10450 GTK_TOGGLE_BUTTON (widget)->active);
10451 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
10452 gtk_widget_set_sensitive (pdata->x_align_spin,
10453 GTK_TOGGLE_BUTTON (widget)->active);
10454 gtk_widget_set_sensitive (pdata->y_align_spin,
10455 GTK_TOGGLE_BUTTON (widget)->active);
10459 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
10461 ProgressData *pdata;
10464 pdata = (ProgressData *) data;
10466 if (!GTK_WIDGET_MAPPED (widget))
10469 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10472 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
10474 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10476 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
10477 (GtkProgressBarStyle) i);
10481 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
10485 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
10486 sprintf (buf, "???");
10488 sprintf (buf, "%.0f%%", 100 *
10489 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
10490 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
10494 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
10496 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
10497 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10498 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
10502 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
10504 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
10505 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
10509 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
10511 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10512 gtk_spin_button_get_value_as_int
10513 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
10517 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
10519 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
10520 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
10521 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
10525 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
10527 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
10528 GTK_TOGGLE_BUTTON (widget)->active);
10529 gtk_widget_set_sensitive (pdata->step_spin,
10530 GTK_TOGGLE_BUTTON (widget)->active);
10531 gtk_widget_set_sensitive (pdata->act_blocks_spin,
10532 GTK_TOGGLE_BUTTON (widget)->active);
10536 entry_changed (GtkWidget *widget, ProgressData *pdata)
10538 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10539 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
10543 create_progress_bar (GtkWidget *widget)
10554 GtkAdjustment *adj;
10555 static ProgressData *pdata = NULL;
10557 static gchar *items1[] =
10565 static gchar *items2[] =
10572 pdata = g_new0 (ProgressData, 1);
10574 if (!pdata->window)
10576 pdata->window = gtk_dialog_new ();
10578 gtk_window_set_screen (GTK_WINDOW (pdata->window),
10579 gtk_widget_get_screen (widget));
10581 gtk_window_set_resizable (GTK_WINDOW (pdata->window), FALSE);
10583 g_signal_connect (pdata->window, "destroy",
10584 G_CALLBACK (destroy_progress),
10589 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
10590 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
10592 vbox = gtk_vbox_new (FALSE, 5);
10593 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10594 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
10595 vbox, FALSE, TRUE, 0);
10597 frame = gtk_frame_new ("Progress");
10598 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10600 vbox2 = gtk_vbox_new (FALSE, 5);
10601 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10603 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10604 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10606 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
10607 g_signal_connect (adj, "value_changed",
10608 G_CALLBACK (progress_value_changed), pdata);
10610 pdata->pbar = gtk_widget_new (GTK_TYPE_PROGRESS_BAR,
10613 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10614 "%v from [%l,%u] (=%p%%)");
10615 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
10616 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
10618 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10619 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10621 hbox = gtk_hbox_new (FALSE, 5);
10622 gtk_container_add (GTK_CONTAINER (align), hbox);
10623 label = gtk_label_new ("Label updated by user :");
10624 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10625 pdata->label = gtk_label_new ("");
10626 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
10628 frame = gtk_frame_new ("Options");
10629 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10631 vbox2 = gtk_vbox_new (FALSE, 5);
10632 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10634 tab = gtk_table_new (7, 2, FALSE);
10635 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
10637 label = gtk_label_new ("Orientation :");
10638 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
10639 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10641 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10643 pdata->omenu1 = build_option_menu (items1, 4, 0,
10644 progressbar_toggle_orientation,
10646 hbox = gtk_hbox_new (FALSE, 0);
10647 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
10648 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10650 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
10652 check = gtk_check_button_new_with_label ("Show text");
10653 g_signal_connect (check, "clicked",
10654 G_CALLBACK (toggle_show_text),
10656 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
10657 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10660 hbox = gtk_hbox_new (FALSE, 0);
10661 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
10662 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10665 label = gtk_label_new ("Format : ");
10666 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10668 pdata->entry = gtk_entry_new ();
10669 g_signal_connect (pdata->entry, "changed",
10670 G_CALLBACK (entry_changed),
10672 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
10673 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
10674 gtk_widget_set_size_request (pdata->entry, 100, -1);
10675 gtk_widget_set_sensitive (pdata->entry, FALSE);
10677 label = gtk_label_new ("Text align :");
10678 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
10679 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10681 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10683 hbox = gtk_hbox_new (FALSE, 0);
10684 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
10685 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10688 label = gtk_label_new ("x :");
10689 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10691 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10692 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
10693 g_signal_connect (adj, "value_changed",
10694 G_CALLBACK (adjust_align), pdata);
10695 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
10696 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
10698 label = gtk_label_new ("y :");
10699 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10701 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10702 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
10703 g_signal_connect (adj, "value_changed",
10704 G_CALLBACK (adjust_align), pdata);
10705 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
10706 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
10708 label = gtk_label_new ("Bar Style :");
10709 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 3, 4,
10710 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10712 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10714 pdata->omenu2 = build_option_menu (items2, 2, 0,
10715 progressbar_toggle_bar_style,
10717 hbox = gtk_hbox_new (FALSE, 0);
10718 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 3, 4,
10719 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10721 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
10723 label = gtk_label_new ("Block count :");
10724 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 4, 5,
10725 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10727 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10729 hbox = gtk_hbox_new (FALSE, 0);
10730 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 4, 5,
10731 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10733 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
10734 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
10735 g_signal_connect (adj, "value_changed",
10736 G_CALLBACK (adjust_blocks), pdata);
10737 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
10738 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10740 check = gtk_check_button_new_with_label ("Activity mode");
10741 g_signal_connect (check, "clicked",
10742 G_CALLBACK (toggle_activity_mode), pdata);
10743 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 5, 6,
10744 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10747 hbox = gtk_hbox_new (FALSE, 0);
10748 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 5, 6,
10749 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10751 label = gtk_label_new ("Step size : ");
10752 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10753 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
10754 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
10755 g_signal_connect (adj, "value_changed",
10756 G_CALLBACK (adjust_step), pdata);
10757 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
10758 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
10760 hbox = gtk_hbox_new (FALSE, 0);
10761 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 6, 7,
10762 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10764 label = gtk_label_new ("Blocks : ");
10765 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10766 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
10767 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
10768 g_signal_connect (adj, "value_changed",
10769 G_CALLBACK (adjust_act_blocks), pdata);
10770 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
10772 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
10774 button = gtk_button_new_with_label ("close");
10775 g_signal_connect_swapped (button, "clicked",
10776 G_CALLBACK (gtk_widget_destroy),
10778 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
10779 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
10780 button, TRUE, TRUE, 0);
10781 gtk_widget_grab_default (button);
10784 if (!GTK_WIDGET_VISIBLE (pdata->window))
10785 gtk_widget_show_all (pdata->window);
10787 gtk_widget_destroy (pdata->window);
10799 GtkWidget *res_widget;
10803 find_widget (GtkWidget *widget, FindWidgetData *data)
10805 GtkAllocation new_allocation;
10809 new_allocation = widget->allocation;
10811 if (data->found || !GTK_WIDGET_MAPPED (widget))
10814 /* Note that in the following code, we only count the
10815 * position as being inside a WINDOW widget if it is inside
10816 * widget->window; points that are outside of widget->window
10817 * but within the allocation are not counted. This is consistent
10818 * with the way we highlight drag targets.
10820 if (!GTK_WIDGET_NO_WINDOW (widget))
10822 new_allocation.x = 0;
10823 new_allocation.y = 0;
10826 if (widget->parent && !data->first)
10828 GdkWindow *window = widget->window;
10829 while (window != widget->parent->window)
10831 gint tx, ty, twidth, theight;
10832 gdk_drawable_get_size (window, &twidth, &theight);
10834 if (new_allocation.x < 0)
10836 new_allocation.width += new_allocation.x;
10837 new_allocation.x = 0;
10839 if (new_allocation.y < 0)
10841 new_allocation.height += new_allocation.y;
10842 new_allocation.y = 0;
10844 if (new_allocation.x + new_allocation.width > twidth)
10845 new_allocation.width = twidth - new_allocation.x;
10846 if (new_allocation.y + new_allocation.height > theight)
10847 new_allocation.height = theight - new_allocation.y;
10849 gdk_window_get_position (window, &tx, &ty);
10850 new_allocation.x += tx;
10852 new_allocation.y += ty;
10855 window = gdk_window_get_parent (window);
10859 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
10860 (data->x < new_allocation.x + new_allocation.width) &&
10861 (data->y < new_allocation.y + new_allocation.height))
10863 /* First, check if the drag is in a valid drop site in
10864 * one of our children
10866 if (GTK_IS_CONTAINER (widget))
10868 FindWidgetData new_data = *data;
10870 new_data.x -= x_offset;
10871 new_data.y -= y_offset;
10872 new_data.found = FALSE;
10873 new_data.first = FALSE;
10875 gtk_container_forall (GTK_CONTAINER (widget),
10876 (GtkCallback)find_widget,
10879 data->found = new_data.found;
10881 data->res_widget = new_data.res_widget;
10884 /* If not, and this widget is registered as a drop site, check to
10885 * emit "drag_motion" to check if we are actually in
10890 data->found = TRUE;
10891 data->res_widget = widget;
10897 find_widget_at_pointer (GdkDisplay *display)
10899 GtkWidget *widget = NULL;
10900 GdkWindow *pointer_window;
10902 FindWidgetData data;
10904 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
10906 if (pointer_window)
10907 gdk_window_get_user_data (pointer_window, (gpointer*) &widget);
10911 gdk_window_get_pointer (widget->window,
10916 data.found = FALSE;
10919 find_widget (widget, &data);
10921 return data.res_widget;
10927 struct PropertiesData {
10928 GtkWidget **window;
10935 destroy_properties (GtkWidget *widget,
10936 struct PropertiesData *data)
10940 *data->window = NULL;
10941 data->window = NULL;
10946 gdk_cursor_unref (data->cursor);
10947 data->cursor = NULL;
10952 g_signal_handler_disconnect (widget, data->handler);
10960 property_query_event (GtkWidget *widget,
10962 struct PropertiesData *data)
10964 GtkWidget *res_widget = NULL;
10966 if (!data->in_query)
10969 if (event->type == GDK_BUTTON_RELEASE)
10971 gtk_grab_remove (widget);
10972 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10975 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
10978 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
10979 gtk_widget_get_screen (widget));
10980 create_prop_editor (G_OBJECT (res_widget), 0);
10983 data->in_query = FALSE;
10990 query_properties (GtkButton *button,
10991 struct PropertiesData *data)
10995 g_signal_connect (button, "event",
10996 G_CALLBACK (property_query_event), data);
11000 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
11003 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
11005 GDK_BUTTON_RELEASE_MASK,
11010 gtk_grab_add (GTK_WIDGET (button));
11012 data->in_query = TRUE;
11016 create_properties (GtkWidget *widget)
11018 static GtkWidget *window = NULL;
11022 struct PropertiesData *data;
11024 data = g_new (struct PropertiesData, 1);
11025 data->window = &window;
11026 data->in_query = FALSE;
11027 data->cursor = NULL;
11032 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11034 gtk_window_set_screen (GTK_WINDOW (window),
11035 gtk_widget_get_screen (widget));
11037 data->handler = g_signal_connect (window, "destroy",
11038 G_CALLBACK (destroy_properties),
11041 gtk_window_set_title (GTK_WINDOW (window), "test properties");
11042 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11044 vbox = gtk_vbox_new (FALSE, 1);
11045 gtk_container_add (GTK_CONTAINER (window), vbox);
11047 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
11048 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
11050 button = gtk_button_new_with_label ("Query properties");
11051 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
11052 g_signal_connect (button, "clicked",
11053 G_CALLBACK (query_properties),
11057 if (!GTK_WIDGET_VISIBLE (window))
11058 gtk_widget_show_all (window);
11060 gtk_widget_destroy (window);
11069 static int color_idle = 0;
11072 color_idle_func (GtkWidget *preview)
11074 static int count = 1;
11078 for (i = 0; i < 256; i++)
11080 for (j = 0, k = 0; j < 256; j++)
11082 buf[k+0] = i + count;
11084 buf[k+2] = j + count;
11088 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11093 gtk_widget_queue_draw (preview);
11094 gdk_window_process_updates (preview->window, TRUE);
11100 color_preview_destroy (GtkWidget *widget,
11101 GtkWidget **window)
11103 gtk_idle_remove (color_idle);
11110 create_color_preview (GtkWidget *widget)
11112 static GtkWidget *window = NULL;
11113 GtkWidget *preview;
11119 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11121 gtk_window_set_screen (GTK_WINDOW (window),
11122 gtk_widget_get_screen (widget));
11124 g_signal_connect (window, "destroy",
11125 G_CALLBACK (color_preview_destroy),
11128 gtk_window_set_title (GTK_WINDOW (window), "test");
11129 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11131 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
11132 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11133 gtk_container_add (GTK_CONTAINER (window), preview);
11135 for (i = 0; i < 256; i++)
11137 for (j = 0, k = 0; j < 256; j++)
11145 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11148 color_idle = gtk_idle_add ((GtkFunction) color_idle_func, preview);
11151 if (!GTK_WIDGET_VISIBLE (window))
11152 gtk_widget_show_all (window);
11154 gtk_widget_destroy (window);
11161 static int gray_idle = 0;
11164 gray_idle_func (GtkWidget *preview)
11166 static int count = 1;
11170 for (i = 0; i < 256; i++)
11172 for (j = 0; j < 256; j++)
11173 buf[j] = i + j + count;
11175 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11180 gtk_widget_draw (preview, NULL);
11186 gray_preview_destroy (GtkWidget *widget,
11187 GtkWidget **window)
11189 gtk_idle_remove (gray_idle);
11196 create_gray_preview (GtkWidget *widget)
11198 static GtkWidget *window = NULL;
11199 GtkWidget *preview;
11205 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11207 gtk_window_set_screen (GTK_WINDOW (window),
11208 gtk_widget_get_screen (widget));
11210 g_signal_connect (window, "destroy",
11211 G_CALLBACK (gray_preview_destroy),
11214 gtk_window_set_title (GTK_WINDOW (window), "test");
11215 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11217 preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
11218 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11219 gtk_container_add (GTK_CONTAINER (window), preview);
11221 for (i = 0; i < 256; i++)
11223 for (j = 0; j < 256; j++)
11226 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11229 gray_idle = gtk_idle_add ((GtkFunction) gray_idle_func, preview);
11232 if (!GTK_WIDGET_VISIBLE (window))
11233 gtk_widget_show_all (window);
11235 gtk_widget_destroy (window);
11244 selection_test_received (GtkWidget *list, GtkSelectionData *data)
11247 GtkWidget *list_item;
11251 if (data->length < 0)
11253 g_print ("Selection retrieval failed\n");
11256 if (data->type != GDK_SELECTION_TYPE_ATOM)
11258 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
11262 /* Clear out any current list items */
11264 gtk_list_clear_items (GTK_LIST(list), 0, -1);
11266 /* Add new items to list */
11268 atoms = (GdkAtom *)data->data;
11271 l = data->length / sizeof (GdkAtom);
11272 for (i = 0; i < l; i++)
11275 name = gdk_atom_name (atoms[i]);
11278 list_item = gtk_list_item_new_with_label (name);
11282 list_item = gtk_list_item_new_with_label ("(bad atom)");
11284 gtk_widget_show (list_item);
11285 item_list = g_list_append (item_list, list_item);
11288 gtk_list_append_items (GTK_LIST (list), item_list);
11294 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
11296 static GdkAtom targets_atom = GDK_NONE;
11298 if (targets_atom == GDK_NONE)
11299 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
11301 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
11306 create_selection_test (GtkWidget *widget)
11308 static GtkWidget *window = NULL;
11311 GtkWidget *scrolled_win;
11317 window = gtk_dialog_new ();
11319 gtk_window_set_screen (GTK_WINDOW (window),
11320 gtk_widget_get_screen (widget));
11322 g_signal_connect (window, "destroy",
11323 G_CALLBACK (gtk_widget_destroyed),
11326 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
11327 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11329 /* Create the list */
11331 vbox = gtk_vbox_new (FALSE, 5);
11332 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11333 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
11336 label = gtk_label_new ("Gets available targets for current selection");
11337 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11339 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
11340 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
11341 GTK_POLICY_AUTOMATIC,
11342 GTK_POLICY_AUTOMATIC);
11343 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
11344 gtk_widget_set_size_request (scrolled_win, 100, 200);
11346 list = gtk_list_new ();
11347 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
11349 g_signal_connect (list, "selection_received",
11350 G_CALLBACK (selection_test_received), NULL);
11352 /* .. And create some buttons */
11353 button = gtk_button_new_with_label ("Get Targets");
11354 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11355 button, TRUE, TRUE, 0);
11357 g_signal_connect (button, "clicked",
11358 G_CALLBACK (selection_test_get_targets), list);
11360 button = gtk_button_new_with_label ("Quit");
11361 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11362 button, TRUE, TRUE, 0);
11364 g_signal_connect_swapped (button, "clicked",
11365 G_CALLBACK (gtk_widget_destroy),
11369 if (!GTK_WIDGET_VISIBLE (window))
11370 gtk_widget_show_all (window);
11372 gtk_widget_destroy (window);
11380 create_gamma_curve (GtkWidget *widget)
11382 static GtkWidget *window = NULL, *curve;
11383 static int count = 0;
11390 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11391 gtk_window_set_screen (GTK_WINDOW (window),
11392 gtk_widget_get_screen (widget));
11394 gtk_window_set_title (GTK_WINDOW (window), "test");
11395 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11397 g_signal_connect (window, "destroy",
11398 G_CALLBACK(gtk_widget_destroyed),
11401 curve = gtk_gamma_curve_new ();
11402 gtk_container_add (GTK_CONTAINER (window), curve);
11403 gtk_widget_show (curve);
11406 max = 127 + (count % 2)*128;
11407 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11409 for (i = 0; i < max; ++i)
11410 vec[i] = (127 / sqrt (max)) * sqrt (i);
11411 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11414 if (!GTK_WIDGET_VISIBLE (window))
11415 gtk_widget_show (window);
11416 else if (count % 4 == 3)
11418 gtk_widget_destroy (window);
11429 static int scroll_test_pos = 0.0;
11432 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
11433 GtkAdjustment *adj)
11436 gint imin, imax, jmin, jmax;
11438 imin = (event->area.x) / 10;
11439 imax = (event->area.x + event->area.width + 9) / 10;
11441 jmin = ((int)adj->value + event->area.y) / 10;
11442 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
11444 gdk_window_clear_area (widget->window,
11445 event->area.x, event->area.y,
11446 event->area.width, event->area.height);
11448 for (i=imin; i<imax; i++)
11449 for (j=jmin; j<jmax; j++)
11451 gdk_draw_rectangle (widget->window,
11452 widget->style->black_gc,
11454 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
11460 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
11461 GtkAdjustment *adj)
11463 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
11464 -adj->page_increment / 2:
11465 adj->page_increment / 2);
11466 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
11467 gtk_adjustment_set_value (adj, new_value);
11473 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
11474 GtkAdjustment *adj)
11476 adj->page_increment = 0.9 * widget->allocation.height;
11477 adj->page_size = widget->allocation.height;
11479 g_signal_emit_by_name (adj, "changed");
11483 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
11485 /* gint source_min = (int)adj->value - scroll_test_pos; */
11488 dy = scroll_test_pos - (int)adj->value;
11489 scroll_test_pos = adj->value;
11491 if (!GTK_WIDGET_DRAWABLE (widget))
11493 gdk_window_scroll (widget->window, 0, dy);
11494 gdk_window_process_updates (widget->window, FALSE);
11499 create_scroll_test (GtkWidget *widget)
11501 static GtkWidget *window = NULL;
11503 GtkWidget *drawing_area;
11504 GtkWidget *scrollbar;
11506 GtkAdjustment *adj;
11507 GdkGeometry geometry;
11508 GdkWindowHints geometry_mask;
11512 window = gtk_dialog_new ();
11514 gtk_window_set_screen (GTK_WINDOW (window),
11515 gtk_widget_get_screen (widget));
11517 g_signal_connect (window, "destroy",
11518 G_CALLBACK (gtk_widget_destroyed),
11521 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
11522 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11524 hbox = gtk_hbox_new (FALSE, 0);
11525 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
11527 gtk_widget_show (hbox);
11529 drawing_area = gtk_drawing_area_new ();
11530 gtk_widget_set_size_request (drawing_area, 200, 200);
11531 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
11532 gtk_widget_show (drawing_area);
11534 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
11536 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
11537 scroll_test_pos = 0.0;
11539 scrollbar = gtk_vscrollbar_new (adj);
11540 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
11541 gtk_widget_show (scrollbar);
11543 g_signal_connect (drawing_area, "expose_event",
11544 G_CALLBACK (scroll_test_expose), adj);
11545 g_signal_connect (drawing_area, "configure_event",
11546 G_CALLBACK (scroll_test_configure), adj);
11547 g_signal_connect (drawing_area, "scroll_event",
11548 G_CALLBACK (scroll_test_scroll), adj);
11550 g_signal_connect (adj, "value_changed",
11551 G_CALLBACK (scroll_test_adjustment_changed),
11554 /* .. And create some buttons */
11556 button = gtk_button_new_with_label ("Quit");
11557 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11558 button, TRUE, TRUE, 0);
11560 g_signal_connect_swapped (button, "clicked",
11561 G_CALLBACK (gtk_widget_destroy),
11563 gtk_widget_show (button);
11565 /* Set up gridded geometry */
11567 geometry_mask = GDK_HINT_MIN_SIZE |
11568 GDK_HINT_BASE_SIZE |
11569 GDK_HINT_RESIZE_INC;
11571 geometry.min_width = 20;
11572 geometry.min_height = 20;
11573 geometry.base_width = 0;
11574 geometry.base_height = 0;
11575 geometry.width_inc = 10;
11576 geometry.height_inc = 10;
11578 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11579 drawing_area, &geometry, geometry_mask);
11582 if (!GTK_WIDGET_VISIBLE (window))
11583 gtk_widget_show (window);
11585 gtk_widget_destroy (window);
11592 static int timer = 0;
11595 timeout_test (GtkWidget *label)
11597 static int count = 0;
11598 static char buffer[32];
11600 sprintf (buffer, "count: %d", ++count);
11601 gtk_label_set_text (GTK_LABEL (label), buffer);
11607 start_timeout_test (GtkWidget *widget,
11612 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
11617 stop_timeout_test (GtkWidget *widget,
11622 gtk_timeout_remove (timer);
11628 destroy_timeout_test (GtkWidget *widget,
11629 GtkWidget **window)
11631 stop_timeout_test (NULL, NULL);
11637 create_timeout_test (GtkWidget *widget)
11639 static GtkWidget *window = NULL;
11645 window = gtk_dialog_new ();
11647 gtk_window_set_screen (GTK_WINDOW (window),
11648 gtk_widget_get_screen (widget));
11650 g_signal_connect (window, "destroy",
11651 G_CALLBACK (destroy_timeout_test),
11654 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
11655 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11657 label = gtk_label_new ("count: 0");
11658 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11659 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11660 label, TRUE, TRUE, 0);
11661 gtk_widget_show (label);
11663 button = gtk_button_new_with_label ("close");
11664 g_signal_connect_swapped (button, "clicked",
11665 G_CALLBACK (gtk_widget_destroy),
11667 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11668 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11669 button, TRUE, TRUE, 0);
11670 gtk_widget_grab_default (button);
11671 gtk_widget_show (button);
11673 button = gtk_button_new_with_label ("start");
11674 g_signal_connect (button, "clicked",
11675 G_CALLBACK(start_timeout_test),
11677 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11678 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11679 button, TRUE, TRUE, 0);
11680 gtk_widget_show (button);
11682 button = gtk_button_new_with_label ("stop");
11683 g_signal_connect (button, "clicked",
11684 G_CALLBACK (stop_timeout_test),
11686 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11687 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11688 button, TRUE, TRUE, 0);
11689 gtk_widget_show (button);
11692 if (!GTK_WIDGET_VISIBLE (window))
11693 gtk_widget_show (window);
11695 gtk_widget_destroy (window);
11702 static int idle_id = 0;
11705 idle_test (GtkWidget *label)
11707 static int count = 0;
11708 static char buffer[32];
11710 sprintf (buffer, "count: %d", ++count);
11711 gtk_label_set_text (GTK_LABEL (label), buffer);
11717 start_idle_test (GtkWidget *widget,
11722 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
11727 stop_idle_test (GtkWidget *widget,
11732 gtk_idle_remove (idle_id);
11738 destroy_idle_test (GtkWidget *widget,
11739 GtkWidget **window)
11741 stop_idle_test (NULL, NULL);
11747 toggle_idle_container (GObject *button,
11748 GtkContainer *container)
11750 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
11754 create_idle_test (GtkWidget *widget)
11756 static GtkWidget *window = NULL;
11759 GtkWidget *container;
11763 GtkWidget *button2;
11767 window = gtk_dialog_new ();
11769 gtk_window_set_screen (GTK_WINDOW (window),
11770 gtk_widget_get_screen (widget));
11772 g_signal_connect (window, "destroy",
11773 G_CALLBACK (destroy_idle_test),
11776 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
11777 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11779 label = gtk_label_new ("count: 0");
11780 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11781 gtk_widget_show (label);
11784 gtk_widget_new (GTK_TYPE_HBOX,
11786 /* "GtkContainer::child", gtk_widget_new (GTK_TYPE_HBOX,
11787 * "GtkWidget::visible", TRUE,
11792 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11793 container, TRUE, TRUE, 0);
11796 gtk_widget_new (GTK_TYPE_FRAME,
11798 "label", "Label Container",
11800 "parent", GTK_DIALOG (window)->vbox,
11803 gtk_widget_new (GTK_TYPE_VBOX,
11808 g_object_connect (gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11809 "label", "Resize-Parent",
11810 "user_data", (void*)GTK_RESIZE_PARENT,
11814 "signal::clicked", toggle_idle_container, container,
11816 button = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11817 "label", "Resize-Queue",
11818 "user_data", (void*)GTK_RESIZE_QUEUE,
11823 g_object_connect (button,
11824 "signal::clicked", toggle_idle_container, container,
11826 button2 = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11827 "label", "Resize-Immediate",
11828 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
11830 g_object_connect (button2,
11831 "signal::clicked", toggle_idle_container, container,
11833 g_object_set (button2,
11839 button = gtk_button_new_with_label ("close");
11840 g_signal_connect_swapped (button, "clicked",
11841 G_CALLBACK (gtk_widget_destroy),
11843 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11844 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11845 button, TRUE, TRUE, 0);
11846 gtk_widget_grab_default (button);
11847 gtk_widget_show (button);
11849 button = gtk_button_new_with_label ("start");
11850 g_signal_connect (button, "clicked",
11851 G_CALLBACK (start_idle_test),
11853 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11854 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11855 button, TRUE, TRUE, 0);
11856 gtk_widget_show (button);
11858 button = gtk_button_new_with_label ("stop");
11859 g_signal_connect (button, "clicked",
11860 G_CALLBACK (stop_idle_test),
11862 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11863 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11864 button, TRUE, TRUE, 0);
11865 gtk_widget_show (button);
11868 if (!GTK_WIDGET_VISIBLE (window))
11869 gtk_widget_show (window);
11871 gtk_widget_destroy (window);
11879 reload_all_rc_files (void)
11881 static GdkAtom atom_rcfiles = GDK_NONE;
11883 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
11887 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
11889 for(i = 0; i < 5; i++)
11890 send_event->client.data.l[i] = 0;
11891 send_event->client.data_format = 32;
11892 send_event->client.message_type = atom_rcfiles;
11893 gdk_event_send_clientmessage_toall (send_event);
11895 gdk_event_free (send_event);
11899 create_rc_file (GtkWidget *widget)
11901 static GtkWidget *window = NULL;
11909 window = gtk_dialog_new ();
11911 gtk_window_set_screen (GTK_WINDOW (window),
11912 gtk_widget_get_screen (widget));
11914 g_signal_connect (window, "destroy",
11915 G_CALLBACK (gtk_widget_destroyed),
11918 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
11919 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
11921 vbox = gtk_vbox_new (FALSE, 0);
11922 gtk_container_add (GTK_CONTAINER (frame), vbox);
11924 label = gtk_label_new ("This label should be red");
11925 gtk_widget_set_name (label, "testgtk-red-label");
11926 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11928 label = gtk_label_new ("This label should be green");
11929 gtk_widget_set_name (label, "testgtk-green-label");
11930 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11932 label = gtk_label_new ("This label should be blue");
11933 gtk_widget_set_name (label, "testgtk-blue-label");
11934 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11936 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
11937 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11939 button = gtk_button_new_with_label ("Reload");
11940 g_signal_connect (button, "clicked",
11941 G_CALLBACK (gtk_rc_reparse_all), NULL);
11942 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11943 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11944 button, TRUE, TRUE, 0);
11945 gtk_widget_grab_default (button);
11947 button = gtk_button_new_with_label ("Reload All");
11948 g_signal_connect (button, "clicked",
11949 G_CALLBACK (reload_all_rc_files), NULL);
11950 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11951 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11952 button, TRUE, TRUE, 0);
11954 button = gtk_button_new_with_label ("Close");
11955 g_signal_connect_swapped (button, "clicked",
11956 G_CALLBACK (gtk_widget_destroy),
11958 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11959 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11960 button, TRUE, TRUE, 0);
11963 if (!GTK_WIDGET_VISIBLE (window))
11964 gtk_widget_show_all (window);
11966 gtk_widget_destroy (window);
11970 * Test of recursive mainloop
11974 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
11981 create_mainloop (GtkWidget *widget)
11983 static GtkWidget *window = NULL;
11989 window = gtk_dialog_new ();
11991 gtk_window_set_screen (GTK_WINDOW (window),
11992 gtk_widget_get_screen (widget));
11994 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
11996 g_signal_connect (window, "destroy",
11997 G_CALLBACK (mainloop_destroyed),
12000 label = gtk_label_new ("In recursive main loop...");
12001 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
12003 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
12005 gtk_widget_show (label);
12007 button = gtk_button_new_with_label ("Leave");
12008 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
12011 g_signal_connect_swapped (button, "clicked",
12012 G_CALLBACK (gtk_widget_destroy),
12015 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12016 gtk_widget_grab_default (button);
12018 gtk_widget_show (button);
12021 if (!GTK_WIDGET_VISIBLE (window))
12023 gtk_widget_show (window);
12025 g_print ("create_mainloop: start\n");
12027 g_print ("create_mainloop: done\n");
12030 gtk_widget_destroy (window);
12034 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
12039 gint imin, imax, jmin, jmax;
12041 layout = GTK_LAYOUT (widget);
12043 if (event->window != layout->bin_window)
12046 imin = (event->area.x) / 10;
12047 imax = (event->area.x + event->area.width + 9) / 10;
12049 jmin = (event->area.y) / 10;
12050 jmax = (event->area.y + event->area.height + 9) / 10;
12052 for (i=imin; i<imax; i++)
12053 for (j=jmin; j<jmax; j++)
12055 gdk_draw_rectangle (layout->bin_window,
12056 widget->style->black_gc,
12064 void create_layout (GtkWidget *widget)
12066 static GtkWidget *window = NULL;
12068 GtkWidget *scrolledwindow;
12077 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12078 gtk_window_set_screen (GTK_WINDOW (window),
12079 gtk_widget_get_screen (widget));
12081 g_signal_connect (window, "destroy",
12082 G_CALLBACK (gtk_widget_destroyed),
12085 gtk_window_set_title (GTK_WINDOW (window), "Layout");
12086 gtk_widget_set_size_request (window, 200, 200);
12088 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
12089 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
12091 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
12092 GTK_CORNER_TOP_RIGHT);
12094 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
12096 layout = gtk_layout_new (NULL, NULL);
12097 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
12099 /* We set step sizes here since GtkLayout does not set
12102 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
12103 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
12105 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
12106 g_signal_connect (layout, "expose_event",
12107 G_CALLBACK (layout_expose_handler), NULL);
12109 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
12111 for (i=0 ; i < 16 ; i++)
12112 for (j=0 ; j < 16 ; j++)
12114 sprintf(buf, "Button %d, %d", i, j);
12116 button = gtk_button_new_with_label (buf);
12118 button = gtk_label_new (buf);
12120 gtk_layout_put (GTK_LAYOUT (layout), button,
12124 for (i=16; i < 1280; i++)
12126 sprintf(buf, "Button %d, %d", i, 0);
12128 button = gtk_button_new_with_label (buf);
12130 button = gtk_label_new (buf);
12132 gtk_layout_put (GTK_LAYOUT (layout), button,
12137 if (!GTK_WIDGET_VISIBLE (window))
12138 gtk_widget_show_all (window);
12140 gtk_widget_destroy (window);
12144 create_styles (GtkWidget *widget)
12146 static GtkWidget *window = NULL;
12151 static GdkColor red = { 0, 0xffff, 0, 0 };
12152 static GdkColor green = { 0, 0, 0xffff, 0 };
12153 static GdkColor blue = { 0, 0, 0, 0xffff };
12154 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
12155 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
12156 PangoFontDescription *font_desc;
12158 GtkRcStyle *rc_style;
12162 window = gtk_dialog_new ();
12163 gtk_window_set_screen (GTK_WINDOW (window),
12164 gtk_widget_get_screen (widget));
12166 g_signal_connect (window, "destroy",
12167 G_CALLBACK (gtk_widget_destroyed),
12171 button = gtk_button_new_with_label ("Close");
12172 g_signal_connect_swapped (button, "clicked",
12173 G_CALLBACK (gtk_widget_destroy),
12175 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12176 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12177 button, TRUE, TRUE, 0);
12178 gtk_widget_show (button);
12180 vbox = gtk_vbox_new (FALSE, 5);
12181 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
12182 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
12184 label = gtk_label_new ("Font:");
12185 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12186 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12188 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
12190 button = gtk_button_new_with_label ("Some Text");
12191 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
12192 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12194 label = gtk_label_new ("Foreground:");
12195 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12196 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12198 button = gtk_button_new_with_label ("Some Text");
12199 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
12200 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12202 label = gtk_label_new ("Background:");
12203 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12204 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12206 button = gtk_button_new_with_label ("Some Text");
12207 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
12208 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12210 label = gtk_label_new ("Text:");
12211 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12212 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12214 entry = gtk_entry_new ();
12215 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12216 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
12217 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12219 label = gtk_label_new ("Base:");
12220 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12221 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12223 entry = gtk_entry_new ();
12224 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12225 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
12226 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12228 label = gtk_label_new ("Multiple:");
12229 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12230 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12232 button = gtk_button_new_with_label ("Some Text");
12234 rc_style = gtk_rc_style_new ();
12236 rc_style->font_desc = pango_font_description_copy (font_desc);
12237 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
12238 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
12239 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
12240 rc_style->fg[GTK_STATE_NORMAL] = yellow;
12241 rc_style->bg[GTK_STATE_NORMAL] = blue;
12242 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
12243 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
12244 rc_style->fg[GTK_STATE_ACTIVE] = red;
12245 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
12246 rc_style->xthickness = 5;
12247 rc_style->ythickness = 5;
12249 gtk_widget_modify_style (button, rc_style);
12250 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
12252 g_object_unref (rc_style);
12254 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12257 if (!GTK_WIDGET_VISIBLE (window))
12258 gtk_widget_show_all (window);
12260 gtk_widget_destroy (window);
12264 * Main Window and Exit
12268 do_exit (GtkWidget *widget, GtkWidget *window)
12270 gtk_widget_destroy (window);
12276 void (*func) (GtkWidget *widget);
12277 gboolean do_not_benchmark;
12280 { "big windows", create_big_windows },
12281 { "button box", create_button_box },
12282 { "buttons", create_buttons },
12283 { "check buttons", create_check_buttons },
12284 { "clist", create_clist},
12285 { "color selection", create_color_selection },
12286 { "ctree", create_ctree },
12287 { "cursors", create_cursors },
12288 { "dialog", create_dialog },
12289 { "display & screen", create_display_screen },
12290 { "entry", create_entry },
12291 { "event watcher", create_event_watcher },
12292 { "file selection", create_file_selection },
12293 { "flipping", create_flipping },
12294 { "focus", create_focus },
12295 { "font selection", create_font_selection },
12296 { "gamma curve", create_gamma_curve, TRUE },
12297 { "gridded geometry", create_gridded_geometry, TRUE },
12298 { "handle box", create_handle_box },
12299 { "image from drawable", create_get_image },
12300 { "image", create_image },
12301 { "item factory", create_item_factory },
12302 { "key lookup", create_key_lookup },
12303 { "labels", create_labels },
12304 { "layout", create_layout },
12305 { "list", create_list },
12306 { "menus", create_menus },
12307 { "message dialog", create_message_dialog },
12308 { "modal window", create_modal_window, TRUE },
12309 { "notebook", create_notebook },
12310 { "panes", create_panes },
12311 { "paned keyboard", create_paned_keyboard_navigation },
12312 { "pixmap", create_pixmap },
12313 { "preview color", create_color_preview, TRUE },
12314 { "preview gray", create_gray_preview, TRUE },
12315 { "progress bar", create_progress_bar },
12316 { "properties", create_properties },
12317 { "radio buttons", create_radio_buttons },
12318 { "range controls", create_range_controls },
12319 { "rc file", create_rc_file },
12320 { "reparent", create_reparent },
12321 { "resize grips", create_resize_grips },
12322 { "rulers", create_rulers },
12323 { "saved position", create_saved_position },
12324 { "scrolled windows", create_scrolled_windows },
12325 { "shapes", create_shapes },
12326 { "size groups", create_size_groups },
12327 { "spinbutton", create_spins },
12328 { "statusbar", create_statusbar },
12329 { "styles", create_styles },
12330 { "test idle", create_idle_test },
12331 { "test mainloop", create_mainloop, TRUE },
12332 { "test scrolling", create_scroll_test },
12333 { "test selection", create_selection_test },
12334 { "test timeout", create_timeout_test },
12335 { "text", create_text },
12336 { "toggle buttons", create_toggle_buttons },
12337 { "toolbar", create_toolbar },
12338 { "tooltips", create_tooltips },
12339 { "tree", create_tree_mode_window},
12340 { "WM hints", create_wmhints },
12341 { "window sizing", create_window_sizing },
12342 { "window states", create_window_states }
12344 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
12347 create_main_window (void)
12352 GtkWidget *scrolled_window;
12356 GtkWidget *separator;
12357 GdkGeometry geometry;
12360 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12361 gtk_widget_set_name (window, "main window");
12362 gtk_widget_set_uposition (window, 20, 20);
12363 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
12365 geometry.min_width = -1;
12366 geometry.min_height = -1;
12367 geometry.max_width = -1;
12368 geometry.max_height = G_MAXSHORT;
12369 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
12371 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
12373 g_signal_connect (window, "destroy",
12374 G_CALLBACK (gtk_main_quit),
12376 g_signal_connect (window, "delete-event",
12377 G_CALLBACK (gtk_false),
12380 box1 = gtk_vbox_new (FALSE, 0);
12381 gtk_container_add (GTK_CONTAINER (window), box1);
12383 if (gtk_micro_version > 0)
12388 gtk_micro_version);
12393 gtk_minor_version);
12395 label = gtk_label_new (buffer);
12396 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
12397 gtk_widget_set_name (label, "testgtk-version-label");
12399 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
12400 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
12401 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
12403 GTK_POLICY_AUTOMATIC);
12404 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
12406 box2 = gtk_vbox_new (FALSE, 0);
12407 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12408 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
12409 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
12410 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
12411 gtk_widget_show (box2);
12413 for (i = 0; i < nbuttons; i++)
12415 button = gtk_button_new_with_label (buttons[i].label);
12416 if (buttons[i].func)
12417 g_signal_connect (button,
12419 G_CALLBACK(buttons[i].func),
12422 gtk_widget_set_sensitive (button, FALSE);
12423 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12426 separator = gtk_hseparator_new ();
12427 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
12429 box2 = gtk_vbox_new (FALSE, 10);
12430 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12431 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
12433 button = gtk_button_new_with_mnemonic ("_Close");
12434 g_signal_connect (button, "clicked",
12435 G_CALLBACK (do_exit),
12437 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12438 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12439 gtk_widget_grab_default (button);
12441 gtk_widget_show_all (window);
12447 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
12448 G_FILE_TEST_EXISTS))
12450 putenv ("GDK_PIXBUF_MODULE_FILE=../gdk-pixbuf/gdk-pixbuf.loaders");
12451 putenv ("GTK_IM_MODULE_FILE=../modules/input/gtk.immodules");
12456 pad (const char *str, int to)
12458 static char buf[256];
12459 int len = strlen (str);
12462 for (i = 0; i < to; i++)
12467 memcpy (buf, str, len);
12473 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
12475 fn (widget); /* on */
12476 while (g_main_context_iteration (NULL, FALSE));
12477 fn (widget); /* off */
12478 while (g_main_context_iteration (NULL, FALSE));
12482 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
12488 static gboolean printed_headers = FALSE;
12490 if (!printed_headers) {
12491 g_print ("Test Iters First Other\n");
12492 g_print ("-------------------- ----- ---------- ----------\n");
12493 printed_headers = TRUE;
12496 g_get_current_time (&tv0);
12497 bench_iteration (widget, fn);
12498 g_get_current_time (&tv1);
12500 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12501 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12503 g_get_current_time (&tv0);
12504 for (n = 0; n < num - 1; n++)
12505 bench_iteration (widget, fn);
12506 g_get_current_time (&tv1);
12507 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12508 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12510 g_print ("%s %5d ", pad (name, 20), num);
12512 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
12514 g_print ("%10.1f\n", dt_first);
12518 do_bench (char* what, int num)
12522 void (* fn) (GtkWidget *widget);
12524 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12526 if (g_ascii_strcasecmp (what, "ALL") == 0)
12528 for (i = 0; i < nbuttons; i++)
12530 if (!buttons[i].do_not_benchmark)
12531 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
12538 for (i = 0; i < nbuttons; i++)
12540 if (strcmp (buttons[i].label, what) == 0)
12542 fn = buttons[i].func;
12548 g_print ("Can't bench: \"%s\" not found.\n", what);
12550 do_real_bench (widget, fn, buttons[i].label, num);
12557 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
12562 main (int argc, char *argv[])
12564 GtkBindingSet *binding_set;
12566 gboolean done_benchmarks = FALSE;
12568 srand (time (NULL));
12572 /* Check to see if we are being run from the correct
12575 if (file_exists ("testgtkrc"))
12576 gtk_rc_add_default_file ("testgtkrc");
12578 g_set_application_name ("GTK+ Test Program");
12580 gtk_init (&argc, &argv);
12584 for (i = 1; i < argc; i++)
12586 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
12593 nextarg = strchr (argv[i], '=');
12604 count = strchr (nextarg, ':');
12607 what = g_strndup (nextarg, count - nextarg);
12609 num = atoi (count);
12614 what = g_strdup (nextarg);
12616 do_bench (what, num ? num : 1);
12617 done_benchmarks = TRUE;
12622 if (done_benchmarks)
12627 binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_WIDGET));
12628 gtk_binding_entry_add_signal (binding_set,
12629 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
12632 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
12634 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
12638 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
12639 " fg[NORMAL] = \"#ff0000\"\n"
12640 " font = \"Sans 18\"\n"
12642 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
12644 create_main_window ();
12650 while (g_main_context_pending (NULL))
12651 g_main_context_iteration (NULL, FALSE);
12654 while (g_main_context_pending (NULL))
12655 g_main_context_iteration (NULL, FALSE);