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 GValue value = { 0, };
8563 g_value_init (&value, G_TYPE_BOOLEAN);
8564 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
8565 gtk_container_child_get_property (container, child, "resize", &value);
8566 g_value_set_boolean (&value, !g_value_get_boolean (&value));
8567 gtk_container_child_set_property (container, child, "resize", &value);
8571 toggle_shrink (GtkWidget *widget, GtkWidget *child)
8573 GValue value = { 0, };
8574 g_value_init (&value, G_TYPE_BOOLEAN);
8575 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
8576 gtk_container_child_get_property (container, child, "shrink", &value);
8577 g_value_set_boolean (&value, !g_value_get_boolean (&value));
8578 gtk_container_child_set_property (container, child, "shrink", &value);
8582 paned_props_clicked (GtkWidget *button,
8585 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
8587 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
8591 create_pane_options (GtkPaned *paned,
8592 const gchar *frame_label,
8593 const gchar *label1,
8594 const gchar *label2)
8600 GtkWidget *check_button;
8602 frame = gtk_frame_new (frame_label);
8603 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
8605 table = gtk_table_new (4, 2, 4);
8606 gtk_container_add (GTK_CONTAINER (frame), table);
8608 label = gtk_label_new (label1);
8609 gtk_table_attach_defaults (GTK_TABLE (table), label,
8612 check_button = gtk_check_button_new_with_label ("Resize");
8613 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8615 g_signal_connect (check_button, "toggled",
8616 G_CALLBACK (toggle_resize),
8619 check_button = gtk_check_button_new_with_label ("Shrink");
8620 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8622 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8624 g_signal_connect (check_button, "toggled",
8625 G_CALLBACK (toggle_shrink),
8628 label = gtk_label_new (label2);
8629 gtk_table_attach_defaults (GTK_TABLE (table), label,
8632 check_button = gtk_check_button_new_with_label ("Resize");
8633 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8635 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8637 g_signal_connect (check_button, "toggled",
8638 G_CALLBACK (toggle_resize),
8641 check_button = gtk_check_button_new_with_label ("Shrink");
8642 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8644 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8646 g_signal_connect (check_button, "toggled",
8647 G_CALLBACK (toggle_shrink),
8650 button = gtk_button_new_with_mnemonic ("_Properties");
8651 gtk_table_attach_defaults (GTK_TABLE (table), button,
8653 g_signal_connect (button, "clicked",
8654 G_CALLBACK (paned_props_clicked),
8661 create_panes (GtkWidget *widget)
8663 static GtkWidget *window = NULL;
8672 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8674 gtk_window_set_screen (GTK_WINDOW (window),
8675 gtk_widget_get_screen (widget));
8677 g_signal_connect (window, "destroy",
8678 G_CALLBACK (gtk_widget_destroyed),
8681 gtk_window_set_title (GTK_WINDOW (window), "Panes");
8682 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8684 vbox = gtk_vbox_new (FALSE, 0);
8685 gtk_container_add (GTK_CONTAINER (window), vbox);
8687 vpaned = gtk_vpaned_new ();
8688 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
8689 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
8691 hpaned = gtk_hpaned_new ();
8692 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
8694 frame = gtk_frame_new (NULL);
8695 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8696 gtk_widget_set_size_request (frame, 60, 60);
8697 gtk_paned_add1 (GTK_PANED (hpaned), frame);
8699 button = gtk_button_new_with_label ("Hi there");
8700 gtk_container_add (GTK_CONTAINER(frame), button);
8702 frame = gtk_frame_new (NULL);
8703 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8704 gtk_widget_set_size_request (frame, 80, 60);
8705 gtk_paned_add2 (GTK_PANED (hpaned), frame);
8707 frame = gtk_frame_new (NULL);
8708 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8709 gtk_widget_set_size_request (frame, 60, 80);
8710 gtk_paned_add2 (GTK_PANED (vpaned), frame);
8712 /* Now create toggle buttons to control sizing */
8714 gtk_box_pack_start (GTK_BOX (vbox),
8715 create_pane_options (GTK_PANED (hpaned),
8721 gtk_box_pack_start (GTK_BOX (vbox),
8722 create_pane_options (GTK_PANED (vpaned),
8728 gtk_widget_show_all (vbox);
8731 if (!GTK_WIDGET_VISIBLE (window))
8732 gtk_widget_show (window);
8734 gtk_widget_destroy (window);
8738 * Paned keyboard navigation
8742 paned_keyboard_window1 (GtkWidget *widget)
8765 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8766 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
8767 gtk_window_set_screen (GTK_WINDOW (window1),
8768 gtk_widget_get_screen (widget));
8770 hpaned1 = gtk_hpaned_new ();
8771 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
8773 frame1 = gtk_frame_new (NULL);
8774 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
8775 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
8777 vbox1 = gtk_vbox_new (FALSE, 0);
8778 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
8780 button7 = gtk_button_new_with_label ("button7");
8781 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
8783 button8 = gtk_button_new_with_label ("button8");
8784 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
8786 button9 = gtk_button_new_with_label ("button9");
8787 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
8789 vpaned1 = gtk_vpaned_new ();
8790 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
8792 frame2 = gtk_frame_new (NULL);
8793 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
8794 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
8796 frame5 = gtk_frame_new (NULL);
8797 gtk_container_add (GTK_CONTAINER (frame2), frame5);
8799 hbox1 = gtk_hbox_new (FALSE, 0);
8800 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
8802 button5 = gtk_button_new_with_label ("button5");
8803 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
8805 button6 = gtk_button_new_with_label ("button6");
8806 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
8808 frame3 = gtk_frame_new (NULL);
8809 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
8810 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
8812 frame4 = gtk_frame_new ("Buttons");
8813 gtk_container_add (GTK_CONTAINER (frame3), frame4);
8814 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
8816 table1 = gtk_table_new (2, 2, FALSE);
8817 gtk_container_add (GTK_CONTAINER (frame4), table1);
8818 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
8820 button1 = gtk_button_new_with_label ("button1");
8821 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
8822 (GtkAttachOptions) (GTK_FILL),
8823 (GtkAttachOptions) (0), 0, 0);
8825 button2 = gtk_button_new_with_label ("button2");
8826 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
8827 (GtkAttachOptions) (GTK_FILL),
8828 (GtkAttachOptions) (0), 0, 0);
8830 button3 = gtk_button_new_with_label ("button3");
8831 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
8832 (GtkAttachOptions) (GTK_FILL),
8833 (GtkAttachOptions) (0), 0, 0);
8835 button4 = gtk_button_new_with_label ("button4");
8836 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
8837 (GtkAttachOptions) (GTK_FILL),
8838 (GtkAttachOptions) (0), 0, 0);
8844 paned_keyboard_window2 (GtkWidget *widget)
8849 GtkWidget *button13;
8853 GtkWidget *button12;
8855 GtkWidget *button11;
8856 GtkWidget *button10;
8858 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8859 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
8861 gtk_window_set_screen (GTK_WINDOW (window2),
8862 gtk_widget_get_screen (widget));
8864 hpaned2 = gtk_hpaned_new ();
8865 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
8867 frame6 = gtk_frame_new (NULL);
8868 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
8869 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
8871 button13 = gtk_button_new_with_label ("button13");
8872 gtk_container_add (GTK_CONTAINER (frame6), button13);
8874 hbox2 = gtk_hbox_new (FALSE, 0);
8875 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
8877 vpaned2 = gtk_vpaned_new ();
8878 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
8880 frame7 = gtk_frame_new (NULL);
8881 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
8882 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
8884 button12 = gtk_button_new_with_label ("button12");
8885 gtk_container_add (GTK_CONTAINER (frame7), button12);
8887 frame8 = gtk_frame_new (NULL);
8888 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
8889 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
8891 button11 = gtk_button_new_with_label ("button11");
8892 gtk_container_add (GTK_CONTAINER (frame8), button11);
8894 button10 = gtk_button_new_with_label ("button10");
8895 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
8901 paned_keyboard_window3 (GtkWidget *widget)
8908 GtkWidget *button14;
8911 GtkWidget *button15;
8914 GtkWidget *button16;
8916 GtkWidget *button17;
8918 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8919 g_object_set_data (G_OBJECT (window3), "window3", window3);
8920 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
8922 gtk_window_set_screen (GTK_WINDOW (window3),
8923 gtk_widget_get_screen (widget));
8926 vbox2 = gtk_vbox_new (FALSE, 0);
8927 gtk_container_add (GTK_CONTAINER (window3), vbox2);
8929 label1 = gtk_label_new ("Three panes nested inside each other");
8930 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
8932 hpaned3 = gtk_hpaned_new ();
8933 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
8935 frame9 = gtk_frame_new (NULL);
8936 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
8937 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
8939 button14 = gtk_button_new_with_label ("button14");
8940 gtk_container_add (GTK_CONTAINER (frame9), button14);
8942 hpaned4 = gtk_hpaned_new ();
8943 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
8945 frame10 = gtk_frame_new (NULL);
8946 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
8947 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
8949 button15 = gtk_button_new_with_label ("button15");
8950 gtk_container_add (GTK_CONTAINER (frame10), button15);
8952 hpaned5 = gtk_hpaned_new ();
8953 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
8955 frame11 = gtk_frame_new (NULL);
8956 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
8957 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
8959 button16 = gtk_button_new_with_label ("button16");
8960 gtk_container_add (GTK_CONTAINER (frame11), button16);
8962 frame12 = gtk_frame_new (NULL);
8963 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
8964 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
8966 button17 = gtk_button_new_with_label ("button17");
8967 gtk_container_add (GTK_CONTAINER (frame12), button17);
8973 paned_keyboard_window4 (GtkWidget *widget)
8980 GtkWidget *button19;
8981 GtkWidget *button18;
8984 GtkWidget *button21;
8985 GtkWidget *button20;
8987 GtkWidget *button23;
8988 GtkWidget *button22;
8990 GtkWidget *button25;
8991 GtkWidget *button24;
8993 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8994 g_object_set_data (G_OBJECT (window4), "window4", window4);
8995 gtk_window_set_title (GTK_WINDOW (window4), "window4");
8997 gtk_window_set_screen (GTK_WINDOW (window4),
8998 gtk_widget_get_screen (widget));
9000 vbox3 = gtk_vbox_new (FALSE, 0);
9001 gtk_container_add (GTK_CONTAINER (window4), vbox3);
9003 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
9004 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
9005 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
9007 hpaned6 = gtk_hpaned_new ();
9008 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
9010 vpaned3 = gtk_vpaned_new ();
9011 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
9013 button19 = gtk_button_new_with_label ("button19");
9014 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
9016 button18 = gtk_button_new_with_label ("button18");
9017 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
9019 hbox3 = gtk_hbox_new (FALSE, 0);
9020 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
9022 vpaned4 = gtk_vpaned_new ();
9023 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
9025 button21 = gtk_button_new_with_label ("button21");
9026 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
9028 button20 = gtk_button_new_with_label ("button20");
9029 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
9031 vpaned5 = gtk_vpaned_new ();
9032 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
9034 button23 = gtk_button_new_with_label ("button23");
9035 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
9037 button22 = gtk_button_new_with_label ("button22");
9038 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
9040 vpaned6 = gtk_vpaned_new ();
9041 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
9043 button25 = gtk_button_new_with_label ("button25");
9044 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
9046 button24 = gtk_button_new_with_label ("button24");
9047 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
9053 create_paned_keyboard_navigation (GtkWidget *widget)
9055 static GtkWidget *window1 = NULL;
9056 static GtkWidget *window2 = NULL;
9057 static GtkWidget *window3 = NULL;
9058 static GtkWidget *window4 = NULL;
9061 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
9063 gtk_widget_destroy (window1);
9064 gtk_widget_destroy (window2);
9065 gtk_widget_destroy (window3);
9066 gtk_widget_destroy (window4);
9071 window1 = paned_keyboard_window1 (widget);
9072 g_signal_connect (window1, "destroy",
9073 G_CALLBACK (gtk_widget_destroyed),
9079 window2 = paned_keyboard_window2 (widget);
9080 g_signal_connect (window2, "destroy",
9081 G_CALLBACK (gtk_widget_destroyed),
9087 window3 = paned_keyboard_window3 (widget);
9088 g_signal_connect (window3, "destroy",
9089 G_CALLBACK (gtk_widget_destroyed),
9095 window4 = paned_keyboard_window4 (widget);
9096 g_signal_connect (window4, "destroy",
9097 G_CALLBACK (gtk_widget_destroyed),
9101 if (GTK_WIDGET_VISIBLE (window1))
9102 gtk_widget_destroy (GTK_WIDGET (window1));
9104 gtk_widget_show_all (GTK_WIDGET (window1));
9106 if (GTK_WIDGET_VISIBLE (window2))
9107 gtk_widget_destroy (GTK_WIDGET (window2));
9109 gtk_widget_show_all (GTK_WIDGET (window2));
9111 if (GTK_WIDGET_VISIBLE (window3))
9112 gtk_widget_destroy (GTK_WIDGET (window3));
9114 gtk_widget_show_all (GTK_WIDGET (window3));
9116 if (GTK_WIDGET_VISIBLE (window4))
9117 gtk_widget_destroy (GTK_WIDGET (window4));
9119 gtk_widget_show_all (GTK_WIDGET (window4));
9127 typedef struct _cursoroffset {gint x,y;} CursorOffset;
9130 shape_pressed (GtkWidget *widget, GdkEventButton *event)
9134 /* ignore double and triple click */
9135 if (event->type != GDK_BUTTON_PRESS)
9138 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9139 p->x = (int) event->x;
9140 p->y = (int) event->y;
9142 gtk_grab_add (widget);
9143 gdk_pointer_grab (widget->window, TRUE,
9144 GDK_BUTTON_RELEASE_MASK |
9145 GDK_BUTTON_MOTION_MASK |
9146 GDK_POINTER_MOTION_HINT_MASK,
9151 shape_released (GtkWidget *widget)
9153 gtk_grab_remove (widget);
9154 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9159 shape_motion (GtkWidget *widget,
9160 GdkEventMotion *event)
9164 GdkModifierType mask;
9166 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9169 * Can't use event->x / event->y here
9170 * because I need absolute coordinates.
9172 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
9173 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
9177 shape_create_icon (GdkScreen *screen,
9188 CursorOffset* icon_pos;
9190 GdkBitmap *gdk_pixmap_mask;
9191 GdkPixmap *gdk_pixmap;
9194 style = gtk_widget_get_default_style ();
9195 gc = style->black_gc;
9198 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
9200 window = gtk_window_new (window_type);
9201 gtk_window_set_screen (GTK_WINDOW (window), screen);
9203 fixed = gtk_fixed_new ();
9204 gtk_widget_set_size_request (fixed, 100, 100);
9205 gtk_container_add (GTK_CONTAINER (window), fixed);
9206 gtk_widget_show (fixed);
9208 gtk_widget_set_events (window,
9209 gtk_widget_get_events (window) |
9210 GDK_BUTTON_MOTION_MASK |
9211 GDK_POINTER_MOTION_HINT_MASK |
9212 GDK_BUTTON_PRESS_MASK);
9214 gtk_widget_realize (window);
9215 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
9216 &style->bg[GTK_STATE_NORMAL],
9219 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
9220 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
9221 gtk_widget_show (pixmap);
9223 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
9225 g_object_unref (gdk_pixmap_mask);
9226 g_object_unref (gdk_pixmap);
9228 g_signal_connect (window, "button_press_event",
9229 G_CALLBACK (shape_pressed), NULL);
9230 g_signal_connect (window, "button_release_event",
9231 G_CALLBACK (shape_released), NULL);
9232 g_signal_connect (window, "motion_notify_event",
9233 G_CALLBACK (shape_motion), NULL);
9235 icon_pos = g_new (CursorOffset, 1);
9236 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
9238 gtk_widget_set_uposition (window, x, y);
9239 gtk_widget_show (window);
9245 create_shapes (GtkWidget *widget)
9247 /* Variables used by the Drag/Drop and Shape Window demos */
9248 static GtkWidget *modeller = NULL;
9249 static GtkWidget *sheets = NULL;
9250 static GtkWidget *rings = NULL;
9251 static GtkWidget *with_region = NULL;
9252 GdkScreen *screen = gtk_widget_get_screen (widget);
9254 if (!(file_exists ("Modeller.xpm") &&
9255 file_exists ("FilesQueue.xpm") &&
9256 file_exists ("3DRings.xpm")))
9262 modeller = shape_create_icon (screen, "Modeller.xpm",
9263 440, 140, 0,0, GTK_WINDOW_POPUP);
9265 g_signal_connect (modeller, "destroy",
9266 G_CALLBACK (gtk_widget_destroyed),
9270 gtk_widget_destroy (modeller);
9274 sheets = shape_create_icon (screen, "FilesQueue.xpm",
9275 580, 170, 0,0, GTK_WINDOW_POPUP);
9277 g_signal_connect (sheets, "destroy",
9278 G_CALLBACK (gtk_widget_destroyed),
9283 gtk_widget_destroy (sheets);
9287 rings = shape_create_icon (screen, "3DRings.xpm",
9288 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9290 g_signal_connect (rings, "destroy",
9291 G_CALLBACK (gtk_widget_destroyed),
9295 gtk_widget_destroy (rings);
9302 with_region = shape_create_icon (screen, "3DRings.xpm",
9303 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9305 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
9307 g_signal_connect (with_region, "destroy",
9308 G_CALLBACK (gtk_widget_destroyed),
9311 /* reset shape from mask to a region */
9314 region = gdk_region_new ();
9326 gdk_region_union_with_rect (region, &rect);
9334 gdk_window_shape_combine_region (with_region->window,
9339 gtk_widget_destroy (with_region);
9347 create_wmhints (GtkWidget *widget)
9349 static GtkWidget *window = NULL;
9351 GtkWidget *separator;
9360 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9362 gtk_window_set_screen (GTK_WINDOW (window),
9363 gtk_widget_get_screen (widget));
9365 g_signal_connect (window, "destroy",
9366 G_CALLBACK (gtk_widget_destroyed),
9369 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
9370 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9372 gtk_widget_realize (window);
9374 circles = gdk_bitmap_create_from_data (window->window,
9378 gdk_window_set_icon (window->window, NULL,
9381 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
9383 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
9384 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
9386 box1 = gtk_vbox_new (FALSE, 0);
9387 gtk_container_add (GTK_CONTAINER (window), box1);
9388 gtk_widget_show (box1);
9390 label = gtk_label_new ("Try iconizing me!");
9391 gtk_widget_set_size_request (label, 150, 50);
9392 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
9393 gtk_widget_show (label);
9396 separator = gtk_hseparator_new ();
9397 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9398 gtk_widget_show (separator);
9401 box2 = gtk_vbox_new (FALSE, 10);
9402 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9403 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9404 gtk_widget_show (box2);
9407 button = gtk_button_new_with_label ("close");
9409 g_signal_connect_swapped (button, "clicked",
9410 G_CALLBACK (gtk_widget_destroy),
9413 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9414 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9415 gtk_widget_grab_default (button);
9416 gtk_widget_show (button);
9419 if (!GTK_WIDGET_VISIBLE (window))
9420 gtk_widget_show (window);
9422 gtk_widget_destroy (window);
9427 * Window state tracking
9431 window_state_callback (GtkWidget *widget,
9432 GdkEventWindowState *event,
9435 GtkWidget *label = data;
9438 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
9439 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
9440 "withdrawn" : "not withdrawn", ", ",
9441 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
9442 "iconified" : "not iconified", ", ",
9443 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
9444 "sticky" : "not sticky", ", ",
9445 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
9446 "maximized" : "not maximized", ", ",
9447 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
9448 "fullscreen" : "not fullscreen",
9451 gtk_label_set_text (GTK_LABEL (label), msg);
9459 tracking_label (GtkWidget *window)
9465 hbox = gtk_hbox_new (FALSE, 5);
9467 g_signal_connect_object (hbox,
9469 G_CALLBACK (gtk_widget_destroy),
9473 label = gtk_label_new ("<no window state events received>");
9474 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
9475 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
9477 g_signal_connect (window,
9478 "window_state_event",
9479 G_CALLBACK (window_state_callback),
9482 button = gtk_button_new_with_label ("Deiconify");
9483 g_signal_connect_object (button,
9485 G_CALLBACK (gtk_window_deiconify),
9488 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9490 button = gtk_button_new_with_label ("Iconify");
9491 g_signal_connect_object (button,
9493 G_CALLBACK (gtk_window_iconify),
9496 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9498 button = gtk_button_new_with_label ("Fullscreen");
9499 g_signal_connect_object (button,
9501 G_CALLBACK (gtk_window_fullscreen),
9504 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9506 button = gtk_button_new_with_label ("Unfullscreen");
9507 g_signal_connect_object (button,
9509 G_CALLBACK (gtk_window_unfullscreen),
9512 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9514 button = gtk_button_new_with_label ("Present");
9515 g_signal_connect_object (button,
9517 G_CALLBACK (gtk_window_present),
9520 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9522 button = gtk_button_new_with_label ("Show");
9523 g_signal_connect_object (button,
9525 G_CALLBACK (gtk_widget_show),
9528 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9530 gtk_widget_show_all (hbox);
9536 get_state_controls (GtkWidget *window)
9541 vbox = gtk_vbox_new (FALSE, 0);
9543 button = gtk_button_new_with_label ("Stick");
9544 g_signal_connect_object (button,
9546 G_CALLBACK (gtk_window_stick),
9549 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9551 button = gtk_button_new_with_label ("Unstick");
9552 g_signal_connect_object (button,
9554 G_CALLBACK (gtk_window_unstick),
9557 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9559 button = gtk_button_new_with_label ("Maximize");
9560 g_signal_connect_object (button,
9562 G_CALLBACK (gtk_window_maximize),
9565 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9567 button = gtk_button_new_with_label ("Unmaximize");
9568 g_signal_connect_object (button,
9570 G_CALLBACK (gtk_window_unmaximize),
9573 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9575 button = gtk_button_new_with_label ("Iconify");
9576 g_signal_connect_object (button,
9578 G_CALLBACK (gtk_window_iconify),
9581 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9583 button = gtk_button_new_with_label ("Fullscreen");
9584 g_signal_connect_object (button,
9586 G_CALLBACK (gtk_window_fullscreen),
9589 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9591 button = gtk_button_new_with_label ("Unfullscreen");
9592 g_signal_connect_object (button,
9594 G_CALLBACK (gtk_window_unfullscreen),
9597 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9599 button = gtk_button_new_with_label ("Hide (withdraw)");
9600 g_signal_connect_object (button,
9602 G_CALLBACK (gtk_widget_hide),
9605 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9607 gtk_widget_show_all (vbox);
9613 create_window_states (GtkWidget *widget)
9615 static GtkWidget *window = NULL;
9618 GtkWidget *iconified;
9620 GtkWidget *controls;
9624 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9625 gtk_window_set_screen (GTK_WINDOW (window),
9626 gtk_widget_get_screen (widget));
9628 g_signal_connect (window, "destroy",
9629 G_CALLBACK (gtk_widget_destroyed),
9632 gtk_window_set_title (GTK_WINDOW (window), "Window states");
9634 box1 = gtk_vbox_new (FALSE, 0);
9635 gtk_container_add (GTK_CONTAINER (window), box1);
9637 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9639 gtk_window_set_screen (GTK_WINDOW (iconified),
9640 gtk_widget_get_screen (widget));
9642 g_signal_connect_object (iconified, "destroy",
9643 G_CALLBACK (gtk_widget_destroy),
9646 gtk_window_iconify (GTK_WINDOW (iconified));
9647 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
9648 controls = get_state_controls (iconified);
9649 gtk_container_add (GTK_CONTAINER (iconified), controls);
9651 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9653 gtk_window_set_screen (GTK_WINDOW (normal),
9654 gtk_widget_get_screen (widget));
9656 g_signal_connect_object (normal, "destroy",
9657 G_CALLBACK (gtk_widget_destroy),
9661 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
9662 controls = get_state_controls (normal);
9663 gtk_container_add (GTK_CONTAINER (normal), controls);
9665 label = tracking_label (iconified);
9666 gtk_container_add (GTK_CONTAINER (box1), label);
9668 label = tracking_label (normal);
9669 gtk_container_add (GTK_CONTAINER (box1), label);
9671 gtk_widget_show_all (iconified);
9672 gtk_widget_show_all (normal);
9673 gtk_widget_show_all (box1);
9676 if (!GTK_WIDGET_VISIBLE (window))
9677 gtk_widget_show (window);
9679 gtk_widget_destroy (window);
9687 configure_event_callback (GtkWidget *widget,
9688 GdkEventConfigure *event,
9691 GtkWidget *label = data;
9695 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
9697 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
9699 event->x, event->y, event->width, event->height,
9702 gtk_label_set_text (GTK_LABEL (label), msg);
9710 get_ints (GtkWidget *window,
9717 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
9718 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
9720 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
9721 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
9725 set_size_callback (GtkWidget *widget,
9730 get_ints (data, &w, &h);
9732 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
9736 unset_default_size_callback (GtkWidget *widget,
9739 gtk_window_set_default_size (g_object_get_data (data, "target"),
9744 set_default_size_callback (GtkWidget *widget,
9749 get_ints (data, &w, &h);
9751 gtk_window_set_default_size (g_object_get_data (data, "target"),
9756 unset_size_request_callback (GtkWidget *widget,
9759 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9764 set_size_request_callback (GtkWidget *widget,
9769 get_ints (data, &w, &h);
9771 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9776 set_location_callback (GtkWidget *widget,
9781 get_ints (data, &x, &y);
9783 gtk_window_move (g_object_get_data (data, "target"), x, y);
9787 move_to_position_callback (GtkWidget *widget,
9793 window = g_object_get_data (data, "target");
9795 gtk_window_get_position (window, &x, &y);
9797 gtk_window_move (window, x, y);
9801 set_geometry_callback (GtkWidget *entry,
9807 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
9809 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
9811 if (!gtk_window_parse_geometry (target, text))
9812 g_print ("Bad geometry string '%s'\n", text);
9818 allow_shrink_callback (GtkWidget *widget,
9821 g_object_set (g_object_get_data (data, "target"),
9823 GTK_TOGGLE_BUTTON (widget)->active,
9828 allow_grow_callback (GtkWidget *widget,
9831 g_object_set (g_object_get_data (data, "target"),
9833 GTK_TOGGLE_BUTTON (widget)->active,
9838 gravity_selected (GtkWidget *widget,
9841 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
9842 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
9846 pos_selected (GtkWidget *widget,
9849 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
9850 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
9854 move_gravity_window_to_current_position (GtkWidget *widget,
9860 window = GTK_WINDOW (data);
9862 gtk_window_get_position (window, &x, &y);
9864 gtk_window_move (window, x, y);
9868 get_screen_corner (GtkWindow *window,
9873 GdkScreen * screen = gtk_window_get_screen (window);
9875 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
9877 switch (gtk_window_get_gravity (window))
9879 case GDK_GRAVITY_SOUTH_EAST:
9880 *x = gdk_screen_get_width (screen) - w;
9881 *y = gdk_screen_get_height (screen) - h;
9884 case GDK_GRAVITY_NORTH_EAST:
9885 *x = gdk_screen_get_width (screen) - w;
9889 case GDK_GRAVITY_SOUTH_WEST:
9891 *y = gdk_screen_get_height (screen) - h;
9894 case GDK_GRAVITY_NORTH_WEST:
9899 case GDK_GRAVITY_SOUTH:
9900 *x = (gdk_screen_get_width (screen) - w) / 2;
9901 *y = gdk_screen_get_height (screen) - h;
9904 case GDK_GRAVITY_NORTH:
9905 *x = (gdk_screen_get_width (screen) - w) / 2;
9909 case GDK_GRAVITY_WEST:
9911 *y = (gdk_screen_get_height (screen) - h) / 2;
9914 case GDK_GRAVITY_EAST:
9915 *x = gdk_screen_get_width (screen) - w;
9916 *y = (gdk_screen_get_height (screen) - h) / 2;
9919 case GDK_GRAVITY_CENTER:
9920 *x = (gdk_screen_get_width (screen) - w) / 2;
9921 *y = (gdk_screen_get_height (screen) - h) / 2;
9924 case GDK_GRAVITY_STATIC:
9925 /* pick some random numbers */
9931 g_assert_not_reached ();
9937 move_gravity_window_to_starting_position (GtkWidget *widget,
9943 window = GTK_WINDOW (data);
9945 get_screen_corner (window,
9948 gtk_window_move (window, x, y);
9952 make_gravity_window (GtkWidget *destroy_with,
9961 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9963 gtk_window_set_screen (GTK_WINDOW (window),
9964 gtk_widget_get_screen (destroy_with));
9966 vbox = gtk_vbox_new (FALSE, 0);
9967 gtk_widget_show (vbox);
9969 gtk_container_add (GTK_CONTAINER (window), vbox);
9970 gtk_window_set_title (GTK_WINDOW (window), title);
9971 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
9973 g_signal_connect_object (destroy_with,
9975 G_CALLBACK (gtk_widget_destroy),
9980 button = gtk_button_new_with_mnemonic ("_Move to current position");
9982 g_signal_connect (button, "clicked",
9983 G_CALLBACK (move_gravity_window_to_current_position),
9986 gtk_container_add (GTK_CONTAINER (vbox), button);
9987 gtk_widget_show (button);
9989 button = gtk_button_new_with_mnemonic ("Move to _starting position");
9991 g_signal_connect (button, "clicked",
9992 G_CALLBACK (move_gravity_window_to_starting_position),
9995 gtk_container_add (GTK_CONTAINER (vbox), button);
9996 gtk_widget_show (button);
9998 /* Pretend this is the result of --geometry.
9999 * DO NOT COPY THIS CODE unless you are setting --geometry results,
10000 * and in that case you probably should just use gtk_window_parse_geometry().
10001 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
10002 * you are parsing --geometry or equivalent.
10004 gtk_window_set_geometry_hints (GTK_WINDOW (window),
10006 GDK_HINT_USER_POS);
10008 gtk_window_set_default_size (GTK_WINDOW (window),
10011 get_screen_corner (GTK_WINDOW (window), &x, &y);
10013 gtk_window_move (GTK_WINDOW (window),
10020 do_gravity_test (GtkWidget *widget,
10023 GtkWidget *destroy_with = data;
10026 /* We put a window at each gravity point on the screen. */
10027 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
10029 gtk_widget_show (window);
10031 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
10033 gtk_widget_show (window);
10035 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
10037 gtk_widget_show (window);
10039 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
10041 gtk_widget_show (window);
10043 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
10045 gtk_widget_show (window);
10047 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
10049 gtk_widget_show (window);
10052 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
10054 gtk_widget_show (window);
10057 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
10059 gtk_widget_show (window);
10061 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
10063 gtk_widget_show (window);
10065 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
10067 gtk_widget_show (window);
10071 window_controls (GtkWidget *window)
10073 GtkWidget *control_window;
10078 GtkAdjustment *adj;
10084 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10086 gtk_window_set_screen (GTK_WINDOW (control_window),
10087 gtk_widget_get_screen (window));
10089 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
10091 g_object_set_data (G_OBJECT (control_window),
10095 g_signal_connect_object (control_window,
10097 G_CALLBACK (gtk_widget_destroy),
10099 G_CONNECT_SWAPPED);
10101 vbox = gtk_vbox_new (FALSE, 5);
10103 gtk_container_add (GTK_CONTAINER (control_window), vbox);
10105 label = gtk_label_new ("<no configure events>");
10106 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10108 g_signal_connect (window,
10110 G_CALLBACK (configure_event_callback),
10113 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10115 spin = gtk_spin_button_new (adj, 0, 0);
10117 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10119 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
10121 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10123 spin = gtk_spin_button_new (adj, 0, 0);
10125 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10127 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
10129 entry = gtk_entry_new ();
10130 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10132 g_signal_connect (entry, "changed",
10133 G_CALLBACK (set_geometry_callback),
10136 button = gtk_button_new_with_label ("Show gravity test windows");
10137 g_signal_connect_swapped (button,
10139 G_CALLBACK (do_gravity_test),
10141 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10143 button = gtk_button_new_with_label ("Reshow with initial size");
10144 g_signal_connect_object (button,
10146 G_CALLBACK (gtk_window_reshow_with_initial_size),
10148 G_CONNECT_SWAPPED);
10149 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10151 button = gtk_button_new_with_label ("Queue resize");
10152 g_signal_connect_object (button,
10154 G_CALLBACK (gtk_widget_queue_resize),
10156 G_CONNECT_SWAPPED);
10157 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10159 button = gtk_button_new_with_label ("Resize");
10160 g_signal_connect (button,
10162 G_CALLBACK (set_size_callback),
10164 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10166 button = gtk_button_new_with_label ("Set default size");
10167 g_signal_connect (button,
10169 G_CALLBACK (set_default_size_callback),
10171 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10173 button = gtk_button_new_with_label ("Unset default size");
10174 g_signal_connect (button,
10176 G_CALLBACK (unset_default_size_callback),
10178 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10180 button = gtk_button_new_with_label ("Set size request");
10181 g_signal_connect (button,
10183 G_CALLBACK (set_size_request_callback),
10185 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10187 button = gtk_button_new_with_label ("Unset size request");
10188 g_signal_connect (button,
10190 G_CALLBACK (unset_size_request_callback),
10192 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10194 button = gtk_button_new_with_label ("Move");
10195 g_signal_connect (button,
10197 G_CALLBACK (set_location_callback),
10199 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10201 button = gtk_button_new_with_label ("Move to current position");
10202 g_signal_connect (button,
10204 G_CALLBACK (move_to_position_callback),
10206 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10208 button = gtk_check_button_new_with_label ("Allow shrink");
10209 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10210 g_signal_connect (button,
10212 G_CALLBACK (allow_shrink_callback),
10214 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10216 button = gtk_check_button_new_with_label ("Allow grow");
10217 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
10218 g_signal_connect (button,
10220 G_CALLBACK (allow_grow_callback),
10222 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10224 button = gtk_button_new_with_mnemonic ("_Show");
10225 g_signal_connect_object (button,
10227 G_CALLBACK (gtk_widget_show),
10229 G_CONNECT_SWAPPED);
10230 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10232 button = gtk_button_new_with_mnemonic ("_Hide");
10233 g_signal_connect_object (button,
10235 G_CALLBACK (gtk_widget_hide),
10237 G_CONNECT_SWAPPED);
10238 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10240 menu = gtk_menu_new ();
10246 static gchar *names[] = {
10247 "GDK_GRAVITY_NORTH_WEST",
10248 "GDK_GRAVITY_NORTH",
10249 "GDK_GRAVITY_NORTH_EAST",
10250 "GDK_GRAVITY_WEST",
10251 "GDK_GRAVITY_CENTER",
10252 "GDK_GRAVITY_EAST",
10253 "GDK_GRAVITY_SOUTH_WEST",
10254 "GDK_GRAVITY_SOUTH",
10255 "GDK_GRAVITY_SOUTH_EAST",
10256 "GDK_GRAVITY_STATIC",
10260 g_assert (names[i]);
10262 mi = gtk_menu_item_new_with_label (names[i]);
10264 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10269 gtk_widget_show_all (menu);
10271 om = gtk_option_menu_new ();
10272 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10275 g_signal_connect (om,
10277 G_CALLBACK (gravity_selected),
10280 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10283 menu = gtk_menu_new ();
10289 static gchar *names[] = {
10290 "GTK_WIN_POS_NONE",
10291 "GTK_WIN_POS_CENTER",
10292 "GTK_WIN_POS_MOUSE",
10293 "GTK_WIN_POS_CENTER_ALWAYS",
10294 "GTK_WIN_POS_CENTER_ON_PARENT",
10298 g_assert (names[i]);
10300 mi = gtk_menu_item_new_with_label (names[i]);
10302 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10307 gtk_widget_show_all (menu);
10309 om = gtk_option_menu_new ();
10310 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10313 g_signal_connect (om,
10315 G_CALLBACK (pos_selected),
10318 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10320 gtk_widget_show_all (vbox);
10322 return control_window;
10326 create_window_sizing (GtkWidget *widget)
10328 static GtkWidget *window = NULL;
10329 static GtkWidget *target_window = NULL;
10331 if (!target_window)
10335 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10336 gtk_window_set_screen (GTK_WINDOW (target_window),
10337 gtk_widget_get_screen (widget));
10338 label = gtk_label_new (NULL);
10339 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");
10340 gtk_container_add (GTK_CONTAINER (target_window), label);
10341 gtk_widget_show (label);
10343 g_signal_connect (target_window, "destroy",
10344 G_CALLBACK (gtk_widget_destroyed),
10347 window = window_controls (target_window);
10349 g_signal_connect (window, "destroy",
10350 G_CALLBACK (gtk_widget_destroyed),
10353 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
10356 /* don't show target window by default, we want to allow testing
10357 * of behavior on first show.
10360 if (!GTK_WIDGET_VISIBLE (window))
10361 gtk_widget_show (window);
10363 gtk_widget_destroy (window);
10370 typedef struct _ProgressData {
10373 GtkWidget *block_spin;
10374 GtkWidget *x_align_spin;
10375 GtkWidget *y_align_spin;
10376 GtkWidget *step_spin;
10377 GtkWidget *act_blocks_spin;
10386 progress_timeout (gpointer data)
10389 GtkAdjustment *adj;
10391 adj = GTK_PROGRESS (data)->adjustment;
10393 new_val = adj->value + 1;
10394 if (new_val > adj->upper)
10395 new_val = adj->lower;
10397 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
10403 destroy_progress (GtkWidget *widget,
10404 ProgressData **pdata)
10406 gtk_timeout_remove ((*pdata)->timer);
10407 (*pdata)->timer = 0;
10408 (*pdata)->window = NULL;
10414 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
10416 ProgressData *pdata;
10419 pdata = (ProgressData *) data;
10421 if (!GTK_WIDGET_MAPPED (widget))
10424 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10426 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
10427 (GtkProgressBarOrientation) i);
10431 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
10433 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
10434 GTK_TOGGLE_BUTTON (widget)->active);
10435 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
10436 gtk_widget_set_sensitive (pdata->x_align_spin,
10437 GTK_TOGGLE_BUTTON (widget)->active);
10438 gtk_widget_set_sensitive (pdata->y_align_spin,
10439 GTK_TOGGLE_BUTTON (widget)->active);
10443 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
10445 ProgressData *pdata;
10448 pdata = (ProgressData *) data;
10450 if (!GTK_WIDGET_MAPPED (widget))
10453 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10456 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
10458 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10460 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
10461 (GtkProgressBarStyle) i);
10465 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
10469 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
10470 sprintf (buf, "???");
10472 sprintf (buf, "%.0f%%", 100 *
10473 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
10474 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
10478 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
10480 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
10481 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10482 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
10486 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
10488 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
10489 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
10493 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
10495 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10496 gtk_spin_button_get_value_as_int
10497 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
10501 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
10503 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
10504 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
10505 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
10509 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
10511 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
10512 GTK_TOGGLE_BUTTON (widget)->active);
10513 gtk_widget_set_sensitive (pdata->step_spin,
10514 GTK_TOGGLE_BUTTON (widget)->active);
10515 gtk_widget_set_sensitive (pdata->act_blocks_spin,
10516 GTK_TOGGLE_BUTTON (widget)->active);
10520 entry_changed (GtkWidget *widget, ProgressData *pdata)
10522 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10523 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
10527 create_progress_bar (GtkWidget *widget)
10538 GtkAdjustment *adj;
10539 static ProgressData *pdata = NULL;
10541 static gchar *items1[] =
10549 static gchar *items2[] =
10556 pdata = g_new0 (ProgressData, 1);
10558 if (!pdata->window)
10560 pdata->window = gtk_dialog_new ();
10562 gtk_window_set_screen (GTK_WINDOW (pdata->window),
10563 gtk_widget_get_screen (widget));
10565 gtk_window_set_resizable (GTK_WINDOW (pdata->window), FALSE);
10567 g_signal_connect (pdata->window, "destroy",
10568 G_CALLBACK (destroy_progress),
10573 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
10574 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
10576 vbox = gtk_vbox_new (FALSE, 5);
10577 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10578 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
10579 vbox, FALSE, TRUE, 0);
10581 frame = gtk_frame_new ("Progress");
10582 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10584 vbox2 = gtk_vbox_new (FALSE, 5);
10585 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10587 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10588 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10590 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
10591 g_signal_connect (adj, "value_changed",
10592 G_CALLBACK (progress_value_changed), pdata);
10594 pdata->pbar = gtk_widget_new (GTK_TYPE_PROGRESS_BAR,
10597 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10598 "%v from [%l,%u] (=%p%%)");
10599 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
10600 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
10602 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10603 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10605 hbox = gtk_hbox_new (FALSE, 5);
10606 gtk_container_add (GTK_CONTAINER (align), hbox);
10607 label = gtk_label_new ("Label updated by user :");
10608 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10609 pdata->label = gtk_label_new ("");
10610 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
10612 frame = gtk_frame_new ("Options");
10613 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10615 vbox2 = gtk_vbox_new (FALSE, 5);
10616 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10618 tab = gtk_table_new (7, 2, FALSE);
10619 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
10621 label = gtk_label_new ("Orientation :");
10622 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
10623 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10625 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10627 pdata->omenu1 = build_option_menu (items1, 4, 0,
10628 progressbar_toggle_orientation,
10630 hbox = gtk_hbox_new (FALSE, 0);
10631 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
10632 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10634 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
10636 check = gtk_check_button_new_with_label ("Show text");
10637 g_signal_connect (check, "clicked",
10638 G_CALLBACK (toggle_show_text),
10640 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
10641 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10644 hbox = gtk_hbox_new (FALSE, 0);
10645 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
10646 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10649 label = gtk_label_new ("Format : ");
10650 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10652 pdata->entry = gtk_entry_new ();
10653 g_signal_connect (pdata->entry, "changed",
10654 G_CALLBACK (entry_changed),
10656 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
10657 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
10658 gtk_widget_set_size_request (pdata->entry, 100, -1);
10659 gtk_widget_set_sensitive (pdata->entry, FALSE);
10661 label = gtk_label_new ("Text align :");
10662 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
10663 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10665 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10667 hbox = gtk_hbox_new (FALSE, 0);
10668 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
10669 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10672 label = gtk_label_new ("x :");
10673 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10675 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10676 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
10677 g_signal_connect (adj, "value_changed",
10678 G_CALLBACK (adjust_align), pdata);
10679 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
10680 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
10682 label = gtk_label_new ("y :");
10683 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10685 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10686 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
10687 g_signal_connect (adj, "value_changed",
10688 G_CALLBACK (adjust_align), pdata);
10689 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
10690 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
10692 label = gtk_label_new ("Bar Style :");
10693 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 3, 4,
10694 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10696 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10698 pdata->omenu2 = build_option_menu (items2, 2, 0,
10699 progressbar_toggle_bar_style,
10701 hbox = gtk_hbox_new (FALSE, 0);
10702 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 3, 4,
10703 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10705 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
10707 label = gtk_label_new ("Block count :");
10708 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 4, 5,
10709 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10711 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10713 hbox = gtk_hbox_new (FALSE, 0);
10714 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 4, 5,
10715 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10717 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
10718 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
10719 g_signal_connect (adj, "value_changed",
10720 G_CALLBACK (adjust_blocks), pdata);
10721 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
10722 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10724 check = gtk_check_button_new_with_label ("Activity mode");
10725 g_signal_connect (check, "clicked",
10726 G_CALLBACK (toggle_activity_mode), pdata);
10727 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 5, 6,
10728 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10731 hbox = gtk_hbox_new (FALSE, 0);
10732 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 5, 6,
10733 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10735 label = gtk_label_new ("Step size : ");
10736 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10737 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
10738 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
10739 g_signal_connect (adj, "value_changed",
10740 G_CALLBACK (adjust_step), pdata);
10741 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
10742 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
10744 hbox = gtk_hbox_new (FALSE, 0);
10745 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 6, 7,
10746 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10748 label = gtk_label_new ("Blocks : ");
10749 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10750 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
10751 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
10752 g_signal_connect (adj, "value_changed",
10753 G_CALLBACK (adjust_act_blocks), pdata);
10754 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
10756 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
10758 button = gtk_button_new_with_label ("close");
10759 g_signal_connect_swapped (button, "clicked",
10760 G_CALLBACK (gtk_widget_destroy),
10762 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
10763 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
10764 button, TRUE, TRUE, 0);
10765 gtk_widget_grab_default (button);
10768 if (!GTK_WIDGET_VISIBLE (pdata->window))
10769 gtk_widget_show_all (pdata->window);
10771 gtk_widget_destroy (pdata->window);
10783 GtkWidget *res_widget;
10787 find_widget (GtkWidget *widget, FindWidgetData *data)
10789 GtkAllocation new_allocation;
10793 new_allocation = widget->allocation;
10795 if (data->found || !GTK_WIDGET_MAPPED (widget))
10798 /* Note that in the following code, we only count the
10799 * position as being inside a WINDOW widget if it is inside
10800 * widget->window; points that are outside of widget->window
10801 * but within the allocation are not counted. This is consistent
10802 * with the way we highlight drag targets.
10804 if (!GTK_WIDGET_NO_WINDOW (widget))
10806 new_allocation.x = 0;
10807 new_allocation.y = 0;
10810 if (widget->parent && !data->first)
10812 GdkWindow *window = widget->window;
10813 while (window != widget->parent->window)
10815 gint tx, ty, twidth, theight;
10816 gdk_drawable_get_size (window, &twidth, &theight);
10818 if (new_allocation.x < 0)
10820 new_allocation.width += new_allocation.x;
10821 new_allocation.x = 0;
10823 if (new_allocation.y < 0)
10825 new_allocation.height += new_allocation.y;
10826 new_allocation.y = 0;
10828 if (new_allocation.x + new_allocation.width > twidth)
10829 new_allocation.width = twidth - new_allocation.x;
10830 if (new_allocation.y + new_allocation.height > theight)
10831 new_allocation.height = theight - new_allocation.y;
10833 gdk_window_get_position (window, &tx, &ty);
10834 new_allocation.x += tx;
10836 new_allocation.y += ty;
10839 window = gdk_window_get_parent (window);
10843 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
10844 (data->x < new_allocation.x + new_allocation.width) &&
10845 (data->y < new_allocation.y + new_allocation.height))
10847 /* First, check if the drag is in a valid drop site in
10848 * one of our children
10850 if (GTK_IS_CONTAINER (widget))
10852 FindWidgetData new_data = *data;
10854 new_data.x -= x_offset;
10855 new_data.y -= y_offset;
10856 new_data.found = FALSE;
10857 new_data.first = FALSE;
10859 gtk_container_forall (GTK_CONTAINER (widget),
10860 (GtkCallback)find_widget,
10863 data->found = new_data.found;
10865 data->res_widget = new_data.res_widget;
10868 /* If not, and this widget is registered as a drop site, check to
10869 * emit "drag_motion" to check if we are actually in
10874 data->found = TRUE;
10875 data->res_widget = widget;
10881 find_widget_at_pointer (GdkDisplay *display)
10883 GtkWidget *widget = NULL;
10884 GdkWindow *pointer_window;
10886 FindWidgetData data;
10888 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
10890 if (pointer_window)
10891 gdk_window_get_user_data (pointer_window, (gpointer*) &widget);
10895 gdk_window_get_pointer (widget->window,
10900 data.found = FALSE;
10903 find_widget (widget, &data);
10905 return data.res_widget;
10911 struct PropertiesData {
10912 GtkWidget **window;
10919 destroy_properties (GtkWidget *widget,
10920 struct PropertiesData *data)
10924 *data->window = NULL;
10925 data->window = NULL;
10930 gdk_cursor_unref (data->cursor);
10931 data->cursor = NULL;
10936 g_signal_handler_disconnect (widget, data->handler);
10944 property_query_event (GtkWidget *widget,
10946 struct PropertiesData *data)
10948 GtkWidget *res_widget = NULL;
10950 if (!data->in_query)
10953 if (event->type == GDK_BUTTON_RELEASE)
10955 gtk_grab_remove (widget);
10956 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10959 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
10962 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
10963 gtk_widget_get_screen (widget));
10964 create_prop_editor (G_OBJECT (res_widget), 0);
10967 data->in_query = FALSE;
10974 query_properties (GtkButton *button,
10975 struct PropertiesData *data)
10979 g_signal_connect (button, "event",
10980 G_CALLBACK (property_query_event), data);
10984 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
10987 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
10989 GDK_BUTTON_RELEASE_MASK,
10994 gtk_grab_add (GTK_WIDGET (button));
10996 data->in_query = TRUE;
11000 create_properties (GtkWidget *widget)
11002 static GtkWidget *window = NULL;
11006 struct PropertiesData *data;
11008 data = g_new (struct PropertiesData, 1);
11009 data->window = &window;
11010 data->in_query = FALSE;
11011 data->cursor = NULL;
11016 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11018 gtk_window_set_screen (GTK_WINDOW (window),
11019 gtk_widget_get_screen (widget));
11021 data->handler = g_signal_connect (window, "destroy",
11022 G_CALLBACK (destroy_properties),
11025 gtk_window_set_title (GTK_WINDOW (window), "test properties");
11026 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11028 vbox = gtk_vbox_new (FALSE, 1);
11029 gtk_container_add (GTK_CONTAINER (window), vbox);
11031 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
11032 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
11034 button = gtk_button_new_with_label ("Query properties");
11035 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
11036 g_signal_connect (button, "clicked",
11037 G_CALLBACK (query_properties),
11041 if (!GTK_WIDGET_VISIBLE (window))
11042 gtk_widget_show_all (window);
11044 gtk_widget_destroy (window);
11053 static int color_idle = 0;
11056 color_idle_func (GtkWidget *preview)
11058 static int count = 1;
11062 for (i = 0; i < 256; i++)
11064 for (j = 0, k = 0; j < 256; j++)
11066 buf[k+0] = i + count;
11068 buf[k+2] = j + count;
11072 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11077 gtk_widget_queue_draw (preview);
11078 gdk_window_process_updates (preview->window, TRUE);
11084 color_preview_destroy (GtkWidget *widget,
11085 GtkWidget **window)
11087 gtk_idle_remove (color_idle);
11094 create_color_preview (GtkWidget *widget)
11096 static GtkWidget *window = NULL;
11097 GtkWidget *preview;
11103 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11105 gtk_window_set_screen (GTK_WINDOW (window),
11106 gtk_widget_get_screen (widget));
11108 g_signal_connect (window, "destroy",
11109 G_CALLBACK (color_preview_destroy),
11112 gtk_window_set_title (GTK_WINDOW (window), "test");
11113 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11115 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
11116 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11117 gtk_container_add (GTK_CONTAINER (window), preview);
11119 for (i = 0; i < 256; i++)
11121 for (j = 0, k = 0; j < 256; j++)
11129 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11132 color_idle = gtk_idle_add ((GtkFunction) color_idle_func, preview);
11135 if (!GTK_WIDGET_VISIBLE (window))
11136 gtk_widget_show_all (window);
11138 gtk_widget_destroy (window);
11145 static int gray_idle = 0;
11148 gray_idle_func (GtkWidget *preview)
11150 static int count = 1;
11154 for (i = 0; i < 256; i++)
11156 for (j = 0; j < 256; j++)
11157 buf[j] = i + j + count;
11159 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11164 gtk_widget_draw (preview, NULL);
11170 gray_preview_destroy (GtkWidget *widget,
11171 GtkWidget **window)
11173 gtk_idle_remove (gray_idle);
11180 create_gray_preview (GtkWidget *widget)
11182 static GtkWidget *window = NULL;
11183 GtkWidget *preview;
11189 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11191 gtk_window_set_screen (GTK_WINDOW (window),
11192 gtk_widget_get_screen (widget));
11194 g_signal_connect (window, "destroy",
11195 G_CALLBACK (gray_preview_destroy),
11198 gtk_window_set_title (GTK_WINDOW (window), "test");
11199 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11201 preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
11202 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11203 gtk_container_add (GTK_CONTAINER (window), preview);
11205 for (i = 0; i < 256; i++)
11207 for (j = 0; j < 256; j++)
11210 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11213 gray_idle = gtk_idle_add ((GtkFunction) gray_idle_func, preview);
11216 if (!GTK_WIDGET_VISIBLE (window))
11217 gtk_widget_show_all (window);
11219 gtk_widget_destroy (window);
11228 selection_test_received (GtkWidget *list, GtkSelectionData *data)
11231 GtkWidget *list_item;
11235 if (data->length < 0)
11237 g_print ("Selection retrieval failed\n");
11240 if (data->type != GDK_SELECTION_TYPE_ATOM)
11242 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
11246 /* Clear out any current list items */
11248 gtk_list_clear_items (GTK_LIST(list), 0, -1);
11250 /* Add new items to list */
11252 atoms = (GdkAtom *)data->data;
11255 l = data->length / sizeof (GdkAtom);
11256 for (i = 0; i < l; i++)
11259 name = gdk_atom_name (atoms[i]);
11262 list_item = gtk_list_item_new_with_label (name);
11266 list_item = gtk_list_item_new_with_label ("(bad atom)");
11268 gtk_widget_show (list_item);
11269 item_list = g_list_append (item_list, list_item);
11272 gtk_list_append_items (GTK_LIST (list), item_list);
11278 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
11280 static GdkAtom targets_atom = GDK_NONE;
11282 if (targets_atom == GDK_NONE)
11283 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
11285 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
11290 create_selection_test (GtkWidget *widget)
11292 static GtkWidget *window = NULL;
11295 GtkWidget *scrolled_win;
11301 window = gtk_dialog_new ();
11303 gtk_window_set_screen (GTK_WINDOW (window),
11304 gtk_widget_get_screen (widget));
11306 g_signal_connect (window, "destroy",
11307 G_CALLBACK (gtk_widget_destroyed),
11310 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
11311 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11313 /* Create the list */
11315 vbox = gtk_vbox_new (FALSE, 5);
11316 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11317 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
11320 label = gtk_label_new ("Gets available targets for current selection");
11321 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11323 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
11324 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
11325 GTK_POLICY_AUTOMATIC,
11326 GTK_POLICY_AUTOMATIC);
11327 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
11328 gtk_widget_set_size_request (scrolled_win, 100, 200);
11330 list = gtk_list_new ();
11331 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
11333 g_signal_connect (list, "selection_received",
11334 G_CALLBACK (selection_test_received), NULL);
11336 /* .. And create some buttons */
11337 button = gtk_button_new_with_label ("Get Targets");
11338 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11339 button, TRUE, TRUE, 0);
11341 g_signal_connect (button, "clicked",
11342 G_CALLBACK (selection_test_get_targets), list);
11344 button = gtk_button_new_with_label ("Quit");
11345 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11346 button, TRUE, TRUE, 0);
11348 g_signal_connect_swapped (button, "clicked",
11349 G_CALLBACK (gtk_widget_destroy),
11353 if (!GTK_WIDGET_VISIBLE (window))
11354 gtk_widget_show_all (window);
11356 gtk_widget_destroy (window);
11364 create_gamma_curve (GtkWidget *widget)
11366 static GtkWidget *window = NULL, *curve;
11367 static int count = 0;
11374 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11375 gtk_window_set_screen (GTK_WINDOW (window),
11376 gtk_widget_get_screen (widget));
11378 gtk_window_set_title (GTK_WINDOW (window), "test");
11379 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11381 g_signal_connect (window, "destroy",
11382 G_CALLBACK(gtk_widget_destroyed),
11385 curve = gtk_gamma_curve_new ();
11386 gtk_container_add (GTK_CONTAINER (window), curve);
11387 gtk_widget_show (curve);
11390 max = 127 + (count % 2)*128;
11391 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11393 for (i = 0; i < max; ++i)
11394 vec[i] = (127 / sqrt (max)) * sqrt (i);
11395 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11398 if (!GTK_WIDGET_VISIBLE (window))
11399 gtk_widget_show (window);
11400 else if (count % 4 == 3)
11402 gtk_widget_destroy (window);
11413 static int scroll_test_pos = 0.0;
11416 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
11417 GtkAdjustment *adj)
11420 gint imin, imax, jmin, jmax;
11422 imin = (event->area.x) / 10;
11423 imax = (event->area.x + event->area.width + 9) / 10;
11425 jmin = ((int)adj->value + event->area.y) / 10;
11426 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
11428 gdk_window_clear_area (widget->window,
11429 event->area.x, event->area.y,
11430 event->area.width, event->area.height);
11432 for (i=imin; i<imax; i++)
11433 for (j=jmin; j<jmax; j++)
11435 gdk_draw_rectangle (widget->window,
11436 widget->style->black_gc,
11438 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
11444 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
11445 GtkAdjustment *adj)
11447 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
11448 -adj->page_increment / 2:
11449 adj->page_increment / 2);
11450 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
11451 gtk_adjustment_set_value (adj, new_value);
11457 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
11458 GtkAdjustment *adj)
11460 adj->page_increment = 0.9 * widget->allocation.height;
11461 adj->page_size = widget->allocation.height;
11463 g_signal_emit_by_name (adj, "changed");
11467 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
11469 /* gint source_min = (int)adj->value - scroll_test_pos; */
11472 dy = scroll_test_pos - (int)adj->value;
11473 scroll_test_pos = adj->value;
11475 if (!GTK_WIDGET_DRAWABLE (widget))
11477 gdk_window_scroll (widget->window, 0, dy);
11478 gdk_window_process_updates (widget->window, FALSE);
11483 create_scroll_test (GtkWidget *widget)
11485 static GtkWidget *window = NULL;
11487 GtkWidget *drawing_area;
11488 GtkWidget *scrollbar;
11490 GtkAdjustment *adj;
11491 GdkGeometry geometry;
11492 GdkWindowHints geometry_mask;
11496 window = gtk_dialog_new ();
11498 gtk_window_set_screen (GTK_WINDOW (window),
11499 gtk_widget_get_screen (widget));
11501 g_signal_connect (window, "destroy",
11502 G_CALLBACK (gtk_widget_destroyed),
11505 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
11506 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11508 hbox = gtk_hbox_new (FALSE, 0);
11509 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
11511 gtk_widget_show (hbox);
11513 drawing_area = gtk_drawing_area_new ();
11514 gtk_widget_set_size_request (drawing_area, 200, 200);
11515 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
11516 gtk_widget_show (drawing_area);
11518 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
11520 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
11521 scroll_test_pos = 0.0;
11523 scrollbar = gtk_vscrollbar_new (adj);
11524 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
11525 gtk_widget_show (scrollbar);
11527 g_signal_connect (drawing_area, "expose_event",
11528 G_CALLBACK (scroll_test_expose), adj);
11529 g_signal_connect (drawing_area, "configure_event",
11530 G_CALLBACK (scroll_test_configure), adj);
11531 g_signal_connect (drawing_area, "scroll_event",
11532 G_CALLBACK (scroll_test_scroll), adj);
11534 g_signal_connect (adj, "value_changed",
11535 G_CALLBACK (scroll_test_adjustment_changed),
11538 /* .. And create some buttons */
11540 button = gtk_button_new_with_label ("Quit");
11541 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11542 button, TRUE, TRUE, 0);
11544 g_signal_connect_swapped (button, "clicked",
11545 G_CALLBACK (gtk_widget_destroy),
11547 gtk_widget_show (button);
11549 /* Set up gridded geometry */
11551 geometry_mask = GDK_HINT_MIN_SIZE |
11552 GDK_HINT_BASE_SIZE |
11553 GDK_HINT_RESIZE_INC;
11555 geometry.min_width = 20;
11556 geometry.min_height = 20;
11557 geometry.base_width = 0;
11558 geometry.base_height = 0;
11559 geometry.width_inc = 10;
11560 geometry.height_inc = 10;
11562 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11563 drawing_area, &geometry, geometry_mask);
11566 if (!GTK_WIDGET_VISIBLE (window))
11567 gtk_widget_show (window);
11569 gtk_widget_destroy (window);
11576 static int timer = 0;
11579 timeout_test (GtkWidget *label)
11581 static int count = 0;
11582 static char buffer[32];
11584 sprintf (buffer, "count: %d", ++count);
11585 gtk_label_set_text (GTK_LABEL (label), buffer);
11591 start_timeout_test (GtkWidget *widget,
11596 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
11601 stop_timeout_test (GtkWidget *widget,
11606 gtk_timeout_remove (timer);
11612 destroy_timeout_test (GtkWidget *widget,
11613 GtkWidget **window)
11615 stop_timeout_test (NULL, NULL);
11621 create_timeout_test (GtkWidget *widget)
11623 static GtkWidget *window = NULL;
11629 window = gtk_dialog_new ();
11631 gtk_window_set_screen (GTK_WINDOW (window),
11632 gtk_widget_get_screen (widget));
11634 g_signal_connect (window, "destroy",
11635 G_CALLBACK (destroy_timeout_test),
11638 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
11639 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11641 label = gtk_label_new ("count: 0");
11642 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11643 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11644 label, TRUE, TRUE, 0);
11645 gtk_widget_show (label);
11647 button = gtk_button_new_with_label ("close");
11648 g_signal_connect_swapped (button, "clicked",
11649 G_CALLBACK (gtk_widget_destroy),
11651 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11652 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11653 button, TRUE, TRUE, 0);
11654 gtk_widget_grab_default (button);
11655 gtk_widget_show (button);
11657 button = gtk_button_new_with_label ("start");
11658 g_signal_connect (button, "clicked",
11659 G_CALLBACK(start_timeout_test),
11661 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11662 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11663 button, TRUE, TRUE, 0);
11664 gtk_widget_show (button);
11666 button = gtk_button_new_with_label ("stop");
11667 g_signal_connect (button, "clicked",
11668 G_CALLBACK (stop_timeout_test),
11670 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11671 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11672 button, TRUE, TRUE, 0);
11673 gtk_widget_show (button);
11676 if (!GTK_WIDGET_VISIBLE (window))
11677 gtk_widget_show (window);
11679 gtk_widget_destroy (window);
11686 static int idle_id = 0;
11689 idle_test (GtkWidget *label)
11691 static int count = 0;
11692 static char buffer[32];
11694 sprintf (buffer, "count: %d", ++count);
11695 gtk_label_set_text (GTK_LABEL (label), buffer);
11701 start_idle_test (GtkWidget *widget,
11706 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
11711 stop_idle_test (GtkWidget *widget,
11716 gtk_idle_remove (idle_id);
11722 destroy_idle_test (GtkWidget *widget,
11723 GtkWidget **window)
11725 stop_idle_test (NULL, NULL);
11731 toggle_idle_container (GObject *button,
11732 GtkContainer *container)
11734 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
11738 create_idle_test (GtkWidget *widget)
11740 static GtkWidget *window = NULL;
11743 GtkWidget *container;
11747 GtkWidget *button2;
11751 window = gtk_dialog_new ();
11753 gtk_window_set_screen (GTK_WINDOW (window),
11754 gtk_widget_get_screen (widget));
11756 g_signal_connect (window, "destroy",
11757 G_CALLBACK (destroy_idle_test),
11760 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
11761 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11763 label = gtk_label_new ("count: 0");
11764 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11765 gtk_widget_show (label);
11768 gtk_widget_new (GTK_TYPE_HBOX,
11770 /* "GtkContainer::child", gtk_widget_new (GTK_TYPE_HBOX,
11771 * "GtkWidget::visible", TRUE,
11776 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11777 container, TRUE, TRUE, 0);
11780 gtk_widget_new (GTK_TYPE_FRAME,
11782 "label", "Label Container",
11784 "parent", GTK_DIALOG (window)->vbox,
11787 gtk_widget_new (GTK_TYPE_VBOX,
11792 g_object_connect (gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11793 "label", "Resize-Parent",
11794 "user_data", (void*)GTK_RESIZE_PARENT,
11798 "signal::clicked", toggle_idle_container, container,
11800 button = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11801 "label", "Resize-Queue",
11802 "user_data", (void*)GTK_RESIZE_QUEUE,
11807 g_object_connect (button,
11808 "signal::clicked", toggle_idle_container, container,
11810 button2 = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11811 "label", "Resize-Immediate",
11812 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
11814 g_object_connect (button2,
11815 "signal::clicked", toggle_idle_container, container,
11817 g_object_set (button2,
11823 button = gtk_button_new_with_label ("close");
11824 g_signal_connect_swapped (button, "clicked",
11825 G_CALLBACK (gtk_widget_destroy),
11827 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11828 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11829 button, TRUE, TRUE, 0);
11830 gtk_widget_grab_default (button);
11831 gtk_widget_show (button);
11833 button = gtk_button_new_with_label ("start");
11834 g_signal_connect (button, "clicked",
11835 G_CALLBACK (start_idle_test),
11837 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11838 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11839 button, TRUE, TRUE, 0);
11840 gtk_widget_show (button);
11842 button = gtk_button_new_with_label ("stop");
11843 g_signal_connect (button, "clicked",
11844 G_CALLBACK (stop_idle_test),
11846 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11847 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11848 button, TRUE, TRUE, 0);
11849 gtk_widget_show (button);
11852 if (!GTK_WIDGET_VISIBLE (window))
11853 gtk_widget_show (window);
11855 gtk_widget_destroy (window);
11863 reload_all_rc_files (void)
11865 static GdkAtom atom_rcfiles = GDK_NONE;
11867 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
11871 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
11873 for(i = 0; i < 5; i++)
11874 send_event->client.data.l[i] = 0;
11875 send_event->client.data_format = 32;
11876 send_event->client.message_type = atom_rcfiles;
11877 gdk_event_send_clientmessage_toall (send_event);
11879 gdk_event_free (send_event);
11883 create_rc_file (GtkWidget *widget)
11885 static GtkWidget *window = NULL;
11893 window = gtk_dialog_new ();
11895 gtk_window_set_screen (GTK_WINDOW (window),
11896 gtk_widget_get_screen (widget));
11898 g_signal_connect (window, "destroy",
11899 G_CALLBACK (gtk_widget_destroyed),
11902 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
11903 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
11905 vbox = gtk_vbox_new (FALSE, 0);
11906 gtk_container_add (GTK_CONTAINER (frame), vbox);
11908 label = gtk_label_new ("This label should be red");
11909 gtk_widget_set_name (label, "testgtk-red-label");
11910 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11912 label = gtk_label_new ("This label should be green");
11913 gtk_widget_set_name (label, "testgtk-green-label");
11914 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11916 label = gtk_label_new ("This label should be blue");
11917 gtk_widget_set_name (label, "testgtk-blue-label");
11918 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11920 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
11921 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11923 button = gtk_button_new_with_label ("Reload");
11924 g_signal_connect (button, "clicked",
11925 G_CALLBACK (gtk_rc_reparse_all), NULL);
11926 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11927 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11928 button, TRUE, TRUE, 0);
11929 gtk_widget_grab_default (button);
11931 button = gtk_button_new_with_label ("Reload All");
11932 g_signal_connect (button, "clicked",
11933 G_CALLBACK (reload_all_rc_files), NULL);
11934 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11935 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11936 button, TRUE, TRUE, 0);
11938 button = gtk_button_new_with_label ("Close");
11939 g_signal_connect_swapped (button, "clicked",
11940 G_CALLBACK (gtk_widget_destroy),
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);
11947 if (!GTK_WIDGET_VISIBLE (window))
11948 gtk_widget_show_all (window);
11950 gtk_widget_destroy (window);
11954 * Test of recursive mainloop
11958 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
11965 create_mainloop (GtkWidget *widget)
11967 static GtkWidget *window = NULL;
11973 window = gtk_dialog_new ();
11975 gtk_window_set_screen (GTK_WINDOW (window),
11976 gtk_widget_get_screen (widget));
11978 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
11980 g_signal_connect (window, "destroy",
11981 G_CALLBACK (mainloop_destroyed),
11984 label = gtk_label_new ("In recursive main loop...");
11985 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
11987 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
11989 gtk_widget_show (label);
11991 button = gtk_button_new_with_label ("Leave");
11992 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
11995 g_signal_connect_swapped (button, "clicked",
11996 G_CALLBACK (gtk_widget_destroy),
11999 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12000 gtk_widget_grab_default (button);
12002 gtk_widget_show (button);
12005 if (!GTK_WIDGET_VISIBLE (window))
12007 gtk_widget_show (window);
12009 g_print ("create_mainloop: start\n");
12011 g_print ("create_mainloop: done\n");
12014 gtk_widget_destroy (window);
12018 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
12023 gint imin, imax, jmin, jmax;
12025 layout = GTK_LAYOUT (widget);
12027 if (event->window != layout->bin_window)
12030 imin = (event->area.x) / 10;
12031 imax = (event->area.x + event->area.width + 9) / 10;
12033 jmin = (event->area.y) / 10;
12034 jmax = (event->area.y + event->area.height + 9) / 10;
12036 for (i=imin; i<imax; i++)
12037 for (j=jmin; j<jmax; j++)
12039 gdk_draw_rectangle (layout->bin_window,
12040 widget->style->black_gc,
12048 void create_layout (GtkWidget *widget)
12050 static GtkWidget *window = NULL;
12052 GtkWidget *scrolledwindow;
12061 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12062 gtk_window_set_screen (GTK_WINDOW (window),
12063 gtk_widget_get_screen (widget));
12065 g_signal_connect (window, "destroy",
12066 G_CALLBACK (gtk_widget_destroyed),
12069 gtk_window_set_title (GTK_WINDOW (window), "Layout");
12070 gtk_widget_set_size_request (window, 200, 200);
12072 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
12073 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
12075 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
12076 GTK_CORNER_TOP_RIGHT);
12078 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
12080 layout = gtk_layout_new (NULL, NULL);
12081 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
12083 /* We set step sizes here since GtkLayout does not set
12086 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
12087 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
12089 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
12090 g_signal_connect (layout, "expose_event",
12091 G_CALLBACK (layout_expose_handler), NULL);
12093 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
12095 for (i=0 ; i < 16 ; i++)
12096 for (j=0 ; j < 16 ; j++)
12098 sprintf(buf, "Button %d, %d", i, j);
12100 button = gtk_button_new_with_label (buf);
12102 button = gtk_label_new (buf);
12104 gtk_layout_put (GTK_LAYOUT (layout), button,
12108 for (i=16; i < 1280; i++)
12110 sprintf(buf, "Button %d, %d", i, 0);
12112 button = gtk_button_new_with_label (buf);
12114 button = gtk_label_new (buf);
12116 gtk_layout_put (GTK_LAYOUT (layout), button,
12121 if (!GTK_WIDGET_VISIBLE (window))
12122 gtk_widget_show_all (window);
12124 gtk_widget_destroy (window);
12128 create_styles (GtkWidget *widget)
12130 static GtkWidget *window = NULL;
12135 static GdkColor red = { 0, 0xffff, 0, 0 };
12136 static GdkColor green = { 0, 0, 0xffff, 0 };
12137 static GdkColor blue = { 0, 0, 0, 0xffff };
12138 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
12139 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
12140 PangoFontDescription *font_desc;
12142 GtkRcStyle *rc_style;
12146 window = gtk_dialog_new ();
12147 gtk_window_set_screen (GTK_WINDOW (window),
12148 gtk_widget_get_screen (widget));
12150 g_signal_connect (window, "destroy",
12151 G_CALLBACK (gtk_widget_destroyed),
12155 button = gtk_button_new_with_label ("Close");
12156 g_signal_connect_swapped (button, "clicked",
12157 G_CALLBACK (gtk_widget_destroy),
12159 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12160 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12161 button, TRUE, TRUE, 0);
12162 gtk_widget_show (button);
12164 vbox = gtk_vbox_new (FALSE, 5);
12165 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
12166 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
12168 label = gtk_label_new ("Font:");
12169 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12170 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12172 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
12174 button = gtk_button_new_with_label ("Some Text");
12175 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
12176 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12178 label = gtk_label_new ("Foreground:");
12179 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12180 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12182 button = gtk_button_new_with_label ("Some Text");
12183 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
12184 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12186 label = gtk_label_new ("Background:");
12187 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12188 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12190 button = gtk_button_new_with_label ("Some Text");
12191 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
12192 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12194 label = gtk_label_new ("Text:");
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 entry = gtk_entry_new ();
12199 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12200 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
12201 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12203 label = gtk_label_new ("Base:");
12204 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12205 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12207 entry = gtk_entry_new ();
12208 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12209 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
12210 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12212 label = gtk_label_new ("Multiple:");
12213 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12214 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12216 button = gtk_button_new_with_label ("Some Text");
12218 rc_style = gtk_rc_style_new ();
12220 rc_style->font_desc = pango_font_description_copy (font_desc);
12221 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
12222 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
12223 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
12224 rc_style->fg[GTK_STATE_NORMAL] = yellow;
12225 rc_style->bg[GTK_STATE_NORMAL] = blue;
12226 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
12227 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
12228 rc_style->fg[GTK_STATE_ACTIVE] = red;
12229 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
12230 rc_style->xthickness = 5;
12231 rc_style->ythickness = 5;
12233 gtk_widget_modify_style (button, rc_style);
12234 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
12236 g_object_unref (rc_style);
12238 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12241 if (!GTK_WIDGET_VISIBLE (window))
12242 gtk_widget_show_all (window);
12244 gtk_widget_destroy (window);
12248 * Main Window and Exit
12252 do_exit (GtkWidget *widget, GtkWidget *window)
12254 gtk_widget_destroy (window);
12260 void (*func) (GtkWidget *widget);
12261 gboolean do_not_benchmark;
12264 { "big windows", create_big_windows },
12265 { "button box", create_button_box },
12266 { "buttons", create_buttons },
12267 { "check buttons", create_check_buttons },
12268 { "clist", create_clist},
12269 { "color selection", create_color_selection },
12270 { "ctree", create_ctree },
12271 { "cursors", create_cursors },
12272 { "dialog", create_dialog },
12273 { "display & screen", create_display_screen },
12274 { "entry", create_entry },
12275 { "event watcher", create_event_watcher },
12276 { "file selection", create_file_selection },
12277 { "flipping", create_flipping },
12278 { "focus", create_focus },
12279 { "font selection", create_font_selection },
12280 { "gamma curve", create_gamma_curve, TRUE },
12281 { "gridded geometry", create_gridded_geometry, TRUE },
12282 { "handle box", create_handle_box },
12283 { "image from drawable", create_get_image },
12284 { "image", create_image },
12285 { "item factory", create_item_factory },
12286 { "key lookup", create_key_lookup },
12287 { "labels", create_labels },
12288 { "layout", create_layout },
12289 { "list", create_list },
12290 { "menus", create_menus },
12291 { "message dialog", create_message_dialog },
12292 { "modal window", create_modal_window, TRUE },
12293 { "notebook", create_notebook },
12294 { "panes", create_panes },
12295 { "paned keyboard", create_paned_keyboard_navigation },
12296 { "pixmap", create_pixmap },
12297 { "preview color", create_color_preview, TRUE },
12298 { "preview gray", create_gray_preview, TRUE },
12299 { "progress bar", create_progress_bar },
12300 { "properties", create_properties },
12301 { "radio buttons", create_radio_buttons },
12302 { "range controls", create_range_controls },
12303 { "rc file", create_rc_file },
12304 { "reparent", create_reparent },
12305 { "resize grips", create_resize_grips },
12306 { "rulers", create_rulers },
12307 { "saved position", create_saved_position },
12308 { "scrolled windows", create_scrolled_windows },
12309 { "shapes", create_shapes },
12310 { "size groups", create_size_groups },
12311 { "spinbutton", create_spins },
12312 { "statusbar", create_statusbar },
12313 { "styles", create_styles },
12314 { "test idle", create_idle_test },
12315 { "test mainloop", create_mainloop, TRUE },
12316 { "test scrolling", create_scroll_test },
12317 { "test selection", create_selection_test },
12318 { "test timeout", create_timeout_test },
12319 { "text", create_text },
12320 { "toggle buttons", create_toggle_buttons },
12321 { "toolbar", create_toolbar },
12322 { "tooltips", create_tooltips },
12323 { "tree", create_tree_mode_window},
12324 { "WM hints", create_wmhints },
12325 { "window sizing", create_window_sizing },
12326 { "window states", create_window_states }
12328 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
12331 create_main_window (void)
12336 GtkWidget *scrolled_window;
12340 GtkWidget *separator;
12341 GdkGeometry geometry;
12344 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12345 gtk_widget_set_name (window, "main window");
12346 gtk_widget_set_uposition (window, 20, 20);
12347 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
12349 geometry.min_width = -1;
12350 geometry.min_height = -1;
12351 geometry.max_width = -1;
12352 geometry.max_height = G_MAXSHORT;
12353 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
12355 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
12357 g_signal_connect (window, "destroy",
12358 G_CALLBACK (gtk_main_quit),
12360 g_signal_connect (window, "delete-event",
12361 G_CALLBACK (gtk_false),
12364 box1 = gtk_vbox_new (FALSE, 0);
12365 gtk_container_add (GTK_CONTAINER (window), box1);
12367 if (gtk_micro_version > 0)
12372 gtk_micro_version);
12377 gtk_minor_version);
12379 label = gtk_label_new (buffer);
12380 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
12381 gtk_widget_set_name (label, "testgtk-version-label");
12383 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
12384 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
12385 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
12387 GTK_POLICY_AUTOMATIC);
12388 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
12390 box2 = gtk_vbox_new (FALSE, 0);
12391 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12392 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
12393 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
12394 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
12395 gtk_widget_show (box2);
12397 for (i = 0; i < nbuttons; i++)
12399 button = gtk_button_new_with_label (buttons[i].label);
12400 if (buttons[i].func)
12401 g_signal_connect (button,
12403 G_CALLBACK(buttons[i].func),
12406 gtk_widget_set_sensitive (button, FALSE);
12407 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12410 separator = gtk_hseparator_new ();
12411 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
12413 box2 = gtk_vbox_new (FALSE, 10);
12414 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12415 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
12417 button = gtk_button_new_with_mnemonic ("_Close");
12418 g_signal_connect (button, "clicked",
12419 G_CALLBACK (do_exit),
12421 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12422 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12423 gtk_widget_grab_default (button);
12425 gtk_widget_show_all (window);
12431 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
12432 G_FILE_TEST_EXISTS))
12434 putenv ("GDK_PIXBUF_MODULE_FILE=../gdk-pixbuf/gdk-pixbuf.loaders");
12435 putenv ("GTK_IM_MODULE_FILE=../modules/input/gtk.immodules");
12440 pad (const char *str, int to)
12442 static char buf[256];
12443 int len = strlen (str);
12446 for (i = 0; i < to; i++)
12451 memcpy (buf, str, len);
12457 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
12459 fn (widget); /* on */
12460 while (g_main_context_iteration (NULL, FALSE));
12461 fn (widget); /* off */
12462 while (g_main_context_iteration (NULL, FALSE));
12466 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
12472 static gboolean printed_headers = FALSE;
12474 if (!printed_headers) {
12475 g_print ("Test Iters First Other\n");
12476 g_print ("-------------------- ----- ---------- ----------\n");
12477 printed_headers = TRUE;
12480 g_get_current_time (&tv0);
12481 bench_iteration (widget, fn);
12482 g_get_current_time (&tv1);
12484 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12485 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12487 g_get_current_time (&tv0);
12488 for (n = 0; n < num - 1; n++)
12489 bench_iteration (widget, fn);
12490 g_get_current_time (&tv1);
12491 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12492 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12494 g_print ("%s %5d ", pad (name, 20), num);
12496 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
12498 g_print ("%10.1f\n", dt_first);
12502 do_bench (char* what, int num)
12506 void (* fn) (GtkWidget *widget);
12508 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12510 if (g_ascii_strcasecmp (what, "ALL") == 0)
12512 for (i = 0; i < nbuttons; i++)
12514 if (!buttons[i].do_not_benchmark)
12515 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
12522 for (i = 0; i < nbuttons; i++)
12524 if (strcmp (buttons[i].label, what) == 0)
12526 fn = buttons[i].func;
12532 g_print ("Can't bench: \"%s\" not found.\n", what);
12534 do_real_bench (widget, fn, buttons[i].label, num);
12541 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
12546 main (int argc, char *argv[])
12548 GtkBindingSet *binding_set;
12550 gboolean done_benchmarks = FALSE;
12552 srand (time (NULL));
12556 /* Check to see if we are being run from the correct
12559 if (file_exists ("testgtkrc"))
12560 gtk_rc_add_default_file ("testgtkrc");
12562 g_set_application_name ("GTK+ Test Program");
12564 gtk_init (&argc, &argv);
12568 for (i = 1; i < argc; i++)
12570 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
12577 nextarg = strchr (argv[i], '=');
12588 count = strchr (nextarg, ':');
12591 what = g_strndup (nextarg, count - nextarg);
12593 num = atoi (count);
12598 what = g_strdup (nextarg);
12600 do_bench (what, num ? num : 1);
12601 done_benchmarks = TRUE;
12606 if (done_benchmarks)
12611 binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_WIDGET));
12612 gtk_binding_entry_add_signal (binding_set,
12613 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
12616 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
12618 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
12622 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
12623 " fg[NORMAL] = \"#ff0000\"\n"
12624 " font = \"Sans 18\"\n"
12626 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
12628 create_main_window ();
12634 while (g_main_context_pending (NULL))
12635 g_main_context_iteration (NULL, FALSE);
12638 while (g_main_context_pending (NULL))
12639 g_main_context_iteration (NULL, FALSE);