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");
1026 g_signal_connect (window, "destroy",
1027 G_CALLBACK (gtk_widget_destroyed),
1030 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1031 gtk_widget_realize (window);
1033 toolbar = gtk_toolbar_new ();
1035 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1037 "Stock icon: New", "Toolbar/New",
1038 G_CALLBACK (set_toolbar_small_stock), toolbar, -1);
1040 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1042 "Stock icon: Open", "Toolbar/Open",
1043 G_CALLBACK (set_toolbar_large_stock), toolbar, -1);
1045 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1046 "Horizontal", "Horizontal toolbar layout", "Toolbar/Horizontal",
1047 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1048 G_CALLBACK (set_toolbar_horizontal), toolbar);
1049 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1050 "Vertical", "Vertical toolbar layout", "Toolbar/Vertical",
1051 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1052 G_CALLBACK (set_toolbar_vertical), toolbar);
1054 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1056 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1057 "Icons", "Only show toolbar icons", "Toolbar/IconsOnly",
1058 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1059 G_CALLBACK (set_toolbar_icons), toolbar);
1060 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1061 "Text", "Only show toolbar text", "Toolbar/TextOnly",
1062 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1063 G_CALLBACK (set_toolbar_text), toolbar);
1064 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1065 "Both", "Show toolbar icons and text", "Toolbar/Both",
1066 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1067 G_CALLBACK (set_toolbar_both), toolbar);
1068 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1069 "Both (horizontal)",
1070 "Show toolbar icons and text in a horizontal fashion",
1071 "Toolbar/BothHoriz",
1072 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1073 G_CALLBACK (set_toolbar_both_horiz), toolbar);
1075 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1077 entry = gtk_entry_new ();
1079 gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), entry, "This is an unusable GtkEntry ;)", "Hey don't click me!!!");
1081 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1084 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1086 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1087 "Enable", "Enable tooltips", NULL,
1088 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1089 G_CALLBACK (set_toolbar_enable), toolbar);
1090 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1091 "Disable", "Disable tooltips", NULL,
1092 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1093 G_CALLBACK (set_toolbar_disable), toolbar);
1095 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1097 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1098 "Frobate", "Frobate tooltip", NULL,
1099 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1101 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1102 "Baz", "Baz tooltip", NULL,
1103 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1106 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1108 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1109 "Blah", "Blah tooltip", NULL,
1110 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1112 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1113 "Bar", "Bar tooltip", NULL,
1114 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1117 gtk_container_add (GTK_CONTAINER (window), toolbar);
1119 gtk_widget_set_size_request (toolbar, 200, -1);
1122 if (!GTK_WIDGET_VISIBLE (window))
1123 gtk_widget_show_all (window);
1125 gtk_widget_destroy (window);
1129 make_toolbar (GtkWidget *window)
1133 if (!GTK_WIDGET_REALIZED (window))
1134 gtk_widget_realize (window);
1136 toolbar = gtk_toolbar_new ();
1138 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1139 "Horizontal", "Horizontal toolbar layout", NULL,
1140 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1141 G_CALLBACK (set_toolbar_horizontal), toolbar);
1142 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1143 "Vertical", "Vertical toolbar layout", NULL,
1144 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1145 G_CALLBACK (set_toolbar_vertical), toolbar);
1147 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1149 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1150 "Icons", "Only show toolbar icons", NULL,
1151 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1152 G_CALLBACK (set_toolbar_icons), toolbar);
1153 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1154 "Text", "Only show toolbar text", NULL,
1155 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1156 G_CALLBACK (set_toolbar_text), toolbar);
1157 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1158 "Both", "Show toolbar icons and text", NULL,
1159 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1160 G_CALLBACK (set_toolbar_both), toolbar);
1162 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1164 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1165 "Woot", "Woot woot woot", NULL,
1166 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1168 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1169 "Blah", "Blah blah blah", "Toolbar/Big",
1170 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1173 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1175 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1176 "Enable", "Enable tooltips", NULL,
1177 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1178 G_CALLBACK (set_toolbar_enable), toolbar);
1179 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1180 "Disable", "Disable tooltips", NULL,
1181 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1182 G_CALLBACK (set_toolbar_disable), toolbar);
1184 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1186 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1187 "Hoo", "Hoo tooltip", NULL,
1188 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1190 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1191 "Woo", "Woo tooltip", NULL,
1192 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1202 static guint statusbar_counter = 1;
1205 statusbar_push (GtkWidget *button,
1206 GtkStatusbar *statusbar)
1210 sprintf (text, "something %d", statusbar_counter++);
1212 gtk_statusbar_push (statusbar, 1, text);
1216 statusbar_pop (GtkWidget *button,
1217 GtkStatusbar *statusbar)
1219 gtk_statusbar_pop (statusbar, 1);
1223 statusbar_steal (GtkWidget *button,
1224 GtkStatusbar *statusbar)
1226 gtk_statusbar_remove (statusbar, 1, 4);
1230 statusbar_popped (GtkStatusbar *statusbar,
1234 if (!statusbar->messages)
1235 statusbar_counter = 1;
1239 statusbar_contexts (GtkStatusbar *statusbar)
1243 string = "any context";
1244 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1246 gtk_statusbar_get_context_id (statusbar, string));
1248 string = "idle messages";
1249 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1251 gtk_statusbar_get_context_id (statusbar, string));
1253 string = "some text";
1254 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1256 gtk_statusbar_get_context_id (statusbar, string));
1258 string = "hit the mouse";
1259 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1261 gtk_statusbar_get_context_id (statusbar, string));
1263 string = "hit the mouse2";
1264 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1266 gtk_statusbar_get_context_id (statusbar, string));
1270 create_statusbar (GtkWidget *widget)
1272 static GtkWidget *window = NULL;
1276 GtkWidget *separator;
1277 GtkWidget *statusbar;
1281 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1282 gtk_window_set_screen (GTK_WINDOW (window),
1283 gtk_widget_get_screen (widget));
1285 g_signal_connect (window, "destroy",
1286 G_CALLBACK (gtk_widget_destroyed),
1289 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1290 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1292 box1 = gtk_vbox_new (FALSE, 0);
1293 gtk_container_add (GTK_CONTAINER (window), box1);
1295 box2 = gtk_vbox_new (FALSE, 10);
1296 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1297 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1299 statusbar = gtk_statusbar_new ();
1300 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1301 g_signal_connect (statusbar,
1303 G_CALLBACK (statusbar_popped),
1306 button = gtk_widget_new (gtk_button_get_type (),
1307 "label", "push something",
1311 g_object_connect (button,
1312 "signal::clicked", statusbar_push, statusbar,
1315 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1320 "signal_after::clicked", statusbar_pop, statusbar,
1323 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1324 "label", "steal #4",
1328 "signal_after::clicked", statusbar_steal, statusbar,
1331 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1332 "label", "test contexts",
1336 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1339 separator = gtk_hseparator_new ();
1340 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1342 box2 = gtk_vbox_new (FALSE, 10);
1343 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1344 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1346 button = gtk_button_new_with_label ("close");
1347 g_signal_connect_swapped (button, "clicked",
1348 G_CALLBACK (gtk_widget_destroy),
1350 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1351 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1352 gtk_widget_grab_default (button);
1355 if (!GTK_WIDGET_VISIBLE (window))
1356 gtk_widget_show_all (window);
1358 gtk_widget_destroy (window);
1366 cb_tree_destroy_event(GtkWidget* w)
1368 sTreeButtons* tree_buttons;
1370 /* free buttons structure associate at this tree */
1371 tree_buttons = g_object_get_data (G_OBJECT (w), "user_data");
1372 g_free (tree_buttons);
1376 cb_add_new_item(GtkWidget* w, GtkTree* tree)
1378 sTreeButtons* tree_buttons;
1379 GList* selected_list;
1380 GtkWidget* selected_item;
1382 GtkWidget* item_new;
1385 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1387 selected_list = GTK_TREE_SELECTION_OLD(tree);
1389 if(selected_list == NULL)
1391 /* there is no item in tree */
1392 subtree = GTK_WIDGET(tree);
1396 /* list can have only one element */
1397 selected_item = GTK_WIDGET(selected_list->data);
1399 subtree = GTK_TREE_ITEM_SUBTREE(selected_item);
1403 /* current selected item have not subtree ... create it */
1404 subtree = gtk_tree_new();
1405 gtk_tree_item_set_subtree(GTK_TREE_ITEM(selected_item),
1410 /* at this point, we know which subtree will be used to add new item */
1411 /* create a new item */
1412 sprintf(buffer, "item add %d", tree_buttons->nb_item_add);
1413 item_new = gtk_tree_item_new_with_label(buffer);
1414 gtk_tree_append(GTK_TREE(subtree), item_new);
1415 gtk_widget_show(item_new);
1417 tree_buttons->nb_item_add++;
1421 cb_remove_item(GtkWidget*w, GtkTree* tree)
1423 GList* selected_list;
1426 selected_list = GTK_TREE_SELECTION_OLD(tree);
1430 while (selected_list)
1432 clear_list = g_list_prepend (clear_list, selected_list->data);
1433 selected_list = selected_list->next;
1436 clear_list = g_list_reverse (clear_list);
1437 gtk_tree_remove_items(tree, clear_list);
1439 g_list_free (clear_list);
1443 cb_remove_subtree(GtkWidget*w, GtkTree* tree)
1445 GList* selected_list;
1448 selected_list = GTK_TREE_SELECTION_OLD(tree);
1452 item = GTK_TREE_ITEM (selected_list->data);
1454 gtk_tree_item_remove_subtree (item);
1459 cb_tree_changed(GtkTree* tree)
1461 sTreeButtons* tree_buttons;
1462 GList* selected_list;
1465 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1467 selected_list = GTK_TREE_SELECTION_OLD(tree);
1468 nb_selected = g_list_length(selected_list);
1470 if(nb_selected == 0)
1472 if(tree->children == NULL)
1473 gtk_widget_set_sensitive(tree_buttons->add_button, TRUE);
1475 gtk_widget_set_sensitive(tree_buttons->add_button, FALSE);
1476 gtk_widget_set_sensitive(tree_buttons->remove_button, FALSE);
1477 gtk_widget_set_sensitive(tree_buttons->subtree_button, FALSE);
1481 gtk_widget_set_sensitive(tree_buttons->remove_button, TRUE);
1482 gtk_widget_set_sensitive(tree_buttons->add_button, (nb_selected == 1));
1483 gtk_widget_set_sensitive(tree_buttons->subtree_button, (nb_selected == 1));
1488 create_subtree(GtkWidget* item, guint level, guint nb_item_max, guint recursion_level_max)
1490 GtkWidget* item_subtree;
1491 GtkWidget* item_new;
1496 if(level == recursion_level_max) return;
1500 /* query with no root item */
1502 item_subtree = item;
1507 /* query with no root item */
1508 /* create subtree and associate it with current item */
1509 item_subtree = gtk_tree_new();
1513 for(nb_item = 0; nb_item < nb_item_max; nb_item++)
1515 sprintf(buffer, "item %d-%d", level, nb_item);
1516 item_new = gtk_tree_item_new_with_label(buffer);
1517 gtk_tree_append(GTK_TREE(item_subtree), item_new);
1518 create_subtree(item_new, level+1, nb_item_max, recursion_level_max);
1519 gtk_widget_show(item_new);
1523 gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), item_subtree);
1527 create_tree_sample(GdkScreen *screen, guint selection_mode,
1528 guint draw_line, guint view_line, guint no_root_item,
1529 guint nb_item_max, guint recursion_level_max)
1534 GtkWidget* separator;
1536 GtkWidget* scrolled_win;
1537 GtkWidget* root_tree;
1538 GtkWidget* root_item;
1539 sTreeButtons* tree_buttons;
1541 /* create tree buttons struct */
1542 if ((tree_buttons = g_malloc (sizeof (sTreeButtons))) == NULL)
1544 g_error("can't allocate memory for tree structure !\n");
1547 tree_buttons->nb_item_add = 0;
1549 /* create top level window */
1550 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1551 gtk_window_set_screen (GTK_WINDOW (window), screen);
1552 gtk_window_set_title(GTK_WINDOW(window), "Tree Sample");
1553 g_signal_connect (window, "destroy",
1554 G_CALLBACK (cb_tree_destroy_event), NULL);
1555 g_object_set_data (G_OBJECT (window), "user_data", tree_buttons);
1557 box1 = gtk_vbox_new(FALSE, 0);
1558 gtk_container_add(GTK_CONTAINER(window), box1);
1559 gtk_widget_show(box1);
1561 /* create tree box */
1562 box2 = gtk_vbox_new(FALSE, 0);
1563 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
1564 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1565 gtk_widget_show(box2);
1567 /* create scrolled window */
1568 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
1569 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
1570 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1571 gtk_box_pack_start (GTK_BOX (box2), scrolled_win, TRUE, TRUE, 0);
1572 gtk_widget_set_size_request (scrolled_win, 200, 200);
1573 gtk_widget_show (scrolled_win);
1575 /* create root tree widget */
1576 root_tree = gtk_tree_new();
1577 g_signal_connect (root_tree, "selection_changed",
1578 G_CALLBACK (cb_tree_changed),
1580 g_object_set_data (G_OBJECT (root_tree), "user_data", tree_buttons);
1581 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), root_tree);
1582 gtk_tree_set_selection_mode(GTK_TREE(root_tree), selection_mode);
1583 gtk_tree_set_view_lines(GTK_TREE(root_tree), draw_line);
1584 gtk_tree_set_view_mode(GTK_TREE(root_tree), !view_line);
1585 gtk_widget_show(root_tree);
1589 /* set root tree to subtree function with root item variable */
1590 root_item = GTK_WIDGET(root_tree);
1594 /* create root tree item widget */
1595 root_item = gtk_tree_item_new_with_label("root item");
1596 gtk_tree_append(GTK_TREE(root_tree), root_item);
1597 gtk_widget_show(root_item);
1599 create_subtree(root_item, -no_root_item, nb_item_max, recursion_level_max);
1601 box2 = gtk_vbox_new(FALSE, 0);
1602 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1603 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1604 gtk_widget_show(box2);
1606 button = gtk_button_new_with_label("Add Item");
1607 gtk_widget_set_sensitive(button, FALSE);
1608 g_signal_connect (button, "clicked",
1609 G_CALLBACK (cb_add_new_item),
1611 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1612 gtk_widget_show(button);
1613 tree_buttons->add_button = button;
1615 button = gtk_button_new_with_label("Remove Item(s)");
1616 gtk_widget_set_sensitive(button, FALSE);
1617 g_signal_connect (button, "clicked",
1618 G_CALLBACK (cb_remove_item),
1620 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1621 gtk_widget_show(button);
1622 tree_buttons->remove_button = button;
1624 button = gtk_button_new_with_label("Remove Subtree");
1625 gtk_widget_set_sensitive(button, FALSE);
1626 g_signal_connect (button, "clicked",
1627 G_CALLBACK (cb_remove_subtree),
1629 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1630 gtk_widget_show(button);
1631 tree_buttons->subtree_button = button;
1633 /* create separator */
1634 separator = gtk_hseparator_new();
1635 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
1636 gtk_widget_show(separator);
1638 /* create button box */
1639 box2 = gtk_vbox_new(FALSE, 0);
1640 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1641 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1642 gtk_widget_show(box2);
1644 button = gtk_button_new_with_label("Close");
1645 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1646 g_signal_connect_swapped (button, "clicked",
1647 G_CALLBACK (gtk_widget_destroy),
1649 gtk_widget_show(button);
1651 gtk_widget_show(window);
1655 cb_create_tree(GtkWidget* w)
1657 guint selection_mode = GTK_SELECTION_SINGLE;
1662 guint recursion_level;
1664 /* get selection mode choice */
1665 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.single_button)->active)
1666 selection_mode = GTK_SELECTION_SINGLE;
1668 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.browse_button)->active)
1669 selection_mode = GTK_SELECTION_BROWSE;
1671 selection_mode = GTK_SELECTION_MULTIPLE;
1673 /* get options choice */
1674 draw_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.draw_line_button)->active;
1675 view_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.view_line_button)->active;
1676 no_root_item = GTK_TOGGLE_BUTTON(sTreeSampleSelection.no_root_item_button)->active;
1679 nb_item = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.nb_item_spinner));
1680 recursion_level = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.recursion_spinner));
1682 if (pow (nb_item, recursion_level) > 10000)
1684 g_print ("%g total items? That will take a very long time. Try less\n",
1685 pow (nb_item, recursion_level));
1689 create_tree_sample(gtk_widget_get_screen (w),
1690 selection_mode, draw_line,
1691 view_line, no_root_item, nb_item, recursion_level);
1695 create_tree_mode_window(GtkWidget *widget)
1697 static GtkWidget* window;
1705 GtkWidget* separator;
1712 /* create toplevel window */
1713 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1714 gtk_window_set_screen (GTK_WINDOW (window),
1715 gtk_widget_get_screen (widget));
1716 gtk_window_set_title(GTK_WINDOW(window), "Set Tree Parameters");
1717 g_signal_connect (window, "destroy",
1718 G_CALLBACK (gtk_widget_destroyed),
1720 box1 = gtk_vbox_new(FALSE, 0);
1721 gtk_container_add(GTK_CONTAINER(window), box1);
1723 /* create upper box - selection box */
1724 box2 = gtk_vbox_new(FALSE, 5);
1725 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
1726 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1728 box3 = gtk_hbox_new(FALSE, 5);
1729 gtk_box_pack_start(GTK_BOX(box2), box3, TRUE, TRUE, 0);
1731 /* create selection mode frame */
1732 frame = gtk_frame_new("Selection Mode");
1733 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
1735 box4 = gtk_vbox_new(FALSE, 0);
1736 gtk_container_add(GTK_CONTAINER(frame), box4);
1737 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1739 /* create radio button */
1740 button = gtk_radio_button_new_with_label(NULL, "SINGLE");
1741 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1742 sTreeSampleSelection.single_button = button;
1744 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1746 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1747 sTreeSampleSelection.browse_button = button;
1749 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1751 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1752 sTreeSampleSelection.multiple_button = button;
1754 sTreeSampleSelection.selection_mode_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
1756 /* create option mode frame */
1757 frame = gtk_frame_new("Options");
1758 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
1760 box4 = gtk_vbox_new(FALSE, 0);
1761 gtk_container_add(GTK_CONTAINER(frame), box4);
1762 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1764 /* create check button */
1765 button = gtk_check_button_new_with_label("Draw line");
1766 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1767 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
1768 sTreeSampleSelection.draw_line_button = button;
1770 button = gtk_check_button_new_with_label("View Line mode");
1771 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1772 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
1773 sTreeSampleSelection.view_line_button = button;
1775 button = gtk_check_button_new_with_label("Without Root item");
1776 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1777 sTreeSampleSelection.no_root_item_button = button;
1779 /* create recursion parameter */
1780 frame = gtk_frame_new("Size Parameters");
1781 gtk_box_pack_start(GTK_BOX(box2), frame, TRUE, TRUE, 0);
1783 box4 = gtk_hbox_new(FALSE, 5);
1784 gtk_container_add(GTK_CONTAINER(frame), box4);
1785 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1787 /* create number of item spin button */
1788 box5 = gtk_hbox_new(FALSE, 5);
1789 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
1791 label = gtk_label_new("Number of items : ");
1792 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1793 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
1795 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_NUMBER_OF_ITEM, 1.0, 255.0, 1.0,
1797 spinner = gtk_spin_button_new (adj, 0, 0);
1798 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
1799 sTreeSampleSelection.nb_item_spinner = spinner;
1801 /* create recursion level spin button */
1802 box5 = gtk_hbox_new(FALSE, 5);
1803 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
1805 label = gtk_label_new("Depth : ");
1806 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1807 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
1809 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_RECURSION_LEVEL, 0.0, 255.0, 1.0,
1811 spinner = gtk_spin_button_new (adj, 0, 0);
1812 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
1813 sTreeSampleSelection.recursion_spinner = spinner;
1815 /* create horizontal separator */
1816 separator = gtk_hseparator_new();
1817 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
1819 /* create bottom button box */
1820 box2 = gtk_hbox_new(TRUE, 10);
1821 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1822 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1824 button = gtk_button_new_with_label("Create Tree");
1825 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1826 g_signal_connect (button, "clicked",
1827 G_CALLBACK (cb_create_tree), NULL);
1829 button = gtk_button_new_with_label("Close");
1830 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1831 g_signal_connect_swapped (button, "clicked",
1832 G_CALLBACK (gtk_widget_destroy),
1835 if (!GTK_WIDGET_VISIBLE (window))
1836 gtk_widget_show_all (window);
1838 gtk_widget_destroy (window);
1844 #define GRID_SIZE 20
1845 #define DEFAULT_GEOMETRY "10x10"
1848 gridded_geometry_expose (GtkWidget *widget,
1849 GdkEventExpose *event)
1853 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
1854 0, 0, widget->allocation.width, widget->allocation.height);
1856 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
1857 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
1859 if ((i + j) % 2 == 0)
1860 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
1861 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1868 gridded_geometry_subresponse (GtkDialog *dialog,
1870 gchar *geometry_string)
1872 if (response_id == GTK_RESPONSE_NONE)
1874 gtk_widget_destroy (GTK_WIDGET (dialog));
1878 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1880 g_print ("Can't parse geometry string %s\n", geometry_string);
1881 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1887 gridded_geometry_response (GtkDialog *dialog,
1891 if (response_id == GTK_RESPONSE_NONE)
1893 gtk_widget_destroy (GTK_WIDGET (dialog));
1897 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1898 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1900 GtkWidget *drawing_area;
1902 GdkGeometry geometry;
1904 window = gtk_dialog_new_with_buttons (title,
1907 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1910 gtk_window_set_screen (GTK_WINDOW (window),
1911 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1913 g_signal_connect (window, "response",
1914 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1916 box = gtk_vbox_new (FALSE, 0);
1917 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), box, TRUE, TRUE, 0);
1919 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1921 drawing_area = gtk_drawing_area_new ();
1922 g_signal_connect (drawing_area, "expose_event",
1923 G_CALLBACK (gridded_geometry_expose), NULL);
1924 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1926 /* Gross hack to work around bug 68668... if we set the size request
1927 * large enough, then the current
1929 * request_of_window - request_of_geometry_widget
1931 * method of getting the base size works more or less works.
1933 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1935 geometry.base_width = 0;
1936 geometry.base_height = 0;
1937 geometry.min_width = 2 * GRID_SIZE;
1938 geometry.min_height = 2 * GRID_SIZE;
1939 geometry.width_inc = GRID_SIZE;
1940 geometry.height_inc = GRID_SIZE;
1942 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1944 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1946 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1948 g_print ("Can't parse geometry string %s\n", geometry_string);
1949 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1952 gtk_widget_show_all (window);
1957 create_gridded_geometry (GtkWidget *widget)
1959 static GtkWidget *window = NULL;
1965 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1968 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1971 gtk_window_set_screen (GTK_WINDOW (window),
1972 gtk_widget_get_screen (widget));
1974 label = gtk_label_new ("Geometry string:");
1975 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0);
1977 entry = gtk_entry_new ();
1978 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1979 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), entry, FALSE, FALSE, 0);
1981 g_signal_connect (window, "response",
1982 G_CALLBACK (gridded_geometry_response), entry);
1983 g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
1985 gtk_widget_show_all (window);
1988 gtk_widget_destroy (window);
1996 handle_box_child_signal (GtkHandleBox *hb,
1998 const gchar *action)
2000 printf ("%s: child <%s> %sed\n",
2001 g_type_name (G_OBJECT_TYPE (hb)),
2002 g_type_name (G_OBJECT_TYPE (child)),
2007 create_handle_box (GtkWidget *widget)
2009 static GtkWidget* window = NULL;
2010 GtkWidget *handle_box;
2011 GtkWidget *handle_box2;
2016 GtkWidget *separator;
2020 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2022 gtk_window_set_screen (GTK_WINDOW (window),
2023 gtk_widget_get_screen (widget));
2025 gtk_window_set_title (GTK_WINDOW (window),
2027 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
2029 g_signal_connect (window, "destroy",
2030 G_CALLBACK (gtk_widget_destroyed),
2033 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
2035 vbox = gtk_vbox_new (FALSE, 0);
2036 gtk_container_add (GTK_CONTAINER (window), vbox);
2037 gtk_widget_show (vbox);
2039 label = gtk_label_new ("Above");
2040 gtk_container_add (GTK_CONTAINER (vbox), label);
2041 gtk_widget_show (label);
2043 separator = gtk_hseparator_new ();
2044 gtk_container_add (GTK_CONTAINER (vbox), separator);
2045 gtk_widget_show (separator);
2047 hbox = gtk_hbox_new (FALSE, 10);
2048 gtk_container_add (GTK_CONTAINER (vbox), hbox);
2049 gtk_widget_show (hbox);
2051 separator = gtk_hseparator_new ();
2052 gtk_container_add (GTK_CONTAINER (vbox), separator);
2053 gtk_widget_show (separator);
2055 label = gtk_label_new ("Below");
2056 gtk_container_add (GTK_CONTAINER (vbox), label);
2057 gtk_widget_show (label);
2059 handle_box = gtk_handle_box_new ();
2060 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2061 g_signal_connect (handle_box,
2063 G_CALLBACK (handle_box_child_signal),
2065 g_signal_connect (handle_box,
2067 G_CALLBACK (handle_box_child_signal),
2069 gtk_widget_show (handle_box);
2071 toolbar = make_toolbar (window);
2073 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2074 gtk_widget_show (toolbar);
2076 handle_box = gtk_handle_box_new ();
2077 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2078 g_signal_connect (handle_box,
2080 G_CALLBACK (handle_box_child_signal),
2082 g_signal_connect (handle_box,
2084 G_CALLBACK (handle_box_child_signal),
2086 gtk_widget_show (handle_box);
2088 handle_box2 = gtk_handle_box_new ();
2089 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2090 g_signal_connect (handle_box2,
2092 G_CALLBACK (handle_box_child_signal),
2094 g_signal_connect (handle_box2,
2096 G_CALLBACK (handle_box_child_signal),
2098 gtk_widget_show (handle_box2);
2100 label = gtk_label_new ("Fooo!");
2101 gtk_container_add (GTK_CONTAINER (handle_box2), label);
2102 gtk_widget_show (label);
2105 if (!GTK_WIDGET_VISIBLE (window))
2106 gtk_widget_show (window);
2108 gtk_widget_destroy (window);
2112 * Test for getting an image from a drawable
2123 take_snapshot (GtkWidget *button,
2126 struct GetImageData *gid = data;
2127 GdkRectangle visible;
2129 int height_fraction;
2132 GdkColor color = { 0, 30000, 0, 0 };
2133 GdkRectangle target;
2136 /* Do some begin_paint_rect on some random rects, draw some
2137 * distinctive stuff into those rects, then take the snapshot.
2138 * figure out whether any rects were overlapped and report to
2142 visible = gid->sw->allocation;
2144 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2145 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2147 width_fraction = visible.width / 4;
2148 height_fraction = visible.height / 4;
2150 gc = gdk_gc_new (gid->src->window);
2151 black_gc = gid->src->style->black_gc;
2153 gdk_gc_set_rgb_fg_color (gc, &color);
2156 target.x = visible.x + width_fraction;
2157 target.y = visible.y + height_fraction * 3;
2158 target.width = width_fraction;
2159 target.height = height_fraction / 2;
2161 gdk_window_begin_paint_rect (gid->src->window,
2164 gdk_draw_rectangle (gid->src->window,
2168 target.width, target.height);
2170 gdk_draw_rectangle (gid->src->window,
2173 target.x + 10, target.y + 10,
2174 target.width - 20, target.height - 20);
2176 target.x = visible.x + width_fraction;
2177 target.y = visible.y + height_fraction;
2178 target.width = width_fraction;
2179 target.height = height_fraction;
2181 gdk_window_begin_paint_rect (gid->src->window,
2184 gdk_draw_rectangle (gid->src->window,
2188 target.width, target.height);
2190 gdk_draw_rectangle (gid->src->window,
2193 target.x + 10, target.y + 10,
2194 target.width - 20, target.height - 20);
2196 target.x = visible.x + width_fraction * 3;
2197 target.y = visible.y + height_fraction;
2198 target.width = width_fraction / 2;
2199 target.height = height_fraction;
2201 gdk_window_begin_paint_rect (gid->src->window,
2204 gdk_draw_rectangle (gid->src->window,
2208 target.width, target.height);
2210 gdk_draw_rectangle (gid->src->window,
2213 target.x + 10, target.y + 10,
2214 target.width - 20, target.height - 20);
2216 target.x = visible.x + width_fraction * 2;
2217 target.y = visible.y + height_fraction * 2;
2218 target.width = width_fraction / 4;
2219 target.height = height_fraction / 4;
2221 gdk_window_begin_paint_rect (gid->src->window,
2224 gdk_draw_rectangle (gid->src->window,
2228 target.width, target.height);
2230 gdk_draw_rectangle (gid->src->window,
2233 target.x + 10, target.y + 10,
2234 target.width - 20, target.height - 20);
2236 target.x += target.width / 2;
2237 target.y += target.width / 2;
2239 gdk_window_begin_paint_rect (gid->src->window,
2242 gdk_draw_rectangle (gid->src->window,
2246 target.width, target.height);
2248 gdk_draw_rectangle (gid->src->window,
2251 target.x + 10, target.y + 10,
2252 target.width - 20, target.height - 20);
2254 /* Screen shot area */
2256 target.x = visible.x + width_fraction * 1.5;
2257 target.y = visible.y + height_fraction * 1.5;
2258 target.width = width_fraction * 2;
2259 target.height = height_fraction * 2;
2261 shot = gdk_drawable_get_image (gid->src->window,
2263 target.width, target.height);
2265 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2268 g_object_unref (shot);
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);
2274 gdk_window_end_paint (gid->src->window);
2276 gdk_draw_rectangle (gid->src->window,
2277 gid->src->style->black_gc,
2280 target.width, target.height);
2282 g_object_unref (gc);
2286 image_source_expose (GtkWidget *da,
2287 GdkEventExpose *event,
2290 int x = event->area.x;
2291 GdkColor red = { 0, 65535, 0, 0 };
2292 GdkColor green = { 0, 0, 65535, 0 };
2293 GdkColor blue = { 0, 0, 0, 65535 };
2296 gc = gdk_gc_new (event->window);
2298 while (x < (event->area.x + event->area.width))
2305 gdk_gc_set_rgb_fg_color (gc, &red);
2311 gdk_gc_set_rgb_fg_color (gc, &green);
2317 gdk_gc_set_rgb_fg_color (gc, &blue);
2321 g_assert_not_reached ();
2325 gdk_draw_line (event->window,
2328 x, event->area.y + event->area.height);
2333 g_object_unref (gc);
2339 create_get_image (GtkWidget *widget)
2341 static GtkWidget *window = NULL;
2344 gtk_widget_destroy (window);
2353 struct GetImageData *gid;
2355 gid = g_new (struct GetImageData, 1);
2357 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2359 gtk_window_set_screen (GTK_WINDOW (window),
2360 gtk_widget_get_screen (widget));
2362 g_signal_connect (window,
2364 G_CALLBACK (gtk_widget_destroyed),
2367 g_object_set_data_full (G_OBJECT (window),
2368 "testgtk-get-image-data",
2372 hbox = gtk_hbox_new (FALSE, 0);
2374 gtk_container_add (GTK_CONTAINER (window), hbox);
2376 sw = gtk_scrolled_window_new (NULL, NULL);
2377 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2378 GTK_POLICY_AUTOMATIC,
2379 GTK_POLICY_AUTOMATIC);
2383 gtk_widget_set_size_request (sw, 400, 400);
2385 src = gtk_drawing_area_new ();
2386 gtk_widget_set_size_request (src, 10000, 10000);
2388 g_signal_connect (src,
2390 G_CALLBACK (image_source_expose),
2395 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2398 gtk_box_pack_start (GTK_BOX (hbox),
2402 vbox = gtk_vbox_new (FALSE, 3);
2404 snap = gtk_widget_new (GTK_TYPE_IMAGE, NULL);
2408 sw = gtk_scrolled_window_new (NULL, NULL);
2409 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2410 GTK_POLICY_AUTOMATIC,
2411 GTK_POLICY_AUTOMATIC);
2412 gtk_widget_set_size_request (sw, 300, 300);
2414 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2416 gtk_box_pack_end (GTK_BOX (vbox), sw, FALSE, FALSE, 5);
2418 button = gtk_button_new_with_label ("Get image from drawable");
2420 g_signal_connect (button,
2422 G_CALLBACK (take_snapshot),
2425 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2427 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2429 gtk_widget_show_all (window);
2437 sensitivity_toggled (GtkWidget *toggle,
2440 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2444 create_sensitivity_control (GtkWidget *widget)
2448 button = gtk_toggle_button_new_with_label ("Sensitive");
2450 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2451 GTK_WIDGET_IS_SENSITIVE (widget));
2453 g_signal_connect (button,
2455 G_CALLBACK (sensitivity_toggled),
2458 gtk_widget_show_all (button);
2464 set_selectable_recursive (GtkWidget *widget,
2467 if (GTK_IS_CONTAINER (widget))
2472 children = gtk_container_get_children (GTK_CONTAINER (widget));
2476 set_selectable_recursive (tmp->data, setting);
2480 g_list_free (children);
2482 else if (GTK_IS_LABEL (widget))
2484 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2489 selectable_toggled (GtkWidget *toggle,
2492 set_selectable_recursive (widget,
2493 GTK_TOGGLE_BUTTON (toggle)->active);
2497 create_selectable_control (GtkWidget *widget)
2501 button = gtk_toggle_button_new_with_label ("Selectable");
2503 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2506 g_signal_connect (button,
2508 G_CALLBACK (selectable_toggled),
2511 gtk_widget_show_all (button);
2516 void create_labels (GtkWidget *widget)
2518 static GtkWidget *window = NULL;
2527 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2529 gtk_window_set_screen (GTK_WINDOW (window),
2530 gtk_widget_get_screen (widget));
2532 g_signal_connect (window, "destroy",
2533 G_CALLBACK (gtk_widget_destroyed),
2536 gtk_window_set_title (GTK_WINDOW (window), "Label");
2538 vbox = gtk_vbox_new (FALSE, 5);
2540 hbox = gtk_hbox_new (FALSE, 5);
2541 gtk_container_add (GTK_CONTAINER (window), vbox);
2543 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2545 button = create_sensitivity_control (hbox);
2547 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2549 button = create_selectable_control (hbox);
2551 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2553 vbox = gtk_vbox_new (FALSE, 5);
2555 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2556 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2558 frame = gtk_frame_new ("Normal Label");
2559 label = gtk_label_new ("This is a Normal label");
2560 gtk_container_add (GTK_CONTAINER (frame), label);
2561 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2563 frame = gtk_frame_new ("Multi-line Label");
2564 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2565 gtk_container_add (GTK_CONTAINER (frame), label);
2566 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2568 frame = gtk_frame_new ("Left Justified Label");
2569 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2570 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2571 gtk_container_add (GTK_CONTAINER (frame), label);
2572 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2574 frame = gtk_frame_new ("Right Justified Label");
2575 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2576 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2577 gtk_container_add (GTK_CONTAINER (frame), label);
2578 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2580 frame = gtk_frame_new ("Internationalized Label");
2581 label = gtk_label_new (NULL);
2582 gtk_label_set_markup (GTK_LABEL (label),
2583 "French (Fran\303\247ais) Bonjour, Salut\n"
2584 "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"
2585 "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"
2586 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2587 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2588 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2589 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2590 gtk_container_add (GTK_CONTAINER (frame), label);
2591 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2593 frame = gtk_frame_new ("Bidirection Label");
2594 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"
2595 "Hebrew \327\251\327\234\327\225\327\235");
2596 gtk_widget_set_direction (label, GTK_TEXT_DIR_RTL);
2597 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2598 gtk_container_add (GTK_CONTAINER (frame), label);
2599 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2601 vbox = gtk_vbox_new (FALSE, 5);
2602 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2603 frame = gtk_frame_new ("Line wrapped label");
2604 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2605 "up the entire "/* big space to test spacing */\
2606 "width allocated to it, but automatically wraps the words to fit. "\
2607 "The time has come, for all good men, to come to the aid of their party. "\
2608 "The sixth sheik's six sheep's sick.\n"\
2609 " It supports multiple paragraphs correctly, and correctly adds "\
2610 "many extra spaces. ");
2612 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2613 gtk_container_add (GTK_CONTAINER (frame), label);
2614 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2616 frame = gtk_frame_new ("Filled, wrapped label");
2617 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2618 "up the entire width allocated to it. Here is a seneance to prove "\
2619 "my point. Here is another sentence. "\
2620 "Here comes the sun, do de do de do.\n"\
2621 " This is a new paragraph.\n"\
2622 " This is another newer, longer, better paragraph. It is coming to an end, "\
2624 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2625 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2626 gtk_container_add (GTK_CONTAINER (frame), label);
2627 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2629 frame = gtk_frame_new ("Underlined label");
2630 label = gtk_label_new ("This label is underlined!\n"
2631 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2632 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2633 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2634 gtk_container_add (GTK_CONTAINER (frame), label);
2635 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2637 frame = gtk_frame_new ("Markup label");
2638 label = gtk_label_new (NULL);
2640 /* There's also a gtk_label_set_markup() without accel if you
2641 * don't have an accelerator key
2643 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2644 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2645 "<b>markup</b> _such as "
2646 "<big><i>Big Italics</i></big>\n"
2647 "<tt>Monospace font</tt>\n"
2648 "<u>Underline!</u>\n"
2650 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2651 "and nothing on this line,\n"
2654 "or even on this one\n"
2655 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2656 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2657 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2659 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2661 gtk_container_add (GTK_CONTAINER (frame), label);
2662 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2665 if (!GTK_WIDGET_VISIBLE (window))
2666 gtk_widget_show_all (window);
2668 gtk_widget_destroy (window);
2676 reparent_label (GtkWidget *widget,
2677 GtkWidget *new_parent)
2681 label = g_object_get_data (G_OBJECT (widget), "user_data");
2683 gtk_widget_reparent (label, new_parent);
2687 set_parent_signal (GtkWidget *child,
2688 GtkWidget *old_parent,
2691 g_print ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2692 g_type_name (G_OBJECT_TYPE (child)),
2693 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
2694 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2695 GPOINTER_TO_INT (func_data));
2699 create_reparent (GtkWidget *widget)
2701 static GtkWidget *window = NULL;
2708 GtkWidget *separator;
2709 GtkWidget *event_box;
2713 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2715 gtk_window_set_screen (GTK_WINDOW (window),
2716 gtk_widget_get_screen (widget));
2718 g_signal_connect (window, "destroy",
2719 G_CALLBACK (gtk_widget_destroyed),
2722 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2723 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2725 box1 = gtk_vbox_new (FALSE, 0);
2726 gtk_container_add (GTK_CONTAINER (window), box1);
2728 box2 = gtk_hbox_new (FALSE, 5);
2729 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2730 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2732 label = gtk_label_new ("Hello World");
2734 frame = gtk_frame_new ("Frame 1");
2735 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2737 box3 = gtk_vbox_new (FALSE, 5);
2738 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2739 gtk_container_add (GTK_CONTAINER (frame), box3);
2741 button = gtk_button_new_with_label ("switch");
2742 g_object_set_data (G_OBJECT (button), "user_data", label);
2743 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2745 event_box = gtk_event_box_new ();
2746 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2747 gtk_container_add (GTK_CONTAINER (event_box), label);
2749 g_signal_connect (button, "clicked",
2750 G_CALLBACK (reparent_label),
2753 g_signal_connect (label, "parent_set",
2754 G_CALLBACK (set_parent_signal),
2755 GINT_TO_POINTER (42));
2757 frame = gtk_frame_new ("Frame 2");
2758 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2760 box3 = gtk_vbox_new (FALSE, 5);
2761 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2762 gtk_container_add (GTK_CONTAINER (frame), box3);
2764 button = gtk_button_new_with_label ("switch");
2765 g_object_set_data (G_OBJECT (button), "user_data", label);
2766 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2768 event_box = gtk_event_box_new ();
2769 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2771 g_signal_connect (button, "clicked",
2772 G_CALLBACK (reparent_label),
2775 separator = gtk_hseparator_new ();
2776 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2778 box2 = gtk_vbox_new (FALSE, 10);
2779 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2780 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2782 button = gtk_button_new_with_label ("close");
2783 g_signal_connect_swapped (button, "clicked",
2784 G_CALLBACK (gtk_widget_destroy), window);
2785 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2786 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
2787 gtk_widget_grab_default (button);
2790 if (!GTK_WIDGET_VISIBLE (window))
2791 gtk_widget_show_all (window);
2793 gtk_widget_destroy (window);
2800 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2802 if (event->type == GDK_BUTTON_PRESS)
2804 if (event->button == 1)
2805 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2806 event->button, event->x_root, event->y_root,
2808 else if (event->button == 2)
2809 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2810 event->button, event->x_root, event->y_root,
2817 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
2819 gtk_paint_resize_grip (area->style,
2821 GTK_WIDGET_STATE (area),
2827 area->allocation.width,
2828 area->allocation.height);
2834 create_resize_grips (GtkWidget *widget)
2836 static GtkWidget *window = NULL;
2838 GtkWidget *hbox, *vbox;
2841 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2843 gtk_window_set_screen (GTK_WINDOW (window),
2844 gtk_widget_get_screen (widget));
2846 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2848 g_signal_connect (window, "destroy",
2849 G_CALLBACK (gtk_widget_destroyed),
2852 vbox = gtk_vbox_new (FALSE, 0);
2853 gtk_container_add (GTK_CONTAINER (window), vbox);
2855 hbox = gtk_hbox_new (FALSE, 0);
2856 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2859 area = gtk_drawing_area_new ();
2860 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2861 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2862 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2863 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2864 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2865 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2868 area = gtk_drawing_area_new ();
2869 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2870 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2871 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2872 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2873 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2874 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2877 area = gtk_drawing_area_new ();
2878 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2879 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2880 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2881 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2882 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2883 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2885 hbox = gtk_hbox_new (FALSE, 0);
2886 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2889 area = gtk_drawing_area_new ();
2890 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2891 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2892 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2893 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2894 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2895 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2898 area = gtk_drawing_area_new ();
2899 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2902 area = gtk_drawing_area_new ();
2903 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2904 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2905 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2906 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2907 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2908 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2911 hbox = gtk_hbox_new (FALSE, 0);
2912 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2915 area = gtk_drawing_area_new ();
2916 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2917 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2918 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2919 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2920 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2921 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2923 area = gtk_drawing_area_new ();
2924 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2925 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2926 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2927 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2928 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2929 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2932 area = gtk_drawing_area_new ();
2933 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2934 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2935 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2936 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2937 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2938 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2941 if (!GTK_WIDGET_VISIBLE (window))
2942 gtk_widget_show_all (window);
2944 gtk_widget_destroy (window);
2950 gint upositionx = 0;
2951 gint upositiony = 0;
2954 uposition_configure (GtkWidget *window)
2960 lx = g_object_get_data (G_OBJECT (window), "x");
2961 ly = g_object_get_data (G_OBJECT (window), "y");
2963 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
2964 sprintf (buffer, "%d", upositionx);
2965 gtk_label_set_text (lx, buffer);
2966 sprintf (buffer, "%d", upositiony);
2967 gtk_label_set_text (ly, buffer);
2973 uposition_stop_configure (GtkToggleButton *toggle,
2977 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2979 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2983 create_saved_position (GtkWidget *widget)
2985 static GtkWidget *window = NULL;
2990 GtkWidget *main_vbox;
2998 window = g_object_connect (gtk_widget_new (GTK_TYPE_WINDOW,
2999 "type", GTK_WINDOW_TOPLEVEL,
3000 "title", "Saved Position",
3002 "signal::configure_event", uposition_configure, NULL,
3005 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3007 gtk_window_set_screen (GTK_WINDOW (window),
3008 gtk_widget_get_screen (widget));
3011 g_signal_connect (window, "destroy",
3012 G_CALLBACK (gtk_widget_destroyed),
3015 main_vbox = gtk_vbox_new (FALSE, 5);
3016 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3017 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3020 gtk_widget_new (gtk_vbox_get_type (),
3021 "GtkBox::homogeneous", FALSE,
3022 "GtkBox::spacing", 5,
3023 "GtkContainer::border_width", 10,
3024 "GtkWidget::parent", main_vbox,
3025 "GtkWidget::visible", TRUE,
3026 "child", g_object_connect (gtk_widget_new (GTK_TYPE_TOGGLE_BUTTON,
3027 "label", "Stop Events",
3031 "signal::clicked", uposition_stop_configure, window,
3035 hbox = gtk_hbox_new (FALSE, 0);
3036 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3037 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3039 label = gtk_label_new ("X Origin : ");
3040 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3041 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3043 x_label = gtk_label_new ("");
3044 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3045 g_object_set_data (G_OBJECT (window), "x", x_label);
3047 hbox = gtk_hbox_new (FALSE, 0);
3048 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3049 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3051 label = gtk_label_new ("Y Origin : ");
3052 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3053 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3055 y_label = gtk_label_new ("");
3056 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3057 g_object_set_data (G_OBJECT (window), "y", y_label);
3060 gtk_widget_new (gtk_hseparator_get_type (),
3061 "GtkWidget::visible", TRUE,
3063 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3065 hbox = gtk_hbox_new (FALSE, 0);
3066 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3067 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3069 button = gtk_button_new_with_label ("Close");
3070 g_signal_connect_swapped (button, "clicked",
3071 G_CALLBACK (gtk_widget_destroy),
3073 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3074 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3075 gtk_widget_grab_default (button);
3077 gtk_widget_show_all (window);
3080 gtk_widget_destroy (window);
3088 create_pixmap (GtkWidget *widget)
3090 static GtkWidget *window = NULL;
3096 GtkWidget *separator;
3097 GtkWidget *pixmapwid;
3101 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3103 gtk_window_set_screen (GTK_WINDOW (window),
3104 gtk_widget_get_screen (widget));
3106 g_signal_connect (window, "destroy",
3107 G_CALLBACK (gtk_widget_destroyed),
3110 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3111 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3112 gtk_widget_realize(window);
3114 box1 = gtk_vbox_new (FALSE, 0);
3115 gtk_container_add (GTK_CONTAINER (window), box1);
3117 box2 = gtk_vbox_new (FALSE, 10);
3118 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3119 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3121 button = gtk_button_new ();
3122 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3124 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3126 label = gtk_label_new ("Pixmap\ntest");
3127 box3 = gtk_hbox_new (FALSE, 0);
3128 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3129 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3130 gtk_container_add (GTK_CONTAINER (box3), label);
3131 gtk_container_add (GTK_CONTAINER (button), box3);
3133 button = gtk_button_new ();
3134 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3136 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3138 label = gtk_label_new ("Pixmap\ntest");
3139 box3 = gtk_hbox_new (FALSE, 0);
3140 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3141 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3142 gtk_container_add (GTK_CONTAINER (box3), label);
3143 gtk_container_add (GTK_CONTAINER (button), box3);
3145 gtk_widget_set_sensitive (button, FALSE);
3147 separator = gtk_hseparator_new ();
3148 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3150 box2 = gtk_vbox_new (FALSE, 10);
3151 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3152 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3154 button = gtk_button_new_with_label ("close");
3155 g_signal_connect_swapped (button, "clicked",
3156 G_CALLBACK (gtk_widget_destroy),
3158 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3159 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3160 gtk_widget_grab_default (button);
3163 if (!GTK_WIDGET_VISIBLE (window))
3164 gtk_widget_show_all (window);
3166 gtk_widget_destroy (window);
3170 tips_query_widget_entered (GtkTipsQuery *tips_query,
3172 const gchar *tip_text,
3173 const gchar *tip_private,
3176 if (GTK_TOGGLE_BUTTON (toggle)->active)
3178 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3179 /* don't let GtkTipsQuery reset its label */
3180 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3185 tips_query_widget_selected (GtkWidget *tips_query,
3187 const gchar *tip_text,
3188 const gchar *tip_private,
3189 GdkEventButton *event,
3193 g_print ("Help \"%s\" requested for <%s>\n",
3194 tip_private ? tip_private : "None",
3195 g_type_name (G_OBJECT_TYPE (widget)));
3200 create_tooltips (GtkWidget *widget)
3202 static GtkWidget *window = NULL;
3209 GtkWidget *tips_query;
3210 GtkWidget *separator;
3211 GtkTooltips *tooltips;
3216 gtk_widget_new (gtk_window_get_type (),
3217 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3218 "GtkContainer::border_width", 0,
3219 "GtkWindow::title", "Tooltips",
3220 "GtkWindow::allow_shrink", TRUE,
3221 "GtkWindow::allow_grow", FALSE,
3224 gtk_window_set_screen (GTK_WINDOW (window),
3225 gtk_widget_get_screen (widget));
3227 g_signal_connect (window, "destroy",
3228 G_CALLBACK (destroy_tooltips),
3231 tooltips=gtk_tooltips_new();
3232 g_object_ref (tooltips);
3233 gtk_object_sink (GTK_OBJECT (tooltips));
3234 g_object_set_data (G_OBJECT (window), "tooltips", tooltips);
3236 box1 = gtk_vbox_new (FALSE, 0);
3237 gtk_container_add (GTK_CONTAINER (window), box1);
3239 box2 = gtk_vbox_new (FALSE, 10);
3240 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3241 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3243 button = gtk_toggle_button_new_with_label ("button1");
3244 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3246 gtk_tooltips_set_tip (tooltips,
3249 "ContextHelp/buttons/1");
3251 button = gtk_toggle_button_new_with_label ("button2");
3252 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3254 gtk_tooltips_set_tip (tooltips,
3256 "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.",
3257 "ContextHelp/buttons/2_long");
3259 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3260 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3262 gtk_tooltips_set_tip (tooltips,
3264 "Toggle TipsQuery view.",
3268 gtk_widget_new (gtk_vbox_get_type (),
3269 "homogeneous", FALSE,
3275 tips_query = gtk_tips_query_new ();
3278 gtk_widget_new (gtk_button_get_type (),
3283 g_object_connect (button,
3284 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3286 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3287 gtk_tooltips_set_tip (tooltips,
3289 "Start the Tooltips Inspector",
3290 "ContextHelp/buttons/?");
3293 g_object_set (g_object_connect (tips_query,
3294 "signal::widget_entered", tips_query_widget_entered, toggle,
3295 "signal::widget_selected", tips_query_widget_selected, NULL,
3302 frame = gtk_widget_new (gtk_frame_get_type (),
3303 "label", "ToolTips Inspector",
3304 "label_xalign", (double) 0.5,
3310 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3312 separator = gtk_hseparator_new ();
3313 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3315 box2 = gtk_vbox_new (FALSE, 10);
3316 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3317 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3319 button = gtk_button_new_with_label ("close");
3320 g_signal_connect_swapped (button, "clicked",
3321 G_CALLBACK (gtk_widget_destroy),
3323 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3324 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3325 gtk_widget_grab_default (button);
3327 gtk_tooltips_set_tip (tooltips, button, "Push this button to close window", "ContextHelp/buttons/Close");
3330 if (!GTK_WIDGET_VISIBLE (window))
3331 gtk_widget_show_all (window);
3333 gtk_widget_destroy (window);
3341 pack_image (GtkWidget *box,
3345 gtk_box_pack_start (GTK_BOX (box),
3346 gtk_label_new (text),
3349 gtk_box_pack_start (GTK_BOX (box),
3355 create_image (GtkWidget *widget)
3357 static GtkWidget *window = NULL;
3365 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3367 gtk_window_set_screen (GTK_WINDOW (window),
3368 gtk_widget_get_screen (widget));
3370 /* this is bogus for testing drawing when allocation < request,
3371 * don't copy into real code
3373 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
3375 g_signal_connect (window, "destroy",
3376 G_CALLBACK (gtk_widget_destroyed),
3379 vbox = gtk_vbox_new (FALSE, 5);
3381 gtk_container_add (GTK_CONTAINER (window), vbox);
3383 pack_image (vbox, "Stock Warning Dialog",
3384 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3385 GTK_ICON_SIZE_DIALOG));
3387 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
3388 gtk_widget_get_colormap (window),
3393 pack_image (vbox, "Pixmap",
3394 gtk_image_new_from_pixmap (pixmap, mask));
3397 if (!GTK_WIDGET_VISIBLE (window))
3398 gtk_widget_show_all (window);
3400 gtk_widget_destroy (window);
3408 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3411 GtkWidget *menuitem;
3420 menu = gtk_menu_new ();
3421 gtk_menu_set_screen (GTK_MENU (menu), screen);
3427 menuitem = gtk_tearoff_menu_item_new ();
3428 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3429 gtk_widget_show (menuitem);
3432 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3433 GTK_ICON_SIZE_MENU);
3434 gtk_widget_show (image);
3435 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3436 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3437 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3438 gtk_widget_show (menuitem);
3440 for (i = 0, j = 1; i < length; i++, j++)
3442 sprintf (buf, "item %2d - %d", depth, j);
3444 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3445 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3449 gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
3452 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3453 gtk_widget_show (menuitem);
3455 gtk_widget_set_sensitive (menuitem, FALSE);
3458 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3462 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3463 create_menu (screen, depth - 1, 5, TRUE));
3470 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3473 GtkWidget *menuitem;
3479 menu = gtk_menu_new ();
3480 gtk_menu_set_screen (GTK_MENU (menu), screen);
3485 menuitem = gtk_tearoff_menu_item_new ();
3486 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3487 gtk_widget_show (menuitem);
3491 menuitem = gtk_menu_item_new_with_label ("items");
3492 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3494 submenu = gtk_menu_new ();
3495 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3496 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3497 gtk_widget_show (menuitem);
3500 /* now fill the items submenu */
3501 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3502 GTK_ICON_SIZE_MENU);
3503 gtk_widget_show (image);
3504 menuitem = gtk_image_menu_item_new_with_label ("Image");
3505 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3506 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3507 gtk_widget_show (menuitem);
3509 menuitem = gtk_menu_item_new_with_label ("x");
3510 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3511 gtk_widget_show (menuitem);
3513 menuitem = gtk_menu_item_new_with_label ("x");
3514 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3515 gtk_widget_show (menuitem);
3517 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3518 GTK_ICON_SIZE_MENU);
3519 gtk_widget_show (image);
3520 menuitem = gtk_image_menu_item_new_with_label ("Image");
3521 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3522 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3523 gtk_widget_show (menuitem);
3525 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3526 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3527 gtk_widget_show (menuitem);
3529 menuitem = gtk_menu_item_new_with_label ("x");
3530 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3531 gtk_widget_show (menuitem);
3533 menuitem = gtk_menu_item_new_with_label ("x");
3534 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3535 gtk_widget_show (menuitem);
3537 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3538 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3539 gtk_widget_show (menuitem);
3541 menuitem = gtk_check_menu_item_new_with_label ("Check");
3542 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3543 gtk_widget_show (menuitem);
3545 menuitem = gtk_menu_item_new_with_label ("x");
3546 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3547 gtk_widget_show (menuitem);
3549 menuitem = gtk_menu_item_new_with_label ("x");
3550 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3551 gtk_widget_show (menuitem);
3553 menuitem = gtk_check_menu_item_new_with_label ("Check");
3554 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3555 gtk_widget_show (menuitem);
3556 /* end of items submenu */
3558 menuitem = gtk_menu_item_new_with_label ("spanning");
3559 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3561 submenu = gtk_menu_new ();
3562 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3563 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3564 gtk_widget_show (menuitem);
3567 /* now fill the spanning submenu */
3568 menuitem = gtk_menu_item_new_with_label ("a");
3569 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3570 gtk_widget_show (menuitem);
3572 menuitem = gtk_menu_item_new_with_label ("b");
3573 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3574 gtk_widget_show (menuitem);
3576 menuitem = gtk_menu_item_new_with_label ("c");
3577 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3578 gtk_widget_show (menuitem);
3580 menuitem = gtk_menu_item_new_with_label ("d");
3581 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3582 gtk_widget_show (menuitem);
3584 menuitem = gtk_menu_item_new_with_label ("e");
3585 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3586 gtk_widget_show (menuitem);
3587 /* end of spanning submenu */
3589 menuitem = gtk_menu_item_new_with_label ("left");
3590 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3591 submenu = gtk_menu_new ();
3592 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3593 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3594 gtk_widget_show (menuitem);
3596 menuitem = gtk_menu_item_new_with_label ("Empty");
3597 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3598 gtk_widget_show (menuitem);
3600 menuitem = gtk_menu_item_new_with_label ("right");
3601 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3602 submenu = gtk_menu_new ();
3603 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3604 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3605 gtk_widget_show (menuitem);
3607 menuitem = gtk_menu_item_new_with_label ("Empty");
3608 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3609 gtk_widget_show (menuitem);
3613 for (; j < rows; j++)
3614 for (i = 0; i < cols; i++)
3616 sprintf (buf, "(%d %d)", i, j);
3617 menuitem = gtk_menu_item_new_with_label (buf);
3618 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3619 gtk_widget_show (menuitem);
3626 create_menus (GtkWidget *widget)
3628 static GtkWidget *window = NULL;
3632 GtkWidget *optionmenu;
3633 GtkWidget *separator;
3639 GtkWidget *menuitem;
3640 GtkAccelGroup *accel_group;
3642 GdkScreen *screen = gtk_widget_get_screen (widget);
3644 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3646 gtk_window_set_screen (GTK_WINDOW (window), screen);
3648 g_signal_connect (window, "destroy",
3649 G_CALLBACK (gtk_widget_destroyed),
3651 g_signal_connect (window, "delete-event",
3652 G_CALLBACK (gtk_true),
3655 accel_group = gtk_accel_group_new ();
3656 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3658 gtk_window_set_title (GTK_WINDOW (window), "menus");
3659 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3662 box1 = gtk_vbox_new (FALSE, 0);
3663 gtk_container_add (GTK_CONTAINER (window), box1);
3664 gtk_widget_show (box1);
3666 menubar = gtk_menu_bar_new ();
3667 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3668 gtk_widget_show (menubar);
3670 menu = create_menu (screen, 2, 50, TRUE);
3672 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3673 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3674 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3675 gtk_widget_show (menuitem);
3677 menu = create_table_menu (screen, 2, 50, TRUE);
3679 menuitem = gtk_menu_item_new_with_label ("table");
3680 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3681 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3682 gtk_widget_show (menuitem);
3684 menuitem = gtk_menu_item_new_with_label ("foo");
3685 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3686 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3687 gtk_widget_show (menuitem);
3689 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3690 GTK_ICON_SIZE_MENU);
3691 gtk_widget_show (image);
3692 menuitem = gtk_image_menu_item_new_with_label ("Help");
3693 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3694 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3695 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3696 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3697 gtk_widget_show (menuitem);
3699 menubar = gtk_menu_bar_new ();
3700 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3701 gtk_widget_show (menubar);
3703 menu = create_menu (screen, 2, 10, TRUE);
3705 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3706 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3707 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3708 gtk_widget_show (menuitem);
3710 box2 = gtk_vbox_new (FALSE, 10);
3711 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3712 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3713 gtk_widget_show (box2);
3715 menu = create_menu (screen, 1, 5, FALSE);
3716 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3718 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3719 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3720 gtk_widget_show (menuitem);
3722 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3723 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3724 gtk_widget_show (menuitem);
3725 gtk_widget_add_accelerator (menuitem,
3731 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3732 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3733 gtk_widget_show (menuitem);
3734 gtk_widget_add_accelerator (menuitem,
3739 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3740 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3741 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3742 gtk_widget_show (menuitem);
3743 gtk_widget_add_accelerator (menuitem,
3749 gtk_widget_add_accelerator (menuitem,
3756 optionmenu = gtk_option_menu_new ();
3757 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
3758 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
3759 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3760 gtk_widget_show (optionmenu);
3762 separator = gtk_hseparator_new ();
3763 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3764 gtk_widget_show (separator);
3766 box2 = gtk_vbox_new (FALSE, 10);
3767 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3768 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3769 gtk_widget_show (box2);
3771 button = gtk_button_new_with_label ("close");
3772 g_signal_connect_swapped (button, "clicked",
3773 G_CALLBACK (gtk_widget_destroy),
3775 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3776 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3777 gtk_widget_grab_default (button);
3778 gtk_widget_show (button);
3781 if (!GTK_WIDGET_VISIBLE (window))
3782 gtk_widget_show (window);
3784 gtk_widget_destroy (window);
3788 gtk_ifactory_cb (gpointer callback_data,
3789 guint callback_action,
3792 g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
3795 /* GdkPixbuf RGBA C-Source image dump */
3797 static const guint8 apple[] =
3799 /* Pixbuf magic (0x47646b50) */
3801 /* length: header (24) + pixel_data (2304) */
3803 /* pixdata_type (0x1010002) */
3805 /* rowstride (96) */
3812 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3813 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3814 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3815 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3816 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3817 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3818 "\0\0\0\0\0\0\0\0\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"
3819 "\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"
3820 "\0\0\0\0\0\0\0\0\0\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"
3821 "[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"
3822 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3823 "\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"
3824 "\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"
3825 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3826 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3827 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3828 "\0\0\0\0\0\0\0\0\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"
3829 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3830 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3831 "\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["
3832 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3833 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3834 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3835 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3836 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3837 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3838 "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"
3839 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3840 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3841 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3842 "\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"
3843 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3844 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3845 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3846 "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"
3847 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3848 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3849 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3850 "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"
3851 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3852 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3853 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3854 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3855 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3856 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3857 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3858 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3859 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3860 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3861 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3862 "\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>"
3863 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3864 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3865 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3866 "\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"
3867 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3868 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3869 "\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"
3870 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3871 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3872 "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"
3873 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3874 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3875 "\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"
3876 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3877 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3878 "\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"
3879 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3880 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3881 "\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"
3882 "\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"
3883 "\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"
3884 "\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"
3885 "\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"
3886 "\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"
3887 "\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"
3888 "\0\0\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"
3889 "\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"
3890 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3894 dump_accels (gpointer callback_data,
3895 guint callback_action,
3898 gtk_accel_map_save_fd (1 /* stdout */);
3901 static GtkItemFactoryEntry menu_items[] =
3903 { "/_File", NULL, 0, 0, "<Branch>" },
3904 { "/File/tearoff1", NULL, gtk_ifactory_cb, 0, "<Tearoff>" },
3905 { "/File/_New", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_NEW },
3906 { "/File/_Open", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
3907 { "/File/_Save", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
3908 { "/File/Save _As...", "<control>A", gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
3909 { "/File/_Dump \"_Accels\"", NULL, dump_accels, 0 },
3910 { "/File/\\/Test__Escaping/And\\/\n\tWei\\\\rdly",
3911 NULL, gtk_ifactory_cb, 0 },
3912 { "/File/sep1", NULL, gtk_ifactory_cb, 0, "<Separator>" },
3913 { "/File/_Quit", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
3915 { "/_Preferences", NULL, 0, 0, "<Branch>" },
3916 { "/_Preferences/_Color", NULL, 0, 0, "<Branch>" },
3917 { "/_Preferences/Color/_Red", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
3918 { "/_Preferences/Color/_Green", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
3919 { "/_Preferences/Color/_Blue", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
3920 { "/_Preferences/_Shape", NULL, 0, 0, "<Branch>" },
3921 { "/_Preferences/Shape/_Square", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
3922 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
3923 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
3924 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
3925 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
3926 { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple },
3927 { "/_Preferences/Coffee", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3928 { "/_Preferences/Toast", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3929 { "/_Preferences/Marshmallow Froot Loops", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3931 /* For testing deletion of menus */
3932 { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
3933 { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
3934 { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
3936 { "/_Help", NULL, 0, 0, "<LastBranch>" },
3937 { "/Help/_Help", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_HELP},
3938 { "/Help/_About", NULL, gtk_ifactory_cb, 0 },
3942 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
3945 create_item_factory (GtkWidget *widget)
3947 static GtkWidget *window = NULL;
3953 GtkWidget *separator;
3956 GtkAccelGroup *accel_group;
3957 GtkItemFactory *item_factory;
3958 GtkTooltips *tooltips;
3960 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3962 gtk_window_set_screen (GTK_WINDOW (window),
3963 gtk_widget_get_screen (widget));
3965 g_signal_connect (window, "destroy",
3966 G_CALLBACK(gtk_widget_destroyed),
3968 g_signal_connect (window, "delete-event",
3969 G_CALLBACK (gtk_true),
3972 accel_group = gtk_accel_group_new ();
3973 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
3974 g_object_set_data_full (G_OBJECT (window),
3978 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3979 gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
3980 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3981 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
3983 /* preselect /Preferences/Shape/Oval over the other radios
3985 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3986 "/Preferences/Shape/Oval")),
3989 /* preselect /Preferences/Coffee
3991 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3992 "/Preferences/Coffee")),
3995 /* preselect /Preferences/Marshmallow Froot Loops and set it insensitive
3997 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3998 "/Preferences/Marshmallow Froot Loops")),
4000 gtk_widget_set_sensitive (GTK_WIDGET (gtk_item_factory_get_item (item_factory,
4001 "/Preferences/Marshmallow Froot Loops")),
4004 /* Test how tooltips (ugh) work on menu items
4006 tooltips = gtk_tooltips_new ();
4007 g_object_ref (tooltips);
4008 gtk_object_sink (GTK_OBJECT (tooltips));
4009 g_object_set_data_full (G_OBJECT (window), "testgtk-tooltips",
4010 tooltips, (GDestroyNotify)g_object_unref);
4012 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/New"),
4013 "Create a new file", NULL);
4014 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Open"),
4015 "Open a file", NULL);
4016 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Save"),
4018 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/Preferences/Color"),
4019 "Modify color", NULL);
4021 box1 = gtk_vbox_new (FALSE, 0);
4022 gtk_container_add (GTK_CONTAINER (window), box1);
4024 gtk_box_pack_start (GTK_BOX (box1),
4025 gtk_item_factory_get_widget (item_factory, "<main>"),
4028 label = gtk_label_new ("Type\n<alt>\nto start");
4029 gtk_widget_set_size_request (label, 200, 200);
4030 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
4031 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
4034 separator = gtk_hseparator_new ();
4035 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4038 box2 = gtk_vbox_new (FALSE, 10);
4039 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4040 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4042 button = gtk_button_new_with_label ("close");
4043 g_signal_connect_swapped (button, "clicked",
4044 G_CALLBACK (gtk_widget_destroy),
4046 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4047 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4048 gtk_widget_grab_default (button);
4050 gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
4052 gtk_widget_show_all (window);
4055 gtk_widget_destroy (window);
4059 accel_button_new (GtkAccelGroup *accel_group,
4064 GdkModifierType modifiers;
4068 gtk_accelerator_parse (accel, &keyval, &modifiers);
4071 button = gtk_button_new ();
4072 gtk_widget_add_accelerator (button, "activate", accel_group,
4073 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
4075 label = gtk_accel_label_new (text);
4076 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
4077 gtk_widget_show (label);
4079 gtk_container_add (GTK_CONTAINER (button), label);
4085 create_key_lookup (GtkWidget *widget)
4087 static GtkWidget *window = NULL;
4091 GtkAccelGroup *accel_group = gtk_accel_group_new ();
4094 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
4095 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
4098 gtk_window_set_screen (GTK_WINDOW (window),
4099 gtk_widget_get_screen (widget));
4101 /* We have to expand it so the accel labels will draw their labels
4103 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
4105 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
4107 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
4108 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4109 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
4110 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4111 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
4112 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4113 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
4114 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4115 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
4116 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4117 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
4118 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4119 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
4120 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4121 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
4122 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4123 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
4124 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4125 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
4126 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
4128 g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
4129 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
4131 gtk_widget_show_all (window);
4134 gtk_widget_destroy (window);
4143 cmw_destroy_cb(GtkWidget *widget)
4145 /* This is needed to get out of gtk_main */
4152 cmw_color (GtkWidget *widget, GtkWidget *parent)
4156 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
4158 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
4160 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4164 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4166 /* And mark it as a transient dialog */
4167 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4169 g_signal_connect (csd, "destroy",
4170 G_CALLBACK (cmw_destroy_cb), NULL);
4172 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4173 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4174 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4175 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4177 /* wait until destroy calls gtk_main_quit */
4178 gtk_widget_show (csd);
4183 cmw_file (GtkWidget *widget, GtkWidget *parent)
4187 fs = gtk_file_selection_new("This is a modal file selection dialog");
4189 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4192 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4194 /* And mark it as a transient dialog */
4195 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4197 g_signal_connect (fs, "destroy",
4198 G_CALLBACK (cmw_destroy_cb), NULL);
4200 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4201 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4202 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4203 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4205 /* wait until destroy calls gtk_main_quit */
4206 gtk_widget_show (fs);
4213 create_modal_window (GtkWidget *widget)
4215 GtkWidget *window = NULL;
4216 GtkWidget *box1,*box2;
4218 GtkWidget *btnColor,*btnFile,*btnClose;
4220 /* Create modal window (Here you can use any window descendent )*/
4221 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4222 gtk_window_set_screen (GTK_WINDOW (window),
4223 gtk_widget_get_screen (widget));
4225 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4227 /* Set window as modal */
4228 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4230 /* Create widgets */
4231 box1 = gtk_vbox_new (FALSE,5);
4232 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4233 box2 = gtk_vbox_new (TRUE,5);
4234 btnColor = gtk_button_new_with_label ("Color");
4235 btnFile = gtk_button_new_with_label ("File Selection");
4236 btnClose = gtk_button_new_with_label ("Close");
4239 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4240 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4243 gtk_container_add (GTK_CONTAINER (window), box1);
4244 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4245 gtk_container_add (GTK_CONTAINER (frame1), box2);
4246 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4247 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4248 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4249 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4251 /* connect signals */
4252 g_signal_connect_swapped (btnClose, "clicked",
4253 G_CALLBACK (gtk_widget_destroy), window);
4255 g_signal_connect (window, "destroy",
4256 G_CALLBACK (cmw_destroy_cb), NULL);
4258 g_signal_connect (btnColor, "clicked",
4259 G_CALLBACK (cmw_color), window);
4260 g_signal_connect (btnFile, "clicked",
4261 G_CALLBACK (cmw_file), window);
4264 gtk_widget_show_all (window);
4266 /* wait until dialog get destroyed */
4275 make_message_dialog (GdkScreen *screen,
4277 GtkMessageType type,
4278 GtkButtonsType buttons,
4279 guint default_response)
4283 gtk_widget_destroy (*dialog);
4288 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4289 "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.)");
4291 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4293 g_signal_connect_swapped (*dialog,
4295 G_CALLBACK (gtk_widget_destroy),
4298 g_signal_connect (*dialog,
4300 G_CALLBACK (gtk_widget_destroyed),
4303 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4305 gtk_widget_show (*dialog);
4309 create_message_dialog (GtkWidget *widget)
4311 static GtkWidget *info = NULL;
4312 static GtkWidget *warning = NULL;
4313 static GtkWidget *error = NULL;
4314 static GtkWidget *question = NULL;
4315 GdkScreen *screen = gtk_widget_get_screen (widget);
4317 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4318 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_OK);
4319 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4320 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_YES);
4327 static GtkWidget *sw_parent = NULL;
4328 static GtkWidget *sw_float_parent;
4329 static guint sw_destroyed_handler = 0;
4332 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4334 gtk_widget_reparent (scrollwin, sw_parent);
4336 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4337 sw_float_parent = NULL;
4339 sw_destroyed_handler = 0;
4345 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4347 gtk_widget_destroy (sw_float_parent);
4349 sw_float_parent = NULL;
4351 sw_destroyed_handler = 0;
4355 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4359 gtk_widget_reparent (scrollwin, sw_parent);
4360 gtk_widget_destroy (sw_float_parent);
4362 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4363 sw_float_parent = NULL;
4365 sw_destroyed_handler = 0;
4369 sw_parent = scrollwin->parent;
4370 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4371 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4372 gtk_widget_get_screen (widget));
4374 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4376 gtk_widget_reparent (scrollwin, sw_float_parent);
4377 gtk_widget_show (sw_float_parent);
4379 sw_destroyed_handler =
4380 g_signal_connect (sw_parent, "destroy",
4381 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4382 g_signal_connect (sw_float_parent, "delete_event",
4383 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4388 create_scrolled_windows (GtkWidget *widget)
4390 static GtkWidget *window;
4391 GtkWidget *scrolled_window;
4399 window = gtk_dialog_new ();
4401 gtk_window_set_screen (GTK_WINDOW (window),
4402 gtk_widget_get_screen (widget));
4404 g_signal_connect (window, "destroy",
4405 G_CALLBACK (gtk_widget_destroyed),
4408 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4409 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4412 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4413 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4414 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4415 GTK_POLICY_AUTOMATIC,
4416 GTK_POLICY_AUTOMATIC);
4417 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
4418 scrolled_window, TRUE, TRUE, 0);
4419 gtk_widget_show (scrolled_window);
4421 table = gtk_table_new (20, 20, FALSE);
4422 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4423 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4424 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4425 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4426 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4427 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4428 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4429 gtk_widget_show (table);
4431 for (i = 0; i < 20; i++)
4432 for (j = 0; j < 20; j++)
4434 sprintf (buffer, "button (%d,%d)\n", i, j);
4435 button = gtk_toggle_button_new_with_label (buffer);
4436 gtk_table_attach_defaults (GTK_TABLE (table), button,
4438 gtk_widget_show (button);
4442 button = gtk_button_new_with_label ("Close");
4443 g_signal_connect_swapped (button, "clicked",
4444 G_CALLBACK (gtk_widget_destroy),
4446 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4447 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4448 button, TRUE, TRUE, 0);
4449 gtk_widget_grab_default (button);
4450 gtk_widget_show (button);
4452 button = gtk_button_new_with_label ("Reparent Out");
4453 g_signal_connect (button, "clicked",
4454 G_CALLBACK (scrolled_windows_remove),
4456 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4457 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4458 button, TRUE, TRUE, 0);
4459 gtk_widget_grab_default (button);
4460 gtk_widget_show (button);
4462 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4465 if (!GTK_WIDGET_VISIBLE (window))
4466 gtk_widget_show (window);
4468 gtk_widget_destroy (window);
4476 entry_toggle_frame (GtkWidget *checkbutton,
4479 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4480 GTK_TOGGLE_BUTTON(checkbutton)->active);
4484 entry_toggle_sensitive (GtkWidget *checkbutton,
4487 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4491 entry_props_clicked (GtkWidget *button,
4494 GtkWidget *window = create_prop_editor (entry, 0);
4496 gtk_window_set_title (GTK_WINDOW (window), "Entry Properties");
4500 create_entry (GtkWidget *widget)
4502 static GtkWidget *window = NULL;
4506 GtkWidget *has_frame_check;
4507 GtkWidget *sensitive_check;
4508 GtkWidget *entry, *cb;
4510 GtkWidget *separator;
4511 GList *cbitems = NULL;
4515 cbitems = g_list_append(cbitems, "item0");
4516 cbitems = g_list_append(cbitems, "item1 item1");
4517 cbitems = g_list_append(cbitems, "item2 item2 item2");
4518 cbitems = g_list_append(cbitems, "item3 item3 item3 item3");
4519 cbitems = g_list_append(cbitems, "item4 item4 item4 item4 item4");
4520 cbitems = g_list_append(cbitems, "item5 item5 item5 item5 item5 item5");
4521 cbitems = g_list_append(cbitems, "item6 item6 item6 item6 item6");
4522 cbitems = g_list_append(cbitems, "item7 item7 item7 item7");
4523 cbitems = g_list_append(cbitems, "item8 item8 item8");
4524 cbitems = g_list_append(cbitems, "item9 item9");
4526 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4527 gtk_window_set_screen (GTK_WINDOW (window),
4528 gtk_widget_get_screen (widget));
4530 g_signal_connect (window, "destroy",
4531 G_CALLBACK (gtk_widget_destroyed),
4534 gtk_window_set_title (GTK_WINDOW (window), "entry");
4535 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4538 box1 = gtk_vbox_new (FALSE, 0);
4539 gtk_container_add (GTK_CONTAINER (window), box1);
4542 box2 = gtk_vbox_new (FALSE, 10);
4543 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4544 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4546 hbox = gtk_hbox_new (FALSE, 5);
4547 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4549 entry = gtk_entry_new ();
4550 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");
4551 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4552 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4554 button = gtk_button_new_with_mnemonic ("_Props");
4555 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4556 g_signal_connect (button, "clicked",
4557 G_CALLBACK (entry_props_clicked),
4560 cb = gtk_combo_new ();
4561 gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
4562 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO(cb)->entry), "hello world \n\n\n foo");
4563 gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry),
4565 gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0);
4567 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4568 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4569 g_signal_connect (sensitive_check, "toggled",
4570 G_CALLBACK (entry_toggle_sensitive), entry);
4571 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4573 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4574 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4575 g_signal_connect (has_frame_check, "toggled",
4576 G_CALLBACK (entry_toggle_frame), entry);
4577 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4579 separator = gtk_hseparator_new ();
4580 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4582 box2 = gtk_vbox_new (FALSE, 10);
4583 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4584 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4586 button = gtk_button_new_with_label ("close");
4587 g_signal_connect_swapped (button, "clicked",
4588 G_CALLBACK (gtk_widget_destroy),
4590 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4591 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4592 gtk_widget_grab_default (button);
4595 if (!GTK_WIDGET_VISIBLE (window))
4596 gtk_widget_show_all (window);
4598 gtk_widget_destroy (window);
4605 event_box_label_pressed (GtkWidget *widget,
4606 GdkEventButton *event,
4609 g_print ("clicked on event box\n");
4613 event_box_button_clicked (GtkWidget *widget,
4617 g_print ("pushed button\n");
4621 event_box_toggle_visible_window (GtkWidget *checkbutton,
4622 GtkEventBox *event_box)
4624 gtk_event_box_set_visible_window (event_box,
4625 GTK_TOGGLE_BUTTON(checkbutton)->active);
4629 event_box_toggle_above_child (GtkWidget *checkbutton,
4630 GtkEventBox *event_box)
4632 gtk_event_box_set_above_child (event_box,
4633 GTK_TOGGLE_BUTTON(checkbutton)->active);
4637 create_event_box (GtkWidget *widget)
4639 static GtkWidget *window = NULL;
4645 GtkWidget *separator;
4646 GtkWidget *event_box;
4648 GtkWidget *visible_window_check;
4649 GtkWidget *above_child_check;
4658 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4659 gtk_window_set_screen (GTK_WINDOW (window),
4660 gtk_widget_get_screen (widget));
4662 g_signal_connect (window, "destroy",
4663 G_CALLBACK (gtk_widget_destroyed),
4666 gtk_window_set_title (GTK_WINDOW (window), "event box");
4667 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4669 box1 = gtk_vbox_new (FALSE, 0);
4670 gtk_container_add (GTK_CONTAINER (window), box1);
4671 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4673 hbox = gtk_hbox_new (FALSE, 0);
4674 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4676 event_box = gtk_event_box_new ();
4677 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4679 vbox = gtk_vbox_new (FALSE, 0);
4680 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4681 g_signal_connect (event_box, "button_press_event",
4682 G_CALLBACK (event_box_label_pressed),
4685 label = gtk_label_new ("Click on this label");
4686 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4688 button = gtk_button_new_with_label ("button in eventbox");
4689 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4690 g_signal_connect (button, "clicked",
4691 G_CALLBACK (event_box_button_clicked),
4695 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4696 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4697 g_signal_connect (visible_window_check, "toggled",
4698 G_CALLBACK (event_box_toggle_visible_window), event_box);
4699 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4701 above_child_check = gtk_check_button_new_with_label("Above Child");
4702 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4703 g_signal_connect (above_child_check, "toggled",
4704 G_CALLBACK (event_box_toggle_above_child), event_box);
4705 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4707 separator = gtk_hseparator_new ();
4708 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4710 box2 = gtk_vbox_new (FALSE, 10);
4711 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4712 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4714 button = gtk_button_new_with_label ("close");
4715 g_signal_connect_swapped (button, "clicked",
4716 G_CALLBACK (gtk_widget_destroy),
4718 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4719 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4720 gtk_widget_grab_default (button);
4723 if (!GTK_WIDGET_VISIBLE (window))
4724 gtk_widget_show_all (window);
4726 gtk_widget_destroy (window);
4734 #define SIZE_GROUP_INITIAL_SIZE 50
4737 size_group_hsize_changed (GtkSpinButton *spin_button,
4740 gtk_widget_set_size_request (GTK_BIN (button)->child,
4741 gtk_spin_button_get_value_as_int (spin_button),
4746 size_group_vsize_changed (GtkSpinButton *spin_button,
4749 gtk_widget_set_size_request (GTK_BIN (button)->child,
4751 gtk_spin_button_get_value_as_int (spin_button));
4755 create_size_group_window (GdkScreen *screen,
4756 GtkSizeGroup *master_size_group)
4760 GtkWidget *main_button;
4762 GtkWidget *spin_button;
4764 GtkSizeGroup *hgroup1;
4765 GtkSizeGroup *hgroup2;
4766 GtkSizeGroup *vgroup1;
4767 GtkSizeGroup *vgroup2;
4769 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4775 gtk_window_set_screen (GTK_WINDOW (window), screen);
4777 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
4779 g_signal_connect (window, "response",
4780 G_CALLBACK (gtk_widget_destroy),
4783 table = gtk_table_new (2, 2, FALSE);
4784 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
4786 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4787 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4788 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4789 gtk_widget_set_size_request (table, 250, 250);
4791 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4792 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4793 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4794 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4796 main_button = gtk_button_new_with_label ("X");
4798 gtk_table_attach (GTK_TABLE (table), main_button,
4800 GTK_EXPAND, GTK_EXPAND,
4802 gtk_size_group_add_widget (master_size_group, main_button);
4803 gtk_size_group_add_widget (hgroup1, main_button);
4804 gtk_size_group_add_widget (vgroup1, main_button);
4805 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
4806 SIZE_GROUP_INITIAL_SIZE,
4807 SIZE_GROUP_INITIAL_SIZE);
4809 button = gtk_button_new ();
4810 gtk_table_attach (GTK_TABLE (table), button,
4812 GTK_EXPAND, GTK_EXPAND,
4814 gtk_size_group_add_widget (vgroup1, button);
4815 gtk_size_group_add_widget (vgroup2, button);
4817 button = gtk_button_new ();
4818 gtk_table_attach (GTK_TABLE (table), button,
4820 GTK_EXPAND, GTK_EXPAND,
4822 gtk_size_group_add_widget (hgroup1, button);
4823 gtk_size_group_add_widget (hgroup2, button);
4825 button = gtk_button_new ();
4826 gtk_table_attach (GTK_TABLE (table), button,
4828 GTK_EXPAND, GTK_EXPAND,
4830 gtk_size_group_add_widget (hgroup2, button);
4831 gtk_size_group_add_widget (vgroup2, button);
4833 g_object_unref (hgroup1);
4834 g_object_unref (hgroup2);
4835 g_object_unref (vgroup1);
4836 g_object_unref (vgroup2);
4838 hbox = gtk_hbox_new (FALSE, 5);
4839 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
4841 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4842 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4843 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4844 g_signal_connect (spin_button, "value_changed",
4845 G_CALLBACK (size_group_hsize_changed), main_button);
4847 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4848 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4849 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4850 g_signal_connect (spin_button, "value_changed",
4851 G_CALLBACK (size_group_vsize_changed), main_button);
4857 create_size_groups (GtkWidget *widget)
4859 static GtkWidget *window1 = NULL;
4860 static GtkWidget *window2 = NULL;
4861 static GtkSizeGroup *master_size_group;
4863 if (!master_size_group)
4864 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4868 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4871 g_signal_connect (window1, "destroy",
4872 G_CALLBACK (gtk_widget_destroyed),
4878 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4881 g_signal_connect (window2, "destroy",
4882 G_CALLBACK (gtk_widget_destroyed),
4886 if (GTK_WIDGET_VISIBLE (window1) && GTK_WIDGET_VISIBLE (window2))
4888 gtk_widget_destroy (window1);
4889 gtk_widget_destroy (window2);
4893 if (!GTK_WIDGET_VISIBLE (window1))
4894 gtk_widget_show_all (window1);
4895 if (!GTK_WIDGET_VISIBLE (window2))
4896 gtk_widget_show_all (window2);
4904 static GtkWidget *spinner1;
4907 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4909 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
4913 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4915 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
4919 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4921 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4922 gtk_spin_button_get_value_as_int (spin));
4926 get_value (GtkWidget *widget, gpointer data)
4930 GtkSpinButton *spin;
4932 spin = GTK_SPIN_BUTTON (spinner1);
4933 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4934 if (GPOINTER_TO_INT (data) == 1)
4935 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4937 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
4938 gtk_label_set_text (label, buf);
4942 get_spin_value (GtkWidget *widget, gpointer data)
4946 GtkSpinButton *spin;
4948 spin = GTK_SPIN_BUTTON (widget);
4949 label = GTK_LABEL (data);
4951 buffer = g_strdup_printf ("%0.*f", spin->digits,
4952 gtk_spin_button_get_value (spin));
4953 gtk_label_set_text (label, buffer);
4959 spin_button_time_output_func (GtkSpinButton *spin_button)
4961 static gchar buf[6];
4965 hours = spin_button->adjustment->value / 60.0;
4966 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4967 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4968 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4969 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4974 spin_button_month_input_func (GtkSpinButton *spin_button,
4978 static gchar *month[12] = { "January", "February", "March", "April",
4979 "May", "June", "July", "August",
4980 "September", "October", "November", "December" };
4982 gboolean found = FALSE;
4984 for (i = 1; i <= 12; i++)
4986 tmp1 = g_ascii_strup (month[i - 1], -1);
4987 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4988 if (strstr (tmp1, tmp2) == tmp1)
4998 return GTK_INPUT_ERROR;
5000 *new_val = (gdouble) i;
5005 spin_button_month_output_func (GtkSpinButton *spin_button)
5008 static gchar *month[12] = { "January", "February", "March", "April",
5009 "May", "June", "July", "August", "September",
5010 "October", "November", "December" };
5012 for (i = 1; i <= 12; i++)
5013 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
5015 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
5016 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
5022 spin_button_hex_input_func (GtkSpinButton *spin_button,
5029 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
5030 res = strtol(buf, &err, 16);
5033 return GTK_INPUT_ERROR;
5039 spin_button_hex_output_func (GtkSpinButton *spin_button)
5041 static gchar buf[7];
5044 val = (gint) spin_button->adjustment->value;
5045 if (fabs (val) < 1e-5)
5046 sprintf (buf, "0x00");
5048 sprintf (buf, "0x%.2X", val);
5049 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
5050 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
5055 create_spins (GtkWidget *widget)
5057 static GtkWidget *window = NULL;
5060 GtkWidget *main_vbox;
5063 GtkWidget *spinner2;
5067 GtkWidget *val_label;
5072 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5073 gtk_window_set_screen (GTK_WINDOW (window),
5074 gtk_widget_get_screen (widget));
5076 g_signal_connect (window, "destroy",
5077 G_CALLBACK (gtk_widget_destroyed),
5080 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
5082 main_vbox = gtk_vbox_new (FALSE, 5);
5083 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
5084 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5086 frame = gtk_frame_new ("Not accelerated");
5087 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5089 vbox = gtk_vbox_new (FALSE, 0);
5090 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5091 gtk_container_add (GTK_CONTAINER (frame), vbox);
5093 /* Time, month, hex spinners */
5095 hbox = gtk_hbox_new (FALSE, 0);
5096 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
5098 vbox2 = gtk_vbox_new (FALSE, 0);
5099 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5101 label = gtk_label_new ("Time :");
5102 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5103 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5105 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
5106 spinner = gtk_spin_button_new (adj, 0, 0);
5107 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
5108 g_signal_connect (spinner,
5110 G_CALLBACK (spin_button_time_output_func),
5112 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5113 gtk_widget_set_size_request (spinner, 55, -1);
5114 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5116 vbox2 = gtk_vbox_new (FALSE, 0);
5117 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5119 label = gtk_label_new ("Month :");
5120 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5121 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5123 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
5125 spinner = gtk_spin_button_new (adj, 0, 0);
5126 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
5127 GTK_UPDATE_IF_VALID);
5128 g_signal_connect (spinner,
5130 G_CALLBACK (spin_button_month_input_func),
5132 g_signal_connect (spinner,
5134 G_CALLBACK (spin_button_month_output_func),
5136 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5137 gtk_widget_set_size_request (spinner, 85, -1);
5138 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5140 vbox2 = gtk_vbox_new (FALSE, 0);
5141 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
5143 label = gtk_label_new ("Hex :");
5144 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5145 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5147 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
5148 spinner = gtk_spin_button_new (adj, 0, 0);
5149 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
5150 g_signal_connect (spinner,
5152 G_CALLBACK (spin_button_hex_input_func),
5154 g_signal_connect (spinner,
5156 G_CALLBACK (spin_button_hex_output_func),
5158 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
5159 gtk_widget_set_size_request (spinner, 55, -1);
5160 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
5162 frame = gtk_frame_new ("Accelerated");
5163 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5165 vbox = gtk_vbox_new (FALSE, 0);
5166 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
5167 gtk_container_add (GTK_CONTAINER (frame), vbox);
5169 hbox = gtk_hbox_new (FALSE, 0);
5170 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5172 vbox2 = gtk_vbox_new (FALSE, 0);
5173 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5175 label = gtk_label_new ("Value :");
5176 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5177 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5179 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
5181 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
5182 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
5183 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
5185 vbox2 = gtk_vbox_new (FALSE, 0);
5186 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
5188 label = gtk_label_new ("Digits :");
5189 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5190 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
5192 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
5193 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
5194 g_signal_connect (adj, "value_changed",
5195 G_CALLBACK (change_digits),
5197 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
5199 hbox = gtk_hbox_new (FALSE, 0);
5200 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
5202 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
5203 g_signal_connect (button, "clicked",
5204 G_CALLBACK (toggle_snap),
5206 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5207 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5209 button = gtk_check_button_new_with_label ("Numeric only input mode");
5210 g_signal_connect (button, "clicked",
5211 G_CALLBACK (toggle_numeric),
5213 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
5214 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
5216 val_label = gtk_label_new ("");
5218 hbox = gtk_hbox_new (FALSE, 0);
5219 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
5221 button = gtk_button_new_with_label ("Value as Int");
5222 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5223 g_signal_connect (button, "clicked",
5224 G_CALLBACK (get_value),
5225 GINT_TO_POINTER (1));
5226 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5228 button = gtk_button_new_with_label ("Value as Float");
5229 g_object_set_data (G_OBJECT (button), "user_data", val_label);
5230 g_signal_connect (button, "clicked",
5231 G_CALLBACK (get_value),
5232 GINT_TO_POINTER (2));
5233 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5235 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
5236 gtk_label_set_text (GTK_LABEL (val_label), "0");
5238 frame = gtk_frame_new ("Using Convenience Constructor");
5239 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
5241 hbox = gtk_hbox_new (FALSE, 0);
5242 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5243 gtk_container_add (GTK_CONTAINER (frame), hbox);
5245 val_label = gtk_label_new ("0.0");
5247 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
5248 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
5249 g_signal_connect (spinner, "value_changed",
5250 G_CALLBACK (get_spin_value), val_label);
5251 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
5252 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
5254 hbox = gtk_hbox_new (FALSE, 0);
5255 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5257 button = gtk_button_new_with_label ("Close");
5258 g_signal_connect_swapped (button, "clicked",
5259 G_CALLBACK (gtk_widget_destroy),
5261 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5264 if (!GTK_WIDGET_VISIBLE (window))
5265 gtk_widget_show_all (window);
5267 gtk_widget_destroy (window);
5276 cursor_expose_event (GtkWidget *widget,
5280 GtkDrawingArea *darea;
5281 GdkDrawable *drawable;
5288 g_return_val_if_fail (widget != NULL, TRUE);
5289 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5291 darea = GTK_DRAWING_AREA (widget);
5292 drawable = widget->window;
5293 white_gc = widget->style->white_gc;
5294 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5295 black_gc = widget->style->black_gc;
5296 max_width = widget->allocation.width;
5297 max_height = widget->allocation.height;
5299 gdk_draw_rectangle (drawable, white_gc,
5306 gdk_draw_rectangle (drawable, black_gc,
5313 gdk_draw_rectangle (drawable, gray_gc,
5324 set_cursor (GtkWidget *spinner,
5333 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5336 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5338 class = gtk_type_class (GDK_TYPE_CURSOR_TYPE);
5339 vals = class->values;
5341 while (vals && vals->value != c)
5344 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5346 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5348 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5349 gdk_window_set_cursor (widget->window, cursor);
5350 gdk_cursor_unref (cursor);
5354 cursor_event (GtkWidget *widget,
5356 GtkSpinButton *spinner)
5358 if ((event->type == GDK_BUTTON_PRESS) &&
5359 ((event->button.button == 1) ||
5360 (event->button.button == 3)))
5362 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5363 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5371 create_cursors (GtkWidget *widget)
5373 static GtkWidget *window = NULL;
5376 GtkWidget *main_vbox;
5387 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5388 gtk_window_set_screen (GTK_WINDOW (window),
5389 gtk_widget_get_screen (widget));
5391 g_signal_connect (window, "destroy",
5392 G_CALLBACK (gtk_widget_destroyed),
5395 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5397 main_vbox = gtk_vbox_new (FALSE, 5);
5398 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5399 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5402 gtk_widget_new (gtk_vbox_get_type (),
5403 "GtkBox::homogeneous", FALSE,
5404 "GtkBox::spacing", 5,
5405 "GtkContainer::border_width", 10,
5406 "GtkWidget::parent", main_vbox,
5407 "GtkWidget::visible", TRUE,
5410 hbox = gtk_hbox_new (FALSE, 0);
5411 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5412 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5414 label = gtk_label_new ("Cursor Value : ");
5415 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5416 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5418 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5422 spinner = gtk_spin_button_new (adj, 0, 0);
5423 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5426 gtk_widget_new (gtk_frame_get_type (),
5427 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5428 "GtkFrame::label_xalign", 0.5,
5429 "GtkFrame::label", "Cursor Area",
5430 "GtkContainer::border_width", 10,
5431 "GtkWidget::parent", vbox,
5432 "GtkWidget::visible", TRUE,
5435 darea = gtk_drawing_area_new ();
5436 gtk_widget_set_size_request (darea, 80, 80);
5437 gtk_container_add (GTK_CONTAINER (frame), darea);
5438 g_signal_connect (darea,
5440 G_CALLBACK (cursor_expose_event),
5442 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5443 g_signal_connect (darea,
5444 "button_press_event",
5445 G_CALLBACK (cursor_event),
5447 gtk_widget_show (darea);
5449 g_signal_connect (spinner, "changed",
5450 G_CALLBACK (set_cursor),
5453 label = gtk_widget_new (GTK_TYPE_LABEL,
5458 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5461 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5464 gtk_widget_new (gtk_hseparator_get_type (),
5465 "GtkWidget::visible", TRUE,
5467 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5469 hbox = gtk_hbox_new (FALSE, 0);
5470 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5471 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5473 button = gtk_button_new_with_label ("Close");
5474 g_signal_connect_swapped (button, "clicked",
5475 G_CALLBACK (gtk_widget_destroy),
5477 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5479 gtk_widget_show_all (window);
5481 set_cursor (spinner, darea);
5484 gtk_widget_destroy (window);
5492 list_add (GtkWidget *widget,
5497 GtkWidget *list_item;
5498 GtkContainer *container;
5500 container = GTK_CONTAINER (list);
5502 sprintf (buffer, "added item %d", i++);
5503 list_item = gtk_list_item_new_with_label (buffer);
5504 gtk_widget_show (list_item);
5506 gtk_container_add (container, list_item);
5510 list_remove (GtkWidget *widget,
5513 GList *clear_list = NULL;
5514 GList *sel_row = NULL;
5517 if (list->selection_mode == GTK_SELECTION_EXTENDED)
5521 item = GTK_CONTAINER (list)->focus_child;
5522 if (!item && list->selection)
5523 item = list->selection->data;
5527 work = g_list_find (list->children, item);
5528 for (sel_row = work; sel_row; sel_row = sel_row->next)
5529 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
5534 for (sel_row = work; sel_row; sel_row = sel_row->prev)
5535 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
5541 for (work = list->selection; work; work = work->next)
5542 clear_list = g_list_prepend (clear_list, work->data);
5544 clear_list = g_list_reverse (clear_list);
5545 gtk_list_remove_items (GTK_LIST (list), clear_list);
5546 g_list_free (clear_list);
5548 if (list->selection_mode == GTK_SELECTION_EXTENDED && sel_row)
5549 gtk_list_select_child (list, GTK_WIDGET(sel_row->data));
5553 list_clear (GtkWidget *widget,
5556 gtk_list_clear_items (GTK_LIST (list), 0, -1);
5559 static gchar *selection_mode_items[] =
5566 static const GtkSelectionMode selection_modes[] = {
5567 GTK_SELECTION_SINGLE,
5568 GTK_SELECTION_BROWSE,
5569 GTK_SELECTION_MULTIPLE
5572 static GtkWidget *list_omenu;
5575 list_toggle_sel_mode (GtkWidget *widget, gpointer data)
5580 list = GTK_LIST (data);
5582 if (!GTK_WIDGET_MAPPED (widget))
5585 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
5587 gtk_list_set_selection_mode (list, selection_modes[i]);
5591 create_list (GtkWidget *widget)
5593 static GtkWidget *window = NULL;
5601 GtkWidget *scrolled_win;
5604 GtkWidget *separator;
5607 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5609 gtk_window_set_screen (GTK_WINDOW (window),
5610 gtk_widget_get_screen (widget));
5612 g_signal_connect (window, "destroy",
5613 G_CALLBACK (gtk_widget_destroyed),
5616 gtk_window_set_title (GTK_WINDOW (window), "list");
5617 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5619 vbox = gtk_vbox_new (FALSE, 0);
5620 gtk_container_add (GTK_CONTAINER (window), vbox);
5622 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
5623 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
5624 gtk_widget_set_size_request (scrolled_win, -1, 300);
5625 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
5626 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
5627 GTK_POLICY_AUTOMATIC,
5628 GTK_POLICY_AUTOMATIC);
5630 list = gtk_list_new ();
5631 gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE);
5632 gtk_scrolled_window_add_with_viewport
5633 (GTK_SCROLLED_WINDOW (scrolled_win), list);
5634 gtk_container_set_focus_vadjustment
5635 (GTK_CONTAINER (list),
5636 gtk_scrolled_window_get_vadjustment
5637 (GTK_SCROLLED_WINDOW (scrolled_win)));
5638 gtk_container_set_focus_hadjustment
5639 (GTK_CONTAINER (list),
5640 gtk_scrolled_window_get_hadjustment
5641 (GTK_SCROLLED_WINDOW (scrolled_win)));
5643 if ((infile = fopen("../gtk/gtkenums.h", "r")))
5649 while (fgets (buffer, 256, infile))
5651 if ((pos = strchr (buffer, '\n')))
5653 item = gtk_list_item_new_with_label (buffer);
5654 gtk_container_add (GTK_CONTAINER (list), item);
5661 hbox = gtk_hbox_new (TRUE, 5);
5662 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5663 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5665 button = gtk_button_new_with_label ("Insert Row");
5666 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5667 g_signal_connect (button, "clicked",
5668 G_CALLBACK (list_add),
5671 button = gtk_button_new_with_label ("Clear List");
5672 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5673 g_signal_connect (button, "clicked",
5674 G_CALLBACK (list_clear),
5677 button = gtk_button_new_with_label ("Remove Selection");
5678 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5679 g_signal_connect (button, "clicked",
5680 G_CALLBACK (list_remove),
5683 cbox = gtk_hbox_new (FALSE, 0);
5684 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
5686 hbox = gtk_hbox_new (FALSE, 5);
5687 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5688 gtk_box_pack_start (GTK_BOX (cbox), hbox, TRUE, FALSE, 0);
5690 label = gtk_label_new ("Selection Mode :");
5691 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5693 list_omenu = build_option_menu (selection_mode_items, 3, 3,
5694 list_toggle_sel_mode,
5696 gtk_box_pack_start (GTK_BOX (hbox), list_omenu, FALSE, TRUE, 0);
5698 separator = gtk_hseparator_new ();
5699 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
5701 cbox = gtk_hbox_new (FALSE, 0);
5702 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
5704 button = gtk_button_new_with_label ("close");
5705 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5706 gtk_box_pack_start (GTK_BOX (cbox), button, TRUE, TRUE, 0);
5707 g_signal_connect_swapped (button, "clicked",
5708 G_CALLBACK (gtk_widget_destroy),
5711 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5712 gtk_widget_grab_default (button);
5715 if (!GTK_WIDGET_VISIBLE (window))
5716 gtk_widget_show_all (window);
5718 gtk_widget_destroy (window);
5725 static char * book_open_xpm[] = {
5748 static char * book_closed_xpm[] = {
5773 static char * mini_page_xpm[] = {
5796 static char * gtk_mini_xpm[] = {
5836 #define TESTGTK_CLIST_COLUMNS 12
5837 static gint clist_rows = 0;
5838 static GtkWidget *clist_omenu;
5841 add1000_clist (GtkWidget *widget, gpointer data)
5844 char text[TESTGTK_CLIST_COLUMNS][50];
5845 char *texts[TESTGTK_CLIST_COLUMNS];
5850 clist = GTK_CLIST (data);
5852 pixmap = gdk_pixmap_create_from_xpm_d (clist->clist_window,
5854 >K_WIDGET (data)->style->white,
5857 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5860 sprintf (text[i], "Column %d", i);
5864 sprintf (text[1], "Right");
5865 sprintf (text[2], "Center");
5867 gtk_clist_freeze (GTK_CLIST (data));
5868 for (i = 0; i < 1000; i++)
5870 sprintf (text[0], "CListRow %d", rand() % 10000);
5871 row = gtk_clist_append (clist, texts);
5872 gtk_clist_set_pixtext (clist, row, 3, "gtk+", 5, pixmap, mask);
5875 gtk_clist_thaw (GTK_CLIST (data));
5877 g_object_unref (pixmap);
5878 g_object_unref (mask);
5882 add10000_clist (GtkWidget *widget, gpointer data)
5885 char text[TESTGTK_CLIST_COLUMNS][50];
5886 char *texts[TESTGTK_CLIST_COLUMNS];
5888 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5891 sprintf (text[i], "Column %d", i);
5894 sprintf (text[1], "Right");
5895 sprintf (text[2], "Center");
5897 gtk_clist_freeze (GTK_CLIST (data));
5898 for (i = 0; i < 10000; i++)
5900 sprintf (text[0], "CListRow %d", rand() % 10000);
5901 gtk_clist_append (GTK_CLIST (data), texts);
5903 gtk_clist_thaw (GTK_CLIST (data));
5907 clear_clist (GtkWidget *widget, gpointer data)
5909 gtk_clist_clear (GTK_CLIST (data));
5913 void clist_remove_selection (GtkWidget *widget, GtkCList *clist)
5915 gtk_clist_freeze (clist);
5917 while (clist->selection)
5922 row = GPOINTER_TO_INT (clist->selection->data);
5924 gtk_clist_remove (clist, row);
5926 if (clist->selection_mode == GTK_SELECTION_BROWSE)
5930 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
5931 clist->focus_row >= 0)
5932 gtk_clist_select_row (clist, clist->focus_row, -1);
5934 gtk_clist_thaw (clist);
5937 void toggle_title_buttons (GtkWidget *widget, GtkCList *clist)
5939 if (GTK_TOGGLE_BUTTON (widget)->active)
5940 gtk_clist_column_titles_show (clist);
5942 gtk_clist_column_titles_hide (clist);
5945 void toggle_reorderable (GtkWidget *widget, GtkCList *clist)
5947 gtk_clist_set_reorderable (clist, GTK_TOGGLE_BUTTON (widget)->active);
5951 insert_row_clist (GtkWidget *widget, gpointer data)
5953 static char *text[] =
5955 "This", "is an", "inserted", "row.",
5956 "This", "is an", "inserted", "row.",
5957 "This", "is an", "inserted", "row."
5960 static GtkStyle *style1 = NULL;
5961 static GtkStyle *style2 = NULL;
5962 static GtkStyle *style3 = NULL;
5965 if (GTK_CLIST (data)->focus_row >= 0)
5966 row = gtk_clist_insert (GTK_CLIST (data), GTK_CLIST (data)->focus_row,
5969 row = gtk_clist_prepend (GTK_CLIST (data), text);
5983 style1 = gtk_style_copy (GTK_WIDGET (data)->style);
5984 style1->base[GTK_STATE_NORMAL] = col1;
5985 style1->base[GTK_STATE_SELECTED] = col2;
5987 style2 = gtk_style_copy (GTK_WIDGET (data)->style);
5988 style2->fg[GTK_STATE_NORMAL] = col1;
5989 style2->fg[GTK_STATE_SELECTED] = col2;
5991 style3 = gtk_style_copy (GTK_WIDGET (data)->style);
5992 style3->fg[GTK_STATE_NORMAL] = col1;
5993 style3->base[GTK_STATE_NORMAL] = col2;
5994 pango_font_description_free (style3->font_desc);
5995 style3->font_desc = pango_font_description_from_string ("courier 12");
5998 gtk_clist_set_cell_style (GTK_CLIST (data), row, 3, style1);
5999 gtk_clist_set_cell_style (GTK_CLIST (data), row, 4, style2);
6000 gtk_clist_set_cell_style (GTK_CLIST (data), row, 0, style3);
6006 clist_warning_test (GtkWidget *button,
6010 static gboolean add_remove = FALSE;
6012 add_remove = !add_remove;
6014 child = gtk_label_new ("Test");
6015 g_object_ref (child);
6016 gtk_object_sink (GTK_OBJECT (child));
6019 gtk_container_add (GTK_CONTAINER (clist), child);
6022 child->parent = clist;
6023 gtk_container_remove (GTK_CONTAINER (clist), child);
6024 child->parent = NULL;
6027 gtk_widget_destroy (child);
6028 gtk_widget_unref (child);
6032 undo_selection (GtkWidget *button, GtkCList *clist)
6034 gtk_clist_undo_selection (clist);
6038 clist_toggle_sel_mode (GtkWidget *widget, gpointer data)
6043 clist = GTK_CLIST (data);
6045 if (!GTK_WIDGET_MAPPED (widget))
6048 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6050 gtk_clist_set_selection_mode (clist, selection_modes[i]);
6054 clist_click_column (GtkCList *clist, gint column, gpointer data)
6057 gtk_clist_set_column_visibility (clist, column, FALSE);
6058 else if (column == clist->sort_column)
6060 if (clist->sort_type == GTK_SORT_ASCENDING)
6061 clist->sort_type = GTK_SORT_DESCENDING;
6063 clist->sort_type = GTK_SORT_ASCENDING;
6066 gtk_clist_set_sort_column (clist, column);
6068 gtk_clist_sort (clist);
6072 create_clist (GtkWidget *widget)
6075 static GtkWidget *window = NULL;
6077 static char *titles[] =
6079 "auto resize", "not resizeable", "max width 100", "min width 50",
6080 "hide column", "Title 5", "Title 6", "Title 7",
6081 "Title 8", "Title 9", "Title 10", "Title 11"
6084 char text[TESTGTK_CLIST_COLUMNS][50];
6085 char *texts[TESTGTK_CLIST_COLUMNS];
6091 GtkWidget *separator;
6092 GtkWidget *scrolled_win;
6095 GtkWidget *undo_button;
6105 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6106 gtk_window_set_screen (GTK_WINDOW (window),
6107 gtk_widget_get_screen (widget));
6109 g_signal_connect (window, "destroy",
6110 G_CALLBACK (gtk_widget_destroyed), &window);
6112 gtk_window_set_title (GTK_WINDOW (window), "clist");
6113 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6115 vbox = gtk_vbox_new (FALSE, 0);
6116 gtk_container_add (GTK_CONTAINER (window), vbox);
6118 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6119 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6120 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6121 GTK_POLICY_AUTOMATIC,
6122 GTK_POLICY_AUTOMATIC);
6124 /* create GtkCList here so we have a pointer to throw at the
6125 * button callbacks -- more is done with it later */
6126 clist = gtk_clist_new_with_titles (TESTGTK_CLIST_COLUMNS, titles);
6127 gtk_container_add (GTK_CONTAINER (scrolled_win), clist);
6128 g_signal_connect (clist, "click_column",
6129 G_CALLBACK (clist_click_column), NULL);
6131 /* control buttons */
6132 hbox = gtk_hbox_new (FALSE, 5);
6133 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6134 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6136 button = gtk_button_new_with_label ("Insert Row");
6137 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6138 g_signal_connect (button, "clicked",
6139 G_CALLBACK (insert_row_clist), clist);
6141 button = gtk_button_new_with_label ("Add 1,000 Rows With Pixmaps");
6142 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6143 g_signal_connect (button, "clicked",
6144 G_CALLBACK (add1000_clist), clist);
6146 button = gtk_button_new_with_label ("Add 10,000 Rows");
6147 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6148 g_signal_connect (button, "clicked",
6149 G_CALLBACK (add10000_clist), clist);
6151 /* second layer of buttons */
6152 hbox = gtk_hbox_new (FALSE, 5);
6153 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6154 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6156 button = gtk_button_new_with_label ("Clear List");
6157 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6158 g_signal_connect (button, "clicked",
6159 G_CALLBACK (clear_clist), clist);
6161 button = gtk_button_new_with_label ("Remove Selection");
6162 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6163 g_signal_connect (button, "clicked",
6164 G_CALLBACK (clist_remove_selection), clist);
6166 undo_button = gtk_button_new_with_label ("Undo Selection");
6167 gtk_box_pack_start (GTK_BOX (hbox), undo_button, TRUE, TRUE, 0);
6168 g_signal_connect (undo_button, "clicked",
6169 G_CALLBACK (undo_selection), clist);
6171 button = gtk_button_new_with_label ("Warning Test");
6172 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6173 g_signal_connect (button, "clicked",
6174 G_CALLBACK (clist_warning_test), clist);
6176 /* third layer of buttons */
6177 hbox = gtk_hbox_new (FALSE, 5);
6178 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6179 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
6181 check = gtk_check_button_new_with_label ("Show Title Buttons");
6182 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
6183 g_signal_connect (check, "clicked",
6184 G_CALLBACK (toggle_title_buttons), clist);
6185 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
6187 check = gtk_check_button_new_with_label ("Reorderable");
6188 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
6189 g_signal_connect (check, "clicked",
6190 G_CALLBACK (toggle_reorderable), clist);
6191 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
6193 label = gtk_label_new ("Selection Mode :");
6194 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6196 clist_omenu = build_option_menu (selection_mode_items, 3, 3,
6197 clist_toggle_sel_mode,
6199 gtk_box_pack_start (GTK_BOX (hbox), clist_omenu, FALSE, TRUE, 0);
6202 * the rest of the clist configuration
6205 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6206 gtk_clist_set_row_height (GTK_CLIST (clist), 18);
6207 gtk_widget_set_size_request (clist, -1, 300);
6209 for (i = 1; i < TESTGTK_CLIST_COLUMNS; i++)
6210 gtk_clist_set_column_width (GTK_CLIST (clist), i, 80);
6212 gtk_clist_set_column_auto_resize (GTK_CLIST (clist), 0, TRUE);
6213 gtk_clist_set_column_resizeable (GTK_CLIST (clist), 1, FALSE);
6214 gtk_clist_set_column_max_width (GTK_CLIST (clist), 2, 100);
6215 gtk_clist_set_column_min_width (GTK_CLIST (clist), 3, 50);
6216 gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
6217 gtk_clist_set_column_justification (GTK_CLIST (clist), 1,
6219 gtk_clist_set_column_justification (GTK_CLIST (clist), 2,
6220 GTK_JUSTIFY_CENTER);
6222 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
6225 sprintf (text[i], "Column %d", i);
6228 sprintf (text[1], "Right");
6229 sprintf (text[2], "Center");
6238 style = gtk_style_new ();
6239 style->fg[GTK_STATE_NORMAL] = col1;
6240 style->base[GTK_STATE_NORMAL] = col2;
6242 pango_font_description_set_size (style->font_desc, 14 * PANGO_SCALE);
6243 pango_font_description_set_weight (style->font_desc, PANGO_WEIGHT_BOLD);
6245 for (i = 0; i < 10; i++)
6247 sprintf (text[0], "CListRow %d", clist_rows++);
6248 gtk_clist_append (GTK_CLIST (clist), texts);
6253 gtk_clist_set_row_style (GTK_CLIST (clist), i, style);
6256 gtk_clist_set_cell_style (GTK_CLIST (clist), i, i % 4, style);
6261 gtk_style_unref (style);
6263 separator = gtk_hseparator_new ();
6264 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
6266 hbox = gtk_hbox_new (FALSE, 0);
6267 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6269 button = gtk_button_new_with_label ("close");
6270 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
6271 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6272 g_signal_connect_swapped (button, "clicked",
6273 G_CALLBACK (gtk_widget_destroy),
6276 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
6277 gtk_widget_grab_default (button);
6280 if (!GTK_WIDGET_VISIBLE (window))
6281 gtk_widget_show_all (window);
6285 gtk_widget_destroy (window);
6303 static gint books = 0;
6304 static gint pages = 0;
6306 static GtkWidget *book_label;
6307 static GtkWidget *page_label;
6308 static GtkWidget *sel_label;
6309 static GtkWidget *vis_label;
6310 static GtkWidget *omenu1;
6311 static GtkWidget *omenu2;
6312 static GtkWidget *omenu3;
6313 static GtkWidget *omenu4;
6314 static GtkWidget *spin1;
6315 static GtkWidget *spin2;
6316 static GtkWidget *spin3;
6317 static gint line_style;
6320 static CTreePixmaps *
6321 get_ctree_pixmaps (GtkCTree *ctree)
6323 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (ctree));
6324 CTreePixmaps *pixmaps = g_object_get_data (G_OBJECT (screen), "ctree-pixmaps");
6328 GdkColormap *colormap = gdk_screen_get_rgb_colormap (screen);
6329 pixmaps = g_new (CTreePixmaps, 1);
6331 pixmaps->pixmap1 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6333 NULL, book_closed_xpm);
6334 pixmaps->pixmap2 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6336 NULL, book_open_xpm);
6337 pixmaps->pixmap3 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6339 NULL, mini_page_xpm);
6341 g_object_set_data (G_OBJECT (screen), "ctree-pixmaps", pixmaps);
6347 void after_press (GtkCTree *ctree, gpointer data)
6351 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
6352 gtk_label_set_text (GTK_LABEL (sel_label), buf);
6354 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
6355 gtk_label_set_text (GTK_LABEL (vis_label), buf);
6357 sprintf (buf, "%d", books);
6358 gtk_label_set_text (GTK_LABEL (book_label), buf);
6360 sprintf (buf, "%d", pages);
6361 gtk_label_set_text (GTK_LABEL (page_label), buf);
6364 void after_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent,
6365 GtkCTreeNode *sibling, gpointer data)
6371 gtk_ctree_get_node_info (ctree, child, &source,
6372 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6374 gtk_ctree_get_node_info (ctree, parent, &target1,
6375 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6377 gtk_ctree_get_node_info (ctree, sibling, &target2,
6378 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6380 g_print ("Moving \"%s\" to \"%s\" with sibling \"%s\".\n", source,
6381 (parent) ? target1 : "nil", (sibling) ? target2 : "nil");
6384 void count_items (GtkCTree *ctree, GtkCTreeNode *list)
6386 if (GTK_CTREE_ROW (list)->is_leaf)
6392 void expand_all (GtkWidget *widget, GtkCTree *ctree)
6394 gtk_ctree_expand_recursive (ctree, NULL);
6395 after_press (ctree, NULL);
6398 void collapse_all (GtkWidget *widget, GtkCTree *ctree)
6400 gtk_ctree_collapse_recursive (ctree, NULL);
6401 after_press (ctree, NULL);
6404 void select_all (GtkWidget *widget, GtkCTree *ctree)
6406 gtk_ctree_select_recursive (ctree, NULL);
6407 after_press (ctree, NULL);
6410 void change_style (GtkWidget *widget, GtkCTree *ctree)
6412 static GtkStyle *style1 = NULL;
6413 static GtkStyle *style2 = NULL;
6419 if (GTK_CLIST (ctree)->focus_row >= 0)
6420 node = GTK_CTREE_NODE
6421 (g_list_nth (GTK_CLIST (ctree)->row_list,GTK_CLIST (ctree)->focus_row));
6423 node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list);
6437 style1 = gtk_style_new ();
6438 style1->base[GTK_STATE_NORMAL] = col1;
6439 style1->fg[GTK_STATE_SELECTED] = col2;
6441 style2 = gtk_style_new ();
6442 style2->base[GTK_STATE_SELECTED] = col2;
6443 style2->fg[GTK_STATE_NORMAL] = col1;
6444 style2->base[GTK_STATE_NORMAL] = col2;
6445 pango_font_description_free (style2->font_desc);
6446 style2->font_desc = pango_font_description_from_string ("courier 30");
6449 gtk_ctree_node_set_cell_style (ctree, node, 1, style1);
6450 gtk_ctree_node_set_cell_style (ctree, node, 0, style2);
6452 if (GTK_CTREE_ROW (node)->children)
6453 gtk_ctree_node_set_row_style (ctree, GTK_CTREE_ROW (node)->children,
6457 void unselect_all (GtkWidget *widget, GtkCTree *ctree)
6459 gtk_ctree_unselect_recursive (ctree, NULL);
6460 after_press (ctree, NULL);
6463 void remove_selection (GtkWidget *widget, GtkCTree *ctree)
6468 clist = GTK_CLIST (ctree);
6470 gtk_clist_freeze (clist);
6472 while (clist->selection)
6474 node = clist->selection->data;
6476 if (GTK_CTREE_ROW (node)->is_leaf)
6479 gtk_ctree_post_recursive (ctree, node,
6480 (GtkCTreeFunc) count_items, NULL);
6482 gtk_ctree_remove_node (ctree, node);
6484 if (clist->selection_mode == GTK_SELECTION_BROWSE)
6488 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
6489 clist->focus_row >= 0)
6491 node = gtk_ctree_node_nth (ctree, clist->focus_row);
6494 gtk_ctree_select (ctree, node);
6497 gtk_clist_thaw (clist);
6498 after_press (ctree, NULL);
6501 struct _ExportStruct {
6507 typedef struct _ExportStruct ExportStruct;
6510 gnode2ctree (GtkCTree *ctree,
6513 GtkCTreeNode *cnode,
6517 GdkPixmap *pixmap_closed;
6518 GdkBitmap *mask_closed;
6519 GdkPixmap *pixmap_opened;
6520 GdkBitmap *mask_opened;
6521 CTreePixmaps *pixmaps;
6523 if (!cnode || !gnode || (!(es = gnode->data)))
6526 pixmaps = get_ctree_pixmaps (ctree);
6530 pixmap_closed = pixmaps->pixmap3;
6531 mask_closed = pixmaps->mask3;
6532 pixmap_opened = NULL;
6537 pixmap_closed = pixmaps->pixmap1;
6538 mask_closed = pixmaps->mask1;
6539 pixmap_opened = pixmaps->pixmap2;
6540 mask_opened = pixmaps->mask2;
6543 gtk_ctree_set_node_info (ctree, cnode, es->tree, 2, pixmap_closed,
6544 mask_closed, pixmap_opened, mask_opened,
6545 es->is_leaf, (depth < 3));
6546 gtk_ctree_node_set_text (ctree, cnode, 1, es->info);
6554 ctree2gnode (GtkCTree *ctree,
6557 GtkCTreeNode *cnode,
6562 if (!cnode || !gnode)
6565 es = g_new (ExportStruct, 1);
6567 es->is_leaf = GTK_CTREE_ROW (cnode)->is_leaf;
6568 es->tree = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[0])->text;
6569 es->info = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[1])->text;
6573 void export_ctree (GtkWidget *widget, GtkCTree *ctree)
6575 char *title[] = { "Tree" , "Info" };
6576 static GtkWidget *export_window = NULL;
6577 static GtkCTree *export_ctree;
6579 GtkWidget *scrolled_win;
6587 export_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6589 gtk_window_set_screen (GTK_WINDOW (export_window),
6590 gtk_widget_get_screen (widget));
6592 g_signal_connect (export_window, "destroy",
6593 G_CALLBACK (gtk_widget_destroyed),
6596 gtk_window_set_title (GTK_WINDOW (export_window), "exported ctree");
6597 gtk_container_set_border_width (GTK_CONTAINER (export_window), 5);
6599 vbox = gtk_vbox_new (FALSE, 0);
6600 gtk_container_add (GTK_CONTAINER (export_window), vbox);
6602 button = gtk_button_new_with_label ("Close");
6603 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, TRUE, 0);
6605 g_signal_connect_swapped (button, "clicked",
6606 G_CALLBACK (gtk_widget_destroy),
6609 sep = gtk_hseparator_new ();
6610 gtk_box_pack_end (GTK_BOX (vbox), sep, FALSE, TRUE, 10);
6612 export_ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
6613 gtk_ctree_set_line_style (export_ctree, GTK_CTREE_LINES_DOTTED);
6615 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6616 gtk_container_add (GTK_CONTAINER (scrolled_win),
6617 GTK_WIDGET (export_ctree));
6618 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6619 GTK_POLICY_AUTOMATIC,
6620 GTK_POLICY_AUTOMATIC);
6621 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6622 gtk_clist_set_selection_mode (GTK_CLIST (export_ctree),
6623 GTK_SELECTION_EXTENDED);
6624 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 0, 200);
6625 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 1, 200);
6626 gtk_widget_set_size_request (GTK_WIDGET (export_ctree), 300, 200);
6629 if (!GTK_WIDGET_VISIBLE (export_window))
6630 gtk_widget_show_all (export_window);
6632 gtk_clist_clear (GTK_CLIST (export_ctree));
6634 node = GTK_CTREE_NODE (g_list_nth (GTK_CLIST (ctree)->row_list,
6635 GTK_CLIST (ctree)->focus_row));
6639 gnode = gtk_ctree_export_to_gnode (ctree, NULL, NULL, node,
6643 gtk_ctree_insert_gnode (export_ctree, NULL, NULL, gnode,
6645 g_node_destroy (gnode);
6649 void change_indent (GtkWidget *widget, GtkCTree *ctree)
6651 gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
6654 void change_spacing (GtkWidget *widget, GtkCTree *ctree)
6656 gtk_ctree_set_spacing (ctree, GTK_ADJUSTMENT (widget)->value);
6659 void change_row_height (GtkWidget *widget, GtkCList *clist)
6661 gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value);
6664 void set_background (GtkCTree *ctree, GtkCTreeNode *node, gpointer data)
6666 GtkStyle *style = NULL;
6671 if (ctree->line_style != GTK_CTREE_LINES_TABBED)
6673 if (!GTK_CTREE_ROW (node)->is_leaf)
6674 style = GTK_CTREE_ROW (node)->row.data;
6675 else if (GTK_CTREE_ROW (node)->parent)
6676 style = GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data;
6679 gtk_ctree_node_set_row_style (ctree, node, style);
6683 ctree_toggle_line_style (GtkWidget *widget, gpointer data)
6688 ctree = GTK_CTREE (data);
6690 if (!GTK_WIDGET_MAPPED (widget))
6693 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6695 if ((ctree->line_style == GTK_CTREE_LINES_TABBED &&
6696 ((GtkCTreeLineStyle) i) != GTK_CTREE_LINES_TABBED) ||
6697 (ctree->line_style != GTK_CTREE_LINES_TABBED &&
6698 ((GtkCTreeLineStyle) i) == GTK_CTREE_LINES_TABBED))
6699 gtk_ctree_pre_recursive (ctree, NULL, set_background, NULL);
6700 gtk_ctree_set_line_style (ctree, i);
6705 ctree_toggle_expander_style (GtkWidget *widget, gpointer data)
6710 ctree = GTK_CTREE (data);
6712 if (!GTK_WIDGET_MAPPED (widget))
6715 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6717 gtk_ctree_set_expander_style (ctree, (GtkCTreeExpanderStyle) i);
6721 ctree_toggle_justify (GtkWidget *widget, gpointer data)
6726 ctree = GTK_CTREE (data);
6728 if (!GTK_WIDGET_MAPPED (widget))
6731 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6733 gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column,
6734 (GtkJustification) i);
6738 ctree_toggle_sel_mode (GtkWidget *widget, gpointer data)
6743 ctree = GTK_CTREE (data);
6745 if (!GTK_WIDGET_MAPPED (widget))
6748 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6750 gtk_clist_set_selection_mode (GTK_CLIST (ctree), selection_modes[i]);
6751 after_press (ctree, NULL);
6754 void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
6755 gint num_books, gint num_pages, GtkCTreeNode *parent)
6760 GtkCTreeNode *sibling;
6761 CTreePixmaps *pixmaps;
6768 pixmaps = get_ctree_pixmaps (ctree);
6770 for (i = num_pages + num_books; i > num_books; i--)
6773 sprintf (buf1, "Page %02d", (gint) rand() % 100);
6774 sprintf (buf2, "Item %d-%d", cur_depth, i);
6775 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
6776 pixmaps->pixmap3, pixmaps->mask3, NULL, NULL,
6779 if (parent && ctree->line_style == GTK_CTREE_LINES_TABBED)
6780 gtk_ctree_node_set_row_style (ctree, sibling,
6781 GTK_CTREE_ROW (parent)->row.style);
6784 if (cur_depth == depth)
6787 for (i = num_books; i > 0; i--)
6792 sprintf (buf1, "Book %02d", (gint) rand() % 100);
6793 sprintf (buf2, "Item %d-%d", cur_depth, i);
6794 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
6795 pixmaps->pixmap1, pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2,
6798 style = gtk_style_new ();
6799 switch (cur_depth % 3)
6802 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
6803 style->base[GTK_STATE_NORMAL].green = 0;
6804 style->base[GTK_STATE_NORMAL].blue = 65535 - ((i * 10000) % 65535);
6807 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
6808 style->base[GTK_STATE_NORMAL].green = 65535 - ((i * 10000) % 65535);
6809 style->base[GTK_STATE_NORMAL].blue = 0;
6812 style->base[GTK_STATE_NORMAL].red = 65535 - ((i * 10000) % 65535);
6813 style->base[GTK_STATE_NORMAL].green = 0;
6814 style->base[GTK_STATE_NORMAL].blue = 10000 * (cur_depth % 6);
6817 gtk_ctree_node_set_row_data_full (ctree, sibling, style,
6818 (GtkDestroyNotify) gtk_style_unref);
6820 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
6821 gtk_ctree_node_set_row_style (ctree, sibling, style);
6823 build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages,
6828 void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
6831 gchar label1[] = "Root";
6832 gchar label2[] = "";
6833 GtkCTreeNode *parent;
6836 CTreePixmaps *pixmaps;
6838 pixmaps = get_ctree_pixmaps (ctree);
6843 d = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
6844 b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
6845 p = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin3));
6847 n = ((pow (b, d) - 1) / (b - 1)) * (p + 1);
6851 g_print ("%d total items? Try less\n",n);
6855 gtk_clist_freeze (GTK_CLIST (ctree));
6856 gtk_clist_clear (GTK_CLIST (ctree));
6861 parent = gtk_ctree_insert_node (ctree, NULL, NULL, text, 5, pixmaps->pixmap1,
6862 pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2, FALSE, TRUE);
6864 style = gtk_style_new ();
6865 style->base[GTK_STATE_NORMAL].red = 0;
6866 style->base[GTK_STATE_NORMAL].green = 45000;
6867 style->base[GTK_STATE_NORMAL].blue = 55000;
6868 gtk_ctree_node_set_row_data_full (ctree, parent, style,
6869 (GtkDestroyNotify) gtk_style_unref);
6871 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
6872 gtk_ctree_node_set_row_style (ctree, parent, style);
6874 build_recursive (ctree, 1, d, b, p, parent);
6875 gtk_clist_thaw (GTK_CLIST (ctree));
6876 after_press (ctree, NULL);
6880 ctree_click_column (GtkCTree *ctree, gint column, gpointer data)
6884 clist = GTK_CLIST (ctree);
6886 if (column == clist->sort_column)
6888 if (clist->sort_type == GTK_SORT_ASCENDING)
6889 clist->sort_type = GTK_SORT_DESCENDING;
6891 clist->sort_type = GTK_SORT_ASCENDING;
6894 gtk_clist_set_sort_column (clist, column);
6896 gtk_ctree_sort_recursive (ctree, NULL);
6899 void create_ctree (GtkWidget *widget)
6901 static GtkWidget *window = NULL;
6902 GtkTooltips *tooltips;
6904 GtkWidget *scrolled_win;
6917 char *title[] = { "Tree" , "Info" };
6920 static gchar *items1[] =
6928 static gchar *items2[] =
6936 static gchar *items3[] =
6944 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6945 gtk_window_set_screen (GTK_WINDOW (window),
6946 gtk_widget_get_screen (widget));
6948 g_signal_connect (window, "destroy",
6949 G_CALLBACK (gtk_widget_destroyed),
6952 gtk_window_set_title (GTK_WINDOW (window), "GtkCTree");
6953 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6955 tooltips = gtk_tooltips_new ();
6956 g_object_ref (tooltips);
6957 gtk_object_sink (GTK_OBJECT (tooltips));
6959 g_object_set_data_full (G_OBJECT (window), "tooltips", tooltips,
6962 vbox = gtk_vbox_new (FALSE, 0);
6963 gtk_container_add (GTK_CONTAINER (window), vbox);
6965 hbox = gtk_hbox_new (FALSE, 5);
6966 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6967 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6969 label = gtk_label_new ("Depth :");
6970 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6972 adj = (GtkAdjustment *) gtk_adjustment_new (4, 1, 10, 1, 5, 0);
6973 spin1 = gtk_spin_button_new (adj, 0, 0);
6974 gtk_box_pack_start (GTK_BOX (hbox), spin1, FALSE, TRUE, 5);
6976 label = gtk_label_new ("Books :");
6977 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6979 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
6980 spin2 = gtk_spin_button_new (adj, 0, 0);
6981 gtk_box_pack_start (GTK_BOX (hbox), spin2, FALSE, TRUE, 5);
6983 label = gtk_label_new ("Pages :");
6984 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6986 adj = (GtkAdjustment *) gtk_adjustment_new (5, 1, 20, 1, 5, 0);
6987 spin3 = gtk_spin_button_new (adj, 0, 0);
6988 gtk_box_pack_start (GTK_BOX (hbox), spin3, FALSE, TRUE, 5);
6990 button = gtk_button_new_with_label ("Close");
6991 gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6993 g_signal_connect_swapped (button, "clicked",
6994 G_CALLBACK (gtk_widget_destroy),
6997 button = gtk_button_new_with_label ("Rebuild Tree");
6998 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7000 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
7001 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
7002 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
7003 GTK_POLICY_AUTOMATIC,
7005 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
7007 ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
7008 gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (ctree));
7010 gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
7011 gtk_clist_set_column_width (GTK_CLIST (ctree), 1, 200);
7012 gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_EXTENDED);
7013 gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
7014 line_style = GTK_CTREE_LINES_DOTTED;
7016 g_signal_connect (button, "clicked",
7017 G_CALLBACK (rebuild_tree), ctree);
7018 g_signal_connect (ctree, "click_column",
7019 G_CALLBACK (ctree_click_column), NULL);
7021 g_signal_connect_after (ctree, "button_press_event",
7022 G_CALLBACK (after_press), NULL);
7023 g_signal_connect_after (ctree, "button_release_event",
7024 G_CALLBACK (after_press), NULL);
7025 g_signal_connect_after (ctree, "tree_move",
7026 G_CALLBACK (after_move), NULL);
7027 g_signal_connect_after (ctree, "end_selection",
7028 G_CALLBACK (after_press), NULL);
7029 g_signal_connect_after (ctree, "toggle_focus_row",
7030 G_CALLBACK (after_press), NULL);
7031 g_signal_connect_after (ctree, "select_all",
7032 G_CALLBACK (after_press), NULL);
7033 g_signal_connect_after (ctree, "unselect_all",
7034 G_CALLBACK (after_press), NULL);
7035 g_signal_connect_after (ctree, "scroll_vertical",
7036 G_CALLBACK (after_press), NULL);
7038 bbox = gtk_hbox_new (FALSE, 5);
7039 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
7040 gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, TRUE, 0);
7042 mbox = gtk_vbox_new (TRUE, 5);
7043 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7045 label = gtk_label_new ("Row Height :");
7046 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7048 label = gtk_label_new ("Indent :");
7049 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7051 label = gtk_label_new ("Spacing :");
7052 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
7054 mbox = gtk_vbox_new (TRUE, 5);
7055 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7057 adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0);
7058 spinner = gtk_spin_button_new (adj, 0, 0);
7059 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7060 gtk_tooltips_set_tip (tooltips, spinner,
7061 "Row height of list items", NULL);
7062 g_signal_connect (adj, "value_changed",
7063 G_CALLBACK (change_row_height), ctree);
7064 gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value);
7066 adj = (GtkAdjustment *) gtk_adjustment_new (20, 0, 60, 1, 10, 0);
7067 spinner = gtk_spin_button_new (adj, 0, 0);
7068 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7069 gtk_tooltips_set_tip (tooltips, spinner, "Tree Indentation.", NULL);
7070 g_signal_connect (adj, "value_changed",
7071 G_CALLBACK (change_indent), ctree);
7073 adj = (GtkAdjustment *) gtk_adjustment_new (5, 0, 60, 1, 10, 0);
7074 spinner = gtk_spin_button_new (adj, 0, 0);
7075 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
7076 gtk_tooltips_set_tip (tooltips, spinner, "Tree Spacing.", NULL);
7077 g_signal_connect (adj, "value_changed",
7078 G_CALLBACK (change_spacing), ctree);
7080 mbox = gtk_vbox_new (TRUE, 5);
7081 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
7083 hbox = gtk_hbox_new (FALSE, 5);
7084 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7086 button = gtk_button_new_with_label ("Expand All");
7087 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7088 g_signal_connect (button, "clicked",
7089 G_CALLBACK (expand_all), ctree);
7091 button = gtk_button_new_with_label ("Collapse All");
7092 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7093 g_signal_connect (button, "clicked",
7094 G_CALLBACK (collapse_all), ctree);
7096 button = gtk_button_new_with_label ("Change Style");
7097 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7098 g_signal_connect (button, "clicked",
7099 G_CALLBACK (change_style), ctree);
7101 button = gtk_button_new_with_label ("Export Tree");
7102 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7103 g_signal_connect (button, "clicked",
7104 G_CALLBACK (export_ctree), ctree);
7106 hbox = gtk_hbox_new (FALSE, 5);
7107 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7109 button = gtk_button_new_with_label ("Select All");
7110 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7111 g_signal_connect (button, "clicked",
7112 G_CALLBACK (select_all), ctree);
7114 button = gtk_button_new_with_label ("Unselect All");
7115 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7116 g_signal_connect (button, "clicked",
7117 G_CALLBACK (unselect_all), ctree);
7119 button = gtk_button_new_with_label ("Remove Selection");
7120 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
7121 g_signal_connect (button, "clicked",
7122 G_CALLBACK (remove_selection), ctree);
7124 check = gtk_check_button_new_with_label ("Reorderable");
7125 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
7126 gtk_tooltips_set_tip (tooltips, check,
7127 "Tree items can be reordered by dragging.", NULL);
7128 g_signal_connect (check, "clicked",
7129 G_CALLBACK (toggle_reorderable), ctree);
7130 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
7132 hbox = gtk_hbox_new (TRUE, 5);
7133 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
7135 omenu1 = build_option_menu (items1, 4, 2,
7136 ctree_toggle_line_style,
7138 gtk_box_pack_start (GTK_BOX (hbox), omenu1, FALSE, TRUE, 0);
7139 gtk_tooltips_set_tip (tooltips, omenu1, "The tree's line style.", NULL);
7141 omenu2 = build_option_menu (items2, 4, 1,
7142 ctree_toggle_expander_style,
7144 gtk_box_pack_start (GTK_BOX (hbox), omenu2, FALSE, TRUE, 0);
7145 gtk_tooltips_set_tip (tooltips, omenu2, "The tree's expander style.",
7148 omenu3 = build_option_menu (items3, 2, 0,
7149 ctree_toggle_justify, ctree);
7150 gtk_box_pack_start (GTK_BOX (hbox), omenu3, FALSE, TRUE, 0);
7151 gtk_tooltips_set_tip (tooltips, omenu3, "The tree's justification.",
7154 omenu4 = build_option_menu (selection_mode_items, 3, 3,
7155 ctree_toggle_sel_mode, ctree);
7156 gtk_box_pack_start (GTK_BOX (hbox), omenu4, FALSE, TRUE, 0);
7157 gtk_tooltips_set_tip (tooltips, omenu4, "The list's selection mode.",
7160 gtk_widget_realize (window);
7162 gtk_widget_set_size_request (GTK_WIDGET (ctree), -1, 300);
7164 frame = gtk_frame_new (NULL);
7165 gtk_container_set_border_width (GTK_CONTAINER (frame), 0);
7166 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
7167 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
7169 hbox = gtk_hbox_new (TRUE, 2);
7170 gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
7171 gtk_container_add (GTK_CONTAINER (frame), hbox);
7173 frame = gtk_frame_new (NULL);
7174 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
7175 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
7177 hbox2 = gtk_hbox_new (FALSE, 0);
7178 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
7179 gtk_container_add (GTK_CONTAINER (frame), hbox2);
7181 label = gtk_label_new ("Books :");
7182 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
7184 sprintf (buf, "%d", books);
7185 book_label = gtk_label_new (buf);
7186 gtk_box_pack_end (GTK_BOX (hbox2), book_label, FALSE, TRUE, 5);
7188 frame = gtk_frame_new (NULL);
7189 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
7190 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
7192 hbox2 = gtk_hbox_new (FALSE, 0);
7193 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
7194 gtk_container_add (GTK_CONTAINER (frame), hbox2);
7196 label = gtk_label_new ("Pages :");
7197 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
7199 sprintf (buf, "%d", pages);
7200 page_label = gtk_label_new (buf);
7201 gtk_box_pack_end (GTK_BOX (hbox2), page_label, FALSE, TRUE, 5);
7203 frame = gtk_frame_new (NULL);
7204 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
7205 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
7207 hbox2 = gtk_hbox_new (FALSE, 0);
7208 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
7209 gtk_container_add (GTK_CONTAINER (frame), hbox2);
7211 label = gtk_label_new ("Selected :");
7212 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
7214 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
7215 sel_label = gtk_label_new (buf);
7216 gtk_box_pack_end (GTK_BOX (hbox2), sel_label, FALSE, TRUE, 5);
7218 frame = gtk_frame_new (NULL);
7219 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
7220 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
7222 hbox2 = gtk_hbox_new (FALSE, 0);
7223 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
7224 gtk_container_add (GTK_CONTAINER (frame), hbox2);
7226 label = gtk_label_new ("Visible :");
7227 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
7229 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
7230 vis_label = gtk_label_new (buf);
7231 gtk_box_pack_end (GTK_BOX (hbox2), vis_label, FALSE, TRUE, 5);
7233 rebuild_tree (NULL, ctree);
7236 if (!GTK_WIDGET_VISIBLE (window))
7237 gtk_widget_show_all (window);
7239 gtk_widget_destroy (window);
7247 color_selection_ok (GtkWidget *w,
7248 GtkColorSelectionDialog *cs)
7250 GtkColorSelection *colorsel;
7253 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
7255 gtk_color_selection_get_color(colorsel,color);
7256 gtk_color_selection_set_color(colorsel,color);
7260 color_selection_changed (GtkWidget *w,
7261 GtkColorSelectionDialog *cs)
7263 GtkColorSelection *colorsel;
7266 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
7267 gtk_color_selection_get_color(colorsel,color);
7271 opacity_toggled_cb (GtkWidget *w,
7272 GtkColorSelectionDialog *cs)
7274 GtkColorSelection *colorsel;
7276 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
7277 gtk_color_selection_set_has_opacity_control (colorsel,
7278 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
7282 palette_toggled_cb (GtkWidget *w,
7283 GtkColorSelectionDialog *cs)
7285 GtkColorSelection *colorsel;
7287 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
7288 gtk_color_selection_set_has_palette (colorsel,
7289 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
7293 create_color_selection (GtkWidget *widget)
7295 static GtkWidget *window = NULL;
7303 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7304 gtk_window_set_screen (GTK_WINDOW (window),
7305 gtk_widget_get_screen (widget));
7307 g_signal_connect (window, "destroy",
7308 G_CALLBACK (gtk_widget_destroyed),
7311 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
7312 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7314 hbox = gtk_hbox_new (FALSE, 8);
7315 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
7316 gtk_container_add (GTK_CONTAINER (window), hbox);
7318 label = gtk_label_new ("Pick a color");
7319 gtk_container_add (GTK_CONTAINER (hbox), label);
7321 picker = gtk_color_button_new ();
7322 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
7323 gtk_container_add (GTK_CONTAINER (hbox), picker);
7326 if (!GTK_WIDGET_VISIBLE (window))
7327 gtk_widget_show_all (window);
7329 gtk_widget_destroy (window);
7337 show_fileops (GtkWidget *widget,
7338 GtkFileSelection *fs)
7342 show_ops = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7345 gtk_file_selection_show_fileop_buttons (fs);
7347 gtk_file_selection_hide_fileop_buttons (fs);
7351 select_multiple (GtkWidget *widget,
7352 GtkFileSelection *fs)
7354 gboolean select_multiple;
7356 select_multiple = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7357 gtk_file_selection_set_select_multiple (fs, select_multiple);
7361 file_selection_ok (GtkFileSelection *fs)
7366 selections = gtk_file_selection_get_selections (fs);
7368 for (i = 0; selections[i] != NULL; i++)
7369 g_print ("%s\n", selections[i]);
7371 g_strfreev (selections);
7373 gtk_widget_destroy (GTK_WIDGET (fs));
7377 create_file_selection (GtkWidget *widget)
7379 static GtkWidget *window = NULL;
7384 window = gtk_file_selection_new ("file selection dialog");
7385 gtk_window_set_screen (GTK_WINDOW (window),
7386 gtk_widget_get_screen (widget));
7388 gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window));
7390 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
7392 g_signal_connect (window, "destroy",
7393 G_CALLBACK (gtk_widget_destroyed),
7396 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->ok_button,
7398 G_CALLBACK (file_selection_ok),
7400 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->cancel_button,
7402 G_CALLBACK (gtk_widget_destroy),
7405 button = gtk_check_button_new_with_label ("Show Fileops");
7406 g_signal_connect (button, "toggled",
7407 G_CALLBACK (show_fileops),
7409 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
7410 button, FALSE, FALSE, 0);
7411 gtk_widget_show (button);
7413 button = gtk_check_button_new_with_label ("Select Multiple");
7414 g_signal_connect (button, "clicked",
7415 G_CALLBACK (select_multiple),
7417 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
7418 button, FALSE, FALSE, 0);
7419 gtk_widget_show (button);
7422 if (!GTK_WIDGET_VISIBLE (window))
7423 gtk_widget_show (window);
7425 gtk_widget_destroy (window);
7429 flipping_toggled_cb (GtkWidget *widget, gpointer data)
7431 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7432 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
7434 gtk_widget_set_default_direction (new_direction);
7438 set_direction_recurse (GtkWidget *widget,
7441 GtkTextDirection *dir = data;
7443 gtk_widget_set_direction (widget, *dir);
7444 if (GTK_IS_CONTAINER (widget))
7445 gtk_container_foreach (GTK_CONTAINER (widget),
7446 set_direction_recurse,
7451 create_forward_back (const char *title,
7452 GtkTextDirection text_dir)
7454 GtkWidget *frame = gtk_frame_new (title);
7455 GtkWidget *bbox = gtk_hbutton_box_new ();
7456 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
7457 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
7459 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
7461 gtk_container_add (GTK_CONTAINER (frame), bbox);
7462 gtk_container_add (GTK_CONTAINER (bbox), back_button);
7463 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
7465 set_direction_recurse (frame, &text_dir);
7471 create_flipping (GtkWidget *widget)
7473 static GtkWidget *window = NULL;
7474 GtkWidget *check_button, *button;
7478 window = gtk_dialog_new ();
7480 gtk_window_set_screen (GTK_WINDOW (window),
7481 gtk_widget_get_screen (widget));
7483 g_signal_connect (window, "destroy",
7484 G_CALLBACK (gtk_widget_destroyed),
7487 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
7489 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
7490 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7491 check_button, TRUE, TRUE, 0);
7493 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7494 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
7497 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7498 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
7501 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7502 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
7505 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
7506 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
7508 g_signal_connect (check_button, "toggled",
7509 G_CALLBACK (flipping_toggled_cb), FALSE);
7511 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
7513 button = gtk_button_new_with_label ("Close");
7514 g_signal_connect_swapped (button, "clicked",
7515 G_CALLBACK (gtk_widget_destroy), window);
7516 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
7517 button, TRUE, TRUE, 0);
7520 if (!GTK_WIDGET_VISIBLE (window))
7521 gtk_widget_show_all (window);
7523 gtk_widget_destroy (window);
7531 make_focus_table (GList **list)
7536 table = gtk_table_new (5, 5, FALSE);
7549 widget = gtk_entry_new ();
7551 widget = gtk_button_new_with_label ("Foo");
7553 *list = g_list_prepend (*list, widget);
7555 gtk_table_attach (GTK_TABLE (table),
7559 GTK_EXPAND | GTK_FILL,
7560 GTK_EXPAND | GTK_FILL,
7569 *list = g_list_reverse (*list);
7575 create_focus (GtkWidget *widget)
7577 static GtkWidget *window = NULL;
7585 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
7591 gtk_window_set_screen (GTK_WINDOW (window),
7592 gtk_widget_get_screen (widget));
7594 g_signal_connect (window, "destroy",
7595 G_CALLBACK (gtk_widget_destroyed),
7598 g_signal_connect (window, "response",
7599 G_CALLBACK (gtk_widget_destroy),
7602 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
7604 frame = gtk_frame_new ("Weird tab focus chain");
7606 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7607 frame, TRUE, TRUE, 0);
7609 table = make_focus_table (&list);
7611 gtk_container_add (GTK_CONTAINER (frame), table);
7613 gtk_container_set_focus_chain (GTK_CONTAINER (table),
7618 frame = gtk_frame_new ("Default tab focus chain");
7620 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7621 frame, TRUE, TRUE, 0);
7624 table = make_focus_table (&list);
7628 gtk_container_add (GTK_CONTAINER (frame), table);
7631 if (!GTK_WIDGET_VISIBLE (window))
7632 gtk_widget_show_all (window);
7634 gtk_widget_destroy (window);
7642 font_selection_ok (GtkWidget *w,
7643 GtkFontSelectionDialog *fs)
7645 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
7647 g_print ("%s\n", s);
7649 gtk_widget_destroy (GTK_WIDGET (fs));
7653 create_font_selection (GtkWidget *widget)
7655 static GtkWidget *window = NULL;
7663 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7664 gtk_window_set_screen (GTK_WINDOW (window),
7665 gtk_widget_get_screen (widget));
7667 g_signal_connect (window, "destroy",
7668 G_CALLBACK (gtk_widget_destroyed),
7671 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
7672 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7674 hbox = gtk_hbox_new (FALSE, 8);
7675 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
7676 gtk_container_add (GTK_CONTAINER (window), hbox);
7678 label = gtk_label_new ("Pick a font");
7679 gtk_container_add (GTK_CONTAINER (hbox), label);
7681 picker = gtk_font_button_new ();
7682 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
7683 gtk_container_add (GTK_CONTAINER (hbox), picker);
7686 if (!GTK_WIDGET_VISIBLE (window))
7687 gtk_widget_show_all (window);
7689 gtk_widget_destroy (window);
7696 static GtkWidget *dialog_window = NULL;
7699 label_toggle (GtkWidget *widget,
7704 *label = gtk_label_new ("Dialog Test");
7705 g_signal_connect (*label,
7707 G_CALLBACK (gtk_widget_destroyed),
7709 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
7710 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
7711 *label, TRUE, TRUE, 0);
7712 gtk_widget_show (*label);
7715 gtk_widget_destroy (*label);
7718 #define RESPONSE_TOGGLE_SEPARATOR 1
7721 print_response (GtkWidget *dialog,
7725 g_print ("response signal received (%d)\n", response_id);
7727 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
7729 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
7730 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
7735 create_dialog (GtkWidget *widget)
7737 static GtkWidget *label;
7742 /* This is a terrible example; it's much simpler to create
7743 * dialogs than this. Don't use testgtk for example code,
7747 dialog_window = gtk_dialog_new ();
7748 gtk_window_set_screen (GTK_WINDOW (dialog_window),
7749 gtk_widget_get_screen (widget));
7751 g_signal_connect (dialog_window,
7753 G_CALLBACK (print_response),
7756 g_signal_connect (dialog_window, "destroy",
7757 G_CALLBACK (gtk_widget_destroyed),
7760 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
7761 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
7763 button = gtk_button_new_with_label ("OK");
7764 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7765 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7766 button, TRUE, TRUE, 0);
7767 gtk_widget_grab_default (button);
7768 gtk_widget_show (button);
7770 button = gtk_button_new_with_label ("Toggle");
7771 g_signal_connect (button, "clicked",
7772 G_CALLBACK (label_toggle),
7774 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7775 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7776 button, TRUE, TRUE, 0);
7777 gtk_widget_show (button);
7781 button = gtk_button_new_with_label ("Separator");
7783 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7785 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
7787 RESPONSE_TOGGLE_SEPARATOR);
7788 gtk_widget_show (button);
7791 if (!GTK_WIDGET_VISIBLE (dialog_window))
7792 gtk_widget_show (dialog_window);
7794 gtk_widget_destroy (dialog_window);
7797 /* Display & Screen test
7803 GtkWidget *radio_dpy;
7804 GtkWidget *toplevel;
7805 GtkWidget *dialog_window;
7806 GList *valid_display_list;
7807 } ScreenDisplaySelection;
7810 display_name_cmp (gconstpointer a,
7813 return g_ascii_strcasecmp (a,b);
7817 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
7820 GdkDisplay *display = gtk_widget_get_display (widget);
7822 GdkScreen *new_screen = NULL;
7823 GdkScreen *current_screen = gtk_widget_get_screen (widget);
7825 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
7827 display_name = g_strdup (gtk_entry_get_text (data->entry));
7828 display = gdk_display_open (display_name);
7832 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
7833 GTK_DIALOG_DESTROY_WITH_PARENT,
7836 "The display :\n%s\ncannot be opened",
7838 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
7839 gtk_widget_show (dialog);
7840 g_signal_connect (dialog, "response",
7841 G_CALLBACK (gtk_widget_destroy),
7846 if (!g_list_find_custom (data->valid_display_list,
7849 data->valid_display_list = g_list_append (data->valid_display_list,
7852 new_screen = gdk_display_get_default_screen (display);
7857 gint number_of_screens = gdk_display_get_n_screens (display);
7858 gint screen_num = gdk_screen_get_number (current_screen);
7859 if ((screen_num +1) < number_of_screens)
7860 new_screen = gdk_display_get_screen (display, screen_num + 1);
7862 new_screen = gdk_display_get_screen (display, 0);
7867 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
7868 gtk_widget_destroy (data->dialog_window);
7873 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
7875 gtk_widget_destroy (data);
7879 create_display_screen (GtkWidget *widget)
7881 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
7882 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
7884 ScreenDisplaySelection *scr_dpy_data;
7885 GdkScreen *screen = gtk_widget_get_screen (widget);
7886 static GList *valid_display_list = NULL;
7888 GdkDisplay *display = gdk_screen_get_display (screen);
7890 window = gtk_widget_new (gtk_window_get_type (),
7893 "type", GTK_WINDOW_TOPLEVEL,
7895 "Screen or Display selection",
7896 "border_width", 10, NULL);
7897 g_signal_connect (window, "destroy",
7898 G_CALLBACK (gtk_widget_destroy), NULL);
7900 vbox = gtk_vbox_new (FALSE, 3);
7901 gtk_container_add (GTK_CONTAINER (window), vbox);
7903 frame = gtk_frame_new ("Select screen or display");
7904 gtk_container_add (GTK_CONTAINER (vbox), frame);
7906 table = gtk_table_new (2, 2, TRUE);
7907 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
7908 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
7910 gtk_container_add (GTK_CONTAINER (frame), table);
7912 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
7913 if (gdk_display_get_n_screens(display) > 1)
7914 radio_scr = gtk_radio_button_new_with_label
7915 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
7918 radio_scr = gtk_radio_button_new_with_label
7919 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
7920 "only one screen on the current display");
7921 gtk_widget_set_sensitive (radio_scr, FALSE);
7923 combo_dpy = gtk_combo_new ();
7924 if (!valid_display_list)
7925 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
7927 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
7929 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
7930 "<hostname>:<X Server Num>.<Screen Num>");
7932 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
7933 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
7934 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
7936 bbox = gtk_hbutton_box_new ();
7937 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
7938 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
7940 gtk_container_add (GTK_CONTAINER (vbox), bbox);
7942 gtk_container_add (GTK_CONTAINER (bbox), applyb);
7943 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
7945 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
7947 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
7948 scr_dpy_data->radio_dpy = radio_dpy;
7949 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
7950 scr_dpy_data->dialog_window = window;
7951 scr_dpy_data->valid_display_list = valid_display_list;
7953 g_signal_connect (cancelb, "clicked",
7954 G_CALLBACK (screen_display_destroy_diag), window);
7955 g_signal_connect (applyb, "clicked",
7956 G_CALLBACK (screen_display_check), scr_dpy_data);
7957 gtk_widget_show_all (window);
7962 static gboolean event_watcher_enter_id = 0;
7963 static gboolean event_watcher_leave_id = 0;
7966 event_watcher (GSignalInvocationHint *ihint,
7967 guint n_param_values,
7968 const GValue *param_values,
7971 g_print ("Watch: \"%s\" emitted for %s\n",
7972 g_signal_name (ihint->signal_id),
7973 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
7979 event_watcher_down (void)
7981 if (event_watcher_enter_id)
7985 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7986 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
7987 event_watcher_enter_id = 0;
7988 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7989 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
7990 event_watcher_leave_id = 0;
7995 event_watcher_toggle (void)
7997 if (event_watcher_enter_id)
7998 event_watcher_down ();
8003 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
8004 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8005 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
8006 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
8011 create_event_watcher (GtkWidget *widget)
8017 dialog_window = gtk_dialog_new ();
8018 gtk_window_set_screen (GTK_WINDOW (dialog_window),
8019 gtk_widget_get_screen (widget));
8021 g_signal_connect (dialog_window, "destroy",
8022 G_CALLBACK (gtk_widget_destroyed),
8024 g_signal_connect (dialog_window, "destroy",
8025 G_CALLBACK (event_watcher_down),
8028 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
8029 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
8030 gtk_widget_set_size_request (dialog_window, 200, 110);
8032 button = gtk_toggle_button_new_with_label ("Activate Watch");
8033 g_signal_connect (button, "clicked",
8034 G_CALLBACK (event_watcher_toggle),
8036 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
8037 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
8038 button, TRUE, TRUE, 0);
8039 gtk_widget_show (button);
8041 button = gtk_button_new_with_label ("Close");
8042 g_signal_connect_swapped (button, "clicked",
8043 G_CALLBACK (gtk_widget_destroy),
8045 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8046 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
8047 button, TRUE, TRUE, 0);
8048 gtk_widget_grab_default (button);
8049 gtk_widget_show (button);
8052 if (!GTK_WIDGET_VISIBLE (dialog_window))
8053 gtk_widget_show (dialog_window);
8055 gtk_widget_destroy (dialog_window);
8063 reformat_value (GtkScale *scale,
8066 return g_strdup_printf ("-->%0.*g<--",
8067 gtk_scale_get_digits (scale), value);
8071 create_range_controls (GtkWidget *widget)
8073 static GtkWidget *window = NULL;
8077 GtkWidget *scrollbar;
8079 GtkWidget *separator;
8080 GtkObject *adjustment;
8085 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8087 gtk_window_set_screen (GTK_WINDOW (window),
8088 gtk_widget_get_screen (widget));
8090 g_signal_connect (window, "destroy",
8091 G_CALLBACK (gtk_widget_destroyed),
8094 gtk_window_set_title (GTK_WINDOW (window), "range controls");
8095 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8098 box1 = gtk_vbox_new (FALSE, 0);
8099 gtk_container_add (GTK_CONTAINER (window), box1);
8100 gtk_widget_show (box1);
8103 box2 = gtk_vbox_new (FALSE, 10);
8104 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8105 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
8106 gtk_widget_show (box2);
8109 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
8111 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
8112 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
8113 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
8114 gtk_scale_set_digits (GTK_SCALE (scale), 1);
8115 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8116 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
8117 gtk_widget_show (scale);
8119 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
8120 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
8121 GTK_UPDATE_CONTINUOUS);
8122 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
8123 gtk_widget_show (scrollbar);
8125 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
8126 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8127 g_signal_connect (scale,
8129 G_CALLBACK (reformat_value),
8131 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
8132 gtk_widget_show (scale);
8134 hbox = gtk_hbox_new (FALSE, 0);
8136 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8137 gtk_widget_set_size_request (scale, -1, 200);
8138 gtk_scale_set_digits (GTK_SCALE (scale), 2);
8139 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8140 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8141 gtk_widget_show (scale);
8143 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8144 gtk_widget_set_size_request (scale, -1, 200);
8145 gtk_scale_set_digits (GTK_SCALE (scale), 2);
8146 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8147 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
8148 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8149 gtk_widget_show (scale);
8151 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
8152 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
8153 g_signal_connect (scale,
8155 G_CALLBACK (reformat_value),
8157 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
8158 gtk_widget_show (scale);
8161 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
8162 gtk_widget_show (hbox);
8164 separator = gtk_hseparator_new ();
8165 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
8166 gtk_widget_show (separator);
8169 box2 = gtk_vbox_new (FALSE, 10);
8170 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8171 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8172 gtk_widget_show (box2);
8175 button = gtk_button_new_with_label ("close");
8176 g_signal_connect_swapped (button, "clicked",
8177 G_CALLBACK (gtk_widget_destroy),
8179 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8180 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8181 gtk_widget_grab_default (button);
8182 gtk_widget_show (button);
8185 if (!GTK_WIDGET_VISIBLE (window))
8186 gtk_widget_show (window);
8188 gtk_widget_destroy (window);
8196 create_rulers (GtkWidget *widget)
8198 static GtkWidget *window = NULL;
8204 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8206 gtk_window_set_screen (GTK_WINDOW (window),
8207 gtk_widget_get_screen (widget));
8209 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
8211 g_signal_connect (window, "destroy",
8212 G_CALLBACK (gtk_widget_destroyed),
8215 gtk_window_set_title (GTK_WINDOW (window), "rulers");
8216 gtk_widget_set_size_request (window, 300, 300);
8217 gtk_widget_set_events (window,
8218 GDK_POINTER_MOTION_MASK
8219 | GDK_POINTER_MOTION_HINT_MASK);
8220 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8222 table = gtk_table_new (2, 2, FALSE);
8223 gtk_container_add (GTK_CONTAINER (window), table);
8224 gtk_widget_show (table);
8226 ruler = gtk_hruler_new ();
8227 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
8228 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
8230 g_signal_connect_swapped (window,
8231 "motion_notify_event",
8232 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
8235 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
8236 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
8237 gtk_widget_show (ruler);
8240 ruler = gtk_vruler_new ();
8241 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
8243 g_signal_connect_swapped (window,
8244 "motion_notify_event",
8245 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
8248 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
8249 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
8250 gtk_widget_show (ruler);
8253 if (!GTK_WIDGET_VISIBLE (window))
8254 gtk_widget_show (window);
8256 gtk_widget_destroy (window);
8260 text_toggle_editable (GtkWidget *checkbutton,
8263 gtk_text_set_editable(GTK_TEXT(text),
8264 GTK_TOGGLE_BUTTON(checkbutton)->active);
8268 text_toggle_word_wrap (GtkWidget *checkbutton,
8271 gtk_text_set_word_wrap(GTK_TEXT(text),
8272 GTK_TOGGLE_BUTTON(checkbutton)->active);
8279 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
8280 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
8281 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
8282 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
8283 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
8284 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
8285 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
8286 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
8289 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
8295 text_insert_random (GtkWidget *w, GtkText *text)
8299 for (i=0; i<10; i++)
8301 c = 'A' + rand() % ('Z' - 'A');
8302 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
8303 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
8308 create_text (GtkWidget *widget)
8312 static GtkWidget *window = NULL;
8318 GtkWidget *separator;
8319 GtkWidget *scrolled_window;
8326 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8327 gtk_window_set_screen (GTK_WINDOW (window),
8328 gtk_widget_get_screen (widget));
8330 gtk_widget_set_name (window, "text window");
8331 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
8332 gtk_widget_set_size_request (window, 500, 500);
8334 g_signal_connect (window, "destroy",
8335 G_CALLBACK (gtk_widget_destroyed),
8338 gtk_window_set_title (GTK_WINDOW (window), "test");
8339 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8342 box1 = gtk_vbox_new (FALSE, 0);
8343 gtk_container_add (GTK_CONTAINER (window), box1);
8344 gtk_widget_show (box1);
8347 box2 = gtk_vbox_new (FALSE, 10);
8348 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8349 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
8350 gtk_widget_show (box2);
8353 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
8354 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
8355 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
8358 gtk_widget_show (scrolled_window);
8360 text = gtk_text_new (NULL, NULL);
8361 gtk_text_set_editable (GTK_TEXT (text), TRUE);
8362 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
8363 gtk_widget_grab_focus (text);
8364 gtk_widget_show (text);
8367 gtk_text_freeze (GTK_TEXT (text));
8369 for (i=0; i<ntext_colors; i++)
8371 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
8372 text_colors[i].name, -1);
8373 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
8375 for (j=0; j<ntext_colors; j++)
8377 gtk_text_insert (GTK_TEXT (text), NULL,
8378 &text_colors[j].color, &text_colors[i].color,
8381 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
8384 infile = fopen("testgtk.c", "r");
8389 int nbytes_read, nbytes_alloc;
8392 nbytes_alloc = 1024;
8393 buffer = g_new (char, nbytes_alloc);
8397 if (nbytes_alloc < nbytes_read + 1024)
8400 buffer = g_realloc (buffer, nbytes_alloc);
8402 len = fread (buffer + nbytes_read, 1, 1024, infile);
8408 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
8409 NULL, buffer, nbytes_read);
8414 gtk_text_thaw (GTK_TEXT (text));
8416 hbox = gtk_hbutton_box_new ();
8417 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
8418 gtk_widget_show (hbox);
8420 check = gtk_check_button_new_with_label("Editable");
8421 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
8422 g_signal_connect (check, "toggled",
8423 G_CALLBACK (text_toggle_editable), text);
8424 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
8425 gtk_widget_show (check);
8427 check = gtk_check_button_new_with_label("Wrap Words");
8428 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
8429 g_signal_connect (check, "toggled",
8430 G_CALLBACK (text_toggle_word_wrap), text);
8431 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
8432 gtk_widget_show (check);
8434 separator = gtk_hseparator_new ();
8435 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
8436 gtk_widget_show (separator);
8439 box2 = gtk_vbox_new (FALSE, 10);
8440 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8441 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8442 gtk_widget_show (box2);
8445 button = gtk_button_new_with_label ("insert random");
8446 g_signal_connect (button, "clicked",
8447 G_CALLBACK (text_insert_random),
8449 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8450 gtk_widget_show (button);
8452 button = gtk_button_new_with_label ("close");
8453 g_signal_connect_swapped (button, "clicked",
8454 G_CALLBACK (gtk_widget_destroy),
8456 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8457 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8458 gtk_widget_grab_default (button);
8459 gtk_widget_show (button);
8462 if (!GTK_WIDGET_VISIBLE (window))
8463 gtk_widget_show (window);
8465 gtk_widget_destroy (window);
8472 GdkPixbuf *book_open;
8473 GdkPixbuf *book_closed;
8474 GtkWidget *sample_notebook;
8477 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
8479 GtkWidget *page_widget;
8482 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
8484 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
8485 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
8487 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
8488 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
8492 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
8494 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
8495 gint old_page_num = gtk_notebook_get_current_page (notebook);
8497 if (page_num == old_page_num)
8500 set_page_image (notebook, page_num, book_open);
8502 if (old_page_num != -1)
8503 set_page_image (notebook, old_page_num, book_closed);
8507 tab_fill (GtkToggleButton *button, GtkWidget *child)
8510 GtkPackType pack_type;
8512 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8513 &expand, NULL, &pack_type);
8514 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8515 expand, button->active, pack_type);
8519 tab_expand (GtkToggleButton *button, GtkWidget *child)
8522 GtkPackType pack_type;
8524 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8525 NULL, &fill, &pack_type);
8526 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8527 button->active, fill, pack_type);
8531 tab_pack (GtkToggleButton *button, GtkWidget *child)
8537 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8538 &expand, &fill, NULL);
8539 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8540 expand, fill, button->active);
8544 create_pages (GtkNotebook *notebook, gint start, gint end)
8546 GtkWidget *child = NULL;
8551 GtkWidget *label_box;
8552 GtkWidget *menu_box;
8556 char accel_buffer[32];
8558 for (i = start; i <= end; i++)
8560 sprintf (buffer, "Page %d", i);
8561 sprintf (accel_buffer, "Page _%d", i);
8563 child = gtk_frame_new (buffer);
8564 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
8566 vbox = gtk_vbox_new (TRUE,0);
8567 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8568 gtk_container_add (GTK_CONTAINER (child), vbox);
8570 hbox = gtk_hbox_new (TRUE,0);
8571 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
8573 button = gtk_check_button_new_with_label ("Fill Tab");
8574 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8575 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8576 g_signal_connect (button, "toggled",
8577 G_CALLBACK (tab_fill), child);
8579 button = gtk_check_button_new_with_label ("Expand Tab");
8580 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8581 g_signal_connect (button, "toggled",
8582 G_CALLBACK (tab_expand), child);
8584 button = gtk_check_button_new_with_label ("Pack end");
8585 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8586 g_signal_connect (button, "toggled",
8587 G_CALLBACK (tab_pack), child);
8589 button = gtk_button_new_with_label ("Hide Page");
8590 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
8591 g_signal_connect_swapped (button, "clicked",
8592 G_CALLBACK (gtk_widget_hide),
8595 gtk_widget_show_all (child);
8597 label_box = gtk_hbox_new (FALSE, 0);
8598 pixwid = gtk_image_new_from_pixbuf (book_closed);
8599 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
8601 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
8602 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
8603 label = gtk_label_new_with_mnemonic (accel_buffer);
8604 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
8605 gtk_widget_show_all (label_box);
8608 menu_box = gtk_hbox_new (FALSE, 0);
8609 pixwid = gtk_image_new_from_pixbuf (book_closed);
8610 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
8612 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
8613 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
8614 label = gtk_label_new (buffer);
8615 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
8616 gtk_widget_show_all (menu_box);
8618 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
8623 rotate_notebook (GtkButton *button,
8624 GtkNotebook *notebook)
8626 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
8630 show_all_pages (GtkButton *button,
8631 GtkNotebook *notebook)
8633 gtk_container_foreach (GTK_CONTAINER (notebook),
8634 (GtkCallback) gtk_widget_show, NULL);
8638 notebook_type_changed (GtkWidget *optionmenu,
8641 GtkNotebook *notebook;
8651 notebook = GTK_NOTEBOOK (data);
8653 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
8658 /* standard notebook */
8659 gtk_notebook_set_show_tabs (notebook, TRUE);
8660 gtk_notebook_set_show_border (notebook, TRUE);
8661 gtk_notebook_set_scrollable (notebook, FALSE);
8665 /* notabs notebook */
8666 gtk_notebook_set_show_tabs (notebook, FALSE);
8667 gtk_notebook_set_show_border (notebook, TRUE);
8672 gtk_notebook_set_show_tabs (notebook, FALSE);
8673 gtk_notebook_set_show_border (notebook, FALSE);
8678 gtk_notebook_set_show_tabs (notebook, TRUE);
8679 gtk_notebook_set_show_border (notebook, TRUE);
8680 gtk_notebook_set_scrollable (notebook, TRUE);
8681 if (g_list_length (notebook->children) == 5)
8682 create_pages (notebook, 6, 15);
8688 if (g_list_length (notebook->children) == 15)
8689 for (i = 0; i < 10; i++)
8690 gtk_notebook_remove_page (notebook, 5);
8694 notebook_popup (GtkToggleButton *button,
8695 GtkNotebook *notebook)
8698 gtk_notebook_popup_enable (notebook);
8700 gtk_notebook_popup_disable (notebook);
8704 notebook_homogeneous (GtkToggleButton *button,
8705 GtkNotebook *notebook)
8707 g_object_set (notebook, "homogeneous", button->active, NULL);
8711 create_notebook (GtkWidget *widget)
8713 static GtkWidget *window = NULL;
8717 GtkWidget *separator;
8721 static gchar *items[] =
8731 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8732 gtk_window_set_screen (GTK_WINDOW (window),
8733 gtk_widget_get_screen (widget));
8735 g_signal_connect (window, "destroy",
8736 G_CALLBACK (gtk_widget_destroyed),
8739 gtk_window_set_title (GTK_WINDOW (window), "notebook");
8740 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8742 box1 = gtk_vbox_new (FALSE, 0);
8743 gtk_container_add (GTK_CONTAINER (window), box1);
8745 sample_notebook = gtk_notebook_new ();
8746 g_signal_connect (sample_notebook, "switch_page",
8747 G_CALLBACK (page_switch), NULL);
8748 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
8749 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
8750 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
8752 gtk_widget_realize (sample_notebook);
8755 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
8758 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
8760 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
8762 separator = gtk_hseparator_new ();
8763 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
8765 box2 = gtk_hbox_new (FALSE, 5);
8766 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8767 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8769 button = gtk_check_button_new_with_label ("popup menu");
8770 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
8771 g_signal_connect (button, "clicked",
8772 G_CALLBACK (notebook_popup),
8775 button = gtk_check_button_new_with_label ("homogeneous tabs");
8776 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
8777 g_signal_connect (button, "clicked",
8778 G_CALLBACK (notebook_homogeneous),
8781 box2 = gtk_hbox_new (FALSE, 5);
8782 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8783 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8785 label = gtk_label_new ("Notebook Style :");
8786 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
8788 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
8789 notebook_type_changed,
8791 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
8793 button = gtk_button_new_with_label ("Show all Pages");
8794 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
8795 g_signal_connect (button, "clicked",
8796 G_CALLBACK (show_all_pages), sample_notebook);
8798 box2 = gtk_hbox_new (TRUE, 10);
8799 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8800 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8802 button = gtk_button_new_with_label ("prev");
8803 g_signal_connect_swapped (button, "clicked",
8804 G_CALLBACK (gtk_notebook_prev_page),
8806 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8808 button = gtk_button_new_with_label ("next");
8809 g_signal_connect_swapped (button, "clicked",
8810 G_CALLBACK (gtk_notebook_next_page),
8812 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8814 button = gtk_button_new_with_label ("rotate");
8815 g_signal_connect (button, "clicked",
8816 G_CALLBACK (rotate_notebook), sample_notebook);
8817 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8819 separator = gtk_hseparator_new ();
8820 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
8822 button = gtk_button_new_with_label ("close");
8823 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
8824 g_signal_connect_swapped (button, "clicked",
8825 G_CALLBACK (gtk_widget_destroy),
8827 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
8828 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8829 gtk_widget_grab_default (button);
8832 if (!GTK_WIDGET_VISIBLE (window))
8833 gtk_widget_show_all (window);
8835 gtk_widget_destroy (window);
8843 toggle_resize (GtkWidget *widget, GtkWidget *child)
8845 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
8846 GValue value = { 0, };
8847 g_value_init (&value, G_TYPE_BOOLEAN);
8848 gtk_container_child_get_property (container, child, "resize", &value);
8849 g_value_set_boolean (&value, !g_value_get_boolean (&value));
8850 gtk_container_child_set_property (container, child, "resize", &value);
8854 toggle_shrink (GtkWidget *widget, GtkWidget *child)
8856 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
8857 GValue value = { 0, };
8858 g_value_init (&value, G_TYPE_BOOLEAN);
8859 gtk_container_child_get_property (container, child, "shrink", &value);
8860 g_value_set_boolean (&value, !g_value_get_boolean (&value));
8861 gtk_container_child_set_property (container, child, "shrink", &value);
8865 paned_props_clicked (GtkWidget *button,
8868 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
8870 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
8874 create_pane_options (GtkPaned *paned,
8875 const gchar *frame_label,
8876 const gchar *label1,
8877 const gchar *label2)
8883 GtkWidget *check_button;
8885 frame = gtk_frame_new (frame_label);
8886 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
8888 table = gtk_table_new (4, 2, 4);
8889 gtk_container_add (GTK_CONTAINER (frame), table);
8891 label = gtk_label_new (label1);
8892 gtk_table_attach_defaults (GTK_TABLE (table), label,
8895 check_button = gtk_check_button_new_with_label ("Resize");
8896 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8898 g_signal_connect (check_button, "toggled",
8899 G_CALLBACK (toggle_resize),
8902 check_button = gtk_check_button_new_with_label ("Shrink");
8903 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8905 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8907 g_signal_connect (check_button, "toggled",
8908 G_CALLBACK (toggle_shrink),
8911 label = gtk_label_new (label2);
8912 gtk_table_attach_defaults (GTK_TABLE (table), label,
8915 check_button = gtk_check_button_new_with_label ("Resize");
8916 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8918 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8920 g_signal_connect (check_button, "toggled",
8921 G_CALLBACK (toggle_resize),
8924 check_button = gtk_check_button_new_with_label ("Shrink");
8925 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8927 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8929 g_signal_connect (check_button, "toggled",
8930 G_CALLBACK (toggle_shrink),
8933 button = gtk_button_new_with_mnemonic ("_Properties");
8934 gtk_table_attach_defaults (GTK_TABLE (table), button,
8936 g_signal_connect (button, "clicked",
8937 G_CALLBACK (paned_props_clicked),
8944 create_panes (GtkWidget *widget)
8946 static GtkWidget *window = NULL;
8955 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8957 gtk_window_set_screen (GTK_WINDOW (window),
8958 gtk_widget_get_screen (widget));
8960 g_signal_connect (window, "destroy",
8961 G_CALLBACK (gtk_widget_destroyed),
8964 gtk_window_set_title (GTK_WINDOW (window), "Panes");
8965 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8967 vbox = gtk_vbox_new (FALSE, 0);
8968 gtk_container_add (GTK_CONTAINER (window), vbox);
8970 vpaned = gtk_vpaned_new ();
8971 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
8972 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
8974 hpaned = gtk_hpaned_new ();
8975 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
8977 frame = gtk_frame_new (NULL);
8978 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8979 gtk_widget_set_size_request (frame, 60, 60);
8980 gtk_paned_add1 (GTK_PANED (hpaned), frame);
8982 button = gtk_button_new_with_label ("Hi there");
8983 gtk_container_add (GTK_CONTAINER(frame), button);
8985 frame = gtk_frame_new (NULL);
8986 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8987 gtk_widget_set_size_request (frame, 80, 60);
8988 gtk_paned_add2 (GTK_PANED (hpaned), frame);
8990 frame = gtk_frame_new (NULL);
8991 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8992 gtk_widget_set_size_request (frame, 60, 80);
8993 gtk_paned_add2 (GTK_PANED (vpaned), frame);
8995 /* Now create toggle buttons to control sizing */
8997 gtk_box_pack_start (GTK_BOX (vbox),
8998 create_pane_options (GTK_PANED (hpaned),
9004 gtk_box_pack_start (GTK_BOX (vbox),
9005 create_pane_options (GTK_PANED (vpaned),
9011 gtk_widget_show_all (vbox);
9014 if (!GTK_WIDGET_VISIBLE (window))
9015 gtk_widget_show (window);
9017 gtk_widget_destroy (window);
9021 * Paned keyboard navigation
9025 paned_keyboard_window1 (GtkWidget *widget)
9048 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9049 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
9050 gtk_window_set_screen (GTK_WINDOW (window1),
9051 gtk_widget_get_screen (widget));
9053 hpaned1 = gtk_hpaned_new ();
9054 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
9056 frame1 = gtk_frame_new (NULL);
9057 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
9058 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
9060 vbox1 = gtk_vbox_new (FALSE, 0);
9061 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
9063 button7 = gtk_button_new_with_label ("button7");
9064 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
9066 button8 = gtk_button_new_with_label ("button8");
9067 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
9069 button9 = gtk_button_new_with_label ("button9");
9070 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
9072 vpaned1 = gtk_vpaned_new ();
9073 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
9075 frame2 = gtk_frame_new (NULL);
9076 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
9077 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
9079 frame5 = gtk_frame_new (NULL);
9080 gtk_container_add (GTK_CONTAINER (frame2), frame5);
9082 hbox1 = gtk_hbox_new (FALSE, 0);
9083 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
9085 button5 = gtk_button_new_with_label ("button5");
9086 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
9088 button6 = gtk_button_new_with_label ("button6");
9089 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
9091 frame3 = gtk_frame_new (NULL);
9092 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
9093 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
9095 frame4 = gtk_frame_new ("Buttons");
9096 gtk_container_add (GTK_CONTAINER (frame3), frame4);
9097 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
9099 table1 = gtk_table_new (2, 2, FALSE);
9100 gtk_container_add (GTK_CONTAINER (frame4), table1);
9101 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
9103 button1 = gtk_button_new_with_label ("button1");
9104 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
9105 (GtkAttachOptions) (GTK_FILL),
9106 (GtkAttachOptions) (0), 0, 0);
9108 button2 = gtk_button_new_with_label ("button2");
9109 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
9110 (GtkAttachOptions) (GTK_FILL),
9111 (GtkAttachOptions) (0), 0, 0);
9113 button3 = gtk_button_new_with_label ("button3");
9114 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
9115 (GtkAttachOptions) (GTK_FILL),
9116 (GtkAttachOptions) (0), 0, 0);
9118 button4 = gtk_button_new_with_label ("button4");
9119 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
9120 (GtkAttachOptions) (GTK_FILL),
9121 (GtkAttachOptions) (0), 0, 0);
9127 paned_keyboard_window2 (GtkWidget *widget)
9132 GtkWidget *button13;
9136 GtkWidget *button12;
9138 GtkWidget *button11;
9139 GtkWidget *button10;
9141 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9142 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
9144 gtk_window_set_screen (GTK_WINDOW (window2),
9145 gtk_widget_get_screen (widget));
9147 hpaned2 = gtk_hpaned_new ();
9148 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
9150 frame6 = gtk_frame_new (NULL);
9151 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
9152 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
9154 button13 = gtk_button_new_with_label ("button13");
9155 gtk_container_add (GTK_CONTAINER (frame6), button13);
9157 hbox2 = gtk_hbox_new (FALSE, 0);
9158 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
9160 vpaned2 = gtk_vpaned_new ();
9161 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
9163 frame7 = gtk_frame_new (NULL);
9164 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
9165 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
9167 button12 = gtk_button_new_with_label ("button12");
9168 gtk_container_add (GTK_CONTAINER (frame7), button12);
9170 frame8 = gtk_frame_new (NULL);
9171 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
9172 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
9174 button11 = gtk_button_new_with_label ("button11");
9175 gtk_container_add (GTK_CONTAINER (frame8), button11);
9177 button10 = gtk_button_new_with_label ("button10");
9178 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
9184 paned_keyboard_window3 (GtkWidget *widget)
9191 GtkWidget *button14;
9194 GtkWidget *button15;
9197 GtkWidget *button16;
9199 GtkWidget *button17;
9201 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9202 g_object_set_data (G_OBJECT (window3), "window3", window3);
9203 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
9205 gtk_window_set_screen (GTK_WINDOW (window3),
9206 gtk_widget_get_screen (widget));
9209 vbox2 = gtk_vbox_new (FALSE, 0);
9210 gtk_container_add (GTK_CONTAINER (window3), vbox2);
9212 label1 = gtk_label_new ("Three panes nested inside each other");
9213 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
9215 hpaned3 = gtk_hpaned_new ();
9216 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
9218 frame9 = gtk_frame_new (NULL);
9219 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
9220 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
9222 button14 = gtk_button_new_with_label ("button14");
9223 gtk_container_add (GTK_CONTAINER (frame9), button14);
9225 hpaned4 = gtk_hpaned_new ();
9226 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
9228 frame10 = gtk_frame_new (NULL);
9229 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
9230 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
9232 button15 = gtk_button_new_with_label ("button15");
9233 gtk_container_add (GTK_CONTAINER (frame10), button15);
9235 hpaned5 = gtk_hpaned_new ();
9236 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
9238 frame11 = gtk_frame_new (NULL);
9239 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
9240 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
9242 button16 = gtk_button_new_with_label ("button16");
9243 gtk_container_add (GTK_CONTAINER (frame11), button16);
9245 frame12 = gtk_frame_new (NULL);
9246 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
9247 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
9249 button17 = gtk_button_new_with_label ("button17");
9250 gtk_container_add (GTK_CONTAINER (frame12), button17);
9256 paned_keyboard_window4 (GtkWidget *widget)
9263 GtkWidget *button19;
9264 GtkWidget *button18;
9267 GtkWidget *button21;
9268 GtkWidget *button20;
9270 GtkWidget *button23;
9271 GtkWidget *button22;
9273 GtkWidget *button25;
9274 GtkWidget *button24;
9276 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9277 g_object_set_data (G_OBJECT (window4), "window4", window4);
9278 gtk_window_set_title (GTK_WINDOW (window4), "window4");
9280 gtk_window_set_screen (GTK_WINDOW (window4),
9281 gtk_widget_get_screen (widget));
9283 vbox3 = gtk_vbox_new (FALSE, 0);
9284 gtk_container_add (GTK_CONTAINER (window4), vbox3);
9286 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
9287 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
9288 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
9290 hpaned6 = gtk_hpaned_new ();
9291 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
9293 vpaned3 = gtk_vpaned_new ();
9294 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
9296 button19 = gtk_button_new_with_label ("button19");
9297 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
9299 button18 = gtk_button_new_with_label ("button18");
9300 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
9302 hbox3 = gtk_hbox_new (FALSE, 0);
9303 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
9305 vpaned4 = gtk_vpaned_new ();
9306 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
9308 button21 = gtk_button_new_with_label ("button21");
9309 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
9311 button20 = gtk_button_new_with_label ("button20");
9312 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
9314 vpaned5 = gtk_vpaned_new ();
9315 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
9317 button23 = gtk_button_new_with_label ("button23");
9318 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
9320 button22 = gtk_button_new_with_label ("button22");
9321 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
9323 vpaned6 = gtk_vpaned_new ();
9324 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
9326 button25 = gtk_button_new_with_label ("button25");
9327 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
9329 button24 = gtk_button_new_with_label ("button24");
9330 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
9336 create_paned_keyboard_navigation (GtkWidget *widget)
9338 static GtkWidget *window1 = NULL;
9339 static GtkWidget *window2 = NULL;
9340 static GtkWidget *window3 = NULL;
9341 static GtkWidget *window4 = NULL;
9344 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
9346 gtk_widget_destroy (window1);
9347 gtk_widget_destroy (window2);
9348 gtk_widget_destroy (window3);
9349 gtk_widget_destroy (window4);
9354 window1 = paned_keyboard_window1 (widget);
9355 g_signal_connect (window1, "destroy",
9356 G_CALLBACK (gtk_widget_destroyed),
9362 window2 = paned_keyboard_window2 (widget);
9363 g_signal_connect (window2, "destroy",
9364 G_CALLBACK (gtk_widget_destroyed),
9370 window3 = paned_keyboard_window3 (widget);
9371 g_signal_connect (window3, "destroy",
9372 G_CALLBACK (gtk_widget_destroyed),
9378 window4 = paned_keyboard_window4 (widget);
9379 g_signal_connect (window4, "destroy",
9380 G_CALLBACK (gtk_widget_destroyed),
9384 if (GTK_WIDGET_VISIBLE (window1))
9385 gtk_widget_destroy (GTK_WIDGET (window1));
9387 gtk_widget_show_all (GTK_WIDGET (window1));
9389 if (GTK_WIDGET_VISIBLE (window2))
9390 gtk_widget_destroy (GTK_WIDGET (window2));
9392 gtk_widget_show_all (GTK_WIDGET (window2));
9394 if (GTK_WIDGET_VISIBLE (window3))
9395 gtk_widget_destroy (GTK_WIDGET (window3));
9397 gtk_widget_show_all (GTK_WIDGET (window3));
9399 if (GTK_WIDGET_VISIBLE (window4))
9400 gtk_widget_destroy (GTK_WIDGET (window4));
9402 gtk_widget_show_all (GTK_WIDGET (window4));
9410 typedef struct _cursoroffset {gint x,y;} CursorOffset;
9413 shape_pressed (GtkWidget *widget, GdkEventButton *event)
9417 /* ignore double and triple click */
9418 if (event->type != GDK_BUTTON_PRESS)
9421 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9422 p->x = (int) event->x;
9423 p->y = (int) event->y;
9425 gtk_grab_add (widget);
9426 gdk_pointer_grab (widget->window, TRUE,
9427 GDK_BUTTON_RELEASE_MASK |
9428 GDK_BUTTON_MOTION_MASK |
9429 GDK_POINTER_MOTION_HINT_MASK,
9434 shape_released (GtkWidget *widget)
9436 gtk_grab_remove (widget);
9437 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9442 shape_motion (GtkWidget *widget,
9443 GdkEventMotion *event)
9447 GdkModifierType mask;
9449 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9452 * Can't use event->x / event->y here
9453 * because I need absolute coordinates.
9455 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
9456 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
9460 shape_create_icon (GdkScreen *screen,
9471 CursorOffset* icon_pos;
9473 GdkBitmap *gdk_pixmap_mask;
9474 GdkPixmap *gdk_pixmap;
9477 style = gtk_widget_get_default_style ();
9478 gc = style->black_gc;
9481 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
9483 window = gtk_window_new (window_type);
9484 gtk_window_set_screen (GTK_WINDOW (window), screen);
9486 fixed = gtk_fixed_new ();
9487 gtk_widget_set_size_request (fixed, 100, 100);
9488 gtk_container_add (GTK_CONTAINER (window), fixed);
9489 gtk_widget_show (fixed);
9491 gtk_widget_set_events (window,
9492 gtk_widget_get_events (window) |
9493 GDK_BUTTON_MOTION_MASK |
9494 GDK_POINTER_MOTION_HINT_MASK |
9495 GDK_BUTTON_PRESS_MASK);
9497 gtk_widget_realize (window);
9498 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
9499 &style->bg[GTK_STATE_NORMAL],
9502 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
9503 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
9504 gtk_widget_show (pixmap);
9506 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
9508 g_object_unref (gdk_pixmap_mask);
9509 g_object_unref (gdk_pixmap);
9511 g_signal_connect (window, "button_press_event",
9512 G_CALLBACK (shape_pressed), NULL);
9513 g_signal_connect (window, "button_release_event",
9514 G_CALLBACK (shape_released), NULL);
9515 g_signal_connect (window, "motion_notify_event",
9516 G_CALLBACK (shape_motion), NULL);
9518 icon_pos = g_new (CursorOffset, 1);
9519 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
9521 gtk_widget_set_uposition (window, x, y);
9522 gtk_widget_show (window);
9528 create_shapes (GtkWidget *widget)
9530 /* Variables used by the Drag/Drop and Shape Window demos */
9531 static GtkWidget *modeller = NULL;
9532 static GtkWidget *sheets = NULL;
9533 static GtkWidget *rings = NULL;
9534 static GtkWidget *with_region = NULL;
9535 GdkScreen *screen = gtk_widget_get_screen (widget);
9537 if (!(file_exists ("Modeller.xpm") &&
9538 file_exists ("FilesQueue.xpm") &&
9539 file_exists ("3DRings.xpm")))
9545 modeller = shape_create_icon (screen, "Modeller.xpm",
9546 440, 140, 0,0, GTK_WINDOW_POPUP);
9548 g_signal_connect (modeller, "destroy",
9549 G_CALLBACK (gtk_widget_destroyed),
9553 gtk_widget_destroy (modeller);
9557 sheets = shape_create_icon (screen, "FilesQueue.xpm",
9558 580, 170, 0,0, GTK_WINDOW_POPUP);
9560 g_signal_connect (sheets, "destroy",
9561 G_CALLBACK (gtk_widget_destroyed),
9566 gtk_widget_destroy (sheets);
9570 rings = shape_create_icon (screen, "3DRings.xpm",
9571 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9573 g_signal_connect (rings, "destroy",
9574 G_CALLBACK (gtk_widget_destroyed),
9578 gtk_widget_destroy (rings);
9585 with_region = shape_create_icon (screen, "3DRings.xpm",
9586 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9588 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
9590 g_signal_connect (with_region, "destroy",
9591 G_CALLBACK (gtk_widget_destroyed),
9594 /* reset shape from mask to a region */
9597 region = gdk_region_new ();
9609 gdk_region_union_with_rect (region, &rect);
9617 gdk_window_shape_combine_region (with_region->window,
9622 gtk_widget_destroy (with_region);
9630 create_wmhints (GtkWidget *widget)
9632 static GtkWidget *window = NULL;
9634 GtkWidget *separator;
9643 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9645 gtk_window_set_screen (GTK_WINDOW (window),
9646 gtk_widget_get_screen (widget));
9648 g_signal_connect (window, "destroy",
9649 G_CALLBACK (gtk_widget_destroyed),
9652 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
9653 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9655 gtk_widget_realize (window);
9657 circles = gdk_bitmap_create_from_data (window->window,
9661 gdk_window_set_icon (window->window, NULL,
9664 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
9666 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
9667 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
9669 box1 = gtk_vbox_new (FALSE, 0);
9670 gtk_container_add (GTK_CONTAINER (window), box1);
9671 gtk_widget_show (box1);
9673 label = gtk_label_new ("Try iconizing me!");
9674 gtk_widget_set_size_request (label, 150, 50);
9675 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
9676 gtk_widget_show (label);
9679 separator = gtk_hseparator_new ();
9680 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9681 gtk_widget_show (separator);
9684 box2 = gtk_vbox_new (FALSE, 10);
9685 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9686 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9687 gtk_widget_show (box2);
9690 button = gtk_button_new_with_label ("close");
9692 g_signal_connect_swapped (button, "clicked",
9693 G_CALLBACK (gtk_widget_destroy),
9696 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9697 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9698 gtk_widget_grab_default (button);
9699 gtk_widget_show (button);
9702 if (!GTK_WIDGET_VISIBLE (window))
9703 gtk_widget_show (window);
9705 gtk_widget_destroy (window);
9710 * Window state tracking
9714 window_state_callback (GtkWidget *widget,
9715 GdkEventWindowState *event,
9718 GtkWidget *label = data;
9721 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
9722 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
9723 "withdrawn" : "not withdrawn", ", ",
9724 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
9725 "iconified" : "not iconified", ", ",
9726 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
9727 "sticky" : "not sticky", ", ",
9728 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
9729 "maximized" : "not maximized", ", ",
9730 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
9731 "fullscreen" : "not fullscreen",
9732 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
9733 "above" : "not above", ", ",
9734 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
9735 "below" : "not below", ", ",
9738 gtk_label_set_text (GTK_LABEL (label), msg);
9746 tracking_label (GtkWidget *window)
9752 hbox = gtk_hbox_new (FALSE, 5);
9754 g_signal_connect_object (hbox,
9756 G_CALLBACK (gtk_widget_destroy),
9760 label = gtk_label_new ("<no window state events received>");
9761 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
9762 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
9764 g_signal_connect (window,
9765 "window_state_event",
9766 G_CALLBACK (window_state_callback),
9769 button = gtk_button_new_with_label ("Deiconify");
9770 g_signal_connect_object (button,
9772 G_CALLBACK (gtk_window_deiconify),
9775 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9777 button = gtk_button_new_with_label ("Iconify");
9778 g_signal_connect_object (button,
9780 G_CALLBACK (gtk_window_iconify),
9783 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9785 button = gtk_button_new_with_label ("Fullscreen");
9786 g_signal_connect_object (button,
9788 G_CALLBACK (gtk_window_fullscreen),
9791 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9793 button = gtk_button_new_with_label ("Unfullscreen");
9794 g_signal_connect_object (button,
9796 G_CALLBACK (gtk_window_unfullscreen),
9799 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9801 button = gtk_button_new_with_label ("Present");
9802 g_signal_connect_object (button,
9804 G_CALLBACK (gtk_window_present),
9807 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9809 button = gtk_button_new_with_label ("Show");
9810 g_signal_connect_object (button,
9812 G_CALLBACK (gtk_widget_show),
9815 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9817 gtk_widget_show_all (hbox);
9823 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
9825 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
9827 gtk_window_set_keep_above (GTK_WINDOW (data),
9828 gtk_toggle_button_get_active (togglebutton));
9830 if (gtk_toggle_button_get_active (togglebutton))
9831 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
9835 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
9837 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
9839 gtk_window_set_keep_below (GTK_WINDOW (data),
9840 gtk_toggle_button_get_active (togglebutton));
9842 if (gtk_toggle_button_get_active (togglebutton))
9843 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
9848 get_state_controls (GtkWidget *window)
9852 GtkWidget *button_above;
9853 GtkWidget *button_below;
9855 vbox = gtk_vbox_new (FALSE, 0);
9857 button = gtk_button_new_with_label ("Stick");
9858 g_signal_connect_object (button,
9860 G_CALLBACK (gtk_window_stick),
9863 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9865 button = gtk_button_new_with_label ("Unstick");
9866 g_signal_connect_object (button,
9868 G_CALLBACK (gtk_window_unstick),
9871 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9873 button = gtk_button_new_with_label ("Maximize");
9874 g_signal_connect_object (button,
9876 G_CALLBACK (gtk_window_maximize),
9879 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9881 button = gtk_button_new_with_label ("Unmaximize");
9882 g_signal_connect_object (button,
9884 G_CALLBACK (gtk_window_unmaximize),
9887 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9889 button = gtk_button_new_with_label ("Iconify");
9890 g_signal_connect_object (button,
9892 G_CALLBACK (gtk_window_iconify),
9895 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9897 button = gtk_button_new_with_label ("Fullscreen");
9898 g_signal_connect_object (button,
9900 G_CALLBACK (gtk_window_fullscreen),
9903 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9905 button = gtk_button_new_with_label ("Unfullscreen");
9906 g_signal_connect_object (button,
9908 G_CALLBACK (gtk_window_unfullscreen),
9911 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9913 button_above = gtk_toggle_button_new_with_label ("Keep above");
9914 g_signal_connect (button_above,
9916 G_CALLBACK (keep_window_above),
9918 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
9920 button_below = gtk_toggle_button_new_with_label ("Keep below");
9921 g_signal_connect (button_below,
9923 G_CALLBACK (keep_window_below),
9925 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
9927 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
9928 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
9930 button = gtk_button_new_with_label ("Hide (withdraw)");
9931 g_signal_connect_object (button,
9933 G_CALLBACK (gtk_widget_hide),
9936 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9938 gtk_widget_show_all (vbox);
9944 create_window_states (GtkWidget *widget)
9946 static GtkWidget *window = NULL;
9949 GtkWidget *iconified;
9951 GtkWidget *controls;
9955 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9956 gtk_window_set_screen (GTK_WINDOW (window),
9957 gtk_widget_get_screen (widget));
9959 g_signal_connect (window, "destroy",
9960 G_CALLBACK (gtk_widget_destroyed),
9963 gtk_window_set_title (GTK_WINDOW (window), "Window states");
9965 box1 = gtk_vbox_new (FALSE, 0);
9966 gtk_container_add (GTK_CONTAINER (window), box1);
9968 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9970 gtk_window_set_screen (GTK_WINDOW (iconified),
9971 gtk_widget_get_screen (widget));
9973 g_signal_connect_object (iconified, "destroy",
9974 G_CALLBACK (gtk_widget_destroy),
9977 gtk_window_iconify (GTK_WINDOW (iconified));
9978 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
9979 controls = get_state_controls (iconified);
9980 gtk_container_add (GTK_CONTAINER (iconified), controls);
9982 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9984 gtk_window_set_screen (GTK_WINDOW (normal),
9985 gtk_widget_get_screen (widget));
9987 g_signal_connect_object (normal, "destroy",
9988 G_CALLBACK (gtk_widget_destroy),
9992 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
9993 controls = get_state_controls (normal);
9994 gtk_container_add (GTK_CONTAINER (normal), controls);
9996 label = tracking_label (iconified);
9997 gtk_container_add (GTK_CONTAINER (box1), label);
9999 label = tracking_label (normal);
10000 gtk_container_add (GTK_CONTAINER (box1), label);
10002 gtk_widget_show_all (iconified);
10003 gtk_widget_show_all (normal);
10004 gtk_widget_show_all (box1);
10007 if (!GTK_WIDGET_VISIBLE (window))
10008 gtk_widget_show (window);
10010 gtk_widget_destroy (window);
10018 configure_event_callback (GtkWidget *widget,
10019 GdkEventConfigure *event,
10022 GtkWidget *label = data;
10026 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
10028 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
10029 "position: %d, %d",
10030 event->x, event->y, event->width, event->height,
10033 gtk_label_set_text (GTK_LABEL (label), msg);
10041 get_ints (GtkWidget *window,
10048 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
10049 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
10051 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
10052 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
10056 set_size_callback (GtkWidget *widget,
10061 get_ints (data, &w, &h);
10063 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
10067 unset_default_size_callback (GtkWidget *widget,
10070 gtk_window_set_default_size (g_object_get_data (data, "target"),
10075 set_default_size_callback (GtkWidget *widget,
10080 get_ints (data, &w, &h);
10082 gtk_window_set_default_size (g_object_get_data (data, "target"),
10087 unset_size_request_callback (GtkWidget *widget,
10090 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10095 set_size_request_callback (GtkWidget *widget,
10100 get_ints (data, &w, &h);
10102 gtk_widget_set_size_request (g_object_get_data (data, "target"),
10107 set_location_callback (GtkWidget *widget,
10112 get_ints (data, &x, &y);
10114 gtk_window_move (g_object_get_data (data, "target"), x, y);
10118 move_to_position_callback (GtkWidget *widget,
10124 window = g_object_get_data (data, "target");
10126 gtk_window_get_position (window, &x, &y);
10128 gtk_window_move (window, x, y);
10132 set_geometry_callback (GtkWidget *entry,
10138 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
10140 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
10142 if (!gtk_window_parse_geometry (target, text))
10143 g_print ("Bad geometry string '%s'\n", text);
10149 allow_shrink_callback (GtkWidget *widget,
10152 g_object_set (g_object_get_data (data, "target"),
10154 GTK_TOGGLE_BUTTON (widget)->active,
10159 allow_grow_callback (GtkWidget *widget,
10162 g_object_set (g_object_get_data (data, "target"),
10164 GTK_TOGGLE_BUTTON (widget)->active,
10169 gravity_selected (GtkWidget *widget,
10172 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
10173 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
10177 pos_selected (GtkWidget *widget,
10180 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
10181 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
10185 move_gravity_window_to_current_position (GtkWidget *widget,
10191 window = GTK_WINDOW (data);
10193 gtk_window_get_position (window, &x, &y);
10195 gtk_window_move (window, x, y);
10199 get_screen_corner (GtkWindow *window,
10204 GdkScreen * screen = gtk_window_get_screen (window);
10206 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
10208 switch (gtk_window_get_gravity (window))
10210 case GDK_GRAVITY_SOUTH_EAST:
10211 *x = gdk_screen_get_width (screen) - w;
10212 *y = gdk_screen_get_height (screen) - h;
10215 case GDK_GRAVITY_NORTH_EAST:
10216 *x = gdk_screen_get_width (screen) - w;
10220 case GDK_GRAVITY_SOUTH_WEST:
10222 *y = gdk_screen_get_height (screen) - h;
10225 case GDK_GRAVITY_NORTH_WEST:
10230 case GDK_GRAVITY_SOUTH:
10231 *x = (gdk_screen_get_width (screen) - w) / 2;
10232 *y = gdk_screen_get_height (screen) - h;
10235 case GDK_GRAVITY_NORTH:
10236 *x = (gdk_screen_get_width (screen) - w) / 2;
10240 case GDK_GRAVITY_WEST:
10242 *y = (gdk_screen_get_height (screen) - h) / 2;
10245 case GDK_GRAVITY_EAST:
10246 *x = gdk_screen_get_width (screen) - w;
10247 *y = (gdk_screen_get_height (screen) - h) / 2;
10250 case GDK_GRAVITY_CENTER:
10251 *x = (gdk_screen_get_width (screen) - w) / 2;
10252 *y = (gdk_screen_get_height (screen) - h) / 2;
10255 case GDK_GRAVITY_STATIC:
10256 /* pick some random numbers */
10262 g_assert_not_reached ();
10268 move_gravity_window_to_starting_position (GtkWidget *widget,
10274 window = GTK_WINDOW (data);
10276 get_screen_corner (window,
10279 gtk_window_move (window, x, y);
10283 make_gravity_window (GtkWidget *destroy_with,
10284 GdkGravity gravity,
10285 const gchar *title)
10292 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10294 gtk_window_set_screen (GTK_WINDOW (window),
10295 gtk_widget_get_screen (destroy_with));
10297 vbox = gtk_vbox_new (FALSE, 0);
10298 gtk_widget_show (vbox);
10300 gtk_container_add (GTK_CONTAINER (window), vbox);
10301 gtk_window_set_title (GTK_WINDOW (window), title);
10302 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
10304 g_signal_connect_object (destroy_with,
10306 G_CALLBACK (gtk_widget_destroy),
10308 G_CONNECT_SWAPPED);
10311 button = gtk_button_new_with_mnemonic ("_Move to current position");
10313 g_signal_connect (button, "clicked",
10314 G_CALLBACK (move_gravity_window_to_current_position),
10317 gtk_container_add (GTK_CONTAINER (vbox), button);
10318 gtk_widget_show (button);
10320 button = gtk_button_new_with_mnemonic ("Move to _starting position");
10322 g_signal_connect (button, "clicked",
10323 G_CALLBACK (move_gravity_window_to_starting_position),
10326 gtk_container_add (GTK_CONTAINER (vbox), button);
10327 gtk_widget_show (button);
10329 /* Pretend this is the result of --geometry.
10330 * DO NOT COPY THIS CODE unless you are setting --geometry results,
10331 * and in that case you probably should just use gtk_window_parse_geometry().
10332 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
10333 * you are parsing --geometry or equivalent.
10335 gtk_window_set_geometry_hints (GTK_WINDOW (window),
10337 GDK_HINT_USER_POS);
10339 gtk_window_set_default_size (GTK_WINDOW (window),
10342 get_screen_corner (GTK_WINDOW (window), &x, &y);
10344 gtk_window_move (GTK_WINDOW (window),
10351 do_gravity_test (GtkWidget *widget,
10354 GtkWidget *destroy_with = data;
10357 /* We put a window at each gravity point on the screen. */
10358 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
10360 gtk_widget_show (window);
10362 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
10364 gtk_widget_show (window);
10366 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
10368 gtk_widget_show (window);
10370 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
10372 gtk_widget_show (window);
10374 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
10376 gtk_widget_show (window);
10378 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
10380 gtk_widget_show (window);
10383 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
10385 gtk_widget_show (window);
10388 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
10390 gtk_widget_show (window);
10392 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
10394 gtk_widget_show (window);
10396 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
10398 gtk_widget_show (window);
10402 window_controls (GtkWidget *window)
10404 GtkWidget *control_window;
10409 GtkAdjustment *adj;
10415 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10417 gtk_window_set_screen (GTK_WINDOW (control_window),
10418 gtk_widget_get_screen (window));
10420 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
10422 g_object_set_data (G_OBJECT (control_window),
10426 g_signal_connect_object (control_window,
10428 G_CALLBACK (gtk_widget_destroy),
10430 G_CONNECT_SWAPPED);
10432 vbox = gtk_vbox_new (FALSE, 5);
10434 gtk_container_add (GTK_CONTAINER (control_window), vbox);
10436 label = gtk_label_new ("<no configure events>");
10437 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10439 g_signal_connect (window,
10441 G_CALLBACK (configure_event_callback),
10444 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10446 spin = gtk_spin_button_new (adj, 0, 0);
10448 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10450 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
10452 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10454 spin = gtk_spin_button_new (adj, 0, 0);
10456 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10458 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
10460 entry = gtk_entry_new ();
10461 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10463 g_signal_connect (entry, "changed",
10464 G_CALLBACK (set_geometry_callback),
10467 button = gtk_button_new_with_label ("Show gravity test windows");
10468 g_signal_connect_swapped (button,
10470 G_CALLBACK (do_gravity_test),
10472 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10474 button = gtk_button_new_with_label ("Reshow with initial size");
10475 g_signal_connect_object (button,
10477 G_CALLBACK (gtk_window_reshow_with_initial_size),
10479 G_CONNECT_SWAPPED);
10480 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10482 button = gtk_button_new_with_label ("Queue resize");
10483 g_signal_connect_object (button,
10485 G_CALLBACK (gtk_widget_queue_resize),
10487 G_CONNECT_SWAPPED);
10488 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10490 button = gtk_button_new_with_label ("Resize");
10491 g_signal_connect (button,
10493 G_CALLBACK (set_size_callback),
10495 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10497 button = gtk_button_new_with_label ("Set default size");
10498 g_signal_connect (button,
10500 G_CALLBACK (set_default_size_callback),
10502 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10504 button = gtk_button_new_with_label ("Unset default size");
10505 g_signal_connect (button,
10507 G_CALLBACK (unset_default_size_callback),
10509 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10511 button = gtk_button_new_with_label ("Set size request");
10512 g_signal_connect (button,
10514 G_CALLBACK (set_size_request_callback),
10516 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10518 button = gtk_button_new_with_label ("Unset size request");
10519 g_signal_connect (button,
10521 G_CALLBACK (unset_size_request_callback),
10523 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10525 button = gtk_button_new_with_label ("Move");
10526 g_signal_connect (button,
10528 G_CALLBACK (set_location_callback),
10530 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10532 button = gtk_button_new_with_label ("Move to current position");
10533 g_signal_connect (button,
10535 G_CALLBACK (move_to_position_callback),
10537 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10539 button = gtk_check_button_new_with_label ("Allow shrink");
10540 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10541 g_signal_connect (button,
10543 G_CALLBACK (allow_shrink_callback),
10545 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10547 button = gtk_check_button_new_with_label ("Allow grow");
10548 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
10549 g_signal_connect (button,
10551 G_CALLBACK (allow_grow_callback),
10553 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10555 button = gtk_button_new_with_mnemonic ("_Show");
10556 g_signal_connect_object (button,
10558 G_CALLBACK (gtk_widget_show),
10560 G_CONNECT_SWAPPED);
10561 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10563 button = gtk_button_new_with_mnemonic ("_Hide");
10564 g_signal_connect_object (button,
10566 G_CALLBACK (gtk_widget_hide),
10568 G_CONNECT_SWAPPED);
10569 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10571 menu = gtk_menu_new ();
10577 static gchar *names[] = {
10578 "GDK_GRAVITY_NORTH_WEST",
10579 "GDK_GRAVITY_NORTH",
10580 "GDK_GRAVITY_NORTH_EAST",
10581 "GDK_GRAVITY_WEST",
10582 "GDK_GRAVITY_CENTER",
10583 "GDK_GRAVITY_EAST",
10584 "GDK_GRAVITY_SOUTH_WEST",
10585 "GDK_GRAVITY_SOUTH",
10586 "GDK_GRAVITY_SOUTH_EAST",
10587 "GDK_GRAVITY_STATIC",
10591 g_assert (names[i]);
10593 mi = gtk_menu_item_new_with_label (names[i]);
10595 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10600 gtk_widget_show_all (menu);
10602 om = gtk_option_menu_new ();
10603 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10606 g_signal_connect (om,
10608 G_CALLBACK (gravity_selected),
10611 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10614 menu = gtk_menu_new ();
10620 static gchar *names[] = {
10621 "GTK_WIN_POS_NONE",
10622 "GTK_WIN_POS_CENTER",
10623 "GTK_WIN_POS_MOUSE",
10624 "GTK_WIN_POS_CENTER_ALWAYS",
10625 "GTK_WIN_POS_CENTER_ON_PARENT",
10629 g_assert (names[i]);
10631 mi = gtk_menu_item_new_with_label (names[i]);
10633 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10638 gtk_widget_show_all (menu);
10640 om = gtk_option_menu_new ();
10641 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10644 g_signal_connect (om,
10646 G_CALLBACK (pos_selected),
10649 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10651 gtk_widget_show_all (vbox);
10653 return control_window;
10657 create_window_sizing (GtkWidget *widget)
10659 static GtkWidget *window = NULL;
10660 static GtkWidget *target_window = NULL;
10662 if (!target_window)
10666 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10667 gtk_window_set_screen (GTK_WINDOW (target_window),
10668 gtk_widget_get_screen (widget));
10669 label = gtk_label_new (NULL);
10670 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");
10671 gtk_container_add (GTK_CONTAINER (target_window), label);
10672 gtk_widget_show (label);
10674 g_signal_connect (target_window, "destroy",
10675 G_CALLBACK (gtk_widget_destroyed),
10678 window = window_controls (target_window);
10680 g_signal_connect (window, "destroy",
10681 G_CALLBACK (gtk_widget_destroyed),
10684 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
10687 /* don't show target window by default, we want to allow testing
10688 * of behavior on first show.
10691 if (!GTK_WIDGET_VISIBLE (window))
10692 gtk_widget_show (window);
10694 gtk_widget_destroy (window);
10701 typedef struct _ProgressData {
10704 GtkWidget *block_spin;
10705 GtkWidget *x_align_spin;
10706 GtkWidget *y_align_spin;
10707 GtkWidget *step_spin;
10708 GtkWidget *act_blocks_spin;
10717 progress_timeout (gpointer data)
10720 GtkAdjustment *adj;
10722 adj = GTK_PROGRESS (data)->adjustment;
10724 new_val = adj->value + 1;
10725 if (new_val > adj->upper)
10726 new_val = adj->lower;
10728 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
10734 destroy_progress (GtkWidget *widget,
10735 ProgressData **pdata)
10737 gtk_timeout_remove ((*pdata)->timer);
10738 (*pdata)->timer = 0;
10739 (*pdata)->window = NULL;
10745 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
10747 ProgressData *pdata;
10750 pdata = (ProgressData *) data;
10752 if (!GTK_WIDGET_MAPPED (widget))
10755 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10757 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
10758 (GtkProgressBarOrientation) i);
10762 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
10764 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
10765 GTK_TOGGLE_BUTTON (widget)->active);
10766 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
10767 gtk_widget_set_sensitive (pdata->x_align_spin,
10768 GTK_TOGGLE_BUTTON (widget)->active);
10769 gtk_widget_set_sensitive (pdata->y_align_spin,
10770 GTK_TOGGLE_BUTTON (widget)->active);
10774 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
10776 ProgressData *pdata;
10779 pdata = (ProgressData *) data;
10781 if (!GTK_WIDGET_MAPPED (widget))
10784 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10787 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
10789 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10791 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
10792 (GtkProgressBarStyle) i);
10796 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
10800 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
10801 sprintf (buf, "???");
10803 sprintf (buf, "%.0f%%", 100 *
10804 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
10805 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
10809 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
10811 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
10812 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10813 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
10817 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
10819 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
10820 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
10824 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
10826 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10827 gtk_spin_button_get_value_as_int
10828 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
10832 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
10834 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
10835 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
10836 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
10840 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
10842 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
10843 GTK_TOGGLE_BUTTON (widget)->active);
10844 gtk_widget_set_sensitive (pdata->step_spin,
10845 GTK_TOGGLE_BUTTON (widget)->active);
10846 gtk_widget_set_sensitive (pdata->act_blocks_spin,
10847 GTK_TOGGLE_BUTTON (widget)->active);
10851 entry_changed (GtkWidget *widget, ProgressData *pdata)
10853 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10854 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
10858 create_progress_bar (GtkWidget *widget)
10869 GtkAdjustment *adj;
10870 static ProgressData *pdata = NULL;
10872 static gchar *items1[] =
10880 static gchar *items2[] =
10887 pdata = g_new0 (ProgressData, 1);
10889 if (!pdata->window)
10891 pdata->window = gtk_dialog_new ();
10893 gtk_window_set_screen (GTK_WINDOW (pdata->window),
10894 gtk_widget_get_screen (widget));
10896 gtk_window_set_resizable (GTK_WINDOW (pdata->window), FALSE);
10898 g_signal_connect (pdata->window, "destroy",
10899 G_CALLBACK (destroy_progress),
10904 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
10905 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
10907 vbox = gtk_vbox_new (FALSE, 5);
10908 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10909 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
10910 vbox, FALSE, TRUE, 0);
10912 frame = gtk_frame_new ("Progress");
10913 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10915 vbox2 = gtk_vbox_new (FALSE, 5);
10916 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10918 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10919 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10921 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
10922 g_signal_connect (adj, "value_changed",
10923 G_CALLBACK (progress_value_changed), pdata);
10925 pdata->pbar = gtk_widget_new (GTK_TYPE_PROGRESS_BAR,
10928 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10929 "%v from [%l,%u] (=%p%%)");
10930 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
10931 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
10933 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10934 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10936 hbox = gtk_hbox_new (FALSE, 5);
10937 gtk_container_add (GTK_CONTAINER (align), hbox);
10938 label = gtk_label_new ("Label updated by user :");
10939 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10940 pdata->label = gtk_label_new ("");
10941 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
10943 frame = gtk_frame_new ("Options");
10944 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10946 vbox2 = gtk_vbox_new (FALSE, 5);
10947 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10949 tab = gtk_table_new (7, 2, FALSE);
10950 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
10952 label = gtk_label_new ("Orientation :");
10953 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
10954 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10956 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10958 pdata->omenu1 = build_option_menu (items1, 4, 0,
10959 progressbar_toggle_orientation,
10961 hbox = gtk_hbox_new (FALSE, 0);
10962 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
10963 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10965 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
10967 check = gtk_check_button_new_with_label ("Show text");
10968 g_signal_connect (check, "clicked",
10969 G_CALLBACK (toggle_show_text),
10971 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
10972 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10975 hbox = gtk_hbox_new (FALSE, 0);
10976 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
10977 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10980 label = gtk_label_new ("Format : ");
10981 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10983 pdata->entry = gtk_entry_new ();
10984 g_signal_connect (pdata->entry, "changed",
10985 G_CALLBACK (entry_changed),
10987 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
10988 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
10989 gtk_widget_set_size_request (pdata->entry, 100, -1);
10990 gtk_widget_set_sensitive (pdata->entry, FALSE);
10992 label = gtk_label_new ("Text align :");
10993 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
10994 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10996 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10998 hbox = gtk_hbox_new (FALSE, 0);
10999 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
11000 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11003 label = gtk_label_new ("x :");
11004 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11006 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11007 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
11008 g_signal_connect (adj, "value_changed",
11009 G_CALLBACK (adjust_align), pdata);
11010 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
11011 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
11013 label = gtk_label_new ("y :");
11014 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
11016 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
11017 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
11018 g_signal_connect (adj, "value_changed",
11019 G_CALLBACK (adjust_align), pdata);
11020 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
11021 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
11023 label = gtk_label_new ("Bar Style :");
11024 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 3, 4,
11025 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11027 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11029 pdata->omenu2 = build_option_menu (items2, 2, 0,
11030 progressbar_toggle_bar_style,
11032 hbox = gtk_hbox_new (FALSE, 0);
11033 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 3, 4,
11034 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11036 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
11038 label = gtk_label_new ("Block count :");
11039 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 4, 5,
11040 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11042 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
11044 hbox = gtk_hbox_new (FALSE, 0);
11045 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 4, 5,
11046 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11048 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
11049 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
11050 g_signal_connect (adj, "value_changed",
11051 G_CALLBACK (adjust_blocks), pdata);
11052 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
11053 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
11055 check = gtk_check_button_new_with_label ("Activity mode");
11056 g_signal_connect (check, "clicked",
11057 G_CALLBACK (toggle_activity_mode), pdata);
11058 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 5, 6,
11059 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11062 hbox = gtk_hbox_new (FALSE, 0);
11063 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 5, 6,
11064 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11066 label = gtk_label_new ("Step size : ");
11067 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11068 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
11069 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
11070 g_signal_connect (adj, "value_changed",
11071 G_CALLBACK (adjust_step), pdata);
11072 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
11073 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
11075 hbox = gtk_hbox_new (FALSE, 0);
11076 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 6, 7,
11077 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
11079 label = gtk_label_new ("Blocks : ");
11080 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
11081 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
11082 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
11083 g_signal_connect (adj, "value_changed",
11084 G_CALLBACK (adjust_act_blocks), pdata);
11085 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
11087 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
11089 button = gtk_button_new_with_label ("close");
11090 g_signal_connect_swapped (button, "clicked",
11091 G_CALLBACK (gtk_widget_destroy),
11093 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11094 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
11095 button, TRUE, TRUE, 0);
11096 gtk_widget_grab_default (button);
11099 if (!GTK_WIDGET_VISIBLE (pdata->window))
11100 gtk_widget_show_all (pdata->window);
11102 gtk_widget_destroy (pdata->window);
11114 GtkWidget *res_widget;
11118 find_widget (GtkWidget *widget, FindWidgetData *data)
11120 GtkAllocation new_allocation;
11124 new_allocation = widget->allocation;
11126 if (data->found || !GTK_WIDGET_MAPPED (widget))
11129 /* Note that in the following code, we only count the
11130 * position as being inside a WINDOW widget if it is inside
11131 * widget->window; points that are outside of widget->window
11132 * but within the allocation are not counted. This is consistent
11133 * with the way we highlight drag targets.
11135 if (!GTK_WIDGET_NO_WINDOW (widget))
11137 new_allocation.x = 0;
11138 new_allocation.y = 0;
11141 if (widget->parent && !data->first)
11143 GdkWindow *window = widget->window;
11144 while (window != widget->parent->window)
11146 gint tx, ty, twidth, theight;
11147 gdk_drawable_get_size (window, &twidth, &theight);
11149 if (new_allocation.x < 0)
11151 new_allocation.width += new_allocation.x;
11152 new_allocation.x = 0;
11154 if (new_allocation.y < 0)
11156 new_allocation.height += new_allocation.y;
11157 new_allocation.y = 0;
11159 if (new_allocation.x + new_allocation.width > twidth)
11160 new_allocation.width = twidth - new_allocation.x;
11161 if (new_allocation.y + new_allocation.height > theight)
11162 new_allocation.height = theight - new_allocation.y;
11164 gdk_window_get_position (window, &tx, &ty);
11165 new_allocation.x += tx;
11167 new_allocation.y += ty;
11170 window = gdk_window_get_parent (window);
11174 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
11175 (data->x < new_allocation.x + new_allocation.width) &&
11176 (data->y < new_allocation.y + new_allocation.height))
11178 /* First, check if the drag is in a valid drop site in
11179 * one of our children
11181 if (GTK_IS_CONTAINER (widget))
11183 FindWidgetData new_data = *data;
11185 new_data.x -= x_offset;
11186 new_data.y -= y_offset;
11187 new_data.found = FALSE;
11188 new_data.first = FALSE;
11190 gtk_container_forall (GTK_CONTAINER (widget),
11191 (GtkCallback)find_widget,
11194 data->found = new_data.found;
11196 data->res_widget = new_data.res_widget;
11199 /* If not, and this widget is registered as a drop site, check to
11200 * emit "drag_motion" to check if we are actually in
11205 data->found = TRUE;
11206 data->res_widget = widget;
11212 find_widget_at_pointer (GdkDisplay *display)
11214 GtkWidget *widget = NULL;
11215 GdkWindow *pointer_window;
11217 FindWidgetData data;
11219 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
11221 if (pointer_window)
11222 gdk_window_get_user_data (pointer_window, (gpointer*) &widget);
11226 gdk_window_get_pointer (widget->window,
11231 data.found = FALSE;
11234 find_widget (widget, &data);
11236 return data.res_widget;
11242 struct PropertiesData {
11243 GtkWidget **window;
11250 destroy_properties (GtkWidget *widget,
11251 struct PropertiesData *data)
11255 *data->window = NULL;
11256 data->window = NULL;
11261 gdk_cursor_unref (data->cursor);
11262 data->cursor = NULL;
11267 g_signal_handler_disconnect (widget, data->handler);
11275 property_query_event (GtkWidget *widget,
11277 struct PropertiesData *data)
11279 GtkWidget *res_widget = NULL;
11281 if (!data->in_query)
11284 if (event->type == GDK_BUTTON_RELEASE)
11286 gtk_grab_remove (widget);
11287 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
11290 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
11293 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
11294 gtk_widget_get_screen (widget));
11295 create_prop_editor (G_OBJECT (res_widget), 0);
11298 data->in_query = FALSE;
11305 query_properties (GtkButton *button,
11306 struct PropertiesData *data)
11310 g_signal_connect (button, "event",
11311 G_CALLBACK (property_query_event), data);
11315 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
11318 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
11320 GDK_BUTTON_RELEASE_MASK,
11325 gtk_grab_add (GTK_WIDGET (button));
11327 data->in_query = TRUE;
11331 create_properties (GtkWidget *widget)
11333 static GtkWidget *window = NULL;
11337 struct PropertiesData *data;
11339 data = g_new (struct PropertiesData, 1);
11340 data->window = &window;
11341 data->in_query = FALSE;
11342 data->cursor = NULL;
11347 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11349 gtk_window_set_screen (GTK_WINDOW (window),
11350 gtk_widget_get_screen (widget));
11352 data->handler = g_signal_connect (window, "destroy",
11353 G_CALLBACK (destroy_properties),
11356 gtk_window_set_title (GTK_WINDOW (window), "test properties");
11357 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11359 vbox = gtk_vbox_new (FALSE, 1);
11360 gtk_container_add (GTK_CONTAINER (window), vbox);
11362 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
11363 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
11365 button = gtk_button_new_with_label ("Query properties");
11366 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
11367 g_signal_connect (button, "clicked",
11368 G_CALLBACK (query_properties),
11372 if (!GTK_WIDGET_VISIBLE (window))
11373 gtk_widget_show_all (window);
11375 gtk_widget_destroy (window);
11384 static int color_idle = 0;
11387 color_idle_func (GtkWidget *preview)
11389 static int count = 1;
11393 for (i = 0; i < 256; i++)
11395 for (j = 0, k = 0; j < 256; j++)
11397 buf[k+0] = i + count;
11399 buf[k+2] = j + count;
11403 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11408 gtk_widget_queue_draw (preview);
11409 gdk_window_process_updates (preview->window, TRUE);
11415 color_preview_destroy (GtkWidget *widget,
11416 GtkWidget **window)
11418 gtk_idle_remove (color_idle);
11425 create_color_preview (GtkWidget *widget)
11427 static GtkWidget *window = NULL;
11428 GtkWidget *preview;
11434 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11436 gtk_window_set_screen (GTK_WINDOW (window),
11437 gtk_widget_get_screen (widget));
11439 g_signal_connect (window, "destroy",
11440 G_CALLBACK (color_preview_destroy),
11443 gtk_window_set_title (GTK_WINDOW (window), "test");
11444 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11446 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
11447 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11448 gtk_container_add (GTK_CONTAINER (window), preview);
11450 for (i = 0; i < 256; i++)
11452 for (j = 0, k = 0; j < 256; j++)
11460 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11463 color_idle = gtk_idle_add ((GtkFunction) color_idle_func, preview);
11466 if (!GTK_WIDGET_VISIBLE (window))
11467 gtk_widget_show_all (window);
11469 gtk_widget_destroy (window);
11476 static int gray_idle = 0;
11479 gray_idle_func (GtkWidget *preview)
11481 static int count = 1;
11485 for (i = 0; i < 256; i++)
11487 for (j = 0; j < 256; j++)
11488 buf[j] = i + j + count;
11490 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11495 gtk_widget_draw (preview, NULL);
11501 gray_preview_destroy (GtkWidget *widget,
11502 GtkWidget **window)
11504 gtk_idle_remove (gray_idle);
11511 create_gray_preview (GtkWidget *widget)
11513 static GtkWidget *window = NULL;
11514 GtkWidget *preview;
11520 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11522 gtk_window_set_screen (GTK_WINDOW (window),
11523 gtk_widget_get_screen (widget));
11525 g_signal_connect (window, "destroy",
11526 G_CALLBACK (gray_preview_destroy),
11529 gtk_window_set_title (GTK_WINDOW (window), "test");
11530 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11532 preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
11533 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11534 gtk_container_add (GTK_CONTAINER (window), preview);
11536 for (i = 0; i < 256; i++)
11538 for (j = 0; j < 256; j++)
11541 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11544 gray_idle = gtk_idle_add ((GtkFunction) gray_idle_func, preview);
11547 if (!GTK_WIDGET_VISIBLE (window))
11548 gtk_widget_show_all (window);
11550 gtk_widget_destroy (window);
11559 selection_test_received (GtkWidget *list, GtkSelectionData *data)
11562 GtkWidget *list_item;
11566 if (data->length < 0)
11568 g_print ("Selection retrieval failed\n");
11571 if (data->type != GDK_SELECTION_TYPE_ATOM)
11573 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
11577 /* Clear out any current list items */
11579 gtk_list_clear_items (GTK_LIST(list), 0, -1);
11581 /* Add new items to list */
11583 atoms = (GdkAtom *)data->data;
11586 l = data->length / sizeof (GdkAtom);
11587 for (i = 0; i < l; i++)
11590 name = gdk_atom_name (atoms[i]);
11593 list_item = gtk_list_item_new_with_label (name);
11597 list_item = gtk_list_item_new_with_label ("(bad atom)");
11599 gtk_widget_show (list_item);
11600 item_list = g_list_append (item_list, list_item);
11603 gtk_list_append_items (GTK_LIST (list), item_list);
11609 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
11611 static GdkAtom targets_atom = GDK_NONE;
11613 if (targets_atom == GDK_NONE)
11614 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
11616 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
11621 create_selection_test (GtkWidget *widget)
11623 static GtkWidget *window = NULL;
11626 GtkWidget *scrolled_win;
11632 window = gtk_dialog_new ();
11634 gtk_window_set_screen (GTK_WINDOW (window),
11635 gtk_widget_get_screen (widget));
11637 g_signal_connect (window, "destroy",
11638 G_CALLBACK (gtk_widget_destroyed),
11641 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
11642 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11644 /* Create the list */
11646 vbox = gtk_vbox_new (FALSE, 5);
11647 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11648 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
11651 label = gtk_label_new ("Gets available targets for current selection");
11652 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11654 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
11655 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
11656 GTK_POLICY_AUTOMATIC,
11657 GTK_POLICY_AUTOMATIC);
11658 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
11659 gtk_widget_set_size_request (scrolled_win, 100, 200);
11661 list = gtk_list_new ();
11662 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
11664 g_signal_connect (list, "selection_received",
11665 G_CALLBACK (selection_test_received), NULL);
11667 /* .. And create some buttons */
11668 button = gtk_button_new_with_label ("Get Targets");
11669 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11670 button, TRUE, TRUE, 0);
11672 g_signal_connect (button, "clicked",
11673 G_CALLBACK (selection_test_get_targets), list);
11675 button = gtk_button_new_with_label ("Quit");
11676 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11677 button, TRUE, TRUE, 0);
11679 g_signal_connect_swapped (button, "clicked",
11680 G_CALLBACK (gtk_widget_destroy),
11684 if (!GTK_WIDGET_VISIBLE (window))
11685 gtk_widget_show_all (window);
11687 gtk_widget_destroy (window);
11695 create_gamma_curve (GtkWidget *widget)
11697 static GtkWidget *window = NULL, *curve;
11698 static int count = 0;
11705 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11706 gtk_window_set_screen (GTK_WINDOW (window),
11707 gtk_widget_get_screen (widget));
11709 gtk_window_set_title (GTK_WINDOW (window), "test");
11710 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11712 g_signal_connect (window, "destroy",
11713 G_CALLBACK(gtk_widget_destroyed),
11716 curve = gtk_gamma_curve_new ();
11717 gtk_container_add (GTK_CONTAINER (window), curve);
11718 gtk_widget_show (curve);
11721 max = 127 + (count % 2)*128;
11722 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11724 for (i = 0; i < max; ++i)
11725 vec[i] = (127 / sqrt (max)) * sqrt (i);
11726 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11729 if (!GTK_WIDGET_VISIBLE (window))
11730 gtk_widget_show (window);
11731 else if (count % 4 == 3)
11733 gtk_widget_destroy (window);
11744 static int scroll_test_pos = 0.0;
11747 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
11748 GtkAdjustment *adj)
11751 gint imin, imax, jmin, jmax;
11753 imin = (event->area.x) / 10;
11754 imax = (event->area.x + event->area.width + 9) / 10;
11756 jmin = ((int)adj->value + event->area.y) / 10;
11757 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
11759 gdk_window_clear_area (widget->window,
11760 event->area.x, event->area.y,
11761 event->area.width, event->area.height);
11763 for (i=imin; i<imax; i++)
11764 for (j=jmin; j<jmax; j++)
11766 gdk_draw_rectangle (widget->window,
11767 widget->style->black_gc,
11769 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
11775 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
11776 GtkAdjustment *adj)
11778 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
11779 -adj->page_increment / 2:
11780 adj->page_increment / 2);
11781 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
11782 gtk_adjustment_set_value (adj, new_value);
11788 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
11789 GtkAdjustment *adj)
11791 adj->page_increment = 0.9 * widget->allocation.height;
11792 adj->page_size = widget->allocation.height;
11794 g_signal_emit_by_name (adj, "changed");
11798 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
11800 /* gint source_min = (int)adj->value - scroll_test_pos; */
11803 dy = scroll_test_pos - (int)adj->value;
11804 scroll_test_pos = adj->value;
11806 if (!GTK_WIDGET_DRAWABLE (widget))
11808 gdk_window_scroll (widget->window, 0, dy);
11809 gdk_window_process_updates (widget->window, FALSE);
11814 create_scroll_test (GtkWidget *widget)
11816 static GtkWidget *window = NULL;
11818 GtkWidget *drawing_area;
11819 GtkWidget *scrollbar;
11821 GtkAdjustment *adj;
11822 GdkGeometry geometry;
11823 GdkWindowHints geometry_mask;
11827 window = gtk_dialog_new ();
11829 gtk_window_set_screen (GTK_WINDOW (window),
11830 gtk_widget_get_screen (widget));
11832 g_signal_connect (window, "destroy",
11833 G_CALLBACK (gtk_widget_destroyed),
11836 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
11837 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11839 hbox = gtk_hbox_new (FALSE, 0);
11840 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
11842 gtk_widget_show (hbox);
11844 drawing_area = gtk_drawing_area_new ();
11845 gtk_widget_set_size_request (drawing_area, 200, 200);
11846 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
11847 gtk_widget_show (drawing_area);
11849 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
11851 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
11852 scroll_test_pos = 0.0;
11854 scrollbar = gtk_vscrollbar_new (adj);
11855 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
11856 gtk_widget_show (scrollbar);
11858 g_signal_connect (drawing_area, "expose_event",
11859 G_CALLBACK (scroll_test_expose), adj);
11860 g_signal_connect (drawing_area, "configure_event",
11861 G_CALLBACK (scroll_test_configure), adj);
11862 g_signal_connect (drawing_area, "scroll_event",
11863 G_CALLBACK (scroll_test_scroll), adj);
11865 g_signal_connect (adj, "value_changed",
11866 G_CALLBACK (scroll_test_adjustment_changed),
11869 /* .. And create some buttons */
11871 button = gtk_button_new_with_label ("Quit");
11872 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11873 button, TRUE, TRUE, 0);
11875 g_signal_connect_swapped (button, "clicked",
11876 G_CALLBACK (gtk_widget_destroy),
11878 gtk_widget_show (button);
11880 /* Set up gridded geometry */
11882 geometry_mask = GDK_HINT_MIN_SIZE |
11883 GDK_HINT_BASE_SIZE |
11884 GDK_HINT_RESIZE_INC;
11886 geometry.min_width = 20;
11887 geometry.min_height = 20;
11888 geometry.base_width = 0;
11889 geometry.base_height = 0;
11890 geometry.width_inc = 10;
11891 geometry.height_inc = 10;
11893 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11894 drawing_area, &geometry, geometry_mask);
11897 if (!GTK_WIDGET_VISIBLE (window))
11898 gtk_widget_show (window);
11900 gtk_widget_destroy (window);
11907 static int timer = 0;
11910 timeout_test (GtkWidget *label)
11912 static int count = 0;
11913 static char buffer[32];
11915 sprintf (buffer, "count: %d", ++count);
11916 gtk_label_set_text (GTK_LABEL (label), buffer);
11922 start_timeout_test (GtkWidget *widget,
11927 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
11932 stop_timeout_test (GtkWidget *widget,
11937 gtk_timeout_remove (timer);
11943 destroy_timeout_test (GtkWidget *widget,
11944 GtkWidget **window)
11946 stop_timeout_test (NULL, NULL);
11952 create_timeout_test (GtkWidget *widget)
11954 static GtkWidget *window = NULL;
11960 window = gtk_dialog_new ();
11962 gtk_window_set_screen (GTK_WINDOW (window),
11963 gtk_widget_get_screen (widget));
11965 g_signal_connect (window, "destroy",
11966 G_CALLBACK (destroy_timeout_test),
11969 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
11970 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11972 label = gtk_label_new ("count: 0");
11973 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11974 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11975 label, TRUE, TRUE, 0);
11976 gtk_widget_show (label);
11978 button = gtk_button_new_with_label ("close");
11979 g_signal_connect_swapped (button, "clicked",
11980 G_CALLBACK (gtk_widget_destroy),
11982 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11983 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11984 button, TRUE, TRUE, 0);
11985 gtk_widget_grab_default (button);
11986 gtk_widget_show (button);
11988 button = gtk_button_new_with_label ("start");
11989 g_signal_connect (button, "clicked",
11990 G_CALLBACK(start_timeout_test),
11992 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11993 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11994 button, TRUE, TRUE, 0);
11995 gtk_widget_show (button);
11997 button = gtk_button_new_with_label ("stop");
11998 g_signal_connect (button, "clicked",
11999 G_CALLBACK (stop_timeout_test),
12001 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12002 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12003 button, TRUE, TRUE, 0);
12004 gtk_widget_show (button);
12007 if (!GTK_WIDGET_VISIBLE (window))
12008 gtk_widget_show (window);
12010 gtk_widget_destroy (window);
12017 static int idle_id = 0;
12020 idle_test (GtkWidget *label)
12022 static int count = 0;
12023 static char buffer[32];
12025 sprintf (buffer, "count: %d", ++count);
12026 gtk_label_set_text (GTK_LABEL (label), buffer);
12032 start_idle_test (GtkWidget *widget,
12037 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
12042 stop_idle_test (GtkWidget *widget,
12047 gtk_idle_remove (idle_id);
12053 destroy_idle_test (GtkWidget *widget,
12054 GtkWidget **window)
12056 stop_idle_test (NULL, NULL);
12062 toggle_idle_container (GObject *button,
12063 GtkContainer *container)
12065 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
12069 create_idle_test (GtkWidget *widget)
12071 static GtkWidget *window = NULL;
12074 GtkWidget *container;
12078 GtkWidget *button2;
12082 window = gtk_dialog_new ();
12084 gtk_window_set_screen (GTK_WINDOW (window),
12085 gtk_widget_get_screen (widget));
12087 g_signal_connect (window, "destroy",
12088 G_CALLBACK (destroy_idle_test),
12091 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
12092 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12094 label = gtk_label_new ("count: 0");
12095 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
12096 gtk_widget_show (label);
12099 gtk_widget_new (GTK_TYPE_HBOX,
12101 /* "GtkContainer::child", gtk_widget_new (GTK_TYPE_HBOX,
12102 * "GtkWidget::visible", TRUE,
12107 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
12108 container, TRUE, TRUE, 0);
12111 gtk_widget_new (GTK_TYPE_FRAME,
12113 "label", "Label Container",
12115 "parent", GTK_DIALOG (window)->vbox,
12118 gtk_widget_new (GTK_TYPE_VBOX,
12123 g_object_connect (gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
12124 "label", "Resize-Parent",
12125 "user_data", (void*)GTK_RESIZE_PARENT,
12129 "signal::clicked", toggle_idle_container, container,
12131 button = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
12132 "label", "Resize-Queue",
12133 "user_data", (void*)GTK_RESIZE_QUEUE,
12138 g_object_connect (button,
12139 "signal::clicked", toggle_idle_container, container,
12141 button2 = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
12142 "label", "Resize-Immediate",
12143 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
12145 g_object_connect (button2,
12146 "signal::clicked", toggle_idle_container, container,
12148 g_object_set (button2,
12154 button = gtk_button_new_with_label ("close");
12155 g_signal_connect_swapped (button, "clicked",
12156 G_CALLBACK (gtk_widget_destroy),
12158 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12159 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12160 button, TRUE, TRUE, 0);
12161 gtk_widget_grab_default (button);
12162 gtk_widget_show (button);
12164 button = gtk_button_new_with_label ("start");
12165 g_signal_connect (button, "clicked",
12166 G_CALLBACK (start_idle_test),
12168 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12169 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12170 button, TRUE, TRUE, 0);
12171 gtk_widget_show (button);
12173 button = gtk_button_new_with_label ("stop");
12174 g_signal_connect (button, "clicked",
12175 G_CALLBACK (stop_idle_test),
12177 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12178 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12179 button, TRUE, TRUE, 0);
12180 gtk_widget_show (button);
12183 if (!GTK_WIDGET_VISIBLE (window))
12184 gtk_widget_show (window);
12186 gtk_widget_destroy (window);
12194 reload_all_rc_files (void)
12196 static GdkAtom atom_rcfiles = GDK_NONE;
12198 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
12202 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
12204 for(i = 0; i < 5; i++)
12205 send_event->client.data.l[i] = 0;
12206 send_event->client.data_format = 32;
12207 send_event->client.message_type = atom_rcfiles;
12208 gdk_event_send_clientmessage_toall (send_event);
12210 gdk_event_free (send_event);
12214 create_rc_file (GtkWidget *widget)
12216 static GtkWidget *window = NULL;
12224 window = gtk_dialog_new ();
12226 gtk_window_set_screen (GTK_WINDOW (window),
12227 gtk_widget_get_screen (widget));
12229 g_signal_connect (window, "destroy",
12230 G_CALLBACK (gtk_widget_destroyed),
12233 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
12234 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
12236 vbox = gtk_vbox_new (FALSE, 0);
12237 gtk_container_add (GTK_CONTAINER (frame), vbox);
12239 label = gtk_label_new ("This label should be red");
12240 gtk_widget_set_name (label, "testgtk-red-label");
12241 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12243 label = gtk_label_new ("This label should be green");
12244 gtk_widget_set_name (label, "testgtk-green-label");
12245 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12247 label = gtk_label_new ("This label should be blue");
12248 gtk_widget_set_name (label, "testgtk-blue-label");
12249 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12251 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
12252 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
12254 button = gtk_button_new_with_label ("Reload");
12255 g_signal_connect (button, "clicked",
12256 G_CALLBACK (gtk_rc_reparse_all), NULL);
12257 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12258 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12259 button, TRUE, TRUE, 0);
12260 gtk_widget_grab_default (button);
12262 button = gtk_button_new_with_label ("Reload All");
12263 g_signal_connect (button, "clicked",
12264 G_CALLBACK (reload_all_rc_files), NULL);
12265 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12266 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12267 button, TRUE, TRUE, 0);
12269 button = gtk_button_new_with_label ("Close");
12270 g_signal_connect_swapped (button, "clicked",
12271 G_CALLBACK (gtk_widget_destroy),
12273 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12274 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12275 button, TRUE, TRUE, 0);
12278 if (!GTK_WIDGET_VISIBLE (window))
12279 gtk_widget_show_all (window);
12281 gtk_widget_destroy (window);
12285 * Test of recursive mainloop
12289 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
12296 create_mainloop (GtkWidget *widget)
12298 static GtkWidget *window = NULL;
12304 window = gtk_dialog_new ();
12306 gtk_window_set_screen (GTK_WINDOW (window),
12307 gtk_widget_get_screen (widget));
12309 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
12311 g_signal_connect (window, "destroy",
12312 G_CALLBACK (mainloop_destroyed),
12315 label = gtk_label_new ("In recursive main loop...");
12316 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
12318 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
12320 gtk_widget_show (label);
12322 button = gtk_button_new_with_label ("Leave");
12323 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
12326 g_signal_connect_swapped (button, "clicked",
12327 G_CALLBACK (gtk_widget_destroy),
12330 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12331 gtk_widget_grab_default (button);
12333 gtk_widget_show (button);
12336 if (!GTK_WIDGET_VISIBLE (window))
12338 gtk_widget_show (window);
12340 g_print ("create_mainloop: start\n");
12342 g_print ("create_mainloop: done\n");
12345 gtk_widget_destroy (window);
12349 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
12354 gint imin, imax, jmin, jmax;
12356 layout = GTK_LAYOUT (widget);
12358 if (event->window != layout->bin_window)
12361 imin = (event->area.x) / 10;
12362 imax = (event->area.x + event->area.width + 9) / 10;
12364 jmin = (event->area.y) / 10;
12365 jmax = (event->area.y + event->area.height + 9) / 10;
12367 for (i=imin; i<imax; i++)
12368 for (j=jmin; j<jmax; j++)
12370 gdk_draw_rectangle (layout->bin_window,
12371 widget->style->black_gc,
12379 void create_layout (GtkWidget *widget)
12381 static GtkWidget *window = NULL;
12383 GtkWidget *scrolledwindow;
12392 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12393 gtk_window_set_screen (GTK_WINDOW (window),
12394 gtk_widget_get_screen (widget));
12396 g_signal_connect (window, "destroy",
12397 G_CALLBACK (gtk_widget_destroyed),
12400 gtk_window_set_title (GTK_WINDOW (window), "Layout");
12401 gtk_widget_set_size_request (window, 200, 200);
12403 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
12404 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
12406 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
12407 GTK_CORNER_TOP_RIGHT);
12409 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
12411 layout = gtk_layout_new (NULL, NULL);
12412 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
12414 /* We set step sizes here since GtkLayout does not set
12417 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
12418 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
12420 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
12421 g_signal_connect (layout, "expose_event",
12422 G_CALLBACK (layout_expose_handler), NULL);
12424 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
12426 for (i=0 ; i < 16 ; i++)
12427 for (j=0 ; j < 16 ; j++)
12429 sprintf(buf, "Button %d, %d", i, j);
12431 button = gtk_button_new_with_label (buf);
12433 button = gtk_label_new (buf);
12435 gtk_layout_put (GTK_LAYOUT (layout), button,
12439 for (i=16; i < 1280; i++)
12441 sprintf(buf, "Button %d, %d", i, 0);
12443 button = gtk_button_new_with_label (buf);
12445 button = gtk_label_new (buf);
12447 gtk_layout_put (GTK_LAYOUT (layout), button,
12452 if (!GTK_WIDGET_VISIBLE (window))
12453 gtk_widget_show_all (window);
12455 gtk_widget_destroy (window);
12459 create_styles (GtkWidget *widget)
12461 static GtkWidget *window = NULL;
12466 static GdkColor red = { 0, 0xffff, 0, 0 };
12467 static GdkColor green = { 0, 0, 0xffff, 0 };
12468 static GdkColor blue = { 0, 0, 0, 0xffff };
12469 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
12470 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
12471 PangoFontDescription *font_desc;
12473 GtkRcStyle *rc_style;
12477 window = gtk_dialog_new ();
12478 gtk_window_set_screen (GTK_WINDOW (window),
12479 gtk_widget_get_screen (widget));
12481 g_signal_connect (window, "destroy",
12482 G_CALLBACK (gtk_widget_destroyed),
12486 button = gtk_button_new_with_label ("Close");
12487 g_signal_connect_swapped (button, "clicked",
12488 G_CALLBACK (gtk_widget_destroy),
12490 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12491 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12492 button, TRUE, TRUE, 0);
12493 gtk_widget_show (button);
12495 vbox = gtk_vbox_new (FALSE, 5);
12496 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
12497 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
12499 label = gtk_label_new ("Font:");
12500 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12501 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12503 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
12505 button = gtk_button_new_with_label ("Some Text");
12506 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
12507 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12509 label = gtk_label_new ("Foreground:");
12510 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12511 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12513 button = gtk_button_new_with_label ("Some Text");
12514 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
12515 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12517 label = gtk_label_new ("Background:");
12518 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12519 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12521 button = gtk_button_new_with_label ("Some Text");
12522 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
12523 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12525 label = gtk_label_new ("Text:");
12526 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12527 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12529 entry = gtk_entry_new ();
12530 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12531 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
12532 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12534 label = gtk_label_new ("Base:");
12535 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12536 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12538 entry = gtk_entry_new ();
12539 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12540 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
12541 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12543 label = gtk_label_new ("Multiple:");
12544 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12545 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12547 button = gtk_button_new_with_label ("Some Text");
12549 rc_style = gtk_rc_style_new ();
12551 rc_style->font_desc = pango_font_description_copy (font_desc);
12552 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
12553 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
12554 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
12555 rc_style->fg[GTK_STATE_NORMAL] = yellow;
12556 rc_style->bg[GTK_STATE_NORMAL] = blue;
12557 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
12558 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
12559 rc_style->fg[GTK_STATE_ACTIVE] = red;
12560 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
12561 rc_style->xthickness = 5;
12562 rc_style->ythickness = 5;
12564 gtk_widget_modify_style (button, rc_style);
12565 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
12567 g_object_unref (rc_style);
12569 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12572 if (!GTK_WIDGET_VISIBLE (window))
12573 gtk_widget_show_all (window);
12575 gtk_widget_destroy (window);
12579 * Main Window and Exit
12583 do_exit (GtkWidget *widget, GtkWidget *window)
12585 gtk_widget_destroy (window);
12591 void (*func) (GtkWidget *widget);
12592 gboolean do_not_benchmark;
12595 { "big windows", create_big_windows },
12596 { "button box", create_button_box },
12597 { "buttons", create_buttons },
12598 { "check buttons", create_check_buttons },
12599 { "clist", create_clist},
12600 { "color selection", create_color_selection },
12601 { "ctree", create_ctree },
12602 { "cursors", create_cursors },
12603 { "dialog", create_dialog },
12604 { "display & screen", create_display_screen },
12605 { "entry", create_entry },
12606 { "event box", create_event_box },
12607 { "event watcher", create_event_watcher },
12608 { "file selection", create_file_selection },
12609 { "flipping", create_flipping },
12610 { "focus", create_focus },
12611 { "font selection", create_font_selection },
12612 { "gamma curve", create_gamma_curve, TRUE },
12613 { "gridded geometry", create_gridded_geometry, TRUE },
12614 { "handle box", create_handle_box },
12615 { "image from drawable", create_get_image },
12616 { "image", create_image },
12617 { "item factory", create_item_factory },
12618 { "key lookup", create_key_lookup },
12619 { "labels", create_labels },
12620 { "layout", create_layout },
12621 { "list", create_list },
12622 { "menus", create_menus },
12623 { "message dialog", create_message_dialog },
12624 { "modal window", create_modal_window, TRUE },
12625 { "notebook", create_notebook },
12626 { "panes", create_panes },
12627 { "paned keyboard", create_paned_keyboard_navigation },
12628 { "pixmap", create_pixmap },
12629 { "preview color", create_color_preview, TRUE },
12630 { "preview gray", create_gray_preview, TRUE },
12631 { "progress bar", create_progress_bar },
12632 { "properties", create_properties },
12633 { "radio buttons", create_radio_buttons },
12634 { "range controls", create_range_controls },
12635 { "rc file", create_rc_file },
12636 { "reparent", create_reparent },
12637 { "resize grips", create_resize_grips },
12638 { "rulers", create_rulers },
12639 { "saved position", create_saved_position },
12640 { "scrolled windows", create_scrolled_windows },
12641 { "shapes", create_shapes },
12642 { "size groups", create_size_groups },
12643 { "spinbutton", create_spins },
12644 { "statusbar", create_statusbar },
12645 { "styles", create_styles },
12646 { "test idle", create_idle_test },
12647 { "test mainloop", create_mainloop, TRUE },
12648 { "test scrolling", create_scroll_test },
12649 { "test selection", create_selection_test },
12650 { "test timeout", create_timeout_test },
12651 { "text", create_text },
12652 { "toggle buttons", create_toggle_buttons },
12653 { "toolbar", create_toolbar },
12654 { "tooltips", create_tooltips },
12655 { "tree", create_tree_mode_window},
12656 { "WM hints", create_wmhints },
12657 { "window sizing", create_window_sizing },
12658 { "window states", create_window_states }
12660 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
12663 create_main_window (void)
12668 GtkWidget *scrolled_window;
12672 GtkWidget *separator;
12673 GdkGeometry geometry;
12676 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12677 gtk_widget_set_name (window, "main window");
12678 gtk_widget_set_uposition (window, 20, 20);
12679 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
12681 geometry.min_width = -1;
12682 geometry.min_height = -1;
12683 geometry.max_width = -1;
12684 geometry.max_height = G_MAXSHORT;
12685 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
12687 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
12689 g_signal_connect (window, "destroy",
12690 G_CALLBACK (gtk_main_quit),
12692 g_signal_connect (window, "delete-event",
12693 G_CALLBACK (gtk_false),
12696 box1 = gtk_vbox_new (FALSE, 0);
12697 gtk_container_add (GTK_CONTAINER (window), box1);
12699 if (gtk_micro_version > 0)
12704 gtk_micro_version);
12709 gtk_minor_version);
12711 label = gtk_label_new (buffer);
12712 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
12713 gtk_widget_set_name (label, "testgtk-version-label");
12715 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
12716 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
12717 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
12719 GTK_POLICY_AUTOMATIC);
12720 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
12722 box2 = gtk_vbox_new (FALSE, 0);
12723 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12724 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
12725 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
12726 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
12727 gtk_widget_show (box2);
12729 for (i = 0; i < nbuttons; i++)
12731 button = gtk_button_new_with_label (buttons[i].label);
12732 if (buttons[i].func)
12733 g_signal_connect (button,
12735 G_CALLBACK(buttons[i].func),
12738 gtk_widget_set_sensitive (button, FALSE);
12739 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12742 separator = gtk_hseparator_new ();
12743 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
12745 box2 = gtk_vbox_new (FALSE, 10);
12746 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12747 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
12749 button = gtk_button_new_with_mnemonic ("_Close");
12750 g_signal_connect (button, "clicked",
12751 G_CALLBACK (do_exit),
12753 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12754 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12755 gtk_widget_grab_default (button);
12757 gtk_widget_show_all (window);
12763 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
12764 G_FILE_TEST_EXISTS))
12766 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
12767 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
12772 pad (const char *str, int to)
12774 static char buf[256];
12775 int len = strlen (str);
12778 for (i = 0; i < to; i++)
12783 memcpy (buf, str, len);
12789 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
12791 fn (widget); /* on */
12792 while (g_main_context_iteration (NULL, FALSE));
12793 fn (widget); /* off */
12794 while (g_main_context_iteration (NULL, FALSE));
12798 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
12804 static gboolean printed_headers = FALSE;
12806 if (!printed_headers) {
12807 g_print ("Test Iters First Other\n");
12808 g_print ("-------------------- ----- ---------- ----------\n");
12809 printed_headers = TRUE;
12812 g_get_current_time (&tv0);
12813 bench_iteration (widget, fn);
12814 g_get_current_time (&tv1);
12816 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12817 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12819 g_get_current_time (&tv0);
12820 for (n = 0; n < num - 1; n++)
12821 bench_iteration (widget, fn);
12822 g_get_current_time (&tv1);
12823 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12824 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12826 g_print ("%s %5d ", pad (name, 20), num);
12828 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
12830 g_print ("%10.1f\n", dt_first);
12834 do_bench (char* what, int num)
12838 void (* fn) (GtkWidget *widget);
12840 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12842 if (g_ascii_strcasecmp (what, "ALL") == 0)
12844 for (i = 0; i < nbuttons; i++)
12846 if (!buttons[i].do_not_benchmark)
12847 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
12854 for (i = 0; i < nbuttons; i++)
12856 if (strcmp (buttons[i].label, what) == 0)
12858 fn = buttons[i].func;
12864 g_print ("Can't bench: \"%s\" not found.\n", what);
12866 do_real_bench (widget, fn, buttons[i].label, num);
12873 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
12878 main (int argc, char *argv[])
12880 GtkBindingSet *binding_set;
12882 gboolean done_benchmarks = FALSE;
12884 srand (time (NULL));
12888 /* Check to see if we are being run from the correct
12891 if (file_exists ("testgtkrc"))
12892 gtk_rc_add_default_file ("testgtkrc");
12894 g_set_application_name ("GTK+ Test Program");
12896 gtk_init (&argc, &argv);
12900 for (i = 1; i < argc; i++)
12902 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
12909 nextarg = strchr (argv[i], '=');
12920 count = strchr (nextarg, ':');
12923 what = g_strndup (nextarg, count - nextarg);
12925 num = atoi (count);
12930 what = g_strdup (nextarg);
12932 do_bench (what, num ? num : 1);
12933 done_benchmarks = TRUE;
12938 if (done_benchmarks)
12943 binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_WIDGET));
12944 gtk_binding_entry_add_signal (binding_set,
12945 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
12948 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
12950 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
12954 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
12955 " fg[NORMAL] = \"#ff0000\"\n"
12956 " font = \"Sans 18\"\n"
12958 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
12960 create_main_window ();
12966 while (g_main_context_pending (NULL))
12967 g_main_context_iteration (NULL, FALSE);
12970 while (g_main_context_pending (NULL))
12971 g_main_context_iteration (NULL, FALSE);