1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
27 #undef GTK_DISABLE_DEPRECATED
43 #define GTK_ENABLE_BROKEN
46 #include "gdk/gdkkeysyms.h"
49 #define sleep(n) _sleep(n)
52 #include "prop-editor.h"
54 #include "circles.xbm"
58 file_exists (const char *filename)
62 return stat (filename, &statbuf) == 0;
66 shape_create_icon (GdkScreen *screen,
75 build_option_menu (gchar *items[],
78 void (*func)(GtkWidget *widget, gpointer data),
81 /* macro, structure and variables used by tree window demos */
82 #define DEFAULT_NUMBER_OF_ITEM 3
83 #define DEFAULT_RECURSION_LEVEL 3
86 GSList* selection_mode_group;
87 GtkWidget* single_button;
88 GtkWidget* browse_button;
89 GtkWidget* multiple_button;
90 GtkWidget* draw_line_button;
91 GtkWidget* view_line_button;
92 GtkWidget* no_root_item_button;
93 GtkWidget* nb_item_spinner;
94 GtkWidget* recursion_spinner;
95 } sTreeSampleSelection;
97 typedef struct sTreeButtons {
99 GtkWidget* add_button;
100 GtkWidget* remove_button;
101 GtkWidget* subtree_button;
103 /* end of tree section */
106 build_option_menu (gchar *items[],
109 void (*func)(GtkWidget *widget, gpointer data),
114 GtkWidget *menu_item;
118 omenu = gtk_option_menu_new ();
119 g_signal_connect (omenu, "changed",
120 G_CALLBACK (func), data);
122 menu = gtk_menu_new ();
125 for (i = 0; i < num_items; i++)
127 menu_item = gtk_radio_menu_item_new_with_label (group, items[i]);
128 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menu_item));
129 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
131 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
132 gtk_widget_show (menu_item);
135 gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
136 gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), history);
142 destroy_tooltips (GtkWidget *widget, GtkWindow **window)
144 GtkTooltips *tt = g_object_get_data (G_OBJECT (*window), "tooltips");
151 * Big windows and guffaw scrolling
155 pattern_expose (GtkWidget *widget,
156 GdkEventExpose *event,
160 GdkWindow *window = event->window;
162 color = g_object_get_data (G_OBJECT (window), "pattern-color");
165 GdkGC *tmp_gc = gdk_gc_new (window);
166 gdk_gc_set_rgb_fg_color (tmp_gc, color);
168 gdk_draw_rectangle (window, tmp_gc, TRUE,
169 event->area.x, event->area.y,
170 event->area.width, event->area.height);
172 g_object_unref (tmp_gc);
179 pattern_set_bg (GtkWidget *widget,
183 static const GdkColor colors[] = {
184 { 0, 0x4444, 0x4444, 0xffff },
185 { 0, 0x8888, 0x8888, 0xffff },
186 { 0, 0xaaaa, 0xaaaa, 0xffff }
189 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
190 gdk_window_set_user_data (child, widget);
194 create_pattern (GtkWidget *widget,
205 while (2 * h <= height)
210 while (2 * w <= width)
212 if ((i + j) % 2 == 0)
217 GdkWindowAttr attributes;
219 attributes.window_type = GDK_WINDOW_CHILD;
222 attributes.width = w;
223 attributes.height = h;
224 attributes.wclass = GDK_INPUT_OUTPUT;
225 attributes.event_mask = GDK_EXPOSURE_MASK;
226 attributes.visual = gtk_widget_get_visual (widget);
227 attributes.colormap = gtk_widget_get_colormap (widget);
229 child = gdk_window_new (parent, &attributes,
230 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
232 pattern_set_bg (widget, child, level);
235 create_pattern (widget, child, level + 1, w, h);
237 gdk_window_show (child);
247 #define PATTERN_SIZE (1 << 18)
250 pattern_hadj_changed (GtkAdjustment *adj,
253 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
254 gint new_value = adj->value;
256 if (GTK_WIDGET_REALIZED (darea))
258 gdk_window_scroll (darea->window, *old_value - new_value, 0);
259 *old_value = new_value;
264 pattern_vadj_changed (GtkAdjustment *adj,
267 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
268 gint new_value = adj->value;
270 if (GTK_WIDGET_REALIZED (darea))
272 gdk_window_scroll (darea->window, 0, *old_value - new_value);
273 *old_value = new_value;
278 pattern_realize (GtkWidget *widget,
281 pattern_set_bg (widget, widget->window, 0);
282 create_pattern (widget, widget->window, 1, PATTERN_SIZE, PATTERN_SIZE);
286 create_big_windows (GtkWidget *widget)
288 static GtkWidget *window = NULL;
289 GtkWidget *darea, *table, *scrollbar;
293 static gint current_x;
294 static gint current_y;
301 window = gtk_dialog_new_with_buttons ("Big Windows",
307 gtk_window_set_screen (GTK_WINDOW (window),
308 gtk_widget_get_screen (widget));
310 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
312 g_signal_connect (window, "destroy",
313 G_CALLBACK (gtk_widget_destroyed),
316 g_signal_connect (window, "response",
317 G_CALLBACK (gtk_widget_destroy),
320 table = gtk_table_new (2, 2, FALSE);
321 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
322 table, TRUE, TRUE, 0);
324 darea = gtk_drawing_area_new ();
326 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
327 g_signal_connect (hadj, "value_changed",
328 G_CALLBACK (pattern_hadj_changed), darea);
329 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
331 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
332 g_signal_connect (vadj, "value_changed",
333 G_CALLBACK (pattern_vadj_changed), darea);
334 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
336 g_signal_connect (darea, "realize",
337 G_CALLBACK (pattern_realize),
339 g_signal_connect (darea, "expose_event",
340 G_CALLBACK (pattern_expose),
343 eventbox = gtk_event_box_new ();
344 gtk_table_attach (GTK_TABLE (table), eventbox,
346 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
349 gtk_container_add (GTK_CONTAINER (eventbox), darea);
351 scrollbar = gtk_hscrollbar_new (hadj);
352 gtk_table_attach (GTK_TABLE (table), scrollbar,
354 GTK_FILL | GTK_EXPAND, GTK_FILL,
357 scrollbar = gtk_vscrollbar_new (vadj);
358 gtk_table_attach (GTK_TABLE (table), scrollbar,
360 GTK_FILL, GTK_EXPAND | GTK_FILL,
365 if (!GTK_WIDGET_VISIBLE (window))
366 gtk_widget_show_all (window);
368 gtk_widget_hide (window);
376 button_window (GtkWidget *widget,
379 if (!GTK_WIDGET_VISIBLE (button))
380 gtk_widget_show (button);
382 gtk_widget_hide (button);
386 create_buttons (GtkWidget *widget)
388 static GtkWidget *window = NULL;
392 GtkWidget *button[10];
393 GtkWidget *separator;
397 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
398 gtk_window_set_screen (GTK_WINDOW (window),
399 gtk_widget_get_screen (widget));
401 g_signal_connect (window, "destroy",
402 G_CALLBACK (gtk_widget_destroyed),
405 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
406 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
408 box1 = gtk_vbox_new (FALSE, 0);
409 gtk_container_add (GTK_CONTAINER (window), box1);
411 table = gtk_table_new (3, 3, FALSE);
412 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
413 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
414 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
415 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
417 button[0] = gtk_button_new_with_label ("button1");
418 button[1] = gtk_button_new_with_mnemonic ("_button2");
419 button[2] = gtk_button_new_with_mnemonic ("_button3");
420 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
421 button[4] = gtk_button_new_with_label ("button5");
422 button[5] = gtk_button_new_with_label ("button6");
423 button[6] = gtk_button_new_with_label ("button7");
424 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
425 button[8] = gtk_button_new_with_label ("button9");
427 g_signal_connect (button[0], "clicked",
428 G_CALLBACK (button_window),
431 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
432 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
434 g_signal_connect (button[1], "clicked",
435 G_CALLBACK (button_window),
438 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
439 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
441 g_signal_connect (button[2], "clicked",
442 G_CALLBACK (button_window),
444 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
445 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
447 g_signal_connect (button[3], "clicked",
448 G_CALLBACK (button_window),
450 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
451 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
453 g_signal_connect (button[4], "clicked",
454 G_CALLBACK (button_window),
456 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
457 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
459 g_signal_connect (button[5], "clicked",
460 G_CALLBACK (button_window),
462 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
463 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
465 g_signal_connect (button[6], "clicked",
466 G_CALLBACK (button_window),
468 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
469 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
471 g_signal_connect (button[7], "clicked",
472 G_CALLBACK (button_window),
474 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
475 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
477 g_signal_connect (button[8], "clicked",
478 G_CALLBACK (button_window),
480 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
481 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
483 separator = gtk_hseparator_new ();
484 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
486 box2 = gtk_vbox_new (FALSE, 10);
487 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
488 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
490 button[9] = gtk_button_new_with_label ("close");
491 g_signal_connect_swapped (button[9], "clicked",
492 G_CALLBACK (gtk_widget_destroy),
494 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
495 GTK_WIDGET_SET_FLAGS (button[9], GTK_CAN_DEFAULT);
496 gtk_widget_grab_default (button[9]);
499 if (!GTK_WIDGET_VISIBLE (window))
500 gtk_widget_show_all (window);
502 gtk_widget_destroy (window);
510 create_toggle_buttons (GtkWidget *widget)
512 static GtkWidget *window = NULL;
516 GtkWidget *separator;
520 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
521 gtk_window_set_screen (GTK_WINDOW (window),
522 gtk_widget_get_screen (widget));
524 g_signal_connect (window, "destroy",
525 G_CALLBACK (gtk_widget_destroyed),
528 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
529 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
531 box1 = gtk_vbox_new (FALSE, 0);
532 gtk_container_add (GTK_CONTAINER (window), box1);
534 box2 = gtk_vbox_new (FALSE, 10);
535 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
536 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
538 button = gtk_toggle_button_new_with_label ("button1");
539 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
541 button = gtk_toggle_button_new_with_label ("button2");
542 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
544 button = gtk_toggle_button_new_with_label ("button3");
545 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
547 button = gtk_toggle_button_new_with_label ("inconsistent");
548 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
549 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
551 separator = gtk_hseparator_new ();
552 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
554 box2 = gtk_vbox_new (FALSE, 10);
555 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
556 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
558 button = gtk_button_new_with_label ("close");
559 g_signal_connect_swapped (button, "clicked",
560 G_CALLBACK (gtk_widget_destroy),
562 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
563 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
564 gtk_widget_grab_default (button);
567 if (!GTK_WIDGET_VISIBLE (window))
568 gtk_widget_show_all (window);
570 gtk_widget_destroy (window);
574 create_widget_grid (GType widget_type)
577 GtkWidget *group_widget = NULL;
580 table = gtk_table_new (FALSE, 3, 3);
582 for (i = 0; i < 5; i++)
584 for (j = 0; j < 5; j++)
589 if (i == 0 && j == 0)
595 tmp = g_strdup_printf ("%d", j);
596 widget = gtk_label_new (tmp);
601 tmp = g_strdup_printf ("%c", 'A' + i - 1);
602 widget = gtk_label_new (tmp);
607 widget = g_object_new (widget_type, NULL);
609 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
612 group_widget = widget;
614 g_object_set (widget, "group", group_widget, NULL);
619 gtk_table_attach (GTK_TABLE (table), widget,
634 create_check_buttons (GtkWidget *widget)
636 static GtkWidget *window = NULL;
640 GtkWidget *separator;
645 window = gtk_dialog_new_with_buttons ("Check Buttons",
651 gtk_window_set_screen (GTK_WINDOW (window),
652 gtk_widget_get_screen (widget));
654 g_signal_connect (window, "destroy",
655 G_CALLBACK (gtk_widget_destroyed),
657 g_signal_connect (window, "response",
658 G_CALLBACK (gtk_widget_destroy),
661 box1 = GTK_DIALOG (window)->vbox;
663 box2 = gtk_vbox_new (FALSE, 10);
664 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
665 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
667 button = gtk_check_button_new_with_mnemonic ("_button1");
668 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
670 button = gtk_check_button_new_with_label ("button2");
671 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
673 button = gtk_check_button_new_with_label ("button3");
674 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
676 button = gtk_check_button_new_with_label ("inconsistent");
677 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
678 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
680 separator = gtk_hseparator_new ();
681 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
683 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
684 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
685 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
688 if (!GTK_WIDGET_VISIBLE (window))
689 gtk_widget_show_all (window);
691 gtk_widget_destroy (window);
699 create_radio_buttons (GtkWidget *widget)
701 static GtkWidget *window = NULL;
705 GtkWidget *separator;
710 window = gtk_dialog_new_with_buttons ("Radio Buttons",
716 gtk_window_set_screen (GTK_WINDOW (window),
717 gtk_widget_get_screen (widget));
719 g_signal_connect (window, "destroy",
720 G_CALLBACK (gtk_widget_destroyed),
722 g_signal_connect (window, "response",
723 G_CALLBACK (gtk_widget_destroy),
726 box1 = GTK_DIALOG (window)->vbox;
728 box2 = gtk_vbox_new (FALSE, 10);
729 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
730 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
732 button = gtk_radio_button_new_with_label (NULL, "button1");
733 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
735 button = gtk_radio_button_new_with_label (
736 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
738 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
739 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
741 button = gtk_radio_button_new_with_label (
742 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
744 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
746 button = gtk_radio_button_new_with_label (
747 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
749 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
750 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
752 separator = gtk_hseparator_new ();
753 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
755 box2 = gtk_vbox_new (FALSE, 10);
756 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
757 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
759 button = gtk_radio_button_new_with_label (NULL, "button4");
760 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
761 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
763 button = gtk_radio_button_new_with_label (
764 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
766 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
767 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
768 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
770 button = gtk_radio_button_new_with_label (
771 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
773 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
774 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
776 separator = gtk_hseparator_new ();
777 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
779 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
780 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
781 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
784 if (!GTK_WIDGET_VISIBLE (window))
785 gtk_widget_show_all (window);
787 gtk_widget_destroy (window);
795 create_bbox (gint horizontal,
806 frame = gtk_frame_new (title);
809 bbox = gtk_hbutton_box_new ();
811 bbox = gtk_vbutton_box_new ();
813 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
814 gtk_container_add (GTK_CONTAINER (frame), bbox);
816 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
817 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
818 gtk_button_box_set_child_size (GTK_BUTTON_BOX (bbox), child_w, child_h);
820 button = gtk_button_new_with_label ("OK");
821 gtk_container_add (GTK_CONTAINER (bbox), button);
823 button = gtk_button_new_with_label ("Cancel");
824 gtk_container_add (GTK_CONTAINER (bbox), button);
826 button = gtk_button_new_with_label ("Help");
827 gtk_container_add (GTK_CONTAINER (bbox), button);
833 create_button_box (GtkWidget *widget)
835 static GtkWidget* window = NULL;
836 GtkWidget *main_vbox;
839 GtkWidget *frame_horz;
840 GtkWidget *frame_vert;
844 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
845 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
846 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
848 g_signal_connect (window, "destroy",
849 G_CALLBACK (gtk_widget_destroyed),
852 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
854 main_vbox = gtk_vbox_new (FALSE, 0);
855 gtk_container_add (GTK_CONTAINER (window), main_vbox);
857 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
858 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
860 vbox = gtk_vbox_new (FALSE, 0);
861 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
862 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
864 gtk_box_pack_start (GTK_BOX (vbox),
865 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
868 gtk_box_pack_start (GTK_BOX (vbox),
869 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
872 gtk_box_pack_start (GTK_BOX (vbox),
873 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
876 gtk_box_pack_start (GTK_BOX (vbox),
877 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
880 frame_vert = gtk_frame_new ("Vertical Button Boxes");
881 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
883 hbox = gtk_hbox_new (FALSE, 0);
884 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
885 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
887 gtk_box_pack_start (GTK_BOX (hbox),
888 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
891 gtk_box_pack_start (GTK_BOX (hbox),
892 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
895 gtk_box_pack_start (GTK_BOX (hbox),
896 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
899 gtk_box_pack_start (GTK_BOX (hbox),
900 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
904 if (!GTK_WIDGET_VISIBLE (window))
905 gtk_widget_show_all (window);
907 gtk_widget_destroy (window);
915 new_pixmap (char *filename,
917 GdkColor *background)
923 if (strcmp (filename, "test.xpm") == 0 ||
924 !file_exists (filename))
926 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask,
931 pixmap = gdk_pixmap_create_from_xpm (window, &mask,
935 wpixmap = gtk_image_new_from_pixmap (pixmap, mask);
942 set_toolbar_small_stock (GtkWidget *widget,
945 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
949 set_toolbar_large_stock (GtkWidget *widget,
952 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
956 set_toolbar_horizontal (GtkWidget *widget,
959 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_HORIZONTAL);
963 set_toolbar_vertical (GtkWidget *widget,
966 gtk_toolbar_set_orientation (GTK_TOOLBAR (data), GTK_ORIENTATION_VERTICAL);
970 set_toolbar_icons (GtkWidget *widget,
973 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
977 set_toolbar_text (GtkWidget *widget,
980 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
984 set_toolbar_both (GtkWidget *widget,
987 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
991 set_toolbar_both_horiz (GtkWidget *widget,
994 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
998 set_toolbar_enable (GtkWidget *widget,
1001 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), TRUE);
1005 set_toolbar_disable (GtkWidget *widget,
1008 gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), FALSE);
1012 create_toolbar (GtkWidget *widget)
1014 static GtkWidget *window = NULL;
1020 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1021 gtk_window_set_screen (GTK_WINDOW (window),
1022 gtk_widget_get_screen (widget));
1024 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1025 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
1027 g_signal_connect (window, "destroy",
1028 G_CALLBACK (gtk_widget_destroyed),
1031 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1032 gtk_widget_realize (window);
1034 toolbar = gtk_toolbar_new ();
1036 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1038 "Stock icon: New", "Toolbar/New",
1039 G_CALLBACK (set_toolbar_small_stock), toolbar, -1);
1041 gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1043 "Stock icon: Open", "Toolbar/Open",
1044 G_CALLBACK (set_toolbar_large_stock), toolbar, -1);
1046 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1047 "Horizontal", "Horizontal toolbar layout", "Toolbar/Horizontal",
1048 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1049 G_CALLBACK (set_toolbar_horizontal), toolbar);
1050 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1051 "Vertical", "Vertical toolbar layout", "Toolbar/Vertical",
1052 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1053 G_CALLBACK (set_toolbar_vertical), toolbar);
1055 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1057 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1058 "Icons", "Only show toolbar icons", "Toolbar/IconsOnly",
1059 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1060 G_CALLBACK (set_toolbar_icons), toolbar);
1061 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1062 "Text", "Only show toolbar text", "Toolbar/TextOnly",
1063 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1064 G_CALLBACK (set_toolbar_text), toolbar);
1065 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1066 "Both", "Show toolbar icons and text", "Toolbar/Both",
1067 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1068 G_CALLBACK (set_toolbar_both), toolbar);
1069 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1070 "Both (horizontal)",
1071 "Show toolbar icons and text in a horizontal fashion",
1072 "Toolbar/BothHoriz",
1073 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1074 G_CALLBACK (set_toolbar_both_horiz), toolbar);
1076 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1078 entry = gtk_entry_new ();
1080 gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), entry, "This is an unusable GtkEntry ;)", "Hey don't click me!!!");
1082 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1085 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1087 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1088 "Enable", "Enable tooltips", NULL,
1089 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1090 G_CALLBACK (set_toolbar_enable), toolbar);
1091 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1092 "Disable", "Disable tooltips", NULL,
1093 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1094 G_CALLBACK (set_toolbar_disable), toolbar);
1096 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1098 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1099 "Frobate", "Frobate tooltip", NULL,
1100 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1102 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1103 "Baz", "Baz tooltip", NULL,
1104 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1107 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1109 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1110 "Blah", "Blah tooltip", NULL,
1111 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1113 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1114 "Bar", "Bar tooltip", NULL,
1115 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1118 gtk_container_add (GTK_CONTAINER (window), toolbar);
1121 if (!GTK_WIDGET_VISIBLE (window))
1122 gtk_widget_show_all (window);
1124 gtk_widget_destroy (window);
1128 make_toolbar (GtkWidget *window)
1132 if (!GTK_WIDGET_REALIZED (window))
1133 gtk_widget_realize (window);
1135 toolbar = gtk_toolbar_new ();
1137 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1138 "Horizontal", "Horizontal toolbar layout", NULL,
1139 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1140 G_CALLBACK (set_toolbar_horizontal), toolbar);
1141 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1142 "Vertical", "Vertical toolbar layout", NULL,
1143 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1144 G_CALLBACK (set_toolbar_vertical), toolbar);
1146 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
1148 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1149 "Icons", "Only show toolbar icons", NULL,
1150 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1151 G_CALLBACK (set_toolbar_icons), toolbar);
1152 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1153 "Text", "Only show toolbar text", NULL,
1154 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1155 G_CALLBACK (set_toolbar_text), toolbar);
1156 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1157 "Both", "Show toolbar icons and text", NULL,
1158 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1159 G_CALLBACK (set_toolbar_both), toolbar);
1161 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1163 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1164 "Woot", "Woot woot woot", NULL,
1165 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1167 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1168 "Blah", "Blah blah blah", "Toolbar/Big",
1169 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1172 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1174 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1175 "Enable", "Enable tooltips", NULL,
1176 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1177 G_CALLBACK (set_toolbar_enable), toolbar);
1178 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1179 "Disable", "Disable tooltips", NULL,
1180 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1181 G_CALLBACK (set_toolbar_disable), toolbar);
1183 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1185 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1186 "Hoo", "Hoo tooltip", NULL,
1187 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1189 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1190 "Woo", "Woo tooltip", NULL,
1191 new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
1201 static guint statusbar_counter = 1;
1204 statusbar_push (GtkWidget *button,
1205 GtkStatusbar *statusbar)
1209 sprintf (text, "something %d", statusbar_counter++);
1211 gtk_statusbar_push (statusbar, 1, text);
1215 statusbar_pop (GtkWidget *button,
1216 GtkStatusbar *statusbar)
1218 gtk_statusbar_pop (statusbar, 1);
1222 statusbar_steal (GtkWidget *button,
1223 GtkStatusbar *statusbar)
1225 gtk_statusbar_remove (statusbar, 1, 4);
1229 statusbar_popped (GtkStatusbar *statusbar,
1233 if (!statusbar->messages)
1234 statusbar_counter = 1;
1238 statusbar_contexts (GtkStatusbar *statusbar)
1242 string = "any context";
1243 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1245 gtk_statusbar_get_context_id (statusbar, string));
1247 string = "idle messages";
1248 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1250 gtk_statusbar_get_context_id (statusbar, string));
1252 string = "some text";
1253 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1255 gtk_statusbar_get_context_id (statusbar, string));
1257 string = "hit the mouse";
1258 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1260 gtk_statusbar_get_context_id (statusbar, string));
1262 string = "hit the mouse2";
1263 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1265 gtk_statusbar_get_context_id (statusbar, string));
1269 create_statusbar (GtkWidget *widget)
1271 static GtkWidget *window = NULL;
1275 GtkWidget *separator;
1276 GtkWidget *statusbar;
1280 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1281 gtk_window_set_screen (GTK_WINDOW (window),
1282 gtk_widget_get_screen (widget));
1284 g_signal_connect (window, "destroy",
1285 G_CALLBACK (gtk_widget_destroyed),
1288 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1289 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1291 box1 = gtk_vbox_new (FALSE, 0);
1292 gtk_container_add (GTK_CONTAINER (window), box1);
1294 box2 = gtk_vbox_new (FALSE, 10);
1295 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1296 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1298 statusbar = gtk_statusbar_new ();
1299 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1300 g_signal_connect (statusbar,
1302 G_CALLBACK (statusbar_popped),
1305 button = gtk_widget_new (gtk_button_get_type (),
1306 "label", "push something",
1310 g_object_connect (button,
1311 "signal::clicked", statusbar_push, statusbar,
1314 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1319 "signal_after::clicked", statusbar_pop, statusbar,
1322 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1323 "label", "steal #4",
1327 "signal_after::clicked", statusbar_steal, statusbar,
1330 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
1331 "label", "test contexts",
1335 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1338 separator = gtk_hseparator_new ();
1339 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1341 box2 = gtk_vbox_new (FALSE, 10);
1342 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1343 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1345 button = gtk_button_new_with_label ("close");
1346 g_signal_connect_swapped (button, "clicked",
1347 G_CALLBACK (gtk_widget_destroy),
1349 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1350 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1351 gtk_widget_grab_default (button);
1354 if (!GTK_WIDGET_VISIBLE (window))
1355 gtk_widget_show_all (window);
1357 gtk_widget_destroy (window);
1365 cb_tree_destroy_event(GtkWidget* w)
1367 sTreeButtons* tree_buttons;
1369 /* free buttons structure associate at this tree */
1370 tree_buttons = g_object_get_data (G_OBJECT (w), "user_data");
1371 g_free (tree_buttons);
1375 cb_add_new_item(GtkWidget* w, GtkTree* tree)
1377 sTreeButtons* tree_buttons;
1378 GList* selected_list;
1379 GtkWidget* selected_item;
1381 GtkWidget* item_new;
1384 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1386 selected_list = GTK_TREE_SELECTION_OLD(tree);
1388 if(selected_list == NULL)
1390 /* there is no item in tree */
1391 subtree = GTK_WIDGET(tree);
1395 /* list can have only one element */
1396 selected_item = GTK_WIDGET(selected_list->data);
1398 subtree = GTK_TREE_ITEM_SUBTREE(selected_item);
1402 /* current selected item have not subtree ... create it */
1403 subtree = gtk_tree_new();
1404 gtk_tree_item_set_subtree(GTK_TREE_ITEM(selected_item),
1409 /* at this point, we know which subtree will be used to add new item */
1410 /* create a new item */
1411 sprintf(buffer, "item add %d", tree_buttons->nb_item_add);
1412 item_new = gtk_tree_item_new_with_label(buffer);
1413 gtk_tree_append(GTK_TREE(subtree), item_new);
1414 gtk_widget_show(item_new);
1416 tree_buttons->nb_item_add++;
1420 cb_remove_item(GtkWidget*w, GtkTree* tree)
1422 GList* selected_list;
1425 selected_list = GTK_TREE_SELECTION_OLD(tree);
1429 while (selected_list)
1431 clear_list = g_list_prepend (clear_list, selected_list->data);
1432 selected_list = selected_list->next;
1435 clear_list = g_list_reverse (clear_list);
1436 gtk_tree_remove_items(tree, clear_list);
1438 g_list_free (clear_list);
1442 cb_remove_subtree(GtkWidget*w, GtkTree* tree)
1444 GList* selected_list;
1447 selected_list = GTK_TREE_SELECTION_OLD(tree);
1451 item = GTK_TREE_ITEM (selected_list->data);
1453 gtk_tree_item_remove_subtree (item);
1458 cb_tree_changed(GtkTree* tree)
1460 sTreeButtons* tree_buttons;
1461 GList* selected_list;
1464 tree_buttons = g_object_get_data (G_OBJECT (tree), "user_data");
1466 selected_list = GTK_TREE_SELECTION_OLD(tree);
1467 nb_selected = g_list_length(selected_list);
1469 if(nb_selected == 0)
1471 if(tree->children == NULL)
1472 gtk_widget_set_sensitive(tree_buttons->add_button, TRUE);
1474 gtk_widget_set_sensitive(tree_buttons->add_button, FALSE);
1475 gtk_widget_set_sensitive(tree_buttons->remove_button, FALSE);
1476 gtk_widget_set_sensitive(tree_buttons->subtree_button, FALSE);
1480 gtk_widget_set_sensitive(tree_buttons->remove_button, TRUE);
1481 gtk_widget_set_sensitive(tree_buttons->add_button, (nb_selected == 1));
1482 gtk_widget_set_sensitive(tree_buttons->subtree_button, (nb_selected == 1));
1487 create_subtree(GtkWidget* item, guint level, guint nb_item_max, guint recursion_level_max)
1489 GtkWidget* item_subtree;
1490 GtkWidget* item_new;
1495 if(level == recursion_level_max) return;
1499 /* query with no root item */
1501 item_subtree = item;
1506 /* query with no root item */
1507 /* create subtree and associate it with current item */
1508 item_subtree = gtk_tree_new();
1512 for(nb_item = 0; nb_item < nb_item_max; nb_item++)
1514 sprintf(buffer, "item %d-%d", level, nb_item);
1515 item_new = gtk_tree_item_new_with_label(buffer);
1516 gtk_tree_append(GTK_TREE(item_subtree), item_new);
1517 create_subtree(item_new, level+1, nb_item_max, recursion_level_max);
1518 gtk_widget_show(item_new);
1522 gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), item_subtree);
1526 create_tree_sample(GdkScreen *screen, guint selection_mode,
1527 guint draw_line, guint view_line, guint no_root_item,
1528 guint nb_item_max, guint recursion_level_max)
1533 GtkWidget* separator;
1535 GtkWidget* scrolled_win;
1536 GtkWidget* root_tree;
1537 GtkWidget* root_item;
1538 sTreeButtons* tree_buttons;
1540 /* create tree buttons struct */
1541 if ((tree_buttons = g_malloc (sizeof (sTreeButtons))) == NULL)
1543 g_error("can't allocate memory for tree structure !\n");
1546 tree_buttons->nb_item_add = 0;
1548 /* create top level window */
1549 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1550 gtk_window_set_screen (GTK_WINDOW (window), screen);
1551 gtk_window_set_title(GTK_WINDOW(window), "Tree Sample");
1552 g_signal_connect (window, "destroy",
1553 G_CALLBACK (cb_tree_destroy_event), NULL);
1554 g_object_set_data (G_OBJECT (window), "user_data", tree_buttons);
1556 box1 = gtk_vbox_new(FALSE, 0);
1557 gtk_container_add(GTK_CONTAINER(window), box1);
1558 gtk_widget_show(box1);
1560 /* create tree box */
1561 box2 = gtk_vbox_new(FALSE, 0);
1562 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
1563 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1564 gtk_widget_show(box2);
1566 /* create scrolled window */
1567 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
1568 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
1569 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1570 gtk_box_pack_start (GTK_BOX (box2), scrolled_win, TRUE, TRUE, 0);
1571 gtk_widget_set_size_request (scrolled_win, 200, 200);
1572 gtk_widget_show (scrolled_win);
1574 /* create root tree widget */
1575 root_tree = gtk_tree_new();
1576 g_signal_connect (root_tree, "selection_changed",
1577 G_CALLBACK (cb_tree_changed),
1579 g_object_set_data (G_OBJECT (root_tree), "user_data", tree_buttons);
1580 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), root_tree);
1581 gtk_tree_set_selection_mode(GTK_TREE(root_tree), selection_mode);
1582 gtk_tree_set_view_lines(GTK_TREE(root_tree), draw_line);
1583 gtk_tree_set_view_mode(GTK_TREE(root_tree), !view_line);
1584 gtk_widget_show(root_tree);
1588 /* set root tree to subtree function with root item variable */
1589 root_item = GTK_WIDGET(root_tree);
1593 /* create root tree item widget */
1594 root_item = gtk_tree_item_new_with_label("root item");
1595 gtk_tree_append(GTK_TREE(root_tree), root_item);
1596 gtk_widget_show(root_item);
1598 create_subtree(root_item, -no_root_item, nb_item_max, recursion_level_max);
1600 box2 = gtk_vbox_new(FALSE, 0);
1601 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1602 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1603 gtk_widget_show(box2);
1605 button = gtk_button_new_with_label("Add Item");
1606 gtk_widget_set_sensitive(button, FALSE);
1607 g_signal_connect (button, "clicked",
1608 G_CALLBACK (cb_add_new_item),
1610 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1611 gtk_widget_show(button);
1612 tree_buttons->add_button = button;
1614 button = gtk_button_new_with_label("Remove Item(s)");
1615 gtk_widget_set_sensitive(button, FALSE);
1616 g_signal_connect (button, "clicked",
1617 G_CALLBACK (cb_remove_item),
1619 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1620 gtk_widget_show(button);
1621 tree_buttons->remove_button = button;
1623 button = gtk_button_new_with_label("Remove Subtree");
1624 gtk_widget_set_sensitive(button, FALSE);
1625 g_signal_connect (button, "clicked",
1626 G_CALLBACK (cb_remove_subtree),
1628 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1629 gtk_widget_show(button);
1630 tree_buttons->subtree_button = button;
1632 /* create separator */
1633 separator = gtk_hseparator_new();
1634 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
1635 gtk_widget_show(separator);
1637 /* create button box */
1638 box2 = gtk_vbox_new(FALSE, 0);
1639 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1640 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1641 gtk_widget_show(box2);
1643 button = gtk_button_new_with_label("Close");
1644 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1645 g_signal_connect_swapped (button, "clicked",
1646 G_CALLBACK (gtk_widget_destroy),
1648 gtk_widget_show(button);
1650 gtk_widget_show(window);
1654 cb_create_tree(GtkWidget* w)
1656 guint selection_mode = GTK_SELECTION_SINGLE;
1661 guint recursion_level;
1663 /* get selection mode choice */
1664 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.single_button)->active)
1665 selection_mode = GTK_SELECTION_SINGLE;
1667 if(GTK_TOGGLE_BUTTON(sTreeSampleSelection.browse_button)->active)
1668 selection_mode = GTK_SELECTION_BROWSE;
1670 selection_mode = GTK_SELECTION_MULTIPLE;
1672 /* get options choice */
1673 draw_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.draw_line_button)->active;
1674 view_line = GTK_TOGGLE_BUTTON(sTreeSampleSelection.view_line_button)->active;
1675 no_root_item = GTK_TOGGLE_BUTTON(sTreeSampleSelection.no_root_item_button)->active;
1678 nb_item = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.nb_item_spinner));
1679 recursion_level = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sTreeSampleSelection.recursion_spinner));
1681 if (pow (nb_item, recursion_level) > 10000)
1683 g_print ("%g total items? That will take a very long time. Try less\n",
1684 pow (nb_item, recursion_level));
1688 create_tree_sample(gtk_widget_get_screen (w),
1689 selection_mode, draw_line,
1690 view_line, no_root_item, nb_item, recursion_level);
1694 create_tree_mode_window(GtkWidget *widget)
1696 static GtkWidget* window;
1704 GtkWidget* separator;
1711 /* create toplevel window */
1712 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1713 gtk_window_set_screen (GTK_WINDOW (window),
1714 gtk_widget_get_screen (widget));
1715 gtk_window_set_title(GTK_WINDOW(window), "Set Tree Parameters");
1716 g_signal_connect (window, "destroy",
1717 G_CALLBACK (gtk_widget_destroyed),
1719 box1 = gtk_vbox_new(FALSE, 0);
1720 gtk_container_add(GTK_CONTAINER(window), box1);
1722 /* create upper box - selection box */
1723 box2 = gtk_vbox_new(FALSE, 5);
1724 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
1725 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1727 box3 = gtk_hbox_new(FALSE, 5);
1728 gtk_box_pack_start(GTK_BOX(box2), box3, TRUE, TRUE, 0);
1730 /* create selection mode frame */
1731 frame = gtk_frame_new("Selection Mode");
1732 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
1734 box4 = gtk_vbox_new(FALSE, 0);
1735 gtk_container_add(GTK_CONTAINER(frame), box4);
1736 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1738 /* create radio button */
1739 button = gtk_radio_button_new_with_label(NULL, "SINGLE");
1740 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1741 sTreeSampleSelection.single_button = button;
1743 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1745 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1746 sTreeSampleSelection.browse_button = button;
1748 button = gtk_radio_button_new_with_label(gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1750 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1751 sTreeSampleSelection.multiple_button = button;
1753 sTreeSampleSelection.selection_mode_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
1755 /* create option mode frame */
1756 frame = gtk_frame_new("Options");
1757 gtk_box_pack_start(GTK_BOX(box3), frame, TRUE, TRUE, 0);
1759 box4 = gtk_vbox_new(FALSE, 0);
1760 gtk_container_add(GTK_CONTAINER(frame), box4);
1761 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1763 /* create check button */
1764 button = gtk_check_button_new_with_label("Draw line");
1765 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1766 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
1767 sTreeSampleSelection.draw_line_button = button;
1769 button = gtk_check_button_new_with_label("View Line mode");
1770 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1771 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
1772 sTreeSampleSelection.view_line_button = button;
1774 button = gtk_check_button_new_with_label("Without Root item");
1775 gtk_box_pack_start(GTK_BOX(box4), button, TRUE, TRUE, 0);
1776 sTreeSampleSelection.no_root_item_button = button;
1778 /* create recursion parameter */
1779 frame = gtk_frame_new("Size Parameters");
1780 gtk_box_pack_start(GTK_BOX(box2), frame, TRUE, TRUE, 0);
1782 box4 = gtk_hbox_new(FALSE, 5);
1783 gtk_container_add(GTK_CONTAINER(frame), box4);
1784 gtk_container_set_border_width(GTK_CONTAINER(box4), 5);
1786 /* create number of item spin button */
1787 box5 = gtk_hbox_new(FALSE, 5);
1788 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
1790 label = gtk_label_new("Number of items : ");
1791 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1792 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
1794 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_NUMBER_OF_ITEM, 1.0, 255.0, 1.0,
1796 spinner = gtk_spin_button_new (adj, 0, 0);
1797 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
1798 sTreeSampleSelection.nb_item_spinner = spinner;
1800 /* create recursion level spin button */
1801 box5 = gtk_hbox_new(FALSE, 5);
1802 gtk_box_pack_start(GTK_BOX(box4), box5, FALSE, FALSE, 0);
1804 label = gtk_label_new("Depth : ");
1805 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1806 gtk_box_pack_start (GTK_BOX (box5), label, FALSE, TRUE, 0);
1808 adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_RECURSION_LEVEL, 0.0, 255.0, 1.0,
1810 spinner = gtk_spin_button_new (adj, 0, 0);
1811 gtk_box_pack_start (GTK_BOX (box5), spinner, FALSE, TRUE, 0);
1812 sTreeSampleSelection.recursion_spinner = spinner;
1814 /* create horizontal separator */
1815 separator = gtk_hseparator_new();
1816 gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, FALSE, 0);
1818 /* create bottom button box */
1819 box2 = gtk_hbox_new(TRUE, 10);
1820 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, FALSE, 0);
1821 gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
1823 button = gtk_button_new_with_label("Create Tree");
1824 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1825 g_signal_connect (button, "clicked",
1826 G_CALLBACK (cb_create_tree), NULL);
1828 button = gtk_button_new_with_label("Close");
1829 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
1830 g_signal_connect_swapped (button, "clicked",
1831 G_CALLBACK (gtk_widget_destroy),
1834 if (!GTK_WIDGET_VISIBLE (window))
1835 gtk_widget_show_all (window);
1837 gtk_widget_destroy (window);
1843 #define GRID_SIZE 20
1844 #define DEFAULT_GEOMETRY "10x10"
1847 gridded_geometry_expose (GtkWidget *widget,
1848 GdkEventExpose *event)
1852 gdk_draw_rectangle (widget->window, widget->style->base_gc[widget->state], TRUE,
1853 0, 0, widget->allocation.width, widget->allocation.height);
1855 for (i = 0 ; i * GRID_SIZE < widget->allocation.width; i++)
1856 for (j = 0 ; j * GRID_SIZE < widget->allocation.height; j++)
1858 if ((i + j) % 2 == 0)
1859 gdk_draw_rectangle (widget->window, widget->style->text_gc[widget->state], TRUE,
1860 i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1867 gridded_geometry_subresponse (GtkDialog *dialog,
1869 gchar *geometry_string)
1871 if (response_id == GTK_RESPONSE_NONE)
1873 gtk_widget_destroy (GTK_WIDGET (dialog));
1877 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1879 g_print ("Can't parse geometry string %s\n", geometry_string);
1880 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1886 gridded_geometry_response (GtkDialog *dialog,
1890 if (response_id == GTK_RESPONSE_NONE)
1892 gtk_widget_destroy (GTK_WIDGET (dialog));
1896 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1897 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1899 GtkWidget *drawing_area;
1901 GdkGeometry geometry;
1903 window = gtk_dialog_new_with_buttons (title,
1906 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1909 gtk_window_set_screen (GTK_WINDOW (window),
1910 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1912 g_signal_connect (window, "response",
1913 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1915 box = gtk_vbox_new (FALSE, 0);
1916 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), box, TRUE, TRUE, 0);
1918 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1920 drawing_area = gtk_drawing_area_new ();
1921 g_signal_connect (drawing_area, "expose_event",
1922 G_CALLBACK (gridded_geometry_expose), NULL);
1923 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1925 /* Gross hack to work around bug 68668... if we set the size request
1926 * large enough, then the current
1928 * request_of_window - request_of_geometry_widget
1930 * method of getting the base size works more or less works.
1932 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1934 geometry.base_width = 0;
1935 geometry.base_height = 0;
1936 geometry.min_width = 2 * GRID_SIZE;
1937 geometry.min_height = 2 * GRID_SIZE;
1938 geometry.width_inc = GRID_SIZE;
1939 geometry.height_inc = GRID_SIZE;
1941 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1943 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1945 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1947 g_print ("Can't parse geometry string %s\n", geometry_string);
1948 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1951 gtk_widget_show_all (window);
1956 create_gridded_geometry (GtkWidget *widget)
1958 static GtkWidget *window = NULL;
1964 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1967 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1970 gtk_window_set_screen (GTK_WINDOW (window),
1971 gtk_widget_get_screen (widget));
1973 label = gtk_label_new ("Geometry string:");
1974 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0);
1976 entry = gtk_entry_new ();
1977 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1978 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), entry, FALSE, FALSE, 0);
1980 g_signal_connect (window, "response",
1981 G_CALLBACK (gridded_geometry_response), entry);
1982 g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
1984 gtk_widget_show_all (window);
1987 gtk_widget_destroy (window);
1995 handle_box_child_signal (GtkHandleBox *hb,
1997 const gchar *action)
1999 printf ("%s: child <%s> %sed\n",
2000 g_type_name (G_OBJECT_TYPE (hb)),
2001 g_type_name (G_OBJECT_TYPE (child)),
2006 create_handle_box (GtkWidget *widget)
2008 static GtkWidget* window = NULL;
2009 GtkWidget *handle_box;
2010 GtkWidget *handle_box2;
2015 GtkWidget *separator;
2019 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2021 gtk_window_set_screen (GTK_WINDOW (window),
2022 gtk_widget_get_screen (widget));
2024 gtk_window_set_title (GTK_WINDOW (window),
2026 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
2028 g_signal_connect (window, "destroy",
2029 G_CALLBACK (gtk_widget_destroyed),
2032 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
2034 vbox = gtk_vbox_new (FALSE, 0);
2035 gtk_container_add (GTK_CONTAINER (window), vbox);
2036 gtk_widget_show (vbox);
2038 label = gtk_label_new ("Above");
2039 gtk_container_add (GTK_CONTAINER (vbox), label);
2040 gtk_widget_show (label);
2042 separator = gtk_hseparator_new ();
2043 gtk_container_add (GTK_CONTAINER (vbox), separator);
2044 gtk_widget_show (separator);
2046 hbox = gtk_hbox_new (FALSE, 10);
2047 gtk_container_add (GTK_CONTAINER (vbox), hbox);
2048 gtk_widget_show (hbox);
2050 separator = gtk_hseparator_new ();
2051 gtk_container_add (GTK_CONTAINER (vbox), separator);
2052 gtk_widget_show (separator);
2054 label = gtk_label_new ("Below");
2055 gtk_container_add (GTK_CONTAINER (vbox), label);
2056 gtk_widget_show (label);
2058 handle_box = gtk_handle_box_new ();
2059 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2060 g_signal_connect (handle_box,
2062 G_CALLBACK (handle_box_child_signal),
2064 g_signal_connect (handle_box,
2066 G_CALLBACK (handle_box_child_signal),
2068 gtk_widget_show (handle_box);
2070 toolbar = make_toolbar (window);
2072 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
2073 gtk_widget_show (toolbar);
2075 handle_box = gtk_handle_box_new ();
2076 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
2077 g_signal_connect (handle_box,
2079 G_CALLBACK (handle_box_child_signal),
2081 g_signal_connect (handle_box,
2083 G_CALLBACK (handle_box_child_signal),
2085 gtk_widget_show (handle_box);
2087 handle_box2 = gtk_handle_box_new ();
2088 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
2089 g_signal_connect (handle_box2,
2091 G_CALLBACK (handle_box_child_signal),
2093 g_signal_connect (handle_box2,
2095 G_CALLBACK (handle_box_child_signal),
2097 gtk_widget_show (handle_box2);
2099 label = gtk_label_new ("Fooo!");
2100 gtk_container_add (GTK_CONTAINER (handle_box2), label);
2101 gtk_widget_show (label);
2104 if (!GTK_WIDGET_VISIBLE (window))
2105 gtk_widget_show (window);
2107 gtk_widget_destroy (window);
2111 * Test for getting an image from a drawable
2122 take_snapshot (GtkWidget *button,
2125 struct GetImageData *gid = data;
2126 GdkRectangle visible;
2128 int height_fraction;
2131 GdkColor color = { 0, 30000, 0, 0 };
2132 GdkRectangle target;
2135 /* Do some begin_paint_rect on some random rects, draw some
2136 * distinctive stuff into those rects, then take the snapshot.
2137 * figure out whether any rects were overlapped and report to
2141 visible = gid->sw->allocation;
2143 visible.x = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2144 visible.y = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gid->sw))->value;
2146 width_fraction = visible.width / 4;
2147 height_fraction = visible.height / 4;
2149 gc = gdk_gc_new (gid->src->window);
2150 black_gc = gid->src->style->black_gc;
2152 gdk_gc_set_rgb_fg_color (gc, &color);
2155 target.x = visible.x + width_fraction;
2156 target.y = visible.y + height_fraction * 3;
2157 target.width = width_fraction;
2158 target.height = height_fraction / 2;
2160 gdk_window_begin_paint_rect (gid->src->window,
2163 gdk_draw_rectangle (gid->src->window,
2167 target.width, target.height);
2169 gdk_draw_rectangle (gid->src->window,
2172 target.x + 10, target.y + 10,
2173 target.width - 20, target.height - 20);
2175 target.x = visible.x + width_fraction;
2176 target.y = visible.y + height_fraction;
2177 target.width = width_fraction;
2178 target.height = height_fraction;
2180 gdk_window_begin_paint_rect (gid->src->window,
2183 gdk_draw_rectangle (gid->src->window,
2187 target.width, target.height);
2189 gdk_draw_rectangle (gid->src->window,
2192 target.x + 10, target.y + 10,
2193 target.width - 20, target.height - 20);
2195 target.x = visible.x + width_fraction * 3;
2196 target.y = visible.y + height_fraction;
2197 target.width = width_fraction / 2;
2198 target.height = height_fraction;
2200 gdk_window_begin_paint_rect (gid->src->window,
2203 gdk_draw_rectangle (gid->src->window,
2207 target.width, target.height);
2209 gdk_draw_rectangle (gid->src->window,
2212 target.x + 10, target.y + 10,
2213 target.width - 20, target.height - 20);
2215 target.x = visible.x + width_fraction * 2;
2216 target.y = visible.y + height_fraction * 2;
2217 target.width = width_fraction / 4;
2218 target.height = height_fraction / 4;
2220 gdk_window_begin_paint_rect (gid->src->window,
2223 gdk_draw_rectangle (gid->src->window,
2227 target.width, target.height);
2229 gdk_draw_rectangle (gid->src->window,
2232 target.x + 10, target.y + 10,
2233 target.width - 20, target.height - 20);
2235 target.x += target.width / 2;
2236 target.y += target.width / 2;
2238 gdk_window_begin_paint_rect (gid->src->window,
2241 gdk_draw_rectangle (gid->src->window,
2245 target.width, target.height);
2247 gdk_draw_rectangle (gid->src->window,
2250 target.x + 10, target.y + 10,
2251 target.width - 20, target.height - 20);
2253 /* Screen shot area */
2255 target.x = visible.x + width_fraction * 1.5;
2256 target.y = visible.y + height_fraction * 1.5;
2257 target.width = width_fraction * 2;
2258 target.height = height_fraction * 2;
2260 shot = gdk_drawable_get_image (gid->src->window,
2262 target.width, target.height);
2264 gtk_image_set_from_image (GTK_IMAGE (gid->snap),
2267 g_object_unref (shot);
2269 gdk_window_end_paint (gid->src->window);
2270 gdk_window_end_paint (gid->src->window);
2271 gdk_window_end_paint (gid->src->window);
2272 gdk_window_end_paint (gid->src->window);
2273 gdk_window_end_paint (gid->src->window);
2275 gdk_draw_rectangle (gid->src->window,
2276 gid->src->style->black_gc,
2279 target.width, target.height);
2281 g_object_unref (gc);
2285 image_source_expose (GtkWidget *da,
2286 GdkEventExpose *event,
2289 int x = event->area.x;
2290 GdkColor red = { 0, 65535, 0, 0 };
2291 GdkColor green = { 0, 0, 65535, 0 };
2292 GdkColor blue = { 0, 0, 0, 65535 };
2295 gc = gdk_gc_new (event->window);
2297 while (x < (event->area.x + event->area.width))
2304 gdk_gc_set_rgb_fg_color (gc, &red);
2310 gdk_gc_set_rgb_fg_color (gc, &green);
2316 gdk_gc_set_rgb_fg_color (gc, &blue);
2320 g_assert_not_reached ();
2324 gdk_draw_line (event->window,
2327 x, event->area.y + event->area.height);
2332 g_object_unref (gc);
2338 create_get_image (GtkWidget *widget)
2340 static GtkWidget *window = NULL;
2343 gtk_widget_destroy (window);
2352 struct GetImageData *gid;
2354 gid = g_new (struct GetImageData, 1);
2356 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2358 gtk_window_set_screen (GTK_WINDOW (window),
2359 gtk_widget_get_screen (widget));
2361 g_signal_connect (window,
2363 G_CALLBACK (gtk_widget_destroyed),
2366 g_object_set_data_full (G_OBJECT (window),
2367 "testgtk-get-image-data",
2371 vbox = gtk_vbox_new (FALSE, 0);
2373 gtk_container_add (GTK_CONTAINER (window), vbox);
2375 sw = gtk_scrolled_window_new (NULL, NULL);
2376 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2377 GTK_POLICY_AUTOMATIC,
2378 GTK_POLICY_AUTOMATIC);
2382 gtk_widget_set_size_request (sw, 400, 400);
2384 src = gtk_drawing_area_new ();
2385 gtk_widget_set_size_request (src, 10000, 10000);
2387 g_signal_connect (src,
2389 G_CALLBACK (image_source_expose),
2394 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
2397 gtk_box_pack_start (GTK_BOX (vbox),
2401 hbox = gtk_hbox_new (FALSE, 3);
2403 snap = gtk_widget_new (GTK_TYPE_IMAGE, NULL);
2407 sw = gtk_scrolled_window_new (NULL, NULL);
2408 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2409 GTK_POLICY_AUTOMATIC,
2410 GTK_POLICY_AUTOMATIC);
2411 gtk_widget_set_size_request (sw, 300, 300);
2413 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), snap);
2415 gtk_box_pack_end (GTK_BOX (hbox), sw, FALSE, FALSE, 5);
2417 button = gtk_button_new_with_label ("Get image from drawable");
2419 g_signal_connect (button,
2421 G_CALLBACK (take_snapshot),
2424 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
2426 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2428 gtk_widget_show_all (window);
2436 sensitivity_toggled (GtkWidget *toggle,
2439 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
2443 create_sensitivity_control (GtkWidget *widget)
2447 button = gtk_toggle_button_new_with_label ("Sensitive");
2449 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2450 GTK_WIDGET_IS_SENSITIVE (widget));
2452 g_signal_connect (button,
2454 G_CALLBACK (sensitivity_toggled),
2457 gtk_widget_show_all (button);
2463 set_selectable_recursive (GtkWidget *widget,
2466 if (GTK_IS_CONTAINER (widget))
2471 children = gtk_container_get_children (GTK_CONTAINER (widget));
2475 set_selectable_recursive (tmp->data, setting);
2479 g_list_free (children);
2481 else if (GTK_IS_LABEL (widget))
2483 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2488 selectable_toggled (GtkWidget *toggle,
2491 set_selectable_recursive (widget,
2492 GTK_TOGGLE_BUTTON (toggle)->active);
2496 create_selectable_control (GtkWidget *widget)
2500 button = gtk_toggle_button_new_with_label ("Selectable");
2502 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2505 g_signal_connect (button,
2507 G_CALLBACK (selectable_toggled),
2510 gtk_widget_show_all (button);
2515 void create_labels (GtkWidget *widget)
2517 static GtkWidget *window = NULL;
2526 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2528 gtk_window_set_screen (GTK_WINDOW (window),
2529 gtk_widget_get_screen (widget));
2531 g_signal_connect (window, "destroy",
2532 G_CALLBACK (gtk_widget_destroyed),
2535 gtk_window_set_title (GTK_WINDOW (window), "Label");
2537 vbox = gtk_vbox_new (FALSE, 5);
2539 hbox = gtk_hbox_new (FALSE, 5);
2540 gtk_container_add (GTK_CONTAINER (window), vbox);
2542 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2544 button = create_sensitivity_control (hbox);
2546 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2548 button = create_selectable_control (hbox);
2550 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2552 vbox = gtk_vbox_new (FALSE, 5);
2554 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2555 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2557 frame = gtk_frame_new ("Normal Label");
2558 label = gtk_label_new ("This is a Normal label");
2559 gtk_container_add (GTK_CONTAINER (frame), label);
2560 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2562 frame = gtk_frame_new ("Multi-line Label");
2563 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2564 gtk_container_add (GTK_CONTAINER (frame), label);
2565 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2567 frame = gtk_frame_new ("Left Justified Label");
2568 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2569 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2570 gtk_container_add (GTK_CONTAINER (frame), label);
2571 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2573 frame = gtk_frame_new ("Right Justified Label");
2574 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2575 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2576 gtk_container_add (GTK_CONTAINER (frame), label);
2577 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2579 frame = gtk_frame_new ("Internationalized Label");
2580 label = gtk_label_new (NULL);
2581 gtk_label_set_markup (GTK_LABEL (label),
2582 "French (Fran\303\247ais) Bonjour, Salut\n"
2583 "Korean (\355\225\234\352\270\200) \354\225\210\353\205\225\355\225\230\354\204\270\354\232\224, \354\225\210\353\205\225\355\225\230\354\213\255\353\213\210\352\271\214\n"
2584 "Russian (\320\240\321\203\321\201\321\201\320\272\320\270\320\271) \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265!\n"
2585 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2586 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2587 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2588 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2589 gtk_container_add (GTK_CONTAINER (frame), label);
2590 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2592 frame = gtk_frame_new ("Bidirection Label");
2593 label = gtk_label_new ("Arabic \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205\n"
2594 "Hebrew \327\251\327\234\327\225\327\235");
2595 gtk_widget_set_direction (label, GTK_TEXT_DIR_RTL);
2596 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2597 gtk_container_add (GTK_CONTAINER (frame), label);
2598 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2600 vbox = gtk_vbox_new (FALSE, 5);
2601 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2602 frame = gtk_frame_new ("Line wrapped label");
2603 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2604 "up the entire "/* big space to test spacing */\
2605 "width allocated to it, but automatically wraps the words to fit. "\
2606 "The time has come, for all good men, to come to the aid of their party. "\
2607 "The sixth sheik's six sheep's sick.\n"\
2608 " It supports multiple paragraphs correctly, and correctly adds "\
2609 "many extra spaces. ");
2611 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2612 gtk_container_add (GTK_CONTAINER (frame), label);
2613 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2615 frame = gtk_frame_new ("Filled, wrapped label");
2616 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2617 "up the entire width allocated to it. Here is a seneance to prove "\
2618 "my point. Here is another sentence. "\
2619 "Here comes the sun, do de do de do.\n"\
2620 " This is a new paragraph.\n"\
2621 " This is another newer, longer, better paragraph. It is coming to an end, "\
2623 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2624 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2625 gtk_container_add (GTK_CONTAINER (frame), label);
2626 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2628 frame = gtk_frame_new ("Underlined label");
2629 label = gtk_label_new ("This label is underlined!\n"
2630 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2631 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2632 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2633 gtk_container_add (GTK_CONTAINER (frame), label);
2634 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2636 frame = gtk_frame_new ("Markup label");
2637 label = gtk_label_new (NULL);
2639 /* There's also a gtk_label_set_markup() without accel if you
2640 * don't have an accelerator key
2642 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2643 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2644 "<b>markup</b> _such as "
2645 "<big><i>Big Italics</i></big>\n"
2646 "<tt>Monospace font</tt>\n"
2647 "<u>Underline!</u>\n"
2649 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2650 "and nothing on this line,\n"
2653 "or even on this one\n"
2654 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2655 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2656 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2658 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_s);
2660 gtk_container_add (GTK_CONTAINER (frame), label);
2661 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2664 if (!GTK_WIDGET_VISIBLE (window))
2665 gtk_widget_show_all (window);
2667 gtk_widget_destroy (window);
2675 reparent_label (GtkWidget *widget,
2676 GtkWidget *new_parent)
2680 label = g_object_get_data (G_OBJECT (widget), "user_data");
2682 gtk_widget_reparent (label, new_parent);
2686 set_parent_signal (GtkWidget *child,
2687 GtkWidget *old_parent,
2690 g_print ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2691 g_type_name (G_OBJECT_TYPE (child)),
2692 child->parent ? g_type_name (G_OBJECT_TYPE (child->parent)) : "NULL",
2693 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2694 GPOINTER_TO_INT (func_data));
2698 create_reparent (GtkWidget *widget)
2700 static GtkWidget *window = NULL;
2707 GtkWidget *separator;
2708 GtkWidget *event_box;
2712 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2714 gtk_window_set_screen (GTK_WINDOW (window),
2715 gtk_widget_get_screen (widget));
2717 g_signal_connect (window, "destroy",
2718 G_CALLBACK (gtk_widget_destroyed),
2721 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2722 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2724 box1 = gtk_vbox_new (FALSE, 0);
2725 gtk_container_add (GTK_CONTAINER (window), box1);
2727 box2 = gtk_hbox_new (FALSE, 5);
2728 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2729 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2731 label = gtk_label_new ("Hello World");
2733 frame = gtk_frame_new ("Frame 1");
2734 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2736 box3 = gtk_vbox_new (FALSE, 5);
2737 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2738 gtk_container_add (GTK_CONTAINER (frame), box3);
2740 button = gtk_button_new_with_label ("switch");
2741 g_object_set_data (G_OBJECT (button), "user_data", label);
2742 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2744 event_box = gtk_event_box_new ();
2745 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2746 gtk_container_add (GTK_CONTAINER (event_box), label);
2748 g_signal_connect (button, "clicked",
2749 G_CALLBACK (reparent_label),
2752 g_signal_connect (label, "parent_set",
2753 G_CALLBACK (set_parent_signal),
2754 GINT_TO_POINTER (42));
2756 frame = gtk_frame_new ("Frame 2");
2757 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2759 box3 = gtk_vbox_new (FALSE, 5);
2760 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2761 gtk_container_add (GTK_CONTAINER (frame), box3);
2763 button = gtk_button_new_with_label ("switch");
2764 g_object_set_data (G_OBJECT (button), "user_data", label);
2765 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2767 event_box = gtk_event_box_new ();
2768 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2770 g_signal_connect (button, "clicked",
2771 G_CALLBACK (reparent_label),
2774 separator = gtk_hseparator_new ();
2775 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2777 box2 = gtk_vbox_new (FALSE, 10);
2778 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2779 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2781 button = gtk_button_new_with_label ("close");
2782 g_signal_connect_swapped (button, "clicked",
2783 G_CALLBACK (gtk_widget_destroy), window);
2784 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2785 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
2786 gtk_widget_grab_default (button);
2789 if (!GTK_WIDGET_VISIBLE (window))
2790 gtk_widget_show_all (window);
2792 gtk_widget_destroy (window);
2799 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2801 if (event->type == GDK_BUTTON_PRESS)
2803 if (event->button == 1)
2804 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2805 event->button, event->x_root, event->y_root,
2807 else if (event->button == 2)
2808 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2809 event->button, event->x_root, event->y_root,
2816 grippy_expose (GtkWidget *area, GdkEventExpose *event, GdkWindowEdge edge)
2818 gtk_paint_resize_grip (area->style,
2820 GTK_WIDGET_STATE (area),
2826 area->allocation.width,
2827 area->allocation.height);
2833 create_resize_grips (GtkWidget *widget)
2835 static GtkWidget *window = NULL;
2837 GtkWidget *hbox, *vbox;
2840 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2842 gtk_window_set_screen (GTK_WINDOW (window),
2843 gtk_widget_get_screen (widget));
2845 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2847 g_signal_connect (window, "destroy",
2848 G_CALLBACK (gtk_widget_destroyed),
2851 vbox = gtk_vbox_new (FALSE, 0);
2852 gtk_container_add (GTK_CONTAINER (window), vbox);
2854 hbox = gtk_hbox_new (FALSE, 0);
2855 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2858 area = gtk_drawing_area_new ();
2859 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2860 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2861 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2862 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2863 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2864 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2867 area = gtk_drawing_area_new ();
2868 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2869 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2870 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2871 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2872 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2873 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2876 area = gtk_drawing_area_new ();
2877 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2878 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2879 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2880 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2881 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2882 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2884 hbox = gtk_hbox_new (FALSE, 0);
2885 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2888 area = gtk_drawing_area_new ();
2889 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2890 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2891 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2892 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2893 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2894 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2897 area = gtk_drawing_area_new ();
2898 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2901 area = gtk_drawing_area_new ();
2902 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2903 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2904 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2905 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2906 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2907 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2910 hbox = gtk_hbox_new (FALSE, 0);
2911 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2914 area = gtk_drawing_area_new ();
2915 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2916 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2917 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2918 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2919 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2920 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2922 area = gtk_drawing_area_new ();
2923 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2924 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2925 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2926 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2927 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2928 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2931 area = gtk_drawing_area_new ();
2932 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2933 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2934 g_signal_connect (area, "expose_event", G_CALLBACK (grippy_expose),
2935 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2936 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2937 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2940 if (!GTK_WIDGET_VISIBLE (window))
2941 gtk_widget_show_all (window);
2943 gtk_widget_destroy (window);
2949 gint upositionx = 0;
2950 gint upositiony = 0;
2953 uposition_configure (GtkWidget *window)
2959 lx = g_object_get_data (G_OBJECT (window), "x");
2960 ly = g_object_get_data (G_OBJECT (window), "y");
2962 gdk_window_get_root_origin (window->window, &upositionx, &upositiony);
2963 sprintf (buffer, "%d", upositionx);
2964 gtk_label_set_text (lx, buffer);
2965 sprintf (buffer, "%d", upositiony);
2966 gtk_label_set_text (ly, buffer);
2972 uposition_stop_configure (GtkToggleButton *toggle,
2976 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2978 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2982 create_saved_position (GtkWidget *widget)
2984 static GtkWidget *window = NULL;
2989 GtkWidget *main_vbox;
2997 window = g_object_connect (gtk_widget_new (GTK_TYPE_WINDOW,
2998 "type", GTK_WINDOW_TOPLEVEL,
2999 "title", "Saved Position",
3001 "signal::configure_event", uposition_configure, NULL,
3004 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
3006 gtk_window_set_screen (GTK_WINDOW (window),
3007 gtk_widget_get_screen (widget));
3010 g_signal_connect (window, "destroy",
3011 G_CALLBACK (gtk_widget_destroyed),
3014 main_vbox = gtk_vbox_new (FALSE, 5);
3015 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
3016 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3019 gtk_widget_new (gtk_vbox_get_type (),
3020 "GtkBox::homogeneous", FALSE,
3021 "GtkBox::spacing", 5,
3022 "GtkContainer::border_width", 10,
3023 "GtkWidget::parent", main_vbox,
3024 "GtkWidget::visible", TRUE,
3025 "child", g_object_connect (gtk_widget_new (GTK_TYPE_TOGGLE_BUTTON,
3026 "label", "Stop Events",
3030 "signal::clicked", uposition_stop_configure, window,
3034 hbox = gtk_hbox_new (FALSE, 0);
3035 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3036 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3038 label = gtk_label_new ("X Origin : ");
3039 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3040 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3042 x_label = gtk_label_new ("");
3043 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
3044 g_object_set_data (G_OBJECT (window), "x", x_label);
3046 hbox = gtk_hbox_new (FALSE, 0);
3047 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
3048 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
3050 label = gtk_label_new ("Y Origin : ");
3051 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
3052 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
3054 y_label = gtk_label_new ("");
3055 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
3056 g_object_set_data (G_OBJECT (window), "y", y_label);
3059 gtk_widget_new (gtk_hseparator_get_type (),
3060 "GtkWidget::visible", TRUE,
3062 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
3064 hbox = gtk_hbox_new (FALSE, 0);
3065 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
3066 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
3068 button = gtk_button_new_with_label ("Close");
3069 g_signal_connect_swapped (button, "clicked",
3070 G_CALLBACK (gtk_widget_destroy),
3072 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
3073 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3074 gtk_widget_grab_default (button);
3076 gtk_widget_show_all (window);
3079 gtk_widget_destroy (window);
3087 create_pixmap (GtkWidget *widget)
3089 static GtkWidget *window = NULL;
3095 GtkWidget *separator;
3096 GtkWidget *pixmapwid;
3100 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3102 gtk_window_set_screen (GTK_WINDOW (window),
3103 gtk_widget_get_screen (widget));
3105 g_signal_connect (window, "destroy",
3106 G_CALLBACK (gtk_widget_destroyed),
3109 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
3110 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3111 gtk_widget_realize(window);
3113 box1 = gtk_vbox_new (FALSE, 0);
3114 gtk_container_add (GTK_CONTAINER (window), box1);
3116 box2 = gtk_vbox_new (FALSE, 10);
3117 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3118 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3120 button = gtk_button_new ();
3121 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3123 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3125 label = gtk_label_new ("Pixmap\ntest");
3126 box3 = gtk_hbox_new (FALSE, 0);
3127 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3128 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3129 gtk_container_add (GTK_CONTAINER (box3), label);
3130 gtk_container_add (GTK_CONTAINER (button), box3);
3132 button = gtk_button_new ();
3133 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
3135 pixmapwid = new_pixmap ("test.xpm", window->window, NULL);
3137 label = gtk_label_new ("Pixmap\ntest");
3138 box3 = gtk_hbox_new (FALSE, 0);
3139 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
3140 gtk_container_add (GTK_CONTAINER (box3), pixmapwid);
3141 gtk_container_add (GTK_CONTAINER (box3), label);
3142 gtk_container_add (GTK_CONTAINER (button), box3);
3144 gtk_widget_set_sensitive (button, FALSE);
3146 separator = gtk_hseparator_new ();
3147 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3149 box2 = gtk_vbox_new (FALSE, 10);
3150 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3151 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3153 button = gtk_button_new_with_label ("close");
3154 g_signal_connect_swapped (button, "clicked",
3155 G_CALLBACK (gtk_widget_destroy),
3157 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3158 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3159 gtk_widget_grab_default (button);
3162 if (!GTK_WIDGET_VISIBLE (window))
3163 gtk_widget_show_all (window);
3165 gtk_widget_destroy (window);
3169 tips_query_widget_entered (GtkTipsQuery *tips_query,
3171 const gchar *tip_text,
3172 const gchar *tip_private,
3175 if (GTK_TOGGLE_BUTTON (toggle)->active)
3177 gtk_label_set_text (GTK_LABEL (tips_query), tip_text ? "There is a Tip!" : "There is no Tip!");
3178 /* don't let GtkTipsQuery reset its label */
3179 g_signal_stop_emission_by_name (tips_query, "widget_entered");
3184 tips_query_widget_selected (GtkWidget *tips_query,
3186 const gchar *tip_text,
3187 const gchar *tip_private,
3188 GdkEventButton *event,
3192 g_print ("Help \"%s\" requested for <%s>\n",
3193 tip_private ? tip_private : "None",
3194 g_type_name (G_OBJECT_TYPE (widget)));
3199 create_tooltips (GtkWidget *widget)
3201 static GtkWidget *window = NULL;
3208 GtkWidget *tips_query;
3209 GtkWidget *separator;
3210 GtkTooltips *tooltips;
3215 gtk_widget_new (gtk_window_get_type (),
3216 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
3217 "GtkContainer::border_width", 0,
3218 "GtkWindow::title", "Tooltips",
3219 "GtkWindow::allow_shrink", TRUE,
3220 "GtkWindow::allow_grow", FALSE,
3223 gtk_window_set_screen (GTK_WINDOW (window),
3224 gtk_widget_get_screen (widget));
3226 g_signal_connect (window, "destroy",
3227 G_CALLBACK (destroy_tooltips),
3230 tooltips=gtk_tooltips_new();
3231 g_object_ref (tooltips);
3232 gtk_object_sink (GTK_OBJECT (tooltips));
3233 g_object_set_data (G_OBJECT (window), "tooltips", tooltips);
3235 box1 = gtk_vbox_new (FALSE, 0);
3236 gtk_container_add (GTK_CONTAINER (window), box1);
3238 box2 = gtk_vbox_new (FALSE, 10);
3239 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3240 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3242 button = gtk_toggle_button_new_with_label ("button1");
3243 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3245 gtk_tooltips_set_tip (tooltips,
3248 "ContextHelp/buttons/1");
3250 button = gtk_toggle_button_new_with_label ("button2");
3251 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3253 gtk_tooltips_set_tip (tooltips,
3255 "This is button 2. This is also a really long tooltip which probably won't fit on a single line and will therefore need to be wrapped. Hopefully the wrapping will work correctly.",
3256 "ContextHelp/buttons/2_long");
3258 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
3259 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3261 gtk_tooltips_set_tip (tooltips,
3263 "Toggle TipsQuery view.",
3267 gtk_widget_new (gtk_vbox_get_type (),
3268 "homogeneous", FALSE,
3274 tips_query = gtk_tips_query_new ();
3277 gtk_widget_new (gtk_button_get_type (),
3282 g_object_connect (button,
3283 "swapped_signal::clicked", gtk_tips_query_start_query, tips_query,
3285 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3286 gtk_tooltips_set_tip (tooltips,
3288 "Start the Tooltips Inspector",
3289 "ContextHelp/buttons/?");
3292 g_object_set (g_object_connect (tips_query,
3293 "signal::widget_entered", tips_query_widget_entered, toggle,
3294 "signal::widget_selected", tips_query_widget_selected, NULL,
3301 frame = gtk_widget_new (gtk_frame_get_type (),
3302 "label", "ToolTips Inspector",
3303 "label_xalign", (double) 0.5,
3309 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3311 separator = gtk_hseparator_new ();
3312 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3314 box2 = gtk_vbox_new (FALSE, 10);
3315 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3316 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3318 button = gtk_button_new_with_label ("close");
3319 g_signal_connect_swapped (button, "clicked",
3320 G_CALLBACK (gtk_widget_destroy),
3322 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3323 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3324 gtk_widget_grab_default (button);
3326 gtk_tooltips_set_tip (tooltips, button, "Push this button to close window", "ContextHelp/buttons/Close");
3329 if (!GTK_WIDGET_VISIBLE (window))
3330 gtk_widget_show_all (window);
3332 gtk_widget_destroy (window);
3340 pack_image (GtkWidget *box,
3344 gtk_box_pack_start (GTK_BOX (box),
3345 gtk_label_new (text),
3348 gtk_box_pack_start (GTK_BOX (box),
3354 create_image (GtkWidget *widget)
3356 static GtkWidget *window = NULL;
3364 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3366 gtk_window_set_screen (GTK_WINDOW (window),
3367 gtk_widget_get_screen (widget));
3369 /* this is bogus for testing drawing when allocation < request,
3370 * don't copy into real code
3372 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
3374 g_signal_connect (window, "destroy",
3375 G_CALLBACK (gtk_widget_destroyed),
3378 vbox = gtk_vbox_new (FALSE, 5);
3380 gtk_container_add (GTK_CONTAINER (window), vbox);
3382 pack_image (vbox, "Stock Warning Dialog",
3383 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3384 GTK_ICON_SIZE_DIALOG));
3386 pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL,
3387 gtk_widget_get_colormap (window),
3392 pack_image (vbox, "Pixmap",
3393 gtk_image_new_from_pixmap (pixmap, mask));
3396 if (!GTK_WIDGET_VISIBLE (window))
3397 gtk_widget_show_all (window);
3399 gtk_widget_destroy (window);
3407 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3410 GtkWidget *menuitem;
3419 menu = gtk_menu_new ();
3420 gtk_menu_set_screen (GTK_MENU (menu), screen);
3426 menuitem = gtk_tearoff_menu_item_new ();
3427 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3428 gtk_widget_show (menuitem);
3431 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3432 GTK_ICON_SIZE_MENU);
3433 gtk_widget_show (image);
3434 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3435 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3436 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3437 gtk_widget_show (menuitem);
3439 for (i = 0, j = 1; i < length; i++, j++)
3441 sprintf (buf, "item %2d - %d", depth, j);
3443 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3444 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3448 gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
3451 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3452 gtk_widget_show (menuitem);
3454 gtk_widget_set_sensitive (menuitem, FALSE);
3457 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3461 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3462 create_menu (screen, depth - 1, 5, TRUE));
3469 create_menus (GtkWidget *widget)
3471 static GtkWidget *window = NULL;
3475 GtkWidget *optionmenu;
3476 GtkWidget *separator;
3482 GtkWidget *menuitem;
3483 GtkAccelGroup *accel_group;
3485 GdkScreen *screen = gtk_widget_get_screen (widget);
3487 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3489 gtk_window_set_screen (GTK_WINDOW (window), screen);
3491 g_signal_connect (window, "destroy",
3492 G_CALLBACK (gtk_widget_destroyed),
3494 g_signal_connect (window, "delete-event",
3495 G_CALLBACK (gtk_true),
3498 accel_group = gtk_accel_group_new ();
3499 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3501 gtk_window_set_title (GTK_WINDOW (window), "menus");
3502 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3505 box1 = gtk_vbox_new (FALSE, 0);
3506 gtk_container_add (GTK_CONTAINER (window), box1);
3507 gtk_widget_show (box1);
3509 menubar = gtk_menu_bar_new ();
3510 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3511 gtk_widget_show (menubar);
3513 menu = create_menu (screen, 2, 50, TRUE);
3515 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3516 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3517 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3518 gtk_widget_show (menuitem);
3520 menuitem = gtk_menu_item_new_with_label ("foo");
3521 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3522 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3523 gtk_widget_show (menuitem);
3525 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3526 GTK_ICON_SIZE_MENU);
3527 gtk_widget_show (image);
3528 menuitem = gtk_image_menu_item_new_with_label ("Help");
3529 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3530 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3531 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3532 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3533 gtk_widget_show (menuitem);
3535 menubar = gtk_menu_bar_new ();
3536 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3537 gtk_widget_show (menubar);
3539 menu = create_menu (screen, 2, 10, TRUE);
3541 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3542 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3543 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3544 gtk_widget_show (menuitem);
3546 box2 = gtk_vbox_new (FALSE, 10);
3547 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3548 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3549 gtk_widget_show (box2);
3551 menu = create_menu (screen, 1, 5, FALSE);
3552 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3554 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3555 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3556 gtk_widget_show (menuitem);
3558 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3559 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3560 gtk_widget_show (menuitem);
3561 gtk_widget_add_accelerator (menuitem,
3567 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3568 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3569 gtk_widget_show (menuitem);
3570 gtk_widget_add_accelerator (menuitem,
3575 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3576 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3577 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3578 gtk_widget_show (menuitem);
3579 gtk_widget_add_accelerator (menuitem,
3585 gtk_widget_add_accelerator (menuitem,
3592 optionmenu = gtk_option_menu_new ();
3593 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
3594 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
3595 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3596 gtk_widget_show (optionmenu);
3598 separator = gtk_hseparator_new ();
3599 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3600 gtk_widget_show (separator);
3602 box2 = gtk_vbox_new (FALSE, 10);
3603 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3604 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3605 gtk_widget_show (box2);
3607 button = gtk_button_new_with_label ("close");
3608 g_signal_connect_swapped (button, "clicked",
3609 G_CALLBACK (gtk_widget_destroy),
3611 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3612 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3613 gtk_widget_grab_default (button);
3614 gtk_widget_show (button);
3617 if (!GTK_WIDGET_VISIBLE (window))
3618 gtk_widget_show (window);
3620 gtk_widget_destroy (window);
3624 gtk_ifactory_cb (gpointer callback_data,
3625 guint callback_action,
3628 g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
3631 /* GdkPixbuf RGBA C-Source image dump */
3633 static const guint8 apple[] =
3635 /* Pixbuf magic (0x47646b50) */
3637 /* length: header (24) + pixel_data (2304) */
3639 /* pixdata_type (0x1010002) */
3641 /* rowstride (96) */
3648 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3649 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3650 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3651 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3652 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3653 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3654 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\24"
3655 "\17\11\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3656 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`m"
3657 "[pn{a\344hv_\345_k[`\0\0\0\0\0\0\0\0\0\0\0\0D>/\305\0\0\0_\0\0\0\0\0"
3658 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3659 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`l[Blza\373s\202d\354w\206g\372p~c"
3660 "\374`l[y\0\0\0\0[S\77/\27\25\17\335\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0"
3661 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3662 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3663 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3664 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0eq"
3665 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3666 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3667 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ly`\40p~b\360lz`\353^kY\246["
3668 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3669 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3670 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3671 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3672 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3673 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3674 "ff@\377QT5\377LR2d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0]iW(\0\0\0\0\0\0\0"
3675 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3676 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3677 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3678 "\377SW6\377RX6\364Za<\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b]@\20"
3679 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3680 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3681 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3682 "wvL\377X]:\377KR0\377NU5v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\212"
3683 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3684 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3685 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3686 "ttJ\377[_<\377HO/\377GN0\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3687 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3688 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3689 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3690 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3691 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3692 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3693 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3694 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3695 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3696 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3697 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3698 "\377HP0\377@H+\373CJ-\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0xxO>"
3699 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3700 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3701 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3702 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\205W\312\216\220`\377\230"
3703 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3704 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3705 "\377=D)\377HQ1:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3706 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3707 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3708 "R[;\377BJ-\3778@'\317\0\0\0>\0\0\0\36\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0"
3709 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3710 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3711 "\376\0\0\0\347\0\0\0\262\0\0\0Y\0\0\0\32\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3712 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3713 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3714 "\0\0\374\0\0\0\320\0\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3715 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3716 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3717 "\0\0\0\347\0\0\0\217\0\0\0""4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3718 "\0\0\0\0\0\0\0\20\0\0\0P\0\0\0\252\7\10\5\346\7\7\5\375\0\0\0\377\0\0"
3719 "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\374\0"
3720 "\0\0\336\0\0\0\254\0\0\0i\0\0\0""2\0\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0"
3721 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\0\0\0\40\0\0\0D\0\0\0m\0\0\0"
3722 "\226\0\0\0\234\0\0\0\234\0\0\0\244\0\0\0\246\0\0\0\232\0\0\0\202\0\0"
3723 "\0i\0\0\0T\0\0\0,\0\0\0\15\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3724 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\6\0\0\0"
3725 "\16\0\0\0\22\0\0\0\24\0\0\0\23\0\0\0\17\0\0\0\14\0\0\0\13\0\0\0\10\0"
3726 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3730 dump_accels (gpointer callback_data,
3731 guint callback_action,
3734 gtk_accel_map_save_fd (1 /* stdout */);
3737 static GtkItemFactoryEntry menu_items[] =
3739 { "/_File", NULL, 0, 0, "<Branch>" },
3740 { "/File/tearoff1", NULL, gtk_ifactory_cb, 0, "<Tearoff>" },
3741 { "/File/_New", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_NEW },
3742 { "/File/_Open", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_OPEN },
3743 { "/File/_Save", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
3744 { "/File/Save _As...", "<control>A", gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_SAVE },
3745 { "/File/_Dump \"_Accels\"", NULL, dump_accels, 0 },
3746 { "/File/\\/Test__Escaping/And\\/\n\tWei\\\\rdly",
3747 NULL, gtk_ifactory_cb, 0 },
3748 { "/File/sep1", NULL, gtk_ifactory_cb, 0, "<Separator>" },
3749 { "/File/_Quit", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_QUIT },
3751 { "/_Preferences", NULL, 0, 0, "<Branch>" },
3752 { "/_Preferences/_Color", NULL, 0, 0, "<Branch>" },
3753 { "/_Preferences/Color/_Red", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
3754 { "/_Preferences/Color/_Green", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
3755 { "/_Preferences/Color/_Blue", NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
3756 { "/_Preferences/_Shape", NULL, 0, 0, "<Branch>" },
3757 { "/_Preferences/Shape/_Square", NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
3758 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
3759 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
3760 { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
3761 { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
3762 { "/_Preferences/Shape/_Image", NULL, gtk_ifactory_cb, 0, "<ImageItem>", apple },
3763 { "/_Preferences/Coffee", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3764 { "/_Preferences/Toast", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3765 { "/_Preferences/Marshmallow Froot Loops", NULL, gtk_ifactory_cb, 0, "<CheckItem>" },
3767 /* For testing deletion of menus */
3768 { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
3769 { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
3770 { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
3772 { "/_Help", NULL, 0, 0, "<LastBranch>" },
3773 { "/Help/_Help", NULL, gtk_ifactory_cb, 0, "<StockItem>", GTK_STOCK_HELP},
3774 { "/Help/_About", NULL, gtk_ifactory_cb, 0 },
3778 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
3781 create_item_factory (GtkWidget *widget)
3783 static GtkWidget *window = NULL;
3789 GtkWidget *separator;
3792 GtkAccelGroup *accel_group;
3793 GtkItemFactory *item_factory;
3794 GtkTooltips *tooltips;
3796 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3798 gtk_window_set_screen (GTK_WINDOW (window),
3799 gtk_widget_get_screen (widget));
3801 g_signal_connect (window, "destroy",
3802 G_CALLBACK(gtk_widget_destroyed),
3804 g_signal_connect (window, "delete-event",
3805 G_CALLBACK (gtk_true),
3808 accel_group = gtk_accel_group_new ();
3809 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
3810 g_object_set_data_full (G_OBJECT (window),
3814 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3815 gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
3816 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3817 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
3819 /* preselect /Preferences/Shape/Oval over the other radios
3821 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3822 "/Preferences/Shape/Oval")),
3825 /* preselect /Preferences/Coffee
3827 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3828 "/Preferences/Coffee")),
3831 /* preselect /Preferences/Marshmallow Froot Loops and set it insensitive
3833 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
3834 "/Preferences/Marshmallow Froot Loops")),
3836 gtk_widget_set_sensitive (GTK_WIDGET (gtk_item_factory_get_item (item_factory,
3837 "/Preferences/Marshmallow Froot Loops")),
3840 /* Test how tooltips (ugh) work on menu items
3842 tooltips = gtk_tooltips_new ();
3843 g_object_ref (tooltips);
3844 gtk_object_sink (GTK_OBJECT (tooltips));
3845 g_object_set_data_full (G_OBJECT (window), "testgtk-tooltips",
3846 tooltips, (GDestroyNotify)g_object_unref);
3848 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/New"),
3849 "Create a new file", NULL);
3850 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Open"),
3851 "Open a file", NULL);
3852 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/File/Save"),
3854 gtk_tooltips_set_tip (tooltips, gtk_item_factory_get_item (item_factory, "/Preferences/Color"),
3855 "Modify color", NULL);
3857 box1 = gtk_vbox_new (FALSE, 0);
3858 gtk_container_add (GTK_CONTAINER (window), box1);
3860 gtk_box_pack_start (GTK_BOX (box1),
3861 gtk_item_factory_get_widget (item_factory, "<main>"),
3864 label = gtk_label_new ("Type\n<alt>\nto start");
3865 gtk_widget_set_size_request (label, 200, 200);
3866 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
3867 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
3870 separator = gtk_hseparator_new ();
3871 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3874 box2 = gtk_vbox_new (FALSE, 10);
3875 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3876 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3878 button = gtk_button_new_with_label ("close");
3879 g_signal_connect_swapped (button, "clicked",
3880 G_CALLBACK (gtk_widget_destroy),
3882 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3883 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
3884 gtk_widget_grab_default (button);
3886 gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
3888 gtk_widget_show_all (window);
3891 gtk_widget_destroy (window);
3895 accel_button_new (GtkAccelGroup *accel_group,
3900 GdkModifierType modifiers;
3904 gtk_accelerator_parse (accel, &keyval, &modifiers);
3907 button = gtk_button_new ();
3908 gtk_widget_add_accelerator (button, "activate", accel_group,
3909 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3911 label = gtk_accel_label_new (text);
3912 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3913 gtk_widget_show (label);
3915 gtk_container_add (GTK_CONTAINER (button), label);
3921 create_key_lookup (GtkWidget *widget)
3923 static GtkWidget *window = NULL;
3927 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3930 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3931 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3934 gtk_window_set_screen (GTK_WINDOW (window),
3935 gtk_widget_get_screen (widget));
3937 /* We have to expand it so the accel labels will draw their labels
3939 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3941 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3943 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3944 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3945 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3946 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3947 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3948 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3949 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3950 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3951 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3952 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3953 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3954 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3955 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3956 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3957 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3958 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3959 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3960 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3961 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3962 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
3964 g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
3965 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
3967 gtk_widget_show_all (window);
3970 gtk_widget_destroy (window);
3979 cmw_destroy_cb(GtkWidget *widget)
3981 /* This is needed to get out of gtk_main */
3988 cmw_color (GtkWidget *widget, GtkWidget *parent)
3992 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3994 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3996 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel),
4000 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
4002 /* And mark it as a transient dialog */
4003 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
4005 g_signal_connect (csd, "destroy",
4006 G_CALLBACK (cmw_destroy_cb), NULL);
4008 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->ok_button,
4009 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4010 g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG (csd)->cancel_button,
4011 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
4013 /* wait until destroy calls gtk_main_quit */
4014 gtk_widget_show (csd);
4019 cmw_file (GtkWidget *widget, GtkWidget *parent)
4023 fs = gtk_file_selection_new("This is a modal file selection dialog");
4025 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
4028 gtk_window_set_modal (GTK_WINDOW(fs),TRUE);
4030 /* And mark it as a transient dialog */
4031 gtk_window_set_transient_for (GTK_WINDOW (fs), GTK_WINDOW (parent));
4033 g_signal_connect (fs, "destroy",
4034 G_CALLBACK (cmw_destroy_cb), NULL);
4036 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->ok_button,
4037 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4038 g_signal_connect_swapped (GTK_FILE_SELECTION (fs)->cancel_button,
4039 "clicked", G_CALLBACK (gtk_widget_destroy), fs);
4041 /* wait until destroy calls gtk_main_quit */
4042 gtk_widget_show (fs);
4049 create_modal_window (GtkWidget *widget)
4051 GtkWidget *window = NULL;
4052 GtkWidget *box1,*box2;
4054 GtkWidget *btnColor,*btnFile,*btnClose;
4056 /* Create modal window (Here you can use any window descendent )*/
4057 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4058 gtk_window_set_screen (GTK_WINDOW (window),
4059 gtk_widget_get_screen (widget));
4061 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
4063 /* Set window as modal */
4064 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
4066 /* Create widgets */
4067 box1 = gtk_vbox_new (FALSE,5);
4068 frame1 = gtk_frame_new ("Standard dialogs in modal form");
4069 box2 = gtk_vbox_new (TRUE,5);
4070 btnColor = gtk_button_new_with_label ("Color");
4071 btnFile = gtk_button_new_with_label ("File Selection");
4072 btnClose = gtk_button_new_with_label ("Close");
4075 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
4076 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
4079 gtk_container_add (GTK_CONTAINER (window), box1);
4080 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
4081 gtk_container_add (GTK_CONTAINER (frame1), box2);
4082 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
4083 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
4084 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
4085 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
4087 /* connect signals */
4088 g_signal_connect_swapped (btnClose, "clicked",
4089 G_CALLBACK (gtk_widget_destroy), window);
4091 g_signal_connect (window, "destroy",
4092 G_CALLBACK (cmw_destroy_cb), NULL);
4094 g_signal_connect (btnColor, "clicked",
4095 G_CALLBACK (cmw_color), window);
4096 g_signal_connect (btnFile, "clicked",
4097 G_CALLBACK (cmw_file), window);
4100 gtk_widget_show_all (window);
4102 /* wait until dialog get destroyed */
4111 make_message_dialog (GdkScreen *screen,
4113 GtkMessageType type,
4114 GtkButtonsType buttons,
4115 guint default_response)
4119 gtk_widget_destroy (*dialog);
4124 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
4125 "This is a message dialog; it can wrap long lines. This is a long line. La la la. Look this line is wrapped. Blah blah blah blah blah blah. (Note: testgtk has a nonstandard gtkrc that changes some of the message dialog icons.)");
4127 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
4129 g_signal_connect_swapped (*dialog,
4131 G_CALLBACK (gtk_widget_destroy),
4134 g_signal_connect (*dialog,
4136 G_CALLBACK (gtk_widget_destroyed),
4139 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
4141 gtk_widget_show (*dialog);
4145 create_message_dialog (GtkWidget *widget)
4147 static GtkWidget *info = NULL;
4148 static GtkWidget *warning = NULL;
4149 static GtkWidget *error = NULL;
4150 static GtkWidget *question = NULL;
4151 GdkScreen *screen = gtk_widget_get_screen (widget);
4153 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
4154 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_OK);
4155 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
4156 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_YES);
4163 static GtkWidget *sw_parent = NULL;
4164 static GtkWidget *sw_float_parent;
4165 static guint sw_destroyed_handler = 0;
4168 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
4170 gtk_widget_reparent (scrollwin, sw_parent);
4172 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4173 sw_float_parent = NULL;
4175 sw_destroyed_handler = 0;
4181 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
4183 gtk_widget_destroy (sw_float_parent);
4185 sw_float_parent = NULL;
4187 sw_destroyed_handler = 0;
4191 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
4195 gtk_widget_reparent (scrollwin, sw_parent);
4196 gtk_widget_destroy (sw_float_parent);
4198 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
4199 sw_float_parent = NULL;
4201 sw_destroyed_handler = 0;
4205 sw_parent = scrollwin->parent;
4206 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4207 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
4208 gtk_widget_get_screen (widget));
4210 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
4212 gtk_widget_reparent (scrollwin, sw_float_parent);
4213 gtk_widget_show (sw_float_parent);
4215 sw_destroyed_handler =
4216 g_signal_connect (sw_parent, "destroy",
4217 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
4218 g_signal_connect (sw_float_parent, "delete_event",
4219 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
4224 create_scrolled_windows (GtkWidget *widget)
4226 static GtkWidget *window;
4227 GtkWidget *scrolled_window;
4235 window = gtk_dialog_new ();
4237 gtk_window_set_screen (GTK_WINDOW (window),
4238 gtk_widget_get_screen (widget));
4240 g_signal_connect (window, "destroy",
4241 G_CALLBACK (gtk_widget_destroyed),
4244 gtk_window_set_title (GTK_WINDOW (window), "dialog");
4245 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4248 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4249 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4250 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4251 GTK_POLICY_AUTOMATIC,
4252 GTK_POLICY_AUTOMATIC);
4253 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
4254 scrolled_window, TRUE, TRUE, 0);
4255 gtk_widget_show (scrolled_window);
4257 table = gtk_table_new (20, 20, FALSE);
4258 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4259 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4260 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4261 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4262 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4263 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4264 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4265 gtk_widget_show (table);
4267 for (i = 0; i < 20; i++)
4268 for (j = 0; j < 20; j++)
4270 sprintf (buffer, "button (%d,%d)\n", i, j);
4271 button = gtk_toggle_button_new_with_label (buffer);
4272 gtk_table_attach_defaults (GTK_TABLE (table), button,
4274 gtk_widget_show (button);
4278 button = gtk_button_new_with_label ("Close");
4279 g_signal_connect_swapped (button, "clicked",
4280 G_CALLBACK (gtk_widget_destroy),
4282 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4283 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4284 button, TRUE, TRUE, 0);
4285 gtk_widget_grab_default (button);
4286 gtk_widget_show (button);
4288 button = gtk_button_new_with_label ("Reparent Out");
4289 g_signal_connect (button, "clicked",
4290 G_CALLBACK (scrolled_windows_remove),
4292 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4293 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
4294 button, TRUE, TRUE, 0);
4295 gtk_widget_grab_default (button);
4296 gtk_widget_show (button);
4298 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4301 if (!GTK_WIDGET_VISIBLE (window))
4302 gtk_widget_show (window);
4304 gtk_widget_destroy (window);
4312 entry_toggle_frame (GtkWidget *checkbutton,
4315 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4316 GTK_TOGGLE_BUTTON(checkbutton)->active);
4320 entry_toggle_sensitive (GtkWidget *checkbutton,
4323 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4327 entry_props_clicked (GtkWidget *button,
4330 GtkWidget *window = create_prop_editor (entry, 0);
4332 gtk_window_set_title (GTK_WINDOW (window), "Entry Properties");
4336 create_entry (GtkWidget *widget)
4338 static GtkWidget *window = NULL;
4342 GtkWidget *has_frame_check;
4343 GtkWidget *sensitive_check;
4344 GtkWidget *entry, *cb;
4346 GtkWidget *separator;
4347 GList *cbitems = NULL;
4351 cbitems = g_list_append(cbitems, "item0");
4352 cbitems = g_list_append(cbitems, "item1 item1");
4353 cbitems = g_list_append(cbitems, "item2 item2 item2");
4354 cbitems = g_list_append(cbitems, "item3 item3 item3 item3");
4355 cbitems = g_list_append(cbitems, "item4 item4 item4 item4 item4");
4356 cbitems = g_list_append(cbitems, "item5 item5 item5 item5 item5 item5");
4357 cbitems = g_list_append(cbitems, "item6 item6 item6 item6 item6");
4358 cbitems = g_list_append(cbitems, "item7 item7 item7 item7");
4359 cbitems = g_list_append(cbitems, "item8 item8 item8");
4360 cbitems = g_list_append(cbitems, "item9 item9");
4362 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4363 gtk_window_set_screen (GTK_WINDOW (window),
4364 gtk_widget_get_screen (widget));
4366 g_signal_connect (window, "destroy",
4367 G_CALLBACK (gtk_widget_destroyed),
4370 gtk_window_set_title (GTK_WINDOW (window), "entry");
4371 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4374 box1 = gtk_vbox_new (FALSE, 0);
4375 gtk_container_add (GTK_CONTAINER (window), box1);
4378 box2 = gtk_vbox_new (FALSE, 10);
4379 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4380 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4382 hbox = gtk_hbox_new (FALSE, 5);
4383 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4385 entry = gtk_entry_new ();
4386 gtk_entry_set_text (GTK_ENTRY (entry), "hello world \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205");
4387 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4388 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4390 button = gtk_button_new_with_mnemonic ("_Props");
4391 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4392 g_signal_connect (button, "clicked",
4393 G_CALLBACK (entry_props_clicked),
4396 cb = gtk_combo_new ();
4397 gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
4398 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO(cb)->entry), "hello world \n\n\n foo");
4399 gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry),
4401 gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0);
4403 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4404 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4405 g_signal_connect (sensitive_check, "toggled",
4406 G_CALLBACK (entry_toggle_sensitive), entry);
4407 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4409 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4410 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4411 g_signal_connect (has_frame_check, "toggled",
4412 G_CALLBACK (entry_toggle_frame), entry);
4413 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4415 separator = gtk_hseparator_new ();
4416 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4418 box2 = gtk_vbox_new (FALSE, 10);
4419 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4420 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4422 button = gtk_button_new_with_label ("close");
4423 g_signal_connect_swapped (button, "clicked",
4424 G_CALLBACK (gtk_widget_destroy),
4426 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4427 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4428 gtk_widget_grab_default (button);
4431 if (!GTK_WIDGET_VISIBLE (window))
4432 gtk_widget_show_all (window);
4434 gtk_widget_destroy (window);
4441 #define SIZE_GROUP_INITIAL_SIZE 50
4444 size_group_hsize_changed (GtkSpinButton *spin_button,
4447 gtk_widget_set_size_request (GTK_BIN (button)->child,
4448 gtk_spin_button_get_value_as_int (spin_button),
4453 size_group_vsize_changed (GtkSpinButton *spin_button,
4456 gtk_widget_set_size_request (GTK_BIN (button)->child,
4458 gtk_spin_button_get_value_as_int (spin_button));
4462 create_size_group_window (GdkScreen *screen,
4463 GtkSizeGroup *master_size_group)
4467 GtkWidget *main_button;
4469 GtkWidget *spin_button;
4471 GtkSizeGroup *hgroup1;
4472 GtkSizeGroup *hgroup2;
4473 GtkSizeGroup *vgroup1;
4474 GtkSizeGroup *vgroup2;
4476 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4482 gtk_window_set_screen (GTK_WINDOW (window), screen);
4484 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
4486 g_signal_connect (window, "response",
4487 G_CALLBACK (gtk_widget_destroy),
4490 table = gtk_table_new (2, 2, FALSE);
4491 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table, TRUE, TRUE, 0);
4493 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4494 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4495 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4496 gtk_widget_set_size_request (table, 250, 250);
4498 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4499 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4500 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4501 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4503 main_button = gtk_button_new_with_label ("X");
4505 gtk_table_attach (GTK_TABLE (table), main_button,
4507 GTK_EXPAND, GTK_EXPAND,
4509 gtk_size_group_add_widget (master_size_group, main_button);
4510 gtk_size_group_add_widget (hgroup1, main_button);
4511 gtk_size_group_add_widget (vgroup1, main_button);
4512 gtk_widget_set_size_request (GTK_BIN (main_button)->child,
4513 SIZE_GROUP_INITIAL_SIZE,
4514 SIZE_GROUP_INITIAL_SIZE);
4516 button = gtk_button_new ();
4517 gtk_table_attach (GTK_TABLE (table), button,
4519 GTK_EXPAND, GTK_EXPAND,
4521 gtk_size_group_add_widget (vgroup1, button);
4522 gtk_size_group_add_widget (vgroup2, button);
4524 button = gtk_button_new ();
4525 gtk_table_attach (GTK_TABLE (table), button,
4527 GTK_EXPAND, GTK_EXPAND,
4529 gtk_size_group_add_widget (hgroup1, button);
4530 gtk_size_group_add_widget (hgroup2, button);
4532 button = gtk_button_new ();
4533 gtk_table_attach (GTK_TABLE (table), button,
4535 GTK_EXPAND, GTK_EXPAND,
4537 gtk_size_group_add_widget (hgroup2, button);
4538 gtk_size_group_add_widget (vgroup2, button);
4540 g_object_unref (hgroup1);
4541 g_object_unref (hgroup2);
4542 g_object_unref (vgroup1);
4543 g_object_unref (vgroup2);
4545 hbox = gtk_hbox_new (FALSE, 5);
4546 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox, FALSE, FALSE, 0);
4548 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4549 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4550 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4551 g_signal_connect (spin_button, "value_changed",
4552 G_CALLBACK (size_group_hsize_changed), main_button);
4554 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4555 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4556 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4557 g_signal_connect (spin_button, "value_changed",
4558 G_CALLBACK (size_group_vsize_changed), main_button);
4564 create_size_groups (GtkWidget *widget)
4566 static GtkWidget *window1 = NULL;
4567 static GtkWidget *window2 = NULL;
4568 static GtkSizeGroup *master_size_group;
4570 if (!master_size_group)
4571 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4575 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4578 g_signal_connect (window1, "destroy",
4579 G_CALLBACK (gtk_widget_destroyed),
4585 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4588 g_signal_connect (window2, "destroy",
4589 G_CALLBACK (gtk_widget_destroyed),
4593 if (GTK_WIDGET_VISIBLE (window1) && GTK_WIDGET_VISIBLE (window2))
4595 gtk_widget_destroy (window1);
4596 gtk_widget_destroy (window2);
4600 if (!GTK_WIDGET_VISIBLE (window1))
4601 gtk_widget_show_all (window1);
4602 if (!GTK_WIDGET_VISIBLE (window2))
4603 gtk_widget_show_all (window2);
4611 static GtkWidget *spinner1;
4614 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4616 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
4620 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4622 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
4626 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4628 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4629 gtk_spin_button_get_value_as_int (spin));
4633 get_value (GtkWidget *widget, gpointer data)
4637 GtkSpinButton *spin;
4639 spin = GTK_SPIN_BUTTON (spinner1);
4640 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4641 if (GPOINTER_TO_INT (data) == 1)
4642 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4644 sprintf (buf, "%0.*f", spin->digits, gtk_spin_button_get_value (spin));
4645 gtk_label_set_text (label, buf);
4649 get_spin_value (GtkWidget *widget, gpointer data)
4653 GtkSpinButton *spin;
4655 spin = GTK_SPIN_BUTTON (widget);
4656 label = GTK_LABEL (data);
4658 buffer = g_strdup_printf ("%0.*f", spin->digits,
4659 gtk_spin_button_get_value (spin));
4660 gtk_label_set_text (label, buffer);
4666 spin_button_time_output_func (GtkSpinButton *spin_button)
4668 static gchar buf[6];
4672 hours = spin_button->adjustment->value / 60.0;
4673 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4674 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4675 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4676 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4681 spin_button_month_input_func (GtkSpinButton *spin_button,
4685 static gchar *month[12] = { "January", "February", "March", "April",
4686 "May", "June", "July", "August",
4687 "September", "October", "November", "December" };
4689 gboolean found = FALSE;
4691 for (i = 1; i <= 12; i++)
4693 tmp1 = g_ascii_strup (month[i - 1], -1);
4694 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4695 if (strstr (tmp1, tmp2) == tmp1)
4705 return GTK_INPUT_ERROR;
4707 *new_val = (gdouble) i;
4712 spin_button_month_output_func (GtkSpinButton *spin_button)
4715 static gchar *month[12] = { "January", "February", "March", "April",
4716 "May", "June", "July", "August", "September",
4717 "October", "November", "December" };
4719 for (i = 1; i <= 12; i++)
4720 if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
4722 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4723 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4729 spin_button_hex_input_func (GtkSpinButton *spin_button,
4736 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4737 res = strtol(buf, &err, 16);
4740 return GTK_INPUT_ERROR;
4746 spin_button_hex_output_func (GtkSpinButton *spin_button)
4748 static gchar buf[7];
4751 val = (gint) spin_button->adjustment->value;
4752 if (fabs (val) < 1e-5)
4753 sprintf (buf, "0x00");
4755 sprintf (buf, "0x%.2X", val);
4756 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4757 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4762 create_spins (GtkWidget *widget)
4764 static GtkWidget *window = NULL;
4767 GtkWidget *main_vbox;
4770 GtkWidget *spinner2;
4774 GtkWidget *val_label;
4779 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4780 gtk_window_set_screen (GTK_WINDOW (window),
4781 gtk_widget_get_screen (widget));
4783 g_signal_connect (window, "destroy",
4784 G_CALLBACK (gtk_widget_destroyed),
4787 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4789 main_vbox = gtk_vbox_new (FALSE, 5);
4790 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4791 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4793 frame = gtk_frame_new ("Not accelerated");
4794 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4796 vbox = gtk_vbox_new (FALSE, 0);
4797 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4798 gtk_container_add (GTK_CONTAINER (frame), vbox);
4800 /* Time, month, hex spinners */
4802 hbox = gtk_hbox_new (FALSE, 0);
4803 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4805 vbox2 = gtk_vbox_new (FALSE, 0);
4806 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4808 label = gtk_label_new ("Time :");
4809 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4810 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4812 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4813 spinner = gtk_spin_button_new (adj, 0, 0);
4814 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4815 g_signal_connect (spinner,
4817 G_CALLBACK (spin_button_time_output_func),
4819 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4820 gtk_widget_set_size_request (spinner, 55, -1);
4821 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4823 vbox2 = gtk_vbox_new (FALSE, 0);
4824 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4826 label = gtk_label_new ("Month :");
4827 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4828 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4830 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4832 spinner = gtk_spin_button_new (adj, 0, 0);
4833 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4834 GTK_UPDATE_IF_VALID);
4835 g_signal_connect (spinner,
4837 G_CALLBACK (spin_button_month_input_func),
4839 g_signal_connect (spinner,
4841 G_CALLBACK (spin_button_month_output_func),
4843 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4844 gtk_widget_set_size_request (spinner, 85, -1);
4845 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4847 vbox2 = gtk_vbox_new (FALSE, 0);
4848 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4850 label = gtk_label_new ("Hex :");
4851 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4852 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4854 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4855 spinner = gtk_spin_button_new (adj, 0, 0);
4856 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4857 g_signal_connect (spinner,
4859 G_CALLBACK (spin_button_hex_input_func),
4861 g_signal_connect (spinner,
4863 G_CALLBACK (spin_button_hex_output_func),
4865 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4866 gtk_widget_set_size_request (spinner, 55, -1);
4867 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4869 frame = gtk_frame_new ("Accelerated");
4870 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4872 vbox = gtk_vbox_new (FALSE, 0);
4873 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4874 gtk_container_add (GTK_CONTAINER (frame), vbox);
4876 hbox = gtk_hbox_new (FALSE, 0);
4877 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4879 vbox2 = gtk_vbox_new (FALSE, 0);
4880 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4882 label = gtk_label_new ("Value :");
4883 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4884 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4886 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
4888 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
4889 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4890 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4892 vbox2 = gtk_vbox_new (FALSE, 0);
4893 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4895 label = gtk_label_new ("Digits :");
4896 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4897 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4899 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4900 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
4901 g_signal_connect (adj, "value_changed",
4902 G_CALLBACK (change_digits),
4904 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4906 hbox = gtk_hbox_new (FALSE, 0);
4907 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4909 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4910 g_signal_connect (button, "clicked",
4911 G_CALLBACK (toggle_snap),
4913 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4914 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4916 button = gtk_check_button_new_with_label ("Numeric only input mode");
4917 g_signal_connect (button, "clicked",
4918 G_CALLBACK (toggle_numeric),
4920 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4921 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4923 val_label = gtk_label_new ("");
4925 hbox = gtk_hbox_new (FALSE, 0);
4926 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4928 button = gtk_button_new_with_label ("Value as Int");
4929 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4930 g_signal_connect (button, "clicked",
4931 G_CALLBACK (get_value),
4932 GINT_TO_POINTER (1));
4933 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4935 button = gtk_button_new_with_label ("Value as Float");
4936 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4937 g_signal_connect (button, "clicked",
4938 G_CALLBACK (get_value),
4939 GINT_TO_POINTER (2));
4940 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4942 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4943 gtk_label_set_text (GTK_LABEL (val_label), "0");
4945 frame = gtk_frame_new ("Using Convenience Constructor");
4946 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4948 hbox = gtk_hbox_new (FALSE, 0);
4949 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4950 gtk_container_add (GTK_CONTAINER (frame), hbox);
4952 val_label = gtk_label_new ("0.0");
4954 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4955 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4956 g_signal_connect (spinner, "value_changed",
4957 G_CALLBACK (get_spin_value), val_label);
4958 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4959 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4961 hbox = gtk_hbox_new (FALSE, 0);
4962 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4964 button = gtk_button_new_with_label ("Close");
4965 g_signal_connect_swapped (button, "clicked",
4966 G_CALLBACK (gtk_widget_destroy),
4968 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4971 if (!GTK_WIDGET_VISIBLE (window))
4972 gtk_widget_show_all (window);
4974 gtk_widget_destroy (window);
4983 cursor_expose_event (GtkWidget *widget,
4987 GtkDrawingArea *darea;
4988 GdkDrawable *drawable;
4995 g_return_val_if_fail (widget != NULL, TRUE);
4996 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
4998 darea = GTK_DRAWING_AREA (widget);
4999 drawable = widget->window;
5000 white_gc = widget->style->white_gc;
5001 gray_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
5002 black_gc = widget->style->black_gc;
5003 max_width = widget->allocation.width;
5004 max_height = widget->allocation.height;
5006 gdk_draw_rectangle (drawable, white_gc,
5013 gdk_draw_rectangle (drawable, black_gc,
5020 gdk_draw_rectangle (drawable, gray_gc,
5031 set_cursor (GtkWidget *spinner,
5040 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5043 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5045 class = gtk_type_class (GDK_TYPE_CURSOR_TYPE);
5046 vals = class->values;
5048 while (vals && vals->value != c)
5051 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5053 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5055 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5056 gdk_window_set_cursor (widget->window, cursor);
5057 gdk_cursor_unref (cursor);
5061 cursor_event (GtkWidget *widget,
5063 GtkSpinButton *spinner)
5065 if ((event->type == GDK_BUTTON_PRESS) &&
5066 ((event->button.button == 1) ||
5067 (event->button.button == 3)))
5069 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5070 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5078 create_cursors (GtkWidget *widget)
5080 static GtkWidget *window = NULL;
5083 GtkWidget *main_vbox;
5094 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5095 gtk_window_set_screen (GTK_WINDOW (window),
5096 gtk_widget_get_screen (widget));
5098 g_signal_connect (window, "destroy",
5099 G_CALLBACK (gtk_widget_destroyed),
5102 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5104 main_vbox = gtk_vbox_new (FALSE, 5);
5105 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5106 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5109 gtk_widget_new (gtk_vbox_get_type (),
5110 "GtkBox::homogeneous", FALSE,
5111 "GtkBox::spacing", 5,
5112 "GtkContainer::border_width", 10,
5113 "GtkWidget::parent", main_vbox,
5114 "GtkWidget::visible", TRUE,
5117 hbox = gtk_hbox_new (FALSE, 0);
5118 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5119 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5121 label = gtk_label_new ("Cursor Value : ");
5122 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5123 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5125 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5129 spinner = gtk_spin_button_new (adj, 0, 0);
5130 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5133 gtk_widget_new (gtk_frame_get_type (),
5134 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5135 "GtkFrame::label_xalign", 0.5,
5136 "GtkFrame::label", "Cursor Area",
5137 "GtkContainer::border_width", 10,
5138 "GtkWidget::parent", vbox,
5139 "GtkWidget::visible", TRUE,
5142 darea = gtk_drawing_area_new ();
5143 gtk_widget_set_size_request (darea, 80, 80);
5144 gtk_container_add (GTK_CONTAINER (frame), darea);
5145 g_signal_connect (darea,
5147 G_CALLBACK (cursor_expose_event),
5149 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5150 g_signal_connect (darea,
5151 "button_press_event",
5152 G_CALLBACK (cursor_event),
5154 gtk_widget_show (darea);
5156 g_signal_connect (spinner, "changed",
5157 G_CALLBACK (set_cursor),
5160 label = gtk_widget_new (GTK_TYPE_LABEL,
5165 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5168 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5171 gtk_widget_new (gtk_hseparator_get_type (),
5172 "GtkWidget::visible", TRUE,
5174 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5176 hbox = gtk_hbox_new (FALSE, 0);
5177 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5178 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5180 button = gtk_button_new_with_label ("Close");
5181 g_signal_connect_swapped (button, "clicked",
5182 G_CALLBACK (gtk_widget_destroy),
5184 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5186 gtk_widget_show_all (window);
5188 set_cursor (spinner, darea);
5191 gtk_widget_destroy (window);
5199 list_add (GtkWidget *widget,
5204 GtkWidget *list_item;
5205 GtkContainer *container;
5207 container = GTK_CONTAINER (list);
5209 sprintf (buffer, "added item %d", i++);
5210 list_item = gtk_list_item_new_with_label (buffer);
5211 gtk_widget_show (list_item);
5213 gtk_container_add (container, list_item);
5217 list_remove (GtkWidget *widget,
5220 GList *clear_list = NULL;
5221 GList *sel_row = NULL;
5224 if (list->selection_mode == GTK_SELECTION_EXTENDED)
5228 item = GTK_CONTAINER (list)->focus_child;
5229 if (!item && list->selection)
5230 item = list->selection->data;
5234 work = g_list_find (list->children, item);
5235 for (sel_row = work; sel_row; sel_row = sel_row->next)
5236 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
5241 for (sel_row = work; sel_row; sel_row = sel_row->prev)
5242 if (GTK_WIDGET (sel_row->data)->state != GTK_STATE_SELECTED)
5248 for (work = list->selection; work; work = work->next)
5249 clear_list = g_list_prepend (clear_list, work->data);
5251 clear_list = g_list_reverse (clear_list);
5252 gtk_list_remove_items (GTK_LIST (list), clear_list);
5253 g_list_free (clear_list);
5255 if (list->selection_mode == GTK_SELECTION_EXTENDED && sel_row)
5256 gtk_list_select_child (list, GTK_WIDGET(sel_row->data));
5260 list_clear (GtkWidget *widget,
5263 gtk_list_clear_items (GTK_LIST (list), 0, -1);
5266 static gchar *selection_mode_items[] =
5273 static const GtkSelectionMode selection_modes[] = {
5274 GTK_SELECTION_SINGLE,
5275 GTK_SELECTION_BROWSE,
5276 GTK_SELECTION_MULTIPLE
5279 static GtkWidget *list_omenu;
5282 list_toggle_sel_mode (GtkWidget *widget, gpointer data)
5287 list = GTK_LIST (data);
5289 if (!GTK_WIDGET_MAPPED (widget))
5292 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
5294 gtk_list_set_selection_mode (list, selection_modes[i]);
5298 create_list (GtkWidget *widget)
5300 static GtkWidget *window = NULL;
5308 GtkWidget *scrolled_win;
5311 GtkWidget *separator;
5314 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5316 gtk_window_set_screen (GTK_WINDOW (window),
5317 gtk_widget_get_screen (widget));
5319 g_signal_connect (window, "destroy",
5320 G_CALLBACK (gtk_widget_destroyed),
5323 gtk_window_set_title (GTK_WINDOW (window), "list");
5324 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5326 vbox = gtk_vbox_new (FALSE, 0);
5327 gtk_container_add (GTK_CONTAINER (window), vbox);
5329 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
5330 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
5331 gtk_widget_set_size_request (scrolled_win, -1, 300);
5332 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
5333 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
5334 GTK_POLICY_AUTOMATIC,
5335 GTK_POLICY_AUTOMATIC);
5337 list = gtk_list_new ();
5338 gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE);
5339 gtk_scrolled_window_add_with_viewport
5340 (GTK_SCROLLED_WINDOW (scrolled_win), list);
5341 gtk_container_set_focus_vadjustment
5342 (GTK_CONTAINER (list),
5343 gtk_scrolled_window_get_vadjustment
5344 (GTK_SCROLLED_WINDOW (scrolled_win)));
5345 gtk_container_set_focus_hadjustment
5346 (GTK_CONTAINER (list),
5347 gtk_scrolled_window_get_hadjustment
5348 (GTK_SCROLLED_WINDOW (scrolled_win)));
5350 if ((infile = fopen("../gtk/gtkenums.h", "r")))
5356 while (fgets (buffer, 256, infile))
5358 if ((pos = strchr (buffer, '\n')))
5360 item = gtk_list_item_new_with_label (buffer);
5361 gtk_container_add (GTK_CONTAINER (list), item);
5368 hbox = gtk_hbox_new (TRUE, 5);
5369 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5370 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5372 button = gtk_button_new_with_label ("Insert Row");
5373 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5374 g_signal_connect (button, "clicked",
5375 G_CALLBACK (list_add),
5378 button = gtk_button_new_with_label ("Clear List");
5379 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5380 g_signal_connect (button, "clicked",
5381 G_CALLBACK (list_clear),
5384 button = gtk_button_new_with_label ("Remove Selection");
5385 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5386 g_signal_connect (button, "clicked",
5387 G_CALLBACK (list_remove),
5390 cbox = gtk_hbox_new (FALSE, 0);
5391 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
5393 hbox = gtk_hbox_new (FALSE, 5);
5394 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5395 gtk_box_pack_start (GTK_BOX (cbox), hbox, TRUE, FALSE, 0);
5397 label = gtk_label_new ("Selection Mode :");
5398 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5400 list_omenu = build_option_menu (selection_mode_items, 3, 3,
5401 list_toggle_sel_mode,
5403 gtk_box_pack_start (GTK_BOX (hbox), list_omenu, FALSE, TRUE, 0);
5405 separator = gtk_hseparator_new ();
5406 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
5408 cbox = gtk_hbox_new (FALSE, 0);
5409 gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, TRUE, 0);
5411 button = gtk_button_new_with_label ("close");
5412 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5413 gtk_box_pack_start (GTK_BOX (cbox), button, TRUE, TRUE, 0);
5414 g_signal_connect_swapped (button, "clicked",
5415 G_CALLBACK (gtk_widget_destroy),
5418 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5419 gtk_widget_grab_default (button);
5422 if (!GTK_WIDGET_VISIBLE (window))
5423 gtk_widget_show_all (window);
5425 gtk_widget_destroy (window);
5432 static char * book_open_xpm[] = {
5455 static char * book_closed_xpm[] = {
5480 static char * mini_page_xpm[] = {
5503 static char * gtk_mini_xpm[] = {
5543 #define TESTGTK_CLIST_COLUMNS 12
5544 static gint clist_rows = 0;
5545 static GtkWidget *clist_omenu;
5548 add1000_clist (GtkWidget *widget, gpointer data)
5551 char text[TESTGTK_CLIST_COLUMNS][50];
5552 char *texts[TESTGTK_CLIST_COLUMNS];
5557 clist = GTK_CLIST (data);
5559 pixmap = gdk_pixmap_create_from_xpm_d (clist->clist_window,
5561 >K_WIDGET (data)->style->white,
5564 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5567 sprintf (text[i], "Column %d", i);
5571 sprintf (text[1], "Right");
5572 sprintf (text[2], "Center");
5574 gtk_clist_freeze (GTK_CLIST (data));
5575 for (i = 0; i < 1000; i++)
5577 sprintf (text[0], "CListRow %d", rand() % 10000);
5578 row = gtk_clist_append (clist, texts);
5579 gtk_clist_set_pixtext (clist, row, 3, "gtk+", 5, pixmap, mask);
5582 gtk_clist_thaw (GTK_CLIST (data));
5584 g_object_unref (pixmap);
5585 g_object_unref (mask);
5589 add10000_clist (GtkWidget *widget, gpointer data)
5592 char text[TESTGTK_CLIST_COLUMNS][50];
5593 char *texts[TESTGTK_CLIST_COLUMNS];
5595 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5598 sprintf (text[i], "Column %d", i);
5601 sprintf (text[1], "Right");
5602 sprintf (text[2], "Center");
5604 gtk_clist_freeze (GTK_CLIST (data));
5605 for (i = 0; i < 10000; i++)
5607 sprintf (text[0], "CListRow %d", rand() % 10000);
5608 gtk_clist_append (GTK_CLIST (data), texts);
5610 gtk_clist_thaw (GTK_CLIST (data));
5614 clear_clist (GtkWidget *widget, gpointer data)
5616 gtk_clist_clear (GTK_CLIST (data));
5620 void clist_remove_selection (GtkWidget *widget, GtkCList *clist)
5622 gtk_clist_freeze (clist);
5624 while (clist->selection)
5629 row = GPOINTER_TO_INT (clist->selection->data);
5631 gtk_clist_remove (clist, row);
5633 if (clist->selection_mode == GTK_SELECTION_BROWSE)
5637 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
5638 clist->focus_row >= 0)
5639 gtk_clist_select_row (clist, clist->focus_row, -1);
5641 gtk_clist_thaw (clist);
5644 void toggle_title_buttons (GtkWidget *widget, GtkCList *clist)
5646 if (GTK_TOGGLE_BUTTON (widget)->active)
5647 gtk_clist_column_titles_show (clist);
5649 gtk_clist_column_titles_hide (clist);
5652 void toggle_reorderable (GtkWidget *widget, GtkCList *clist)
5654 gtk_clist_set_reorderable (clist, GTK_TOGGLE_BUTTON (widget)->active);
5658 insert_row_clist (GtkWidget *widget, gpointer data)
5660 static char *text[] =
5662 "This", "is an", "inserted", "row.",
5663 "This", "is an", "inserted", "row.",
5664 "This", "is an", "inserted", "row."
5667 static GtkStyle *style1 = NULL;
5668 static GtkStyle *style2 = NULL;
5669 static GtkStyle *style3 = NULL;
5672 if (GTK_CLIST (data)->focus_row >= 0)
5673 row = gtk_clist_insert (GTK_CLIST (data), GTK_CLIST (data)->focus_row,
5676 row = gtk_clist_prepend (GTK_CLIST (data), text);
5690 style1 = gtk_style_copy (GTK_WIDGET (data)->style);
5691 style1->base[GTK_STATE_NORMAL] = col1;
5692 style1->base[GTK_STATE_SELECTED] = col2;
5694 style2 = gtk_style_copy (GTK_WIDGET (data)->style);
5695 style2->fg[GTK_STATE_NORMAL] = col1;
5696 style2->fg[GTK_STATE_SELECTED] = col2;
5698 style3 = gtk_style_copy (GTK_WIDGET (data)->style);
5699 style3->fg[GTK_STATE_NORMAL] = col1;
5700 style3->base[GTK_STATE_NORMAL] = col2;
5701 pango_font_description_free (style3->font_desc);
5702 style3->font_desc = pango_font_description_from_string ("courier 12");
5705 gtk_clist_set_cell_style (GTK_CLIST (data), row, 3, style1);
5706 gtk_clist_set_cell_style (GTK_CLIST (data), row, 4, style2);
5707 gtk_clist_set_cell_style (GTK_CLIST (data), row, 0, style3);
5713 clist_warning_test (GtkWidget *button,
5717 static gboolean add_remove = FALSE;
5719 add_remove = !add_remove;
5721 child = gtk_label_new ("Test");
5722 g_object_ref (child);
5723 gtk_object_sink (GTK_OBJECT (child));
5726 gtk_container_add (GTK_CONTAINER (clist), child);
5729 child->parent = clist;
5730 gtk_container_remove (GTK_CONTAINER (clist), child);
5731 child->parent = NULL;
5734 gtk_widget_destroy (child);
5735 gtk_widget_unref (child);
5739 undo_selection (GtkWidget *button, GtkCList *clist)
5741 gtk_clist_undo_selection (clist);
5745 clist_toggle_sel_mode (GtkWidget *widget, gpointer data)
5750 clist = GTK_CLIST (data);
5752 if (!GTK_WIDGET_MAPPED (widget))
5755 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
5757 gtk_clist_set_selection_mode (clist, selection_modes[i]);
5761 clist_click_column (GtkCList *clist, gint column, gpointer data)
5764 gtk_clist_set_column_visibility (clist, column, FALSE);
5765 else if (column == clist->sort_column)
5767 if (clist->sort_type == GTK_SORT_ASCENDING)
5768 clist->sort_type = GTK_SORT_DESCENDING;
5770 clist->sort_type = GTK_SORT_ASCENDING;
5773 gtk_clist_set_sort_column (clist, column);
5775 gtk_clist_sort (clist);
5779 create_clist (GtkWidget *widget)
5782 static GtkWidget *window = NULL;
5784 static char *titles[] =
5786 "auto resize", "not resizeable", "max width 100", "min width 50",
5787 "hide column", "Title 5", "Title 6", "Title 7",
5788 "Title 8", "Title 9", "Title 10", "Title 11"
5791 char text[TESTGTK_CLIST_COLUMNS][50];
5792 char *texts[TESTGTK_CLIST_COLUMNS];
5798 GtkWidget *separator;
5799 GtkWidget *scrolled_win;
5802 GtkWidget *undo_button;
5812 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5813 gtk_window_set_screen (GTK_WINDOW (window),
5814 gtk_widget_get_screen (widget));
5816 g_signal_connect (window, "destroy",
5817 G_CALLBACK (gtk_widget_destroyed), &window);
5819 gtk_window_set_title (GTK_WINDOW (window), "clist");
5820 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5822 vbox = gtk_vbox_new (FALSE, 0);
5823 gtk_container_add (GTK_CONTAINER (window), vbox);
5825 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
5826 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
5827 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
5828 GTK_POLICY_AUTOMATIC,
5829 GTK_POLICY_AUTOMATIC);
5831 /* create GtkCList here so we have a pointer to throw at the
5832 * button callbacks -- more is done with it later */
5833 clist = gtk_clist_new_with_titles (TESTGTK_CLIST_COLUMNS, titles);
5834 gtk_container_add (GTK_CONTAINER (scrolled_win), clist);
5835 g_signal_connect (clist, "click_column",
5836 G_CALLBACK (clist_click_column), NULL);
5838 /* control buttons */
5839 hbox = gtk_hbox_new (FALSE, 5);
5840 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5841 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
5843 button = gtk_button_new_with_label ("Insert Row");
5844 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5845 g_signal_connect (button, "clicked",
5846 G_CALLBACK (insert_row_clist), clist);
5848 button = gtk_button_new_with_label ("Add 1,000 Rows With Pixmaps");
5849 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5850 g_signal_connect (button, "clicked",
5851 G_CALLBACK (add1000_clist), clist);
5853 button = gtk_button_new_with_label ("Add 10,000 Rows");
5854 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5855 g_signal_connect (button, "clicked",
5856 G_CALLBACK (add10000_clist), clist);
5858 /* second layer of buttons */
5859 hbox = gtk_hbox_new (FALSE, 5);
5860 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5861 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
5863 button = gtk_button_new_with_label ("Clear List");
5864 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5865 g_signal_connect (button, "clicked",
5866 G_CALLBACK (clear_clist), clist);
5868 button = gtk_button_new_with_label ("Remove Selection");
5869 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5870 g_signal_connect (button, "clicked",
5871 G_CALLBACK (clist_remove_selection), clist);
5873 undo_button = gtk_button_new_with_label ("Undo Selection");
5874 gtk_box_pack_start (GTK_BOX (hbox), undo_button, TRUE, TRUE, 0);
5875 g_signal_connect (undo_button, "clicked",
5876 G_CALLBACK (undo_selection), clist);
5878 button = gtk_button_new_with_label ("Warning Test");
5879 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5880 g_signal_connect (button, "clicked",
5881 G_CALLBACK (clist_warning_test), clist);
5883 /* third layer of buttons */
5884 hbox = gtk_hbox_new (FALSE, 5);
5885 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5886 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
5888 check = gtk_check_button_new_with_label ("Show Title Buttons");
5889 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
5890 g_signal_connect (check, "clicked",
5891 G_CALLBACK (toggle_title_buttons), clist);
5892 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
5894 check = gtk_check_button_new_with_label ("Reorderable");
5895 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
5896 g_signal_connect (check, "clicked",
5897 G_CALLBACK (toggle_reorderable), clist);
5898 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
5900 label = gtk_label_new ("Selection Mode :");
5901 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5903 clist_omenu = build_option_menu (selection_mode_items, 3, 3,
5904 clist_toggle_sel_mode,
5906 gtk_box_pack_start (GTK_BOX (hbox), clist_omenu, FALSE, TRUE, 0);
5909 * the rest of the clist configuration
5912 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
5913 gtk_clist_set_row_height (GTK_CLIST (clist), 18);
5914 gtk_widget_set_size_request (clist, -1, 300);
5916 for (i = 1; i < TESTGTK_CLIST_COLUMNS; i++)
5917 gtk_clist_set_column_width (GTK_CLIST (clist), i, 80);
5919 gtk_clist_set_column_auto_resize (GTK_CLIST (clist), 0, TRUE);
5920 gtk_clist_set_column_resizeable (GTK_CLIST (clist), 1, FALSE);
5921 gtk_clist_set_column_max_width (GTK_CLIST (clist), 2, 100);
5922 gtk_clist_set_column_min_width (GTK_CLIST (clist), 3, 50);
5923 gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
5924 gtk_clist_set_column_justification (GTK_CLIST (clist), 1,
5926 gtk_clist_set_column_justification (GTK_CLIST (clist), 2,
5927 GTK_JUSTIFY_CENTER);
5929 for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++)
5932 sprintf (text[i], "Column %d", i);
5935 sprintf (text[1], "Right");
5936 sprintf (text[2], "Center");
5945 style = gtk_style_new ();
5946 style->fg[GTK_STATE_NORMAL] = col1;
5947 style->base[GTK_STATE_NORMAL] = col2;
5949 pango_font_description_set_size (style->font_desc, 14 * PANGO_SCALE);
5950 pango_font_description_set_weight (style->font_desc, PANGO_WEIGHT_BOLD);
5952 for (i = 0; i < 10; i++)
5954 sprintf (text[0], "CListRow %d", clist_rows++);
5955 gtk_clist_append (GTK_CLIST (clist), texts);
5960 gtk_clist_set_row_style (GTK_CLIST (clist), i, style);
5963 gtk_clist_set_cell_style (GTK_CLIST (clist), i, i % 4, style);
5968 gtk_style_unref (style);
5970 separator = gtk_hseparator_new ();
5971 gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
5973 hbox = gtk_hbox_new (FALSE, 0);
5974 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5976 button = gtk_button_new_with_label ("close");
5977 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5978 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
5979 g_signal_connect_swapped (button, "clicked",
5980 G_CALLBACK (gtk_widget_destroy),
5983 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
5984 gtk_widget_grab_default (button);
5987 if (!GTK_WIDGET_VISIBLE (window))
5988 gtk_widget_show_all (window);
5992 gtk_widget_destroy (window);
6010 static gint books = 0;
6011 static gint pages = 0;
6013 static GtkWidget *book_label;
6014 static GtkWidget *page_label;
6015 static GtkWidget *sel_label;
6016 static GtkWidget *vis_label;
6017 static GtkWidget *omenu1;
6018 static GtkWidget *omenu2;
6019 static GtkWidget *omenu3;
6020 static GtkWidget *omenu4;
6021 static GtkWidget *spin1;
6022 static GtkWidget *spin2;
6023 static GtkWidget *spin3;
6024 static gint line_style;
6027 static CTreePixmaps *
6028 get_ctree_pixmaps (GtkCTree *ctree)
6030 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (ctree));
6031 CTreePixmaps *pixmaps = g_object_get_data (G_OBJECT (screen), "ctree-pixmaps");
6035 GdkColormap *colormap = gdk_screen_get_rgb_colormap (screen);
6036 pixmaps = g_new (CTreePixmaps, 1);
6038 pixmaps->pixmap1 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6040 NULL, book_closed_xpm);
6041 pixmaps->pixmap2 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6043 NULL, book_open_xpm);
6044 pixmaps->pixmap3 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap,
6046 NULL, mini_page_xpm);
6048 g_object_set_data (G_OBJECT (screen), "ctree-pixmaps", pixmaps);
6054 void after_press (GtkCTree *ctree, gpointer data)
6058 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
6059 gtk_label_set_text (GTK_LABEL (sel_label), buf);
6061 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
6062 gtk_label_set_text (GTK_LABEL (vis_label), buf);
6064 sprintf (buf, "%d", books);
6065 gtk_label_set_text (GTK_LABEL (book_label), buf);
6067 sprintf (buf, "%d", pages);
6068 gtk_label_set_text (GTK_LABEL (page_label), buf);
6071 void after_move (GtkCTree *ctree, GtkCTreeNode *child, GtkCTreeNode *parent,
6072 GtkCTreeNode *sibling, gpointer data)
6078 gtk_ctree_get_node_info (ctree, child, &source,
6079 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6081 gtk_ctree_get_node_info (ctree, parent, &target1,
6082 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6084 gtk_ctree_get_node_info (ctree, sibling, &target2,
6085 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
6087 g_print ("Moving \"%s\" to \"%s\" with sibling \"%s\".\n", source,
6088 (parent) ? target1 : "nil", (sibling) ? target2 : "nil");
6091 void count_items (GtkCTree *ctree, GtkCTreeNode *list)
6093 if (GTK_CTREE_ROW (list)->is_leaf)
6099 void expand_all (GtkWidget *widget, GtkCTree *ctree)
6101 gtk_ctree_expand_recursive (ctree, NULL);
6102 after_press (ctree, NULL);
6105 void collapse_all (GtkWidget *widget, GtkCTree *ctree)
6107 gtk_ctree_collapse_recursive (ctree, NULL);
6108 after_press (ctree, NULL);
6111 void select_all (GtkWidget *widget, GtkCTree *ctree)
6113 gtk_ctree_select_recursive (ctree, NULL);
6114 after_press (ctree, NULL);
6117 void change_style (GtkWidget *widget, GtkCTree *ctree)
6119 static GtkStyle *style1 = NULL;
6120 static GtkStyle *style2 = NULL;
6126 if (GTK_CLIST (ctree)->focus_row >= 0)
6127 node = GTK_CTREE_NODE
6128 (g_list_nth (GTK_CLIST (ctree)->row_list,GTK_CLIST (ctree)->focus_row));
6130 node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list);
6144 style1 = gtk_style_new ();
6145 style1->base[GTK_STATE_NORMAL] = col1;
6146 style1->fg[GTK_STATE_SELECTED] = col2;
6148 style2 = gtk_style_new ();
6149 style2->base[GTK_STATE_SELECTED] = col2;
6150 style2->fg[GTK_STATE_NORMAL] = col1;
6151 style2->base[GTK_STATE_NORMAL] = col2;
6152 pango_font_description_free (style2->font_desc);
6153 style2->font_desc = pango_font_description_from_string ("courier 30");
6156 gtk_ctree_node_set_cell_style (ctree, node, 1, style1);
6157 gtk_ctree_node_set_cell_style (ctree, node, 0, style2);
6159 if (GTK_CTREE_ROW (node)->children)
6160 gtk_ctree_node_set_row_style (ctree, GTK_CTREE_ROW (node)->children,
6164 void unselect_all (GtkWidget *widget, GtkCTree *ctree)
6166 gtk_ctree_unselect_recursive (ctree, NULL);
6167 after_press (ctree, NULL);
6170 void remove_selection (GtkWidget *widget, GtkCTree *ctree)
6175 clist = GTK_CLIST (ctree);
6177 gtk_clist_freeze (clist);
6179 while (clist->selection)
6181 node = clist->selection->data;
6183 if (GTK_CTREE_ROW (node)->is_leaf)
6186 gtk_ctree_post_recursive (ctree, node,
6187 (GtkCTreeFunc) count_items, NULL);
6189 gtk_ctree_remove_node (ctree, node);
6191 if (clist->selection_mode == GTK_SELECTION_BROWSE)
6195 if (clist->selection_mode == GTK_SELECTION_EXTENDED && !clist->selection &&
6196 clist->focus_row >= 0)
6198 node = gtk_ctree_node_nth (ctree, clist->focus_row);
6201 gtk_ctree_select (ctree, node);
6204 gtk_clist_thaw (clist);
6205 after_press (ctree, NULL);
6208 struct _ExportStruct {
6214 typedef struct _ExportStruct ExportStruct;
6217 gnode2ctree (GtkCTree *ctree,
6220 GtkCTreeNode *cnode,
6224 GdkPixmap *pixmap_closed;
6225 GdkBitmap *mask_closed;
6226 GdkPixmap *pixmap_opened;
6227 GdkBitmap *mask_opened;
6228 CTreePixmaps *pixmaps;
6230 if (!cnode || !gnode || (!(es = gnode->data)))
6233 pixmaps = get_ctree_pixmaps (ctree);
6237 pixmap_closed = pixmaps->pixmap3;
6238 mask_closed = pixmaps->mask3;
6239 pixmap_opened = NULL;
6244 pixmap_closed = pixmaps->pixmap1;
6245 mask_closed = pixmaps->mask1;
6246 pixmap_opened = pixmaps->pixmap2;
6247 mask_opened = pixmaps->mask2;
6250 gtk_ctree_set_node_info (ctree, cnode, es->tree, 2, pixmap_closed,
6251 mask_closed, pixmap_opened, mask_opened,
6252 es->is_leaf, (depth < 3));
6253 gtk_ctree_node_set_text (ctree, cnode, 1, es->info);
6261 ctree2gnode (GtkCTree *ctree,
6264 GtkCTreeNode *cnode,
6269 if (!cnode || !gnode)
6272 es = g_new (ExportStruct, 1);
6274 es->is_leaf = GTK_CTREE_ROW (cnode)->is_leaf;
6275 es->tree = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[0])->text;
6276 es->info = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (cnode)->row.cell[1])->text;
6280 void export_ctree (GtkWidget *widget, GtkCTree *ctree)
6282 char *title[] = { "Tree" , "Info" };
6283 static GtkWidget *export_window = NULL;
6284 static GtkCTree *export_ctree;
6286 GtkWidget *scrolled_win;
6294 export_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6296 gtk_window_set_screen (GTK_WINDOW (export_window),
6297 gtk_widget_get_screen (widget));
6299 g_signal_connect (export_window, "destroy",
6300 G_CALLBACK (gtk_widget_destroyed),
6303 gtk_window_set_title (GTK_WINDOW (export_window), "exported ctree");
6304 gtk_container_set_border_width (GTK_CONTAINER (export_window), 5);
6306 vbox = gtk_vbox_new (FALSE, 0);
6307 gtk_container_add (GTK_CONTAINER (export_window), vbox);
6309 button = gtk_button_new_with_label ("Close");
6310 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, TRUE, 0);
6312 g_signal_connect_swapped (button, "clicked",
6313 G_CALLBACK (gtk_widget_destroy),
6316 sep = gtk_hseparator_new ();
6317 gtk_box_pack_end (GTK_BOX (vbox), sep, FALSE, TRUE, 10);
6319 export_ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
6320 gtk_ctree_set_line_style (export_ctree, GTK_CTREE_LINES_DOTTED);
6322 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6323 gtk_container_add (GTK_CONTAINER (scrolled_win),
6324 GTK_WIDGET (export_ctree));
6325 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6326 GTK_POLICY_AUTOMATIC,
6327 GTK_POLICY_AUTOMATIC);
6328 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6329 gtk_clist_set_selection_mode (GTK_CLIST (export_ctree),
6330 GTK_SELECTION_EXTENDED);
6331 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 0, 200);
6332 gtk_clist_set_column_width (GTK_CLIST (export_ctree), 1, 200);
6333 gtk_widget_set_size_request (GTK_WIDGET (export_ctree), 300, 200);
6336 if (!GTK_WIDGET_VISIBLE (export_window))
6337 gtk_widget_show_all (export_window);
6339 gtk_clist_clear (GTK_CLIST (export_ctree));
6341 node = GTK_CTREE_NODE (g_list_nth (GTK_CLIST (ctree)->row_list,
6342 GTK_CLIST (ctree)->focus_row));
6346 gnode = gtk_ctree_export_to_gnode (ctree, NULL, NULL, node,
6350 gtk_ctree_insert_gnode (export_ctree, NULL, NULL, gnode,
6352 g_node_destroy (gnode);
6356 void change_indent (GtkWidget *widget, GtkCTree *ctree)
6358 gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value);
6361 void change_spacing (GtkWidget *widget, GtkCTree *ctree)
6363 gtk_ctree_set_spacing (ctree, GTK_ADJUSTMENT (widget)->value);
6366 void change_row_height (GtkWidget *widget, GtkCList *clist)
6368 gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value);
6371 void set_background (GtkCTree *ctree, GtkCTreeNode *node, gpointer data)
6373 GtkStyle *style = NULL;
6378 if (ctree->line_style != GTK_CTREE_LINES_TABBED)
6380 if (!GTK_CTREE_ROW (node)->is_leaf)
6381 style = GTK_CTREE_ROW (node)->row.data;
6382 else if (GTK_CTREE_ROW (node)->parent)
6383 style = GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data;
6386 gtk_ctree_node_set_row_style (ctree, node, style);
6390 ctree_toggle_line_style (GtkWidget *widget, gpointer data)
6395 ctree = GTK_CTREE (data);
6397 if (!GTK_WIDGET_MAPPED (widget))
6400 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6402 if ((ctree->line_style == GTK_CTREE_LINES_TABBED &&
6403 ((GtkCTreeLineStyle) i) != GTK_CTREE_LINES_TABBED) ||
6404 (ctree->line_style != GTK_CTREE_LINES_TABBED &&
6405 ((GtkCTreeLineStyle) i) == GTK_CTREE_LINES_TABBED))
6406 gtk_ctree_pre_recursive (ctree, NULL, set_background, NULL);
6407 gtk_ctree_set_line_style (ctree, i);
6412 ctree_toggle_expander_style (GtkWidget *widget, gpointer data)
6417 ctree = GTK_CTREE (data);
6419 if (!GTK_WIDGET_MAPPED (widget))
6422 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6424 gtk_ctree_set_expander_style (ctree, (GtkCTreeExpanderStyle) i);
6428 ctree_toggle_justify (GtkWidget *widget, gpointer data)
6433 ctree = GTK_CTREE (data);
6435 if (!GTK_WIDGET_MAPPED (widget))
6438 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6440 gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column,
6441 (GtkJustification) i);
6445 ctree_toggle_sel_mode (GtkWidget *widget, gpointer data)
6450 ctree = GTK_CTREE (data);
6452 if (!GTK_WIDGET_MAPPED (widget))
6455 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
6457 gtk_clist_set_selection_mode (GTK_CLIST (ctree), selection_modes[i]);
6458 after_press (ctree, NULL);
6461 void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
6462 gint num_books, gint num_pages, GtkCTreeNode *parent)
6467 GtkCTreeNode *sibling;
6468 CTreePixmaps *pixmaps;
6475 pixmaps = get_ctree_pixmaps (ctree);
6477 for (i = num_pages + num_books; i > num_books; i--)
6480 sprintf (buf1, "Page %02d", (gint) rand() % 100);
6481 sprintf (buf2, "Item %d-%d", cur_depth, i);
6482 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
6483 pixmaps->pixmap3, pixmaps->mask3, NULL, NULL,
6486 if (parent && ctree->line_style == GTK_CTREE_LINES_TABBED)
6487 gtk_ctree_node_set_row_style (ctree, sibling,
6488 GTK_CTREE_ROW (parent)->row.style);
6491 if (cur_depth == depth)
6494 for (i = num_books; i > 0; i--)
6499 sprintf (buf1, "Book %02d", (gint) rand() % 100);
6500 sprintf (buf2, "Item %d-%d", cur_depth, i);
6501 sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5,
6502 pixmaps->pixmap1, pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2,
6505 style = gtk_style_new ();
6506 switch (cur_depth % 3)
6509 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
6510 style->base[GTK_STATE_NORMAL].green = 0;
6511 style->base[GTK_STATE_NORMAL].blue = 65535 - ((i * 10000) % 65535);
6514 style->base[GTK_STATE_NORMAL].red = 10000 * (cur_depth % 6);
6515 style->base[GTK_STATE_NORMAL].green = 65535 - ((i * 10000) % 65535);
6516 style->base[GTK_STATE_NORMAL].blue = 0;
6519 style->base[GTK_STATE_NORMAL].red = 65535 - ((i * 10000) % 65535);
6520 style->base[GTK_STATE_NORMAL].green = 0;
6521 style->base[GTK_STATE_NORMAL].blue = 10000 * (cur_depth % 6);
6524 gtk_ctree_node_set_row_data_full (ctree, sibling, style,
6525 (GtkDestroyNotify) gtk_style_unref);
6527 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
6528 gtk_ctree_node_set_row_style (ctree, sibling, style);
6530 build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages,
6535 void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
6538 gchar label1[] = "Root";
6539 gchar label2[] = "";
6540 GtkCTreeNode *parent;
6543 CTreePixmaps *pixmaps;
6545 pixmaps = get_ctree_pixmaps (ctree);
6550 d = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
6551 b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
6552 p = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin3));
6554 n = ((pow (b, d) - 1) / (b - 1)) * (p + 1);
6558 g_print ("%d total items? Try less\n",n);
6562 gtk_clist_freeze (GTK_CLIST (ctree));
6563 gtk_clist_clear (GTK_CLIST (ctree));
6568 parent = gtk_ctree_insert_node (ctree, NULL, NULL, text, 5, pixmaps->pixmap1,
6569 pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2, FALSE, TRUE);
6571 style = gtk_style_new ();
6572 style->base[GTK_STATE_NORMAL].red = 0;
6573 style->base[GTK_STATE_NORMAL].green = 45000;
6574 style->base[GTK_STATE_NORMAL].blue = 55000;
6575 gtk_ctree_node_set_row_data_full (ctree, parent, style,
6576 (GtkDestroyNotify) gtk_style_unref);
6578 if (ctree->line_style == GTK_CTREE_LINES_TABBED)
6579 gtk_ctree_node_set_row_style (ctree, parent, style);
6581 build_recursive (ctree, 1, d, b, p, parent);
6582 gtk_clist_thaw (GTK_CLIST (ctree));
6583 after_press (ctree, NULL);
6587 ctree_click_column (GtkCTree *ctree, gint column, gpointer data)
6591 clist = GTK_CLIST (ctree);
6593 if (column == clist->sort_column)
6595 if (clist->sort_type == GTK_SORT_ASCENDING)
6596 clist->sort_type = GTK_SORT_DESCENDING;
6598 clist->sort_type = GTK_SORT_ASCENDING;
6601 gtk_clist_set_sort_column (clist, column);
6603 gtk_ctree_sort_recursive (ctree, NULL);
6606 void create_ctree (GtkWidget *widget)
6608 static GtkWidget *window = NULL;
6609 GtkTooltips *tooltips;
6611 GtkWidget *scrolled_win;
6624 char *title[] = { "Tree" , "Info" };
6627 static gchar *items1[] =
6635 static gchar *items2[] =
6643 static gchar *items3[] =
6651 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6652 gtk_window_set_screen (GTK_WINDOW (window),
6653 gtk_widget_get_screen (widget));
6655 g_signal_connect (window, "destroy",
6656 G_CALLBACK (gtk_widget_destroyed),
6659 gtk_window_set_title (GTK_WINDOW (window), "GtkCTree");
6660 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6662 tooltips = gtk_tooltips_new ();
6663 g_object_ref (tooltips);
6664 gtk_object_sink (GTK_OBJECT (tooltips));
6666 g_object_set_data_full (G_OBJECT (window), "tooltips", tooltips,
6669 vbox = gtk_vbox_new (FALSE, 0);
6670 gtk_container_add (GTK_CONTAINER (window), vbox);
6672 hbox = gtk_hbox_new (FALSE, 5);
6673 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
6674 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
6676 label = gtk_label_new ("Depth :");
6677 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6679 adj = (GtkAdjustment *) gtk_adjustment_new (4, 1, 10, 1, 5, 0);
6680 spin1 = gtk_spin_button_new (adj, 0, 0);
6681 gtk_box_pack_start (GTK_BOX (hbox), spin1, FALSE, TRUE, 5);
6683 label = gtk_label_new ("Books :");
6684 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6686 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
6687 spin2 = gtk_spin_button_new (adj, 0, 0);
6688 gtk_box_pack_start (GTK_BOX (hbox), spin2, FALSE, TRUE, 5);
6690 label = gtk_label_new ("Pages :");
6691 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
6693 adj = (GtkAdjustment *) gtk_adjustment_new (5, 1, 20, 1, 5, 0);
6694 spin3 = gtk_spin_button_new (adj, 0, 0);
6695 gtk_box_pack_start (GTK_BOX (hbox), spin3, FALSE, TRUE, 5);
6697 button = gtk_button_new_with_label ("Close");
6698 gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6700 g_signal_connect_swapped (button, "clicked",
6701 G_CALLBACK (gtk_widget_destroy),
6704 button = gtk_button_new_with_label ("Rebuild Tree");
6705 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6707 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
6708 gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5);
6709 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
6710 GTK_POLICY_AUTOMATIC,
6712 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
6714 ctree = GTK_CTREE (gtk_ctree_new_with_titles (2, 0, title));
6715 gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (ctree));
6717 gtk_clist_set_column_auto_resize (GTK_CLIST (ctree), 0, TRUE);
6718 gtk_clist_set_column_width (GTK_CLIST (ctree), 1, 200);
6719 gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_EXTENDED);
6720 gtk_ctree_set_line_style (ctree, GTK_CTREE_LINES_DOTTED);
6721 line_style = GTK_CTREE_LINES_DOTTED;
6723 g_signal_connect (button, "clicked",
6724 G_CALLBACK (rebuild_tree), ctree);
6725 g_signal_connect (ctree, "click_column",
6726 G_CALLBACK (ctree_click_column), NULL);
6728 g_signal_connect_after (ctree, "button_press_event",
6729 G_CALLBACK (after_press), NULL);
6730 g_signal_connect_after (ctree, "button_release_event",
6731 G_CALLBACK (after_press), NULL);
6732 g_signal_connect_after (ctree, "tree_move",
6733 G_CALLBACK (after_move), NULL);
6734 g_signal_connect_after (ctree, "end_selection",
6735 G_CALLBACK (after_press), NULL);
6736 g_signal_connect_after (ctree, "toggle_focus_row",
6737 G_CALLBACK (after_press), NULL);
6738 g_signal_connect_after (ctree, "select_all",
6739 G_CALLBACK (after_press), NULL);
6740 g_signal_connect_after (ctree, "unselect_all",
6741 G_CALLBACK (after_press), NULL);
6742 g_signal_connect_after (ctree, "scroll_vertical",
6743 G_CALLBACK (after_press), NULL);
6745 bbox = gtk_hbox_new (FALSE, 5);
6746 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
6747 gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, TRUE, 0);
6749 mbox = gtk_vbox_new (TRUE, 5);
6750 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
6752 label = gtk_label_new ("Row Height :");
6753 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
6755 label = gtk_label_new ("Indent :");
6756 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
6758 label = gtk_label_new ("Spacing :");
6759 gtk_box_pack_start (GTK_BOX (mbox), label, FALSE, FALSE, 0);
6761 mbox = gtk_vbox_new (TRUE, 5);
6762 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
6764 adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0);
6765 spinner = gtk_spin_button_new (adj, 0, 0);
6766 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
6767 gtk_tooltips_set_tip (tooltips, spinner,
6768 "Row height of list items", NULL);
6769 g_signal_connect (adj, "value_changed",
6770 G_CALLBACK (change_row_height), ctree);
6771 gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value);
6773 adj = (GtkAdjustment *) gtk_adjustment_new (20, 0, 60, 1, 10, 0);
6774 spinner = gtk_spin_button_new (adj, 0, 0);
6775 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
6776 gtk_tooltips_set_tip (tooltips, spinner, "Tree Indentation.", NULL);
6777 g_signal_connect (adj, "value_changed",
6778 G_CALLBACK (change_indent), ctree);
6780 adj = (GtkAdjustment *) gtk_adjustment_new (5, 0, 60, 1, 10, 0);
6781 spinner = gtk_spin_button_new (adj, 0, 0);
6782 gtk_box_pack_start (GTK_BOX (mbox), spinner, FALSE, FALSE, 5);
6783 gtk_tooltips_set_tip (tooltips, spinner, "Tree Spacing.", NULL);
6784 g_signal_connect (adj, "value_changed",
6785 G_CALLBACK (change_spacing), ctree);
6787 mbox = gtk_vbox_new (TRUE, 5);
6788 gtk_box_pack_start (GTK_BOX (bbox), mbox, FALSE, TRUE, 0);
6790 hbox = gtk_hbox_new (FALSE, 5);
6791 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
6793 button = gtk_button_new_with_label ("Expand All");
6794 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6795 g_signal_connect (button, "clicked",
6796 G_CALLBACK (expand_all), ctree);
6798 button = gtk_button_new_with_label ("Collapse All");
6799 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6800 g_signal_connect (button, "clicked",
6801 G_CALLBACK (collapse_all), ctree);
6803 button = gtk_button_new_with_label ("Change Style");
6804 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6805 g_signal_connect (button, "clicked",
6806 G_CALLBACK (change_style), ctree);
6808 button = gtk_button_new_with_label ("Export Tree");
6809 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6810 g_signal_connect (button, "clicked",
6811 G_CALLBACK (export_ctree), ctree);
6813 hbox = gtk_hbox_new (FALSE, 5);
6814 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
6816 button = gtk_button_new_with_label ("Select All");
6817 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6818 g_signal_connect (button, "clicked",
6819 G_CALLBACK (select_all), ctree);
6821 button = gtk_button_new_with_label ("Unselect All");
6822 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6823 g_signal_connect (button, "clicked",
6824 G_CALLBACK (unselect_all), ctree);
6826 button = gtk_button_new_with_label ("Remove Selection");
6827 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
6828 g_signal_connect (button, "clicked",
6829 G_CALLBACK (remove_selection), ctree);
6831 check = gtk_check_button_new_with_label ("Reorderable");
6832 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
6833 gtk_tooltips_set_tip (tooltips, check,
6834 "Tree items can be reordered by dragging.", NULL);
6835 g_signal_connect (check, "clicked",
6836 G_CALLBACK (toggle_reorderable), ctree);
6837 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
6839 hbox = gtk_hbox_new (TRUE, 5);
6840 gtk_box_pack_start (GTK_BOX (mbox), hbox, FALSE, FALSE, 0);
6842 omenu1 = build_option_menu (items1, 4, 2,
6843 ctree_toggle_line_style,
6845 gtk_box_pack_start (GTK_BOX (hbox), omenu1, FALSE, TRUE, 0);
6846 gtk_tooltips_set_tip (tooltips, omenu1, "The tree's line style.", NULL);
6848 omenu2 = build_option_menu (items2, 4, 1,
6849 ctree_toggle_expander_style,
6851 gtk_box_pack_start (GTK_BOX (hbox), omenu2, FALSE, TRUE, 0);
6852 gtk_tooltips_set_tip (tooltips, omenu2, "The tree's expander style.",
6855 omenu3 = build_option_menu (items3, 2, 0,
6856 ctree_toggle_justify, ctree);
6857 gtk_box_pack_start (GTK_BOX (hbox), omenu3, FALSE, TRUE, 0);
6858 gtk_tooltips_set_tip (tooltips, omenu3, "The tree's justification.",
6861 omenu4 = build_option_menu (selection_mode_items, 3, 3,
6862 ctree_toggle_sel_mode, ctree);
6863 gtk_box_pack_start (GTK_BOX (hbox), omenu4, FALSE, TRUE, 0);
6864 gtk_tooltips_set_tip (tooltips, omenu4, "The list's selection mode.",
6867 gtk_widget_realize (window);
6869 gtk_widget_set_size_request (GTK_WIDGET (ctree), -1, 300);
6871 frame = gtk_frame_new (NULL);
6872 gtk_container_set_border_width (GTK_CONTAINER (frame), 0);
6873 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
6874 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
6876 hbox = gtk_hbox_new (TRUE, 2);
6877 gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
6878 gtk_container_add (GTK_CONTAINER (frame), hbox);
6880 frame = gtk_frame_new (NULL);
6881 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6882 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6884 hbox2 = gtk_hbox_new (FALSE, 0);
6885 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6886 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6888 label = gtk_label_new ("Books :");
6889 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6891 sprintf (buf, "%d", books);
6892 book_label = gtk_label_new (buf);
6893 gtk_box_pack_end (GTK_BOX (hbox2), book_label, FALSE, TRUE, 5);
6895 frame = gtk_frame_new (NULL);
6896 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6897 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6899 hbox2 = gtk_hbox_new (FALSE, 0);
6900 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6901 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6903 label = gtk_label_new ("Pages :");
6904 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6906 sprintf (buf, "%d", pages);
6907 page_label = gtk_label_new (buf);
6908 gtk_box_pack_end (GTK_BOX (hbox2), page_label, FALSE, TRUE, 5);
6910 frame = gtk_frame_new (NULL);
6911 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6912 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6914 hbox2 = gtk_hbox_new (FALSE, 0);
6915 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6916 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6918 label = gtk_label_new ("Selected :");
6919 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6921 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->selection));
6922 sel_label = gtk_label_new (buf);
6923 gtk_box_pack_end (GTK_BOX (hbox2), sel_label, FALSE, TRUE, 5);
6925 frame = gtk_frame_new (NULL);
6926 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
6927 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
6929 hbox2 = gtk_hbox_new (FALSE, 0);
6930 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 2);
6931 gtk_container_add (GTK_CONTAINER (frame), hbox2);
6933 label = gtk_label_new ("Visible :");
6934 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
6936 sprintf (buf, "%d", g_list_length (GTK_CLIST (ctree)->row_list));
6937 vis_label = gtk_label_new (buf);
6938 gtk_box_pack_end (GTK_BOX (hbox2), vis_label, FALSE, TRUE, 5);
6940 rebuild_tree (NULL, ctree);
6943 if (!GTK_WIDGET_VISIBLE (window))
6944 gtk_widget_show_all (window);
6946 gtk_widget_destroy (window);
6954 color_selection_ok (GtkWidget *w,
6955 GtkColorSelectionDialog *cs)
6957 GtkColorSelection *colorsel;
6960 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6962 gtk_color_selection_get_color(colorsel,color);
6963 gtk_color_selection_set_color(colorsel,color);
6967 color_selection_changed (GtkWidget *w,
6968 GtkColorSelectionDialog *cs)
6970 GtkColorSelection *colorsel;
6973 colorsel=GTK_COLOR_SELECTION(cs->colorsel);
6974 gtk_color_selection_get_color(colorsel,color);
6978 opacity_toggled_cb (GtkWidget *w,
6979 GtkColorSelectionDialog *cs)
6981 GtkColorSelection *colorsel;
6983 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6984 gtk_color_selection_set_has_opacity_control (colorsel,
6985 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
6989 palette_toggled_cb (GtkWidget *w,
6990 GtkColorSelectionDialog *cs)
6992 GtkColorSelection *colorsel;
6994 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
6995 gtk_color_selection_set_has_palette (colorsel,
6996 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
7000 create_color_selection (GtkWidget *widget)
7002 static GtkWidget *window = NULL;
7010 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7011 gtk_window_set_screen (GTK_WINDOW (window),
7012 gtk_widget_get_screen (widget));
7014 g_signal_connect (window, "destroy",
7015 G_CALLBACK (gtk_widget_destroyed),
7018 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
7019 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7021 hbox = gtk_hbox_new (FALSE, 8);
7022 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
7023 gtk_container_add (GTK_CONTAINER (window), hbox);
7025 label = gtk_label_new ("Pick a color");
7026 gtk_container_add (GTK_CONTAINER (hbox), label);
7028 picker = gtk_color_button_new ();
7029 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
7030 gtk_container_add (GTK_CONTAINER (hbox), picker);
7033 if (!GTK_WIDGET_VISIBLE (window))
7034 gtk_widget_show_all (window);
7036 gtk_widget_destroy (window);
7044 show_fileops (GtkWidget *widget,
7045 GtkFileSelection *fs)
7049 show_ops = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7052 gtk_file_selection_show_fileop_buttons (fs);
7054 gtk_file_selection_hide_fileop_buttons (fs);
7058 select_multiple (GtkWidget *widget,
7059 GtkFileSelection *fs)
7061 gboolean select_multiple;
7063 select_multiple = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7064 gtk_file_selection_set_select_multiple (fs, select_multiple);
7068 file_selection_ok (GtkFileSelection *fs)
7073 selections = gtk_file_selection_get_selections (fs);
7075 for (i = 0; selections[i] != NULL; i++)
7076 g_print ("%s\n", selections[i]);
7078 g_strfreev (selections);
7080 gtk_widget_destroy (GTK_WIDGET (fs));
7084 create_file_selection (GtkWidget *widget)
7086 static GtkWidget *window = NULL;
7091 window = gtk_file_selection_new ("file selection dialog");
7092 gtk_window_set_screen (GTK_WINDOW (window),
7093 gtk_widget_get_screen (widget));
7095 gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window));
7097 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
7099 g_signal_connect (window, "destroy",
7100 G_CALLBACK (gtk_widget_destroyed),
7103 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->ok_button,
7105 G_CALLBACK (file_selection_ok),
7107 g_signal_connect_swapped (GTK_FILE_SELECTION (window)->cancel_button,
7109 G_CALLBACK (gtk_widget_destroy),
7112 button = gtk_check_button_new_with_label ("Show Fileops");
7113 g_signal_connect (button, "toggled",
7114 G_CALLBACK (show_fileops),
7116 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
7117 button, FALSE, FALSE, 0);
7118 gtk_widget_show (button);
7120 button = gtk_check_button_new_with_label ("Select Multiple");
7121 g_signal_connect (button, "clicked",
7122 G_CALLBACK (select_multiple),
7124 gtk_box_pack_start (GTK_BOX (GTK_FILE_SELECTION (window)->action_area),
7125 button, FALSE, FALSE, 0);
7126 gtk_widget_show (button);
7129 if (!GTK_WIDGET_VISIBLE (window))
7130 gtk_widget_show (window);
7132 gtk_widget_destroy (window);
7136 flipping_toggled_cb (GtkWidget *widget, gpointer data)
7138 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
7139 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
7141 gtk_widget_set_default_direction (new_direction);
7145 set_direction_recurse (GtkWidget *widget,
7148 GtkTextDirection *dir = data;
7150 gtk_widget_set_direction (widget, *dir);
7151 if (GTK_IS_CONTAINER (widget))
7152 gtk_container_foreach (GTK_CONTAINER (widget),
7153 set_direction_recurse,
7158 create_forward_back (const char *title,
7159 GtkTextDirection text_dir)
7161 GtkWidget *frame = gtk_frame_new (title);
7162 GtkWidget *bbox = gtk_hbutton_box_new ();
7163 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
7164 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
7166 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
7168 gtk_container_add (GTK_CONTAINER (frame), bbox);
7169 gtk_container_add (GTK_CONTAINER (bbox), back_button);
7170 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
7172 set_direction_recurse (frame, &text_dir);
7178 create_flipping (GtkWidget *widget)
7180 static GtkWidget *window = NULL;
7181 GtkWidget *check_button, *button;
7185 window = gtk_dialog_new ();
7187 gtk_window_set_screen (GTK_WINDOW (window),
7188 gtk_widget_get_screen (widget));
7190 g_signal_connect (window, "destroy",
7191 G_CALLBACK (gtk_widget_destroyed),
7194 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
7196 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
7197 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7198 check_button, TRUE, TRUE, 0);
7200 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7201 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
7204 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7205 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
7208 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7209 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
7212 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
7213 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
7215 g_signal_connect (check_button, "toggled",
7216 G_CALLBACK (flipping_toggled_cb), FALSE);
7218 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
7220 button = gtk_button_new_with_label ("Close");
7221 g_signal_connect_swapped (button, "clicked",
7222 G_CALLBACK (gtk_widget_destroy), window);
7223 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
7224 button, TRUE, TRUE, 0);
7227 if (!GTK_WIDGET_VISIBLE (window))
7228 gtk_widget_show_all (window);
7230 gtk_widget_destroy (window);
7238 make_focus_table (GList **list)
7243 table = gtk_table_new (5, 5, FALSE);
7256 widget = gtk_entry_new ();
7258 widget = gtk_button_new_with_label ("Foo");
7260 *list = g_list_prepend (*list, widget);
7262 gtk_table_attach (GTK_TABLE (table),
7266 GTK_EXPAND | GTK_FILL,
7267 GTK_EXPAND | GTK_FILL,
7276 *list = g_list_reverse (*list);
7282 create_focus (GtkWidget *widget)
7284 static GtkWidget *window = NULL;
7292 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
7298 gtk_window_set_screen (GTK_WINDOW (window),
7299 gtk_widget_get_screen (widget));
7301 g_signal_connect (window, "destroy",
7302 G_CALLBACK (gtk_widget_destroyed),
7305 g_signal_connect (window, "response",
7306 G_CALLBACK (gtk_widget_destroy),
7309 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
7311 frame = gtk_frame_new ("Weird tab focus chain");
7313 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7314 frame, TRUE, TRUE, 0);
7316 table = make_focus_table (&list);
7318 gtk_container_add (GTK_CONTAINER (frame), table);
7320 gtk_container_set_focus_chain (GTK_CONTAINER (table),
7325 frame = gtk_frame_new ("Default tab focus chain");
7327 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
7328 frame, TRUE, TRUE, 0);
7331 table = make_focus_table (&list);
7335 gtk_container_add (GTK_CONTAINER (frame), table);
7338 if (!GTK_WIDGET_VISIBLE (window))
7339 gtk_widget_show_all (window);
7341 gtk_widget_destroy (window);
7349 font_selection_ok (GtkWidget *w,
7350 GtkFontSelectionDialog *fs)
7352 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
7354 g_print ("%s\n", s);
7356 gtk_widget_destroy (GTK_WIDGET (fs));
7360 create_font_selection (GtkWidget *widget)
7362 static GtkWidget *window = NULL;
7370 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7371 gtk_window_set_screen (GTK_WINDOW (window),
7372 gtk_widget_get_screen (widget));
7374 g_signal_connect (window, "destroy",
7375 G_CALLBACK (gtk_widget_destroyed),
7378 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
7379 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7381 hbox = gtk_hbox_new (FALSE, 8);
7382 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
7383 gtk_container_add (GTK_CONTAINER (window), hbox);
7385 label = gtk_label_new ("Pick a font");
7386 gtk_container_add (GTK_CONTAINER (hbox), label);
7388 picker = gtk_font_button_new ();
7389 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
7390 gtk_container_add (GTK_CONTAINER (hbox), picker);
7393 if (!GTK_WIDGET_VISIBLE (window))
7394 gtk_widget_show_all (window);
7396 gtk_widget_destroy (window);
7403 static GtkWidget *dialog_window = NULL;
7406 label_toggle (GtkWidget *widget,
7411 *label = gtk_label_new ("Dialog Test");
7412 g_signal_connect (*label,
7414 G_CALLBACK (gtk_widget_destroyed),
7416 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
7417 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
7418 *label, TRUE, TRUE, 0);
7419 gtk_widget_show (*label);
7422 gtk_widget_destroy (*label);
7425 #define RESPONSE_TOGGLE_SEPARATOR 1
7428 print_response (GtkWidget *dialog,
7432 g_print ("response signal received (%d)\n", response_id);
7434 if (response_id == RESPONSE_TOGGLE_SEPARATOR)
7436 gtk_dialog_set_has_separator (GTK_DIALOG (dialog),
7437 !gtk_dialog_get_has_separator (GTK_DIALOG (dialog)));
7442 create_dialog (GtkWidget *widget)
7444 static GtkWidget *label;
7449 /* This is a terrible example; it's much simpler to create
7450 * dialogs than this. Don't use testgtk for example code,
7454 dialog_window = gtk_dialog_new ();
7455 gtk_window_set_screen (GTK_WINDOW (dialog_window),
7456 gtk_widget_get_screen (widget));
7458 g_signal_connect (dialog_window,
7460 G_CALLBACK (print_response),
7463 g_signal_connect (dialog_window, "destroy",
7464 G_CALLBACK (gtk_widget_destroyed),
7467 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
7468 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
7470 button = gtk_button_new_with_label ("OK");
7471 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7472 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7473 button, TRUE, TRUE, 0);
7474 gtk_widget_grab_default (button);
7475 gtk_widget_show (button);
7477 button = gtk_button_new_with_label ("Toggle");
7478 g_signal_connect (button, "clicked",
7479 G_CALLBACK (label_toggle),
7481 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7482 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7483 button, TRUE, TRUE, 0);
7484 gtk_widget_show (button);
7488 button = gtk_button_new_with_label ("Separator");
7490 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7492 gtk_dialog_add_action_widget (GTK_DIALOG (dialog_window),
7494 RESPONSE_TOGGLE_SEPARATOR);
7495 gtk_widget_show (button);
7498 if (!GTK_WIDGET_VISIBLE (dialog_window))
7499 gtk_widget_show (dialog_window);
7501 gtk_widget_destroy (dialog_window);
7504 /* Display & Screen test
7510 GtkWidget *radio_dpy;
7511 GtkWidget *toplevel;
7512 GtkWidget *dialog_window;
7513 GList *valid_display_list;
7514 } ScreenDisplaySelection;
7517 display_name_cmp (gconstpointer a,
7520 return g_ascii_strcasecmp (a,b);
7524 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
7527 GdkDisplay *display = gtk_widget_get_display (widget);
7529 GdkScreen *new_screen = NULL;
7530 GdkScreen *current_screen = gtk_widget_get_screen (widget);
7532 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
7534 display_name = g_strdup (gtk_entry_get_text (data->entry));
7535 display = gdk_display_open (display_name);
7539 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
7540 GTK_DIALOG_DESTROY_WITH_PARENT,
7543 "The display :\n%s\ncannot be opened",
7545 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
7546 gtk_widget_show (dialog);
7547 g_signal_connect (dialog, "response",
7548 G_CALLBACK (gtk_widget_destroy),
7553 if (!g_list_find_custom (data->valid_display_list,
7556 data->valid_display_list = g_list_append (data->valid_display_list,
7559 new_screen = gdk_display_get_default_screen (display);
7564 gint number_of_screens = gdk_display_get_n_screens (display);
7565 gint screen_num = gdk_screen_get_number (current_screen);
7566 if ((screen_num +1) < number_of_screens)
7567 new_screen = gdk_display_get_screen (display, screen_num + 1);
7569 new_screen = gdk_display_get_screen (display, 0);
7574 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
7575 gtk_widget_destroy (data->dialog_window);
7580 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
7582 gtk_widget_destroy (data);
7586 create_display_screen (GtkWidget *widget)
7588 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
7589 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
7591 ScreenDisplaySelection *scr_dpy_data;
7592 GdkScreen *screen = gtk_widget_get_screen (widget);
7593 static GList *valid_display_list = NULL;
7595 GdkDisplay *display = gdk_screen_get_display (screen);
7597 window = gtk_widget_new (gtk_window_get_type (),
7600 "type", GTK_WINDOW_TOPLEVEL,
7602 "Screen or Display selection",
7603 "border_width", 10, NULL);
7604 g_signal_connect (window, "destroy",
7605 G_CALLBACK (gtk_widget_destroy), NULL);
7607 vbox = gtk_vbox_new (FALSE, 3);
7608 gtk_container_add (GTK_CONTAINER (window), vbox);
7610 frame = gtk_frame_new ("Select screen or display");
7611 gtk_container_add (GTK_CONTAINER (vbox), frame);
7613 table = gtk_table_new (2, 2, TRUE);
7614 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
7615 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
7617 gtk_container_add (GTK_CONTAINER (frame), table);
7619 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
7620 if (gdk_display_get_n_screens(display) > 1)
7621 radio_scr = gtk_radio_button_new_with_label
7622 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
7625 radio_scr = gtk_radio_button_new_with_label
7626 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
7627 "only one screen on the current display");
7628 gtk_widget_set_sensitive (radio_scr, FALSE);
7630 combo_dpy = gtk_combo_new ();
7631 if (!valid_display_list)
7632 valid_display_list = g_list_append (valid_display_list, "diabolo:0.0");
7634 gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list);
7636 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry),
7637 "<hostname>:<X Server Num>.<Screen Num>");
7639 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
7640 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
7641 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
7643 bbox = gtk_hbutton_box_new ();
7644 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
7645 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
7647 gtk_container_add (GTK_CONTAINER (vbox), bbox);
7649 gtk_container_add (GTK_CONTAINER (bbox), applyb);
7650 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
7652 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
7654 scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry);
7655 scr_dpy_data->radio_dpy = radio_dpy;
7656 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
7657 scr_dpy_data->dialog_window = window;
7658 scr_dpy_data->valid_display_list = valid_display_list;
7660 g_signal_connect (cancelb, "clicked",
7661 G_CALLBACK (screen_display_destroy_diag), window);
7662 g_signal_connect (applyb, "clicked",
7663 G_CALLBACK (screen_display_check), scr_dpy_data);
7664 gtk_widget_show_all (window);
7669 static gboolean event_watcher_enter_id = 0;
7670 static gboolean event_watcher_leave_id = 0;
7673 event_watcher (GSignalInvocationHint *ihint,
7674 guint n_param_values,
7675 const GValue *param_values,
7678 g_print ("Watch: \"%s\" emitted for %s\n",
7679 g_signal_name (ihint->signal_id),
7680 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
7686 event_watcher_down (void)
7688 if (event_watcher_enter_id)
7692 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7693 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
7694 event_watcher_enter_id = 0;
7695 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7696 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
7697 event_watcher_leave_id = 0;
7702 event_watcher_toggle (void)
7704 if (event_watcher_enter_id)
7705 event_watcher_down ();
7710 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
7711 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7712 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
7713 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
7718 create_event_watcher (GtkWidget *widget)
7724 dialog_window = gtk_dialog_new ();
7725 gtk_window_set_screen (GTK_WINDOW (dialog_window),
7726 gtk_widget_get_screen (widget));
7728 g_signal_connect (dialog_window, "destroy",
7729 G_CALLBACK (gtk_widget_destroyed),
7731 g_signal_connect (dialog_window, "destroy",
7732 G_CALLBACK (event_watcher_down),
7735 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
7736 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
7737 gtk_widget_set_size_request (dialog_window, 200, 110);
7739 button = gtk_toggle_button_new_with_label ("Activate Watch");
7740 g_signal_connect (button, "clicked",
7741 G_CALLBACK (event_watcher_toggle),
7743 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
7744 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
7745 button, TRUE, TRUE, 0);
7746 gtk_widget_show (button);
7748 button = gtk_button_new_with_label ("Close");
7749 g_signal_connect_swapped (button, "clicked",
7750 G_CALLBACK (gtk_widget_destroy),
7752 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7753 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
7754 button, TRUE, TRUE, 0);
7755 gtk_widget_grab_default (button);
7756 gtk_widget_show (button);
7759 if (!GTK_WIDGET_VISIBLE (dialog_window))
7760 gtk_widget_show (dialog_window);
7762 gtk_widget_destroy (dialog_window);
7770 reformat_value (GtkScale *scale,
7773 return g_strdup_printf ("-->%0.*g<--",
7774 gtk_scale_get_digits (scale), value);
7778 create_range_controls (GtkWidget *widget)
7780 static GtkWidget *window = NULL;
7784 GtkWidget *scrollbar;
7786 GtkWidget *separator;
7787 GtkObject *adjustment;
7792 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7794 gtk_window_set_screen (GTK_WINDOW (window),
7795 gtk_widget_get_screen (widget));
7797 g_signal_connect (window, "destroy",
7798 G_CALLBACK (gtk_widget_destroyed),
7801 gtk_window_set_title (GTK_WINDOW (window), "range controls");
7802 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7805 box1 = gtk_vbox_new (FALSE, 0);
7806 gtk_container_add (GTK_CONTAINER (window), box1);
7807 gtk_widget_show (box1);
7810 box2 = gtk_vbox_new (FALSE, 10);
7811 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7812 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
7813 gtk_widget_show (box2);
7816 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
7818 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7819 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
7820 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
7821 gtk_scale_set_digits (GTK_SCALE (scale), 1);
7822 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7823 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7824 gtk_widget_show (scale);
7826 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
7827 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
7828 GTK_UPDATE_CONTINUOUS);
7829 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
7830 gtk_widget_show (scrollbar);
7832 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
7833 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7834 g_signal_connect (scale,
7836 G_CALLBACK (reformat_value),
7838 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
7839 gtk_widget_show (scale);
7841 hbox = gtk_hbox_new (FALSE, 0);
7843 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7844 gtk_widget_set_size_request (scale, -1, 200);
7845 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7846 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7847 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7848 gtk_widget_show (scale);
7850 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7851 gtk_widget_set_size_request (scale, -1, 200);
7852 gtk_scale_set_digits (GTK_SCALE (scale), 2);
7853 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7854 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
7855 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7856 gtk_widget_show (scale);
7858 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
7859 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
7860 g_signal_connect (scale,
7862 G_CALLBACK (reformat_value),
7864 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
7865 gtk_widget_show (scale);
7868 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
7869 gtk_widget_show (hbox);
7871 separator = gtk_hseparator_new ();
7872 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7873 gtk_widget_show (separator);
7876 box2 = gtk_vbox_new (FALSE, 10);
7877 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7878 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7879 gtk_widget_show (box2);
7882 button = gtk_button_new_with_label ("close");
7883 g_signal_connect_swapped (button, "clicked",
7884 G_CALLBACK (gtk_widget_destroy),
7886 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7887 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
7888 gtk_widget_grab_default (button);
7889 gtk_widget_show (button);
7892 if (!GTK_WIDGET_VISIBLE (window))
7893 gtk_widget_show (window);
7895 gtk_widget_destroy (window);
7903 create_rulers (GtkWidget *widget)
7905 static GtkWidget *window = NULL;
7911 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7913 gtk_window_set_screen (GTK_WINDOW (window),
7914 gtk_widget_get_screen (widget));
7916 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
7918 g_signal_connect (window, "destroy",
7919 G_CALLBACK (gtk_widget_destroyed),
7922 gtk_window_set_title (GTK_WINDOW (window), "rulers");
7923 gtk_widget_set_size_request (window, 300, 300);
7924 gtk_widget_set_events (window,
7925 GDK_POINTER_MOTION_MASK
7926 | GDK_POINTER_MOTION_HINT_MASK);
7927 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7929 table = gtk_table_new (2, 2, FALSE);
7930 gtk_container_add (GTK_CONTAINER (window), table);
7931 gtk_widget_show (table);
7933 ruler = gtk_hruler_new ();
7934 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
7935 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
7937 g_signal_connect_swapped (window,
7938 "motion_notify_event",
7939 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7942 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
7943 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
7944 gtk_widget_show (ruler);
7947 ruler = gtk_vruler_new ();
7948 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
7950 g_signal_connect_swapped (window,
7951 "motion_notify_event",
7952 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
7955 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
7956 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
7957 gtk_widget_show (ruler);
7960 if (!GTK_WIDGET_VISIBLE (window))
7961 gtk_widget_show (window);
7963 gtk_widget_destroy (window);
7967 text_toggle_editable (GtkWidget *checkbutton,
7970 gtk_text_set_editable(GTK_TEXT(text),
7971 GTK_TOGGLE_BUTTON(checkbutton)->active);
7975 text_toggle_word_wrap (GtkWidget *checkbutton,
7978 gtk_text_set_word_wrap(GTK_TEXT(text),
7979 GTK_TOGGLE_BUTTON(checkbutton)->active);
7986 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
7987 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
7988 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
7989 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
7990 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
7991 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
7992 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
7993 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
7996 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
8002 text_insert_random (GtkWidget *w, GtkText *text)
8006 for (i=0; i<10; i++)
8008 c = 'A' + rand() % ('Z' - 'A');
8009 gtk_text_set_point (text, rand() % gtk_text_get_length (text));
8010 gtk_text_insert (text, NULL, NULL, NULL, &c, 1);
8015 create_text (GtkWidget *widget)
8019 static GtkWidget *window = NULL;
8025 GtkWidget *separator;
8026 GtkWidget *scrolled_window;
8033 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8034 gtk_window_set_screen (GTK_WINDOW (window),
8035 gtk_widget_get_screen (widget));
8037 gtk_widget_set_name (window, "text window");
8038 g_object_set (window, "allow_shrink", TRUE, "allow_grow", TRUE, NULL);
8039 gtk_widget_set_size_request (window, 500, 500);
8041 g_signal_connect (window, "destroy",
8042 G_CALLBACK (gtk_widget_destroyed),
8045 gtk_window_set_title (GTK_WINDOW (window), "test");
8046 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8049 box1 = gtk_vbox_new (FALSE, 0);
8050 gtk_container_add (GTK_CONTAINER (window), box1);
8051 gtk_widget_show (box1);
8054 box2 = gtk_vbox_new (FALSE, 10);
8055 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8056 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
8057 gtk_widget_show (box2);
8060 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
8061 gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
8062 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
8065 gtk_widget_show (scrolled_window);
8067 text = gtk_text_new (NULL, NULL);
8068 gtk_text_set_editable (GTK_TEXT (text), TRUE);
8069 gtk_container_add (GTK_CONTAINER (scrolled_window), text);
8070 gtk_widget_grab_focus (text);
8071 gtk_widget_show (text);
8074 gtk_text_freeze (GTK_TEXT (text));
8076 for (i=0; i<ntext_colors; i++)
8078 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
8079 text_colors[i].name, -1);
8080 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\t", -1);
8082 for (j=0; j<ntext_colors; j++)
8084 gtk_text_insert (GTK_TEXT (text), NULL,
8085 &text_colors[j].color, &text_colors[i].color,
8088 gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, "\n", -1);
8091 infile = fopen("testgtk.c", "r");
8096 int nbytes_read, nbytes_alloc;
8099 nbytes_alloc = 1024;
8100 buffer = g_new (char, nbytes_alloc);
8104 if (nbytes_alloc < nbytes_read + 1024)
8107 buffer = g_realloc (buffer, nbytes_alloc);
8109 len = fread (buffer + nbytes_read, 1, 1024, infile);
8115 gtk_text_insert (GTK_TEXT (text), NULL, NULL,
8116 NULL, buffer, nbytes_read);
8121 gtk_text_thaw (GTK_TEXT (text));
8123 hbox = gtk_hbutton_box_new ();
8124 gtk_box_pack_start (GTK_BOX (box2), hbox, FALSE, FALSE, 0);
8125 gtk_widget_show (hbox);
8127 check = gtk_check_button_new_with_label("Editable");
8128 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
8129 g_signal_connect (check, "toggled",
8130 G_CALLBACK (text_toggle_editable), text);
8131 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
8132 gtk_widget_show (check);
8134 check = gtk_check_button_new_with_label("Wrap Words");
8135 gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, TRUE, 0);
8136 g_signal_connect (check, "toggled",
8137 G_CALLBACK (text_toggle_word_wrap), text);
8138 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
8139 gtk_widget_show (check);
8141 separator = gtk_hseparator_new ();
8142 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
8143 gtk_widget_show (separator);
8146 box2 = gtk_vbox_new (FALSE, 10);
8147 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8148 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8149 gtk_widget_show (box2);
8152 button = gtk_button_new_with_label ("insert random");
8153 g_signal_connect (button, "clicked",
8154 G_CALLBACK (text_insert_random),
8156 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8157 gtk_widget_show (button);
8159 button = gtk_button_new_with_label ("close");
8160 g_signal_connect_swapped (button, "clicked",
8161 G_CALLBACK (gtk_widget_destroy),
8163 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8164 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8165 gtk_widget_grab_default (button);
8166 gtk_widget_show (button);
8169 if (!GTK_WIDGET_VISIBLE (window))
8170 gtk_widget_show (window);
8172 gtk_widget_destroy (window);
8179 GdkPixbuf *book_open;
8180 GdkPixbuf *book_closed;
8181 GtkWidget *sample_notebook;
8184 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
8186 GtkWidget *page_widget;
8189 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
8191 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
8192 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
8194 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
8195 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
8199 page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
8201 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
8202 gint old_page_num = gtk_notebook_get_current_page (notebook);
8204 if (page_num == old_page_num)
8207 set_page_image (notebook, page_num, book_open);
8209 if (old_page_num != -1)
8210 set_page_image (notebook, old_page_num, book_closed);
8214 tab_fill (GtkToggleButton *button, GtkWidget *child)
8217 GtkPackType pack_type;
8219 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8220 &expand, NULL, &pack_type);
8221 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8222 expand, button->active, pack_type);
8226 tab_expand (GtkToggleButton *button, GtkWidget *child)
8229 GtkPackType pack_type;
8231 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8232 NULL, &fill, &pack_type);
8233 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8234 button->active, fill, pack_type);
8238 tab_pack (GtkToggleButton *button, GtkWidget *child)
8244 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8245 &expand, &fill, NULL);
8246 gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (sample_notebook), child,
8247 expand, fill, button->active);
8251 create_pages (GtkNotebook *notebook, gint start, gint end)
8253 GtkWidget *child = NULL;
8258 GtkWidget *label_box;
8259 GtkWidget *menu_box;
8263 char accel_buffer[32];
8265 for (i = start; i <= end; i++)
8267 sprintf (buffer, "Page %d", i);
8268 sprintf (accel_buffer, "Page _%d", i);
8270 child = gtk_frame_new (buffer);
8271 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
8273 vbox = gtk_vbox_new (TRUE,0);
8274 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8275 gtk_container_add (GTK_CONTAINER (child), vbox);
8277 hbox = gtk_hbox_new (TRUE,0);
8278 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
8280 button = gtk_check_button_new_with_label ("Fill Tab");
8281 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8282 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8283 g_signal_connect (button, "toggled",
8284 G_CALLBACK (tab_fill), child);
8286 button = gtk_check_button_new_with_label ("Expand Tab");
8287 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8288 g_signal_connect (button, "toggled",
8289 G_CALLBACK (tab_expand), child);
8291 button = gtk_check_button_new_with_label ("Pack end");
8292 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
8293 g_signal_connect (button, "toggled",
8294 G_CALLBACK (tab_pack), child);
8296 button = gtk_button_new_with_label ("Hide Page");
8297 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
8298 g_signal_connect_swapped (button, "clicked",
8299 G_CALLBACK (gtk_widget_hide),
8302 gtk_widget_show_all (child);
8304 label_box = gtk_hbox_new (FALSE, 0);
8305 pixwid = gtk_image_new_from_pixbuf (book_closed);
8306 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
8308 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
8309 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
8310 label = gtk_label_new_with_mnemonic (accel_buffer);
8311 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
8312 gtk_widget_show_all (label_box);
8315 menu_box = gtk_hbox_new (FALSE, 0);
8316 pixwid = gtk_image_new_from_pixbuf (book_closed);
8317 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
8319 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
8320 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
8321 label = gtk_label_new (buffer);
8322 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
8323 gtk_widget_show_all (menu_box);
8325 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
8330 rotate_notebook (GtkButton *button,
8331 GtkNotebook *notebook)
8333 gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos + 1) % 4);
8337 show_all_pages (GtkButton *button,
8338 GtkNotebook *notebook)
8340 gtk_container_foreach (GTK_CONTAINER (notebook),
8341 (GtkCallback) gtk_widget_show, NULL);
8345 notebook_type_changed (GtkWidget *optionmenu,
8348 GtkNotebook *notebook;
8358 notebook = GTK_NOTEBOOK (data);
8360 c = gtk_option_menu_get_history (GTK_OPTION_MENU (optionmenu));
8365 /* standard notebook */
8366 gtk_notebook_set_show_tabs (notebook, TRUE);
8367 gtk_notebook_set_show_border (notebook, TRUE);
8368 gtk_notebook_set_scrollable (notebook, FALSE);
8372 /* notabs notebook */
8373 gtk_notebook_set_show_tabs (notebook, FALSE);
8374 gtk_notebook_set_show_border (notebook, TRUE);
8379 gtk_notebook_set_show_tabs (notebook, FALSE);
8380 gtk_notebook_set_show_border (notebook, FALSE);
8385 gtk_notebook_set_show_tabs (notebook, TRUE);
8386 gtk_notebook_set_show_border (notebook, TRUE);
8387 gtk_notebook_set_scrollable (notebook, TRUE);
8388 if (g_list_length (notebook->children) == 5)
8389 create_pages (notebook, 6, 15);
8395 if (g_list_length (notebook->children) == 15)
8396 for (i = 0; i < 10; i++)
8397 gtk_notebook_remove_page (notebook, 5);
8401 notebook_popup (GtkToggleButton *button,
8402 GtkNotebook *notebook)
8405 gtk_notebook_popup_enable (notebook);
8407 gtk_notebook_popup_disable (notebook);
8411 notebook_homogeneous (GtkToggleButton *button,
8412 GtkNotebook *notebook)
8414 g_object_set (notebook, "homogeneous", button->active, NULL);
8418 create_notebook (GtkWidget *widget)
8420 static GtkWidget *window = NULL;
8424 GtkWidget *separator;
8428 static gchar *items[] =
8438 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8439 gtk_window_set_screen (GTK_WINDOW (window),
8440 gtk_widget_get_screen (widget));
8442 g_signal_connect (window, "destroy",
8443 G_CALLBACK (gtk_widget_destroyed),
8446 gtk_window_set_title (GTK_WINDOW (window), "notebook");
8447 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8449 box1 = gtk_vbox_new (FALSE, 0);
8450 gtk_container_add (GTK_CONTAINER (window), box1);
8452 sample_notebook = gtk_notebook_new ();
8453 g_signal_connect (sample_notebook, "switch_page",
8454 G_CALLBACK (page_switch), NULL);
8455 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
8456 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
8457 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
8459 gtk_widget_realize (sample_notebook);
8462 book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm);
8465 book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm);
8467 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
8469 separator = gtk_hseparator_new ();
8470 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
8472 box2 = gtk_hbox_new (FALSE, 5);
8473 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8474 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8476 button = gtk_check_button_new_with_label ("popup menu");
8477 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
8478 g_signal_connect (button, "clicked",
8479 G_CALLBACK (notebook_popup),
8482 button = gtk_check_button_new_with_label ("homogeneous tabs");
8483 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
8484 g_signal_connect (button, "clicked",
8485 G_CALLBACK (notebook_homogeneous),
8488 box2 = gtk_hbox_new (FALSE, 5);
8489 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8490 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8492 label = gtk_label_new ("Notebook Style :");
8493 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
8495 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
8496 notebook_type_changed,
8498 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
8500 button = gtk_button_new_with_label ("Show all Pages");
8501 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
8502 g_signal_connect (button, "clicked",
8503 G_CALLBACK (show_all_pages), sample_notebook);
8505 box2 = gtk_hbox_new (TRUE, 10);
8506 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
8507 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
8509 button = gtk_button_new_with_label ("prev");
8510 g_signal_connect_swapped (button, "clicked",
8511 G_CALLBACK (gtk_notebook_prev_page),
8513 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8515 button = gtk_button_new_with_label ("next");
8516 g_signal_connect_swapped (button, "clicked",
8517 G_CALLBACK (gtk_notebook_next_page),
8519 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8521 button = gtk_button_new_with_label ("rotate");
8522 g_signal_connect (button, "clicked",
8523 G_CALLBACK (rotate_notebook), sample_notebook);
8524 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
8526 separator = gtk_hseparator_new ();
8527 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
8529 button = gtk_button_new_with_label ("close");
8530 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
8531 g_signal_connect_swapped (button, "clicked",
8532 G_CALLBACK (gtk_widget_destroy),
8534 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
8535 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
8536 gtk_widget_grab_default (button);
8539 if (!GTK_WIDGET_VISIBLE (window))
8540 gtk_widget_show_all (window);
8542 gtk_widget_destroy (window);
8550 toggle_resize (GtkWidget *widget, GtkWidget *child)
8552 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
8553 GValue value = { 0, };
8554 g_value_init (&value, G_TYPE_BOOLEAN);
8555 gtk_container_child_get_property (container, child, "resize", &value);
8556 g_value_set_boolean (&value, !g_value_get_boolean (&value));
8557 gtk_container_child_set_property (container, child, "resize", &value);
8561 toggle_shrink (GtkWidget *widget, GtkWidget *child)
8563 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
8564 GValue value = { 0, };
8565 g_value_init (&value, G_TYPE_BOOLEAN);
8566 gtk_container_child_get_property (container, child, "shrink", &value);
8567 g_value_set_boolean (&value, !g_value_get_boolean (&value));
8568 gtk_container_child_set_property (container, child, "shrink", &value);
8572 paned_props_clicked (GtkWidget *button,
8575 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
8577 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
8581 create_pane_options (GtkPaned *paned,
8582 const gchar *frame_label,
8583 const gchar *label1,
8584 const gchar *label2)
8590 GtkWidget *check_button;
8592 frame = gtk_frame_new (frame_label);
8593 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
8595 table = gtk_table_new (4, 2, 4);
8596 gtk_container_add (GTK_CONTAINER (frame), table);
8598 label = gtk_label_new (label1);
8599 gtk_table_attach_defaults (GTK_TABLE (table), label,
8602 check_button = gtk_check_button_new_with_label ("Resize");
8603 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8605 g_signal_connect (check_button, "toggled",
8606 G_CALLBACK (toggle_resize),
8609 check_button = gtk_check_button_new_with_label ("Shrink");
8610 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8612 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8614 g_signal_connect (check_button, "toggled",
8615 G_CALLBACK (toggle_shrink),
8618 label = gtk_label_new (label2);
8619 gtk_table_attach_defaults (GTK_TABLE (table), label,
8622 check_button = gtk_check_button_new_with_label ("Resize");
8623 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8625 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8627 g_signal_connect (check_button, "toggled",
8628 G_CALLBACK (toggle_resize),
8631 check_button = gtk_check_button_new_with_label ("Shrink");
8632 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
8634 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
8636 g_signal_connect (check_button, "toggled",
8637 G_CALLBACK (toggle_shrink),
8640 button = gtk_button_new_with_mnemonic ("_Properties");
8641 gtk_table_attach_defaults (GTK_TABLE (table), button,
8643 g_signal_connect (button, "clicked",
8644 G_CALLBACK (paned_props_clicked),
8651 create_panes (GtkWidget *widget)
8653 static GtkWidget *window = NULL;
8662 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8664 gtk_window_set_screen (GTK_WINDOW (window),
8665 gtk_widget_get_screen (widget));
8667 g_signal_connect (window, "destroy",
8668 G_CALLBACK (gtk_widget_destroyed),
8671 gtk_window_set_title (GTK_WINDOW (window), "Panes");
8672 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
8674 vbox = gtk_vbox_new (FALSE, 0);
8675 gtk_container_add (GTK_CONTAINER (window), vbox);
8677 vpaned = gtk_vpaned_new ();
8678 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
8679 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
8681 hpaned = gtk_hpaned_new ();
8682 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
8684 frame = gtk_frame_new (NULL);
8685 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8686 gtk_widget_set_size_request (frame, 60, 60);
8687 gtk_paned_add1 (GTK_PANED (hpaned), frame);
8689 button = gtk_button_new_with_label ("Hi there");
8690 gtk_container_add (GTK_CONTAINER(frame), button);
8692 frame = gtk_frame_new (NULL);
8693 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8694 gtk_widget_set_size_request (frame, 80, 60);
8695 gtk_paned_add2 (GTK_PANED (hpaned), frame);
8697 frame = gtk_frame_new (NULL);
8698 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
8699 gtk_widget_set_size_request (frame, 60, 80);
8700 gtk_paned_add2 (GTK_PANED (vpaned), frame);
8702 /* Now create toggle buttons to control sizing */
8704 gtk_box_pack_start (GTK_BOX (vbox),
8705 create_pane_options (GTK_PANED (hpaned),
8711 gtk_box_pack_start (GTK_BOX (vbox),
8712 create_pane_options (GTK_PANED (vpaned),
8718 gtk_widget_show_all (vbox);
8721 if (!GTK_WIDGET_VISIBLE (window))
8722 gtk_widget_show (window);
8724 gtk_widget_destroy (window);
8728 * Paned keyboard navigation
8732 paned_keyboard_window1 (GtkWidget *widget)
8755 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8756 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
8757 gtk_window_set_screen (GTK_WINDOW (window1),
8758 gtk_widget_get_screen (widget));
8760 hpaned1 = gtk_hpaned_new ();
8761 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
8763 frame1 = gtk_frame_new (NULL);
8764 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
8765 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
8767 vbox1 = gtk_vbox_new (FALSE, 0);
8768 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
8770 button7 = gtk_button_new_with_label ("button7");
8771 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
8773 button8 = gtk_button_new_with_label ("button8");
8774 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
8776 button9 = gtk_button_new_with_label ("button9");
8777 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
8779 vpaned1 = gtk_vpaned_new ();
8780 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
8782 frame2 = gtk_frame_new (NULL);
8783 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
8784 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
8786 frame5 = gtk_frame_new (NULL);
8787 gtk_container_add (GTK_CONTAINER (frame2), frame5);
8789 hbox1 = gtk_hbox_new (FALSE, 0);
8790 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
8792 button5 = gtk_button_new_with_label ("button5");
8793 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
8795 button6 = gtk_button_new_with_label ("button6");
8796 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
8798 frame3 = gtk_frame_new (NULL);
8799 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
8800 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
8802 frame4 = gtk_frame_new ("Buttons");
8803 gtk_container_add (GTK_CONTAINER (frame3), frame4);
8804 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
8806 table1 = gtk_table_new (2, 2, FALSE);
8807 gtk_container_add (GTK_CONTAINER (frame4), table1);
8808 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
8810 button1 = gtk_button_new_with_label ("button1");
8811 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
8812 (GtkAttachOptions) (GTK_FILL),
8813 (GtkAttachOptions) (0), 0, 0);
8815 button2 = gtk_button_new_with_label ("button2");
8816 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
8817 (GtkAttachOptions) (GTK_FILL),
8818 (GtkAttachOptions) (0), 0, 0);
8820 button3 = gtk_button_new_with_label ("button3");
8821 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
8822 (GtkAttachOptions) (GTK_FILL),
8823 (GtkAttachOptions) (0), 0, 0);
8825 button4 = gtk_button_new_with_label ("button4");
8826 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
8827 (GtkAttachOptions) (GTK_FILL),
8828 (GtkAttachOptions) (0), 0, 0);
8834 paned_keyboard_window2 (GtkWidget *widget)
8839 GtkWidget *button13;
8843 GtkWidget *button12;
8845 GtkWidget *button11;
8846 GtkWidget *button10;
8848 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8849 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
8851 gtk_window_set_screen (GTK_WINDOW (window2),
8852 gtk_widget_get_screen (widget));
8854 hpaned2 = gtk_hpaned_new ();
8855 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
8857 frame6 = gtk_frame_new (NULL);
8858 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
8859 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
8861 button13 = gtk_button_new_with_label ("button13");
8862 gtk_container_add (GTK_CONTAINER (frame6), button13);
8864 hbox2 = gtk_hbox_new (FALSE, 0);
8865 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
8867 vpaned2 = gtk_vpaned_new ();
8868 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
8870 frame7 = gtk_frame_new (NULL);
8871 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
8872 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
8874 button12 = gtk_button_new_with_label ("button12");
8875 gtk_container_add (GTK_CONTAINER (frame7), button12);
8877 frame8 = gtk_frame_new (NULL);
8878 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
8879 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
8881 button11 = gtk_button_new_with_label ("button11");
8882 gtk_container_add (GTK_CONTAINER (frame8), button11);
8884 button10 = gtk_button_new_with_label ("button10");
8885 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
8891 paned_keyboard_window3 (GtkWidget *widget)
8898 GtkWidget *button14;
8901 GtkWidget *button15;
8904 GtkWidget *button16;
8906 GtkWidget *button17;
8908 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8909 g_object_set_data (G_OBJECT (window3), "window3", window3);
8910 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
8912 gtk_window_set_screen (GTK_WINDOW (window3),
8913 gtk_widget_get_screen (widget));
8916 vbox2 = gtk_vbox_new (FALSE, 0);
8917 gtk_container_add (GTK_CONTAINER (window3), vbox2);
8919 label1 = gtk_label_new ("Three panes nested inside each other");
8920 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
8922 hpaned3 = gtk_hpaned_new ();
8923 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
8925 frame9 = gtk_frame_new (NULL);
8926 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
8927 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
8929 button14 = gtk_button_new_with_label ("button14");
8930 gtk_container_add (GTK_CONTAINER (frame9), button14);
8932 hpaned4 = gtk_hpaned_new ();
8933 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
8935 frame10 = gtk_frame_new (NULL);
8936 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
8937 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
8939 button15 = gtk_button_new_with_label ("button15");
8940 gtk_container_add (GTK_CONTAINER (frame10), button15);
8942 hpaned5 = gtk_hpaned_new ();
8943 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
8945 frame11 = gtk_frame_new (NULL);
8946 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
8947 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
8949 button16 = gtk_button_new_with_label ("button16");
8950 gtk_container_add (GTK_CONTAINER (frame11), button16);
8952 frame12 = gtk_frame_new (NULL);
8953 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
8954 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
8956 button17 = gtk_button_new_with_label ("button17");
8957 gtk_container_add (GTK_CONTAINER (frame12), button17);
8963 paned_keyboard_window4 (GtkWidget *widget)
8970 GtkWidget *button19;
8971 GtkWidget *button18;
8974 GtkWidget *button21;
8975 GtkWidget *button20;
8977 GtkWidget *button23;
8978 GtkWidget *button22;
8980 GtkWidget *button25;
8981 GtkWidget *button24;
8983 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8984 g_object_set_data (G_OBJECT (window4), "window4", window4);
8985 gtk_window_set_title (GTK_WINDOW (window4), "window4");
8987 gtk_window_set_screen (GTK_WINDOW (window4),
8988 gtk_widget_get_screen (widget));
8990 vbox3 = gtk_vbox_new (FALSE, 0);
8991 gtk_container_add (GTK_CONTAINER (window4), vbox3);
8993 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
8994 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
8995 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
8997 hpaned6 = gtk_hpaned_new ();
8998 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
9000 vpaned3 = gtk_vpaned_new ();
9001 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
9003 button19 = gtk_button_new_with_label ("button19");
9004 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
9006 button18 = gtk_button_new_with_label ("button18");
9007 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
9009 hbox3 = gtk_hbox_new (FALSE, 0);
9010 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
9012 vpaned4 = gtk_vpaned_new ();
9013 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
9015 button21 = gtk_button_new_with_label ("button21");
9016 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
9018 button20 = gtk_button_new_with_label ("button20");
9019 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
9021 vpaned5 = gtk_vpaned_new ();
9022 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
9024 button23 = gtk_button_new_with_label ("button23");
9025 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
9027 button22 = gtk_button_new_with_label ("button22");
9028 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
9030 vpaned6 = gtk_vpaned_new ();
9031 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
9033 button25 = gtk_button_new_with_label ("button25");
9034 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
9036 button24 = gtk_button_new_with_label ("button24");
9037 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
9043 create_paned_keyboard_navigation (GtkWidget *widget)
9045 static GtkWidget *window1 = NULL;
9046 static GtkWidget *window2 = NULL;
9047 static GtkWidget *window3 = NULL;
9048 static GtkWidget *window4 = NULL;
9051 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
9053 gtk_widget_destroy (window1);
9054 gtk_widget_destroy (window2);
9055 gtk_widget_destroy (window3);
9056 gtk_widget_destroy (window4);
9061 window1 = paned_keyboard_window1 (widget);
9062 g_signal_connect (window1, "destroy",
9063 G_CALLBACK (gtk_widget_destroyed),
9069 window2 = paned_keyboard_window2 (widget);
9070 g_signal_connect (window2, "destroy",
9071 G_CALLBACK (gtk_widget_destroyed),
9077 window3 = paned_keyboard_window3 (widget);
9078 g_signal_connect (window3, "destroy",
9079 G_CALLBACK (gtk_widget_destroyed),
9085 window4 = paned_keyboard_window4 (widget);
9086 g_signal_connect (window4, "destroy",
9087 G_CALLBACK (gtk_widget_destroyed),
9091 if (GTK_WIDGET_VISIBLE (window1))
9092 gtk_widget_destroy (GTK_WIDGET (window1));
9094 gtk_widget_show_all (GTK_WIDGET (window1));
9096 if (GTK_WIDGET_VISIBLE (window2))
9097 gtk_widget_destroy (GTK_WIDGET (window2));
9099 gtk_widget_show_all (GTK_WIDGET (window2));
9101 if (GTK_WIDGET_VISIBLE (window3))
9102 gtk_widget_destroy (GTK_WIDGET (window3));
9104 gtk_widget_show_all (GTK_WIDGET (window3));
9106 if (GTK_WIDGET_VISIBLE (window4))
9107 gtk_widget_destroy (GTK_WIDGET (window4));
9109 gtk_widget_show_all (GTK_WIDGET (window4));
9117 typedef struct _cursoroffset {gint x,y;} CursorOffset;
9120 shape_pressed (GtkWidget *widget, GdkEventButton *event)
9124 /* ignore double and triple click */
9125 if (event->type != GDK_BUTTON_PRESS)
9128 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9129 p->x = (int) event->x;
9130 p->y = (int) event->y;
9132 gtk_grab_add (widget);
9133 gdk_pointer_grab (widget->window, TRUE,
9134 GDK_BUTTON_RELEASE_MASK |
9135 GDK_BUTTON_MOTION_MASK |
9136 GDK_POINTER_MOTION_HINT_MASK,
9141 shape_released (GtkWidget *widget)
9143 gtk_grab_remove (widget);
9144 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
9149 shape_motion (GtkWidget *widget,
9150 GdkEventMotion *event)
9154 GdkModifierType mask;
9156 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
9159 * Can't use event->x / event->y here
9160 * because I need absolute coordinates.
9162 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
9163 gtk_widget_set_uposition (widget, xp - p->x, yp - p->y);
9167 shape_create_icon (GdkScreen *screen,
9178 CursorOffset* icon_pos;
9180 GdkBitmap *gdk_pixmap_mask;
9181 GdkPixmap *gdk_pixmap;
9184 style = gtk_widget_get_default_style ();
9185 gc = style->black_gc;
9188 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
9190 window = gtk_window_new (window_type);
9191 gtk_window_set_screen (GTK_WINDOW (window), screen);
9193 fixed = gtk_fixed_new ();
9194 gtk_widget_set_size_request (fixed, 100, 100);
9195 gtk_container_add (GTK_CONTAINER (window), fixed);
9196 gtk_widget_show (fixed);
9198 gtk_widget_set_events (window,
9199 gtk_widget_get_events (window) |
9200 GDK_BUTTON_MOTION_MASK |
9201 GDK_POINTER_MOTION_HINT_MASK |
9202 GDK_BUTTON_PRESS_MASK);
9204 gtk_widget_realize (window);
9205 gdk_pixmap = gdk_pixmap_create_from_xpm (window->window, &gdk_pixmap_mask,
9206 &style->bg[GTK_STATE_NORMAL],
9209 pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
9210 gtk_fixed_put (GTK_FIXED (fixed), pixmap, px,py);
9211 gtk_widget_show (pixmap);
9213 gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px, py);
9215 g_object_unref (gdk_pixmap_mask);
9216 g_object_unref (gdk_pixmap);
9218 g_signal_connect (window, "button_press_event",
9219 G_CALLBACK (shape_pressed), NULL);
9220 g_signal_connect (window, "button_release_event",
9221 G_CALLBACK (shape_released), NULL);
9222 g_signal_connect (window, "motion_notify_event",
9223 G_CALLBACK (shape_motion), NULL);
9225 icon_pos = g_new (CursorOffset, 1);
9226 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
9228 gtk_widget_set_uposition (window, x, y);
9229 gtk_widget_show (window);
9235 create_shapes (GtkWidget *widget)
9237 /* Variables used by the Drag/Drop and Shape Window demos */
9238 static GtkWidget *modeller = NULL;
9239 static GtkWidget *sheets = NULL;
9240 static GtkWidget *rings = NULL;
9241 static GtkWidget *with_region = NULL;
9242 GdkScreen *screen = gtk_widget_get_screen (widget);
9244 if (!(file_exists ("Modeller.xpm") &&
9245 file_exists ("FilesQueue.xpm") &&
9246 file_exists ("3DRings.xpm")))
9252 modeller = shape_create_icon (screen, "Modeller.xpm",
9253 440, 140, 0,0, GTK_WINDOW_POPUP);
9255 g_signal_connect (modeller, "destroy",
9256 G_CALLBACK (gtk_widget_destroyed),
9260 gtk_widget_destroy (modeller);
9264 sheets = shape_create_icon (screen, "FilesQueue.xpm",
9265 580, 170, 0,0, GTK_WINDOW_POPUP);
9267 g_signal_connect (sheets, "destroy",
9268 G_CALLBACK (gtk_widget_destroyed),
9273 gtk_widget_destroy (sheets);
9277 rings = shape_create_icon (screen, "3DRings.xpm",
9278 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9280 g_signal_connect (rings, "destroy",
9281 G_CALLBACK (gtk_widget_destroyed),
9285 gtk_widget_destroy (rings);
9292 with_region = shape_create_icon (screen, "3DRings.xpm",
9293 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
9295 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
9297 g_signal_connect (with_region, "destroy",
9298 G_CALLBACK (gtk_widget_destroyed),
9301 /* reset shape from mask to a region */
9304 region = gdk_region_new ();
9316 gdk_region_union_with_rect (region, &rect);
9324 gdk_window_shape_combine_region (with_region->window,
9329 gtk_widget_destroy (with_region);
9337 create_wmhints (GtkWidget *widget)
9339 static GtkWidget *window = NULL;
9341 GtkWidget *separator;
9350 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9352 gtk_window_set_screen (GTK_WINDOW (window),
9353 gtk_widget_get_screen (widget));
9355 g_signal_connect (window, "destroy",
9356 G_CALLBACK (gtk_widget_destroyed),
9359 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
9360 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9362 gtk_widget_realize (window);
9364 circles = gdk_bitmap_create_from_data (window->window,
9368 gdk_window_set_icon (window->window, NULL,
9371 gdk_window_set_icon_name (window->window, "WMHints Test Icon");
9373 gdk_window_set_decorations (window->window, GDK_DECOR_ALL | GDK_DECOR_MENU);
9374 gdk_window_set_functions (window->window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
9376 box1 = gtk_vbox_new (FALSE, 0);
9377 gtk_container_add (GTK_CONTAINER (window), box1);
9378 gtk_widget_show (box1);
9380 label = gtk_label_new ("Try iconizing me!");
9381 gtk_widget_set_size_request (label, 150, 50);
9382 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
9383 gtk_widget_show (label);
9386 separator = gtk_hseparator_new ();
9387 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
9388 gtk_widget_show (separator);
9391 box2 = gtk_vbox_new (FALSE, 10);
9392 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
9393 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
9394 gtk_widget_show (box2);
9397 button = gtk_button_new_with_label ("close");
9399 g_signal_connect_swapped (button, "clicked",
9400 G_CALLBACK (gtk_widget_destroy),
9403 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
9404 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
9405 gtk_widget_grab_default (button);
9406 gtk_widget_show (button);
9409 if (!GTK_WIDGET_VISIBLE (window))
9410 gtk_widget_show (window);
9412 gtk_widget_destroy (window);
9417 * Window state tracking
9421 window_state_callback (GtkWidget *widget,
9422 GdkEventWindowState *event,
9425 GtkWidget *label = data;
9428 msg = g_strconcat (GTK_WINDOW (widget)->title, ": ",
9429 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
9430 "withdrawn" : "not withdrawn", ", ",
9431 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
9432 "iconified" : "not iconified", ", ",
9433 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
9434 "sticky" : "not sticky", ", ",
9435 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
9436 "maximized" : "not maximized", ", ",
9437 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
9438 "fullscreen" : "not fullscreen",
9441 gtk_label_set_text (GTK_LABEL (label), msg);
9449 tracking_label (GtkWidget *window)
9455 hbox = gtk_hbox_new (FALSE, 5);
9457 g_signal_connect_object (hbox,
9459 G_CALLBACK (gtk_widget_destroy),
9463 label = gtk_label_new ("<no window state events received>");
9464 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
9465 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
9467 g_signal_connect (window,
9468 "window_state_event",
9469 G_CALLBACK (window_state_callback),
9472 button = gtk_button_new_with_label ("Deiconify");
9473 g_signal_connect_object (button,
9475 G_CALLBACK (gtk_window_deiconify),
9478 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9480 button = gtk_button_new_with_label ("Iconify");
9481 g_signal_connect_object (button,
9483 G_CALLBACK (gtk_window_iconify),
9486 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9488 button = gtk_button_new_with_label ("Fullscreen");
9489 g_signal_connect_object (button,
9491 G_CALLBACK (gtk_window_fullscreen),
9494 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9496 button = gtk_button_new_with_label ("Unfullscreen");
9497 g_signal_connect_object (button,
9499 G_CALLBACK (gtk_window_unfullscreen),
9502 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9504 button = gtk_button_new_with_label ("Present");
9505 g_signal_connect_object (button,
9507 G_CALLBACK (gtk_window_present),
9510 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9512 button = gtk_button_new_with_label ("Show");
9513 g_signal_connect_object (button,
9515 G_CALLBACK (gtk_widget_show),
9518 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
9520 gtk_widget_show_all (hbox);
9526 get_state_controls (GtkWidget *window)
9531 vbox = gtk_vbox_new (FALSE, 0);
9533 button = gtk_button_new_with_label ("Stick");
9534 g_signal_connect_object (button,
9536 G_CALLBACK (gtk_window_stick),
9539 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9541 button = gtk_button_new_with_label ("Unstick");
9542 g_signal_connect_object (button,
9544 G_CALLBACK (gtk_window_unstick),
9547 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9549 button = gtk_button_new_with_label ("Maximize");
9550 g_signal_connect_object (button,
9552 G_CALLBACK (gtk_window_maximize),
9555 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9557 button = gtk_button_new_with_label ("Unmaximize");
9558 g_signal_connect_object (button,
9560 G_CALLBACK (gtk_window_unmaximize),
9563 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9565 button = gtk_button_new_with_label ("Iconify");
9566 g_signal_connect_object (button,
9568 G_CALLBACK (gtk_window_iconify),
9571 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9573 button = gtk_button_new_with_label ("Fullscreen");
9574 g_signal_connect_object (button,
9576 G_CALLBACK (gtk_window_fullscreen),
9579 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9581 button = gtk_button_new_with_label ("Unfullscreen");
9582 g_signal_connect_object (button,
9584 G_CALLBACK (gtk_window_unfullscreen),
9587 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9589 button = gtk_button_new_with_label ("Hide (withdraw)");
9590 g_signal_connect_object (button,
9592 G_CALLBACK (gtk_widget_hide),
9595 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9597 gtk_widget_show_all (vbox);
9603 create_window_states (GtkWidget *widget)
9605 static GtkWidget *window = NULL;
9608 GtkWidget *iconified;
9610 GtkWidget *controls;
9614 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9615 gtk_window_set_screen (GTK_WINDOW (window),
9616 gtk_widget_get_screen (widget));
9618 g_signal_connect (window, "destroy",
9619 G_CALLBACK (gtk_widget_destroyed),
9622 gtk_window_set_title (GTK_WINDOW (window), "Window states");
9624 box1 = gtk_vbox_new (FALSE, 0);
9625 gtk_container_add (GTK_CONTAINER (window), box1);
9627 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9629 gtk_window_set_screen (GTK_WINDOW (iconified),
9630 gtk_widget_get_screen (widget));
9632 g_signal_connect_object (iconified, "destroy",
9633 G_CALLBACK (gtk_widget_destroy),
9636 gtk_window_iconify (GTK_WINDOW (iconified));
9637 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
9638 controls = get_state_controls (iconified);
9639 gtk_container_add (GTK_CONTAINER (iconified), controls);
9641 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9643 gtk_window_set_screen (GTK_WINDOW (normal),
9644 gtk_widget_get_screen (widget));
9646 g_signal_connect_object (normal, "destroy",
9647 G_CALLBACK (gtk_widget_destroy),
9651 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
9652 controls = get_state_controls (normal);
9653 gtk_container_add (GTK_CONTAINER (normal), controls);
9655 label = tracking_label (iconified);
9656 gtk_container_add (GTK_CONTAINER (box1), label);
9658 label = tracking_label (normal);
9659 gtk_container_add (GTK_CONTAINER (box1), label);
9661 gtk_widget_show_all (iconified);
9662 gtk_widget_show_all (normal);
9663 gtk_widget_show_all (box1);
9666 if (!GTK_WIDGET_VISIBLE (window))
9667 gtk_widget_show (window);
9669 gtk_widget_destroy (window);
9677 configure_event_callback (GtkWidget *widget,
9678 GdkEventConfigure *event,
9681 GtkWidget *label = data;
9685 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
9687 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
9689 event->x, event->y, event->width, event->height,
9692 gtk_label_set_text (GTK_LABEL (label), msg);
9700 get_ints (GtkWidget *window,
9707 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
9708 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
9710 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
9711 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
9715 set_size_callback (GtkWidget *widget,
9720 get_ints (data, &w, &h);
9722 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
9726 unset_default_size_callback (GtkWidget *widget,
9729 gtk_window_set_default_size (g_object_get_data (data, "target"),
9734 set_default_size_callback (GtkWidget *widget,
9739 get_ints (data, &w, &h);
9741 gtk_window_set_default_size (g_object_get_data (data, "target"),
9746 unset_size_request_callback (GtkWidget *widget,
9749 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9754 set_size_request_callback (GtkWidget *widget,
9759 get_ints (data, &w, &h);
9761 gtk_widget_set_size_request (g_object_get_data (data, "target"),
9766 set_location_callback (GtkWidget *widget,
9771 get_ints (data, &x, &y);
9773 gtk_window_move (g_object_get_data (data, "target"), x, y);
9777 move_to_position_callback (GtkWidget *widget,
9783 window = g_object_get_data (data, "target");
9785 gtk_window_get_position (window, &x, &y);
9787 gtk_window_move (window, x, y);
9791 set_geometry_callback (GtkWidget *entry,
9797 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
9799 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
9801 if (!gtk_window_parse_geometry (target, text))
9802 g_print ("Bad geometry string '%s'\n", text);
9808 allow_shrink_callback (GtkWidget *widget,
9811 g_object_set (g_object_get_data (data, "target"),
9813 GTK_TOGGLE_BUTTON (widget)->active,
9818 allow_grow_callback (GtkWidget *widget,
9821 g_object_set (g_object_get_data (data, "target"),
9823 GTK_TOGGLE_BUTTON (widget)->active,
9828 gravity_selected (GtkWidget *widget,
9831 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
9832 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GDK_GRAVITY_NORTH_WEST);
9836 pos_selected (GtkWidget *widget,
9839 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
9840 gtk_option_menu_get_history (GTK_OPTION_MENU (widget)) + GTK_WIN_POS_NONE);
9844 move_gravity_window_to_current_position (GtkWidget *widget,
9850 window = GTK_WINDOW (data);
9852 gtk_window_get_position (window, &x, &y);
9854 gtk_window_move (window, x, y);
9858 get_screen_corner (GtkWindow *window,
9863 GdkScreen * screen = gtk_window_get_screen (window);
9865 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
9867 switch (gtk_window_get_gravity (window))
9869 case GDK_GRAVITY_SOUTH_EAST:
9870 *x = gdk_screen_get_width (screen) - w;
9871 *y = gdk_screen_get_height (screen) - h;
9874 case GDK_GRAVITY_NORTH_EAST:
9875 *x = gdk_screen_get_width (screen) - w;
9879 case GDK_GRAVITY_SOUTH_WEST:
9881 *y = gdk_screen_get_height (screen) - h;
9884 case GDK_GRAVITY_NORTH_WEST:
9889 case GDK_GRAVITY_SOUTH:
9890 *x = (gdk_screen_get_width (screen) - w) / 2;
9891 *y = gdk_screen_get_height (screen) - h;
9894 case GDK_GRAVITY_NORTH:
9895 *x = (gdk_screen_get_width (screen) - w) / 2;
9899 case GDK_GRAVITY_WEST:
9901 *y = (gdk_screen_get_height (screen) - h) / 2;
9904 case GDK_GRAVITY_EAST:
9905 *x = gdk_screen_get_width (screen) - w;
9906 *y = (gdk_screen_get_height (screen) - h) / 2;
9909 case GDK_GRAVITY_CENTER:
9910 *x = (gdk_screen_get_width (screen) - w) / 2;
9911 *y = (gdk_screen_get_height (screen) - h) / 2;
9914 case GDK_GRAVITY_STATIC:
9915 /* pick some random numbers */
9921 g_assert_not_reached ();
9927 move_gravity_window_to_starting_position (GtkWidget *widget,
9933 window = GTK_WINDOW (data);
9935 get_screen_corner (window,
9938 gtk_window_move (window, x, y);
9942 make_gravity_window (GtkWidget *destroy_with,
9951 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9953 gtk_window_set_screen (GTK_WINDOW (window),
9954 gtk_widget_get_screen (destroy_with));
9956 vbox = gtk_vbox_new (FALSE, 0);
9957 gtk_widget_show (vbox);
9959 gtk_container_add (GTK_CONTAINER (window), vbox);
9960 gtk_window_set_title (GTK_WINDOW (window), title);
9961 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
9963 g_signal_connect_object (destroy_with,
9965 G_CALLBACK (gtk_widget_destroy),
9970 button = gtk_button_new_with_mnemonic ("_Move to current position");
9972 g_signal_connect (button, "clicked",
9973 G_CALLBACK (move_gravity_window_to_current_position),
9976 gtk_container_add (GTK_CONTAINER (vbox), button);
9977 gtk_widget_show (button);
9979 button = gtk_button_new_with_mnemonic ("Move to _starting position");
9981 g_signal_connect (button, "clicked",
9982 G_CALLBACK (move_gravity_window_to_starting_position),
9985 gtk_container_add (GTK_CONTAINER (vbox), button);
9986 gtk_widget_show (button);
9988 /* Pretend this is the result of --geometry.
9989 * DO NOT COPY THIS CODE unless you are setting --geometry results,
9990 * and in that case you probably should just use gtk_window_parse_geometry().
9991 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
9992 * you are parsing --geometry or equivalent.
9994 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9998 gtk_window_set_default_size (GTK_WINDOW (window),
10001 get_screen_corner (GTK_WINDOW (window), &x, &y);
10003 gtk_window_move (GTK_WINDOW (window),
10010 do_gravity_test (GtkWidget *widget,
10013 GtkWidget *destroy_with = data;
10016 /* We put a window at each gravity point on the screen. */
10017 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
10019 gtk_widget_show (window);
10021 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
10023 gtk_widget_show (window);
10025 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
10027 gtk_widget_show (window);
10029 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
10031 gtk_widget_show (window);
10033 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
10035 gtk_widget_show (window);
10037 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
10039 gtk_widget_show (window);
10042 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
10044 gtk_widget_show (window);
10047 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
10049 gtk_widget_show (window);
10051 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
10053 gtk_widget_show (window);
10055 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
10057 gtk_widget_show (window);
10061 window_controls (GtkWidget *window)
10063 GtkWidget *control_window;
10068 GtkAdjustment *adj;
10074 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10076 gtk_window_set_screen (GTK_WINDOW (control_window),
10077 gtk_widget_get_screen (window));
10079 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
10081 g_object_set_data (G_OBJECT (control_window),
10085 g_signal_connect_object (control_window,
10087 G_CALLBACK (gtk_widget_destroy),
10089 G_CONNECT_SWAPPED);
10091 vbox = gtk_vbox_new (FALSE, 5);
10093 gtk_container_add (GTK_CONTAINER (control_window), vbox);
10095 label = gtk_label_new ("<no configure events>");
10096 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
10098 g_signal_connect (window,
10100 G_CALLBACK (configure_event_callback),
10103 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10105 spin = gtk_spin_button_new (adj, 0, 0);
10107 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10109 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
10111 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
10113 spin = gtk_spin_button_new (adj, 0, 0);
10115 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
10117 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
10119 entry = gtk_entry_new ();
10120 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
10122 g_signal_connect (entry, "changed",
10123 G_CALLBACK (set_geometry_callback),
10126 button = gtk_button_new_with_label ("Show gravity test windows");
10127 g_signal_connect_swapped (button,
10129 G_CALLBACK (do_gravity_test),
10131 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10133 button = gtk_button_new_with_label ("Reshow with initial size");
10134 g_signal_connect_object (button,
10136 G_CALLBACK (gtk_window_reshow_with_initial_size),
10138 G_CONNECT_SWAPPED);
10139 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10141 button = gtk_button_new_with_label ("Queue resize");
10142 g_signal_connect_object (button,
10144 G_CALLBACK (gtk_widget_queue_resize),
10146 G_CONNECT_SWAPPED);
10147 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10149 button = gtk_button_new_with_label ("Resize");
10150 g_signal_connect (button,
10152 G_CALLBACK (set_size_callback),
10154 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10156 button = gtk_button_new_with_label ("Set default size");
10157 g_signal_connect (button,
10159 G_CALLBACK (set_default_size_callback),
10161 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10163 button = gtk_button_new_with_label ("Unset default size");
10164 g_signal_connect (button,
10166 G_CALLBACK (unset_default_size_callback),
10168 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10170 button = gtk_button_new_with_label ("Set size request");
10171 g_signal_connect (button,
10173 G_CALLBACK (set_size_request_callback),
10175 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10177 button = gtk_button_new_with_label ("Unset size request");
10178 g_signal_connect (button,
10180 G_CALLBACK (unset_size_request_callback),
10182 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10184 button = gtk_button_new_with_label ("Move");
10185 g_signal_connect (button,
10187 G_CALLBACK (set_location_callback),
10189 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10191 button = gtk_button_new_with_label ("Move to current position");
10192 g_signal_connect (button,
10194 G_CALLBACK (move_to_position_callback),
10196 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10198 button = gtk_check_button_new_with_label ("Allow shrink");
10199 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
10200 g_signal_connect (button,
10202 G_CALLBACK (allow_shrink_callback),
10204 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10206 button = gtk_check_button_new_with_label ("Allow grow");
10207 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
10208 g_signal_connect (button,
10210 G_CALLBACK (allow_grow_callback),
10212 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10214 button = gtk_button_new_with_mnemonic ("_Show");
10215 g_signal_connect_object (button,
10217 G_CALLBACK (gtk_widget_show),
10219 G_CONNECT_SWAPPED);
10220 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10222 button = gtk_button_new_with_mnemonic ("_Hide");
10223 g_signal_connect_object (button,
10225 G_CALLBACK (gtk_widget_hide),
10227 G_CONNECT_SWAPPED);
10228 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10230 menu = gtk_menu_new ();
10236 static gchar *names[] = {
10237 "GDK_GRAVITY_NORTH_WEST",
10238 "GDK_GRAVITY_NORTH",
10239 "GDK_GRAVITY_NORTH_EAST",
10240 "GDK_GRAVITY_WEST",
10241 "GDK_GRAVITY_CENTER",
10242 "GDK_GRAVITY_EAST",
10243 "GDK_GRAVITY_SOUTH_WEST",
10244 "GDK_GRAVITY_SOUTH",
10245 "GDK_GRAVITY_SOUTH_EAST",
10246 "GDK_GRAVITY_STATIC",
10250 g_assert (names[i]);
10252 mi = gtk_menu_item_new_with_label (names[i]);
10254 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10259 gtk_widget_show_all (menu);
10261 om = gtk_option_menu_new ();
10262 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10265 g_signal_connect (om,
10267 G_CALLBACK (gravity_selected),
10270 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10273 menu = gtk_menu_new ();
10279 static gchar *names[] = {
10280 "GTK_WIN_POS_NONE",
10281 "GTK_WIN_POS_CENTER",
10282 "GTK_WIN_POS_MOUSE",
10283 "GTK_WIN_POS_CENTER_ALWAYS",
10284 "GTK_WIN_POS_CENTER_ON_PARENT",
10288 g_assert (names[i]);
10290 mi = gtk_menu_item_new_with_label (names[i]);
10292 gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
10297 gtk_widget_show_all (menu);
10299 om = gtk_option_menu_new ();
10300 gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
10303 g_signal_connect (om,
10305 G_CALLBACK (pos_selected),
10308 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
10310 gtk_widget_show_all (vbox);
10312 return control_window;
10316 create_window_sizing (GtkWidget *widget)
10318 static GtkWidget *window = NULL;
10319 static GtkWidget *target_window = NULL;
10321 if (!target_window)
10325 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10326 gtk_window_set_screen (GTK_WINDOW (target_window),
10327 gtk_widget_get_screen (widget));
10328 label = gtk_label_new (NULL);
10329 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");
10330 gtk_container_add (GTK_CONTAINER (target_window), label);
10331 gtk_widget_show (label);
10333 g_signal_connect (target_window, "destroy",
10334 G_CALLBACK (gtk_widget_destroyed),
10337 window = window_controls (target_window);
10339 g_signal_connect (window, "destroy",
10340 G_CALLBACK (gtk_widget_destroyed),
10343 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
10346 /* don't show target window by default, we want to allow testing
10347 * of behavior on first show.
10350 if (!GTK_WIDGET_VISIBLE (window))
10351 gtk_widget_show (window);
10353 gtk_widget_destroy (window);
10360 typedef struct _ProgressData {
10363 GtkWidget *block_spin;
10364 GtkWidget *x_align_spin;
10365 GtkWidget *y_align_spin;
10366 GtkWidget *step_spin;
10367 GtkWidget *act_blocks_spin;
10376 progress_timeout (gpointer data)
10379 GtkAdjustment *adj;
10381 adj = GTK_PROGRESS (data)->adjustment;
10383 new_val = adj->value + 1;
10384 if (new_val > adj->upper)
10385 new_val = adj->lower;
10387 gtk_progress_set_value (GTK_PROGRESS (data), new_val);
10393 destroy_progress (GtkWidget *widget,
10394 ProgressData **pdata)
10396 gtk_timeout_remove ((*pdata)->timer);
10397 (*pdata)->timer = 0;
10398 (*pdata)->window = NULL;
10404 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
10406 ProgressData *pdata;
10409 pdata = (ProgressData *) data;
10411 if (!GTK_WIDGET_MAPPED (widget))
10414 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10416 gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
10417 (GtkProgressBarOrientation) i);
10421 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
10423 gtk_progress_set_show_text (GTK_PROGRESS (pdata->pbar),
10424 GTK_TOGGLE_BUTTON (widget)->active);
10425 gtk_widget_set_sensitive (pdata->entry, GTK_TOGGLE_BUTTON (widget)->active);
10426 gtk_widget_set_sensitive (pdata->x_align_spin,
10427 GTK_TOGGLE_BUTTON (widget)->active);
10428 gtk_widget_set_sensitive (pdata->y_align_spin,
10429 GTK_TOGGLE_BUTTON (widget)->active);
10433 progressbar_toggle_bar_style (GtkWidget *widget, gpointer data)
10435 ProgressData *pdata;
10438 pdata = (ProgressData *) data;
10440 if (!GTK_WIDGET_MAPPED (widget))
10443 i = gtk_option_menu_get_history (GTK_OPTION_MENU (widget));
10446 gtk_widget_set_sensitive (pdata->block_spin, TRUE);
10448 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10450 gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (pdata->pbar),
10451 (GtkProgressBarStyle) i);
10455 progress_value_changed (GtkAdjustment *adj, ProgressData *pdata)
10459 if (GTK_PROGRESS (pdata->pbar)->activity_mode)
10460 sprintf (buf, "???");
10462 sprintf (buf, "%.0f%%", 100 *
10463 gtk_progress_get_current_percentage (GTK_PROGRESS (pdata->pbar)));
10464 gtk_label_set_text (GTK_LABEL (pdata->label), buf);
10468 adjust_blocks (GtkAdjustment *adj, ProgressData *pdata)
10470 gtk_progress_set_percentage (GTK_PROGRESS (pdata->pbar), 0);
10471 gtk_progress_bar_set_discrete_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10472 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->block_spin)));
10476 adjust_step (GtkAdjustment *adj, ProgressData *pdata)
10478 gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pdata->pbar),
10479 gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pdata->step_spin)));
10483 adjust_act_blocks (GtkAdjustment *adj, ProgressData *pdata)
10485 gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (pdata->pbar),
10486 gtk_spin_button_get_value_as_int
10487 (GTK_SPIN_BUTTON (pdata->act_blocks_spin)));
10491 adjust_align (GtkAdjustment *adj, ProgressData *pdata)
10493 gtk_progress_set_text_alignment (GTK_PROGRESS (pdata->pbar),
10494 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->x_align_spin)),
10495 gtk_spin_button_get_value (GTK_SPIN_BUTTON (pdata->y_align_spin)));
10499 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
10501 gtk_progress_set_activity_mode (GTK_PROGRESS (pdata->pbar),
10502 GTK_TOGGLE_BUTTON (widget)->active);
10503 gtk_widget_set_sensitive (pdata->step_spin,
10504 GTK_TOGGLE_BUTTON (widget)->active);
10505 gtk_widget_set_sensitive (pdata->act_blocks_spin,
10506 GTK_TOGGLE_BUTTON (widget)->active);
10510 entry_changed (GtkWidget *widget, ProgressData *pdata)
10512 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10513 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
10517 create_progress_bar (GtkWidget *widget)
10528 GtkAdjustment *adj;
10529 static ProgressData *pdata = NULL;
10531 static gchar *items1[] =
10539 static gchar *items2[] =
10546 pdata = g_new0 (ProgressData, 1);
10548 if (!pdata->window)
10550 pdata->window = gtk_dialog_new ();
10552 gtk_window_set_screen (GTK_WINDOW (pdata->window),
10553 gtk_widget_get_screen (widget));
10555 gtk_window_set_resizable (GTK_WINDOW (pdata->window), FALSE);
10557 g_signal_connect (pdata->window, "destroy",
10558 G_CALLBACK (destroy_progress),
10563 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
10564 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
10566 vbox = gtk_vbox_new (FALSE, 5);
10567 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
10568 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->vbox),
10569 vbox, FALSE, TRUE, 0);
10571 frame = gtk_frame_new ("Progress");
10572 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10574 vbox2 = gtk_vbox_new (FALSE, 5);
10575 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10577 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10578 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10580 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, 300, 0, 0, 0);
10581 g_signal_connect (adj, "value_changed",
10582 G_CALLBACK (progress_value_changed), pdata);
10584 pdata->pbar = gtk_widget_new (GTK_TYPE_PROGRESS_BAR,
10587 gtk_progress_set_format_string (GTK_PROGRESS (pdata->pbar),
10588 "%v from [%l,%u] (=%p%%)");
10589 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
10590 pdata->timer = gtk_timeout_add (100, progress_timeout, pdata->pbar);
10592 align = gtk_alignment_new (0.5, 0.5, 0, 0);
10593 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
10595 hbox = gtk_hbox_new (FALSE, 5);
10596 gtk_container_add (GTK_CONTAINER (align), hbox);
10597 label = gtk_label_new ("Label updated by user :");
10598 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10599 pdata->label = gtk_label_new ("");
10600 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
10602 frame = gtk_frame_new ("Options");
10603 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
10605 vbox2 = gtk_vbox_new (FALSE, 5);
10606 gtk_container_add (GTK_CONTAINER (frame), vbox2);
10608 tab = gtk_table_new (7, 2, FALSE);
10609 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
10611 label = gtk_label_new ("Orientation :");
10612 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
10613 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10615 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10617 pdata->omenu1 = build_option_menu (items1, 4, 0,
10618 progressbar_toggle_orientation,
10620 hbox = gtk_hbox_new (FALSE, 0);
10621 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
10622 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10624 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
10626 check = gtk_check_button_new_with_label ("Show text");
10627 g_signal_connect (check, "clicked",
10628 G_CALLBACK (toggle_show_text),
10630 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
10631 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10634 hbox = gtk_hbox_new (FALSE, 0);
10635 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
10636 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10639 label = gtk_label_new ("Format : ");
10640 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10642 pdata->entry = gtk_entry_new ();
10643 g_signal_connect (pdata->entry, "changed",
10644 G_CALLBACK (entry_changed),
10646 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
10647 gtk_entry_set_text (GTK_ENTRY (pdata->entry), "%v from [%l,%u] (=%p%%)");
10648 gtk_widget_set_size_request (pdata->entry, 100, -1);
10649 gtk_widget_set_sensitive (pdata->entry, FALSE);
10651 label = gtk_label_new ("Text align :");
10652 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 2, 3,
10653 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10655 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10657 hbox = gtk_hbox_new (FALSE, 0);
10658 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
10659 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10662 label = gtk_label_new ("x :");
10663 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10665 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10666 pdata->x_align_spin = gtk_spin_button_new (adj, 0, 1);
10667 g_signal_connect (adj, "value_changed",
10668 G_CALLBACK (adjust_align), pdata);
10669 gtk_box_pack_start (GTK_BOX (hbox), pdata->x_align_spin, FALSE, TRUE, 0);
10670 gtk_widget_set_sensitive (pdata->x_align_spin, FALSE);
10672 label = gtk_label_new ("y :");
10673 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 5);
10675 adj = (GtkAdjustment *) gtk_adjustment_new (0.5, 0, 1, 0.1, 0.1, 0);
10676 pdata->y_align_spin = gtk_spin_button_new (adj, 0, 1);
10677 g_signal_connect (adj, "value_changed",
10678 G_CALLBACK (adjust_align), pdata);
10679 gtk_box_pack_start (GTK_BOX (hbox), pdata->y_align_spin, FALSE, TRUE, 0);
10680 gtk_widget_set_sensitive (pdata->y_align_spin, FALSE);
10682 label = gtk_label_new ("Bar Style :");
10683 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 3, 4,
10684 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10686 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10688 pdata->omenu2 = build_option_menu (items2, 2, 0,
10689 progressbar_toggle_bar_style,
10691 hbox = gtk_hbox_new (FALSE, 0);
10692 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 3, 4,
10693 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10695 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu2, TRUE, TRUE, 0);
10697 label = gtk_label_new ("Block count :");
10698 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 4, 5,
10699 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10701 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
10703 hbox = gtk_hbox_new (FALSE, 0);
10704 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 4, 5,
10705 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10707 adj = (GtkAdjustment *) gtk_adjustment_new (10, 2, 20, 1, 5, 0);
10708 pdata->block_spin = gtk_spin_button_new (adj, 0, 0);
10709 g_signal_connect (adj, "value_changed",
10710 G_CALLBACK (adjust_blocks), pdata);
10711 gtk_box_pack_start (GTK_BOX (hbox), pdata->block_spin, FALSE, TRUE, 0);
10712 gtk_widget_set_sensitive (pdata->block_spin, FALSE);
10714 check = gtk_check_button_new_with_label ("Activity mode");
10715 g_signal_connect (check, "clicked",
10716 G_CALLBACK (toggle_activity_mode), pdata);
10717 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 5, 6,
10718 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10721 hbox = gtk_hbox_new (FALSE, 0);
10722 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 5, 6,
10723 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10725 label = gtk_label_new ("Step size : ");
10726 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10727 adj = (GtkAdjustment *) gtk_adjustment_new (3, 1, 20, 1, 5, 0);
10728 pdata->step_spin = gtk_spin_button_new (adj, 0, 0);
10729 g_signal_connect (adj, "value_changed",
10730 G_CALLBACK (adjust_step), pdata);
10731 gtk_box_pack_start (GTK_BOX (hbox), pdata->step_spin, FALSE, TRUE, 0);
10732 gtk_widget_set_sensitive (pdata->step_spin, FALSE);
10734 hbox = gtk_hbox_new (FALSE, 0);
10735 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 6, 7,
10736 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
10738 label = gtk_label_new ("Blocks : ");
10739 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
10740 adj = (GtkAdjustment *) gtk_adjustment_new (5, 2, 10, 1, 5, 0);
10741 pdata->act_blocks_spin = gtk_spin_button_new (adj, 0, 0);
10742 g_signal_connect (adj, "value_changed",
10743 G_CALLBACK (adjust_act_blocks), pdata);
10744 gtk_box_pack_start (GTK_BOX (hbox), pdata->act_blocks_spin, FALSE, TRUE,
10746 gtk_widget_set_sensitive (pdata->act_blocks_spin, FALSE);
10748 button = gtk_button_new_with_label ("close");
10749 g_signal_connect_swapped (button, "clicked",
10750 G_CALLBACK (gtk_widget_destroy),
10752 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
10753 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pdata->window)->action_area),
10754 button, TRUE, TRUE, 0);
10755 gtk_widget_grab_default (button);
10758 if (!GTK_WIDGET_VISIBLE (pdata->window))
10759 gtk_widget_show_all (pdata->window);
10761 gtk_widget_destroy (pdata->window);
10773 GtkWidget *res_widget;
10777 find_widget (GtkWidget *widget, FindWidgetData *data)
10779 GtkAllocation new_allocation;
10783 new_allocation = widget->allocation;
10785 if (data->found || !GTK_WIDGET_MAPPED (widget))
10788 /* Note that in the following code, we only count the
10789 * position as being inside a WINDOW widget if it is inside
10790 * widget->window; points that are outside of widget->window
10791 * but within the allocation are not counted. This is consistent
10792 * with the way we highlight drag targets.
10794 if (!GTK_WIDGET_NO_WINDOW (widget))
10796 new_allocation.x = 0;
10797 new_allocation.y = 0;
10800 if (widget->parent && !data->first)
10802 GdkWindow *window = widget->window;
10803 while (window != widget->parent->window)
10805 gint tx, ty, twidth, theight;
10806 gdk_drawable_get_size (window, &twidth, &theight);
10808 if (new_allocation.x < 0)
10810 new_allocation.width += new_allocation.x;
10811 new_allocation.x = 0;
10813 if (new_allocation.y < 0)
10815 new_allocation.height += new_allocation.y;
10816 new_allocation.y = 0;
10818 if (new_allocation.x + new_allocation.width > twidth)
10819 new_allocation.width = twidth - new_allocation.x;
10820 if (new_allocation.y + new_allocation.height > theight)
10821 new_allocation.height = theight - new_allocation.y;
10823 gdk_window_get_position (window, &tx, &ty);
10824 new_allocation.x += tx;
10826 new_allocation.y += ty;
10829 window = gdk_window_get_parent (window);
10833 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
10834 (data->x < new_allocation.x + new_allocation.width) &&
10835 (data->y < new_allocation.y + new_allocation.height))
10837 /* First, check if the drag is in a valid drop site in
10838 * one of our children
10840 if (GTK_IS_CONTAINER (widget))
10842 FindWidgetData new_data = *data;
10844 new_data.x -= x_offset;
10845 new_data.y -= y_offset;
10846 new_data.found = FALSE;
10847 new_data.first = FALSE;
10849 gtk_container_forall (GTK_CONTAINER (widget),
10850 (GtkCallback)find_widget,
10853 data->found = new_data.found;
10855 data->res_widget = new_data.res_widget;
10858 /* If not, and this widget is registered as a drop site, check to
10859 * emit "drag_motion" to check if we are actually in
10864 data->found = TRUE;
10865 data->res_widget = widget;
10871 find_widget_at_pointer (GdkDisplay *display)
10873 GtkWidget *widget = NULL;
10874 GdkWindow *pointer_window;
10876 FindWidgetData data;
10878 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
10880 if (pointer_window)
10881 gdk_window_get_user_data (pointer_window, (gpointer*) &widget);
10885 gdk_window_get_pointer (widget->window,
10890 data.found = FALSE;
10893 find_widget (widget, &data);
10895 return data.res_widget;
10901 struct PropertiesData {
10902 GtkWidget **window;
10909 destroy_properties (GtkWidget *widget,
10910 struct PropertiesData *data)
10914 *data->window = NULL;
10915 data->window = NULL;
10920 gdk_cursor_unref (data->cursor);
10921 data->cursor = NULL;
10926 g_signal_handler_disconnect (widget, data->handler);
10934 property_query_event (GtkWidget *widget,
10936 struct PropertiesData *data)
10938 GtkWidget *res_widget = NULL;
10940 if (!data->in_query)
10943 if (event->type == GDK_BUTTON_RELEASE)
10945 gtk_grab_remove (widget);
10946 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
10949 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
10952 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
10953 gtk_widget_get_screen (widget));
10954 create_prop_editor (G_OBJECT (res_widget), 0);
10957 data->in_query = FALSE;
10964 query_properties (GtkButton *button,
10965 struct PropertiesData *data)
10969 g_signal_connect (button, "event",
10970 G_CALLBACK (property_query_event), data);
10974 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
10977 failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
10979 GDK_BUTTON_RELEASE_MASK,
10984 gtk_grab_add (GTK_WIDGET (button));
10986 data->in_query = TRUE;
10990 create_properties (GtkWidget *widget)
10992 static GtkWidget *window = NULL;
10996 struct PropertiesData *data;
10998 data = g_new (struct PropertiesData, 1);
10999 data->window = &window;
11000 data->in_query = FALSE;
11001 data->cursor = NULL;
11006 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11008 gtk_window_set_screen (GTK_WINDOW (window),
11009 gtk_widget_get_screen (widget));
11011 data->handler = g_signal_connect (window, "destroy",
11012 G_CALLBACK (destroy_properties),
11015 gtk_window_set_title (GTK_WINDOW (window), "test properties");
11016 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11018 vbox = gtk_vbox_new (FALSE, 1);
11019 gtk_container_add (GTK_CONTAINER (window), vbox);
11021 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
11022 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
11024 button = gtk_button_new_with_label ("Query properties");
11025 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
11026 g_signal_connect (button, "clicked",
11027 G_CALLBACK (query_properties),
11031 if (!GTK_WIDGET_VISIBLE (window))
11032 gtk_widget_show_all (window);
11034 gtk_widget_destroy (window);
11043 static int color_idle = 0;
11046 color_idle_func (GtkWidget *preview)
11048 static int count = 1;
11052 for (i = 0; i < 256; i++)
11054 for (j = 0, k = 0; j < 256; j++)
11056 buf[k+0] = i + count;
11058 buf[k+2] = j + count;
11062 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11067 gtk_widget_queue_draw (preview);
11068 gdk_window_process_updates (preview->window, TRUE);
11074 color_preview_destroy (GtkWidget *widget,
11075 GtkWidget **window)
11077 gtk_idle_remove (color_idle);
11084 create_color_preview (GtkWidget *widget)
11086 static GtkWidget *window = NULL;
11087 GtkWidget *preview;
11093 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11095 gtk_window_set_screen (GTK_WINDOW (window),
11096 gtk_widget_get_screen (widget));
11098 g_signal_connect (window, "destroy",
11099 G_CALLBACK (color_preview_destroy),
11102 gtk_window_set_title (GTK_WINDOW (window), "test");
11103 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11105 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
11106 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11107 gtk_container_add (GTK_CONTAINER (window), preview);
11109 for (i = 0; i < 256; i++)
11111 for (j = 0, k = 0; j < 256; j++)
11119 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11122 color_idle = gtk_idle_add ((GtkFunction) color_idle_func, preview);
11125 if (!GTK_WIDGET_VISIBLE (window))
11126 gtk_widget_show_all (window);
11128 gtk_widget_destroy (window);
11135 static int gray_idle = 0;
11138 gray_idle_func (GtkWidget *preview)
11140 static int count = 1;
11144 for (i = 0; i < 256; i++)
11146 for (j = 0; j < 256; j++)
11147 buf[j] = i + j + count;
11149 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11154 gtk_widget_draw (preview, NULL);
11160 gray_preview_destroy (GtkWidget *widget,
11161 GtkWidget **window)
11163 gtk_idle_remove (gray_idle);
11170 create_gray_preview (GtkWidget *widget)
11172 static GtkWidget *window = NULL;
11173 GtkWidget *preview;
11179 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11181 gtk_window_set_screen (GTK_WINDOW (window),
11182 gtk_widget_get_screen (widget));
11184 g_signal_connect (window, "destroy",
11185 G_CALLBACK (gray_preview_destroy),
11188 gtk_window_set_title (GTK_WINDOW (window), "test");
11189 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11191 preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
11192 gtk_preview_size (GTK_PREVIEW (preview), 256, 256);
11193 gtk_container_add (GTK_CONTAINER (window), preview);
11195 for (i = 0; i < 256; i++)
11197 for (j = 0; j < 256; j++)
11200 gtk_preview_draw_row (GTK_PREVIEW (preview), buf, 0, i, 256);
11203 gray_idle = gtk_idle_add ((GtkFunction) gray_idle_func, preview);
11206 if (!GTK_WIDGET_VISIBLE (window))
11207 gtk_widget_show_all (window);
11209 gtk_widget_destroy (window);
11218 selection_test_received (GtkWidget *list, GtkSelectionData *data)
11221 GtkWidget *list_item;
11225 if (data->length < 0)
11227 g_print ("Selection retrieval failed\n");
11230 if (data->type != GDK_SELECTION_TYPE_ATOM)
11232 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
11236 /* Clear out any current list items */
11238 gtk_list_clear_items (GTK_LIST(list), 0, -1);
11240 /* Add new items to list */
11242 atoms = (GdkAtom *)data->data;
11245 l = data->length / sizeof (GdkAtom);
11246 for (i = 0; i < l; i++)
11249 name = gdk_atom_name (atoms[i]);
11252 list_item = gtk_list_item_new_with_label (name);
11256 list_item = gtk_list_item_new_with_label ("(bad atom)");
11258 gtk_widget_show (list_item);
11259 item_list = g_list_append (item_list, list_item);
11262 gtk_list_append_items (GTK_LIST (list), item_list);
11268 selection_test_get_targets (GtkWidget *widget, GtkWidget *list)
11270 static GdkAtom targets_atom = GDK_NONE;
11272 if (targets_atom == GDK_NONE)
11273 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
11275 gtk_selection_convert (list, GDK_SELECTION_PRIMARY, targets_atom,
11280 create_selection_test (GtkWidget *widget)
11282 static GtkWidget *window = NULL;
11285 GtkWidget *scrolled_win;
11291 window = gtk_dialog_new ();
11293 gtk_window_set_screen (GTK_WINDOW (window),
11294 gtk_widget_get_screen (widget));
11296 g_signal_connect (window, "destroy",
11297 G_CALLBACK (gtk_widget_destroyed),
11300 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
11301 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11303 /* Create the list */
11305 vbox = gtk_vbox_new (FALSE, 5);
11306 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
11307 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
11310 label = gtk_label_new ("Gets available targets for current selection");
11311 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11313 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
11314 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
11315 GTK_POLICY_AUTOMATIC,
11316 GTK_POLICY_AUTOMATIC);
11317 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
11318 gtk_widget_set_size_request (scrolled_win, 100, 200);
11320 list = gtk_list_new ();
11321 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
11323 g_signal_connect (list, "selection_received",
11324 G_CALLBACK (selection_test_received), NULL);
11326 /* .. And create some buttons */
11327 button = gtk_button_new_with_label ("Get Targets");
11328 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11329 button, TRUE, TRUE, 0);
11331 g_signal_connect (button, "clicked",
11332 G_CALLBACK (selection_test_get_targets), list);
11334 button = gtk_button_new_with_label ("Quit");
11335 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11336 button, TRUE, TRUE, 0);
11338 g_signal_connect_swapped (button, "clicked",
11339 G_CALLBACK (gtk_widget_destroy),
11343 if (!GTK_WIDGET_VISIBLE (window))
11344 gtk_widget_show_all (window);
11346 gtk_widget_destroy (window);
11354 create_gamma_curve (GtkWidget *widget)
11356 static GtkWidget *window = NULL, *curve;
11357 static int count = 0;
11364 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
11365 gtk_window_set_screen (GTK_WINDOW (window),
11366 gtk_widget_get_screen (widget));
11368 gtk_window_set_title (GTK_WINDOW (window), "test");
11369 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
11371 g_signal_connect (window, "destroy",
11372 G_CALLBACK(gtk_widget_destroyed),
11375 curve = gtk_gamma_curve_new ();
11376 gtk_container_add (GTK_CONTAINER (window), curve);
11377 gtk_widget_show (curve);
11380 max = 127 + (count % 2)*128;
11381 gtk_curve_set_range (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11383 for (i = 0; i < max; ++i)
11384 vec[i] = (127 / sqrt (max)) * sqrt (i);
11385 gtk_curve_set_vector (GTK_CURVE (GTK_GAMMA_CURVE (curve)->curve),
11388 if (!GTK_WIDGET_VISIBLE (window))
11389 gtk_widget_show (window);
11390 else if (count % 4 == 3)
11392 gtk_widget_destroy (window);
11403 static int scroll_test_pos = 0.0;
11406 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
11407 GtkAdjustment *adj)
11410 gint imin, imax, jmin, jmax;
11412 imin = (event->area.x) / 10;
11413 imax = (event->area.x + event->area.width + 9) / 10;
11415 jmin = ((int)adj->value + event->area.y) / 10;
11416 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
11418 gdk_window_clear_area (widget->window,
11419 event->area.x, event->area.y,
11420 event->area.width, event->area.height);
11422 for (i=imin; i<imax; i++)
11423 for (j=jmin; j<jmax; j++)
11425 gdk_draw_rectangle (widget->window,
11426 widget->style->black_gc,
11428 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
11434 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
11435 GtkAdjustment *adj)
11437 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
11438 -adj->page_increment / 2:
11439 adj->page_increment / 2);
11440 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
11441 gtk_adjustment_set_value (adj, new_value);
11447 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
11448 GtkAdjustment *adj)
11450 adj->page_increment = 0.9 * widget->allocation.height;
11451 adj->page_size = widget->allocation.height;
11453 g_signal_emit_by_name (adj, "changed");
11457 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
11459 /* gint source_min = (int)adj->value - scroll_test_pos; */
11462 dy = scroll_test_pos - (int)adj->value;
11463 scroll_test_pos = adj->value;
11465 if (!GTK_WIDGET_DRAWABLE (widget))
11467 gdk_window_scroll (widget->window, 0, dy);
11468 gdk_window_process_updates (widget->window, FALSE);
11473 create_scroll_test (GtkWidget *widget)
11475 static GtkWidget *window = NULL;
11477 GtkWidget *drawing_area;
11478 GtkWidget *scrollbar;
11480 GtkAdjustment *adj;
11481 GdkGeometry geometry;
11482 GdkWindowHints geometry_mask;
11486 window = gtk_dialog_new ();
11488 gtk_window_set_screen (GTK_WINDOW (window),
11489 gtk_widget_get_screen (widget));
11491 g_signal_connect (window, "destroy",
11492 G_CALLBACK (gtk_widget_destroyed),
11495 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
11496 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11498 hbox = gtk_hbox_new (FALSE, 0);
11499 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), hbox,
11501 gtk_widget_show (hbox);
11503 drawing_area = gtk_drawing_area_new ();
11504 gtk_widget_set_size_request (drawing_area, 200, 200);
11505 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
11506 gtk_widget_show (drawing_area);
11508 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
11510 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
11511 scroll_test_pos = 0.0;
11513 scrollbar = gtk_vscrollbar_new (adj);
11514 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
11515 gtk_widget_show (scrollbar);
11517 g_signal_connect (drawing_area, "expose_event",
11518 G_CALLBACK (scroll_test_expose), adj);
11519 g_signal_connect (drawing_area, "configure_event",
11520 G_CALLBACK (scroll_test_configure), adj);
11521 g_signal_connect (drawing_area, "scroll_event",
11522 G_CALLBACK (scroll_test_scroll), adj);
11524 g_signal_connect (adj, "value_changed",
11525 G_CALLBACK (scroll_test_adjustment_changed),
11528 /* .. And create some buttons */
11530 button = gtk_button_new_with_label ("Quit");
11531 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11532 button, TRUE, TRUE, 0);
11534 g_signal_connect_swapped (button, "clicked",
11535 G_CALLBACK (gtk_widget_destroy),
11537 gtk_widget_show (button);
11539 /* Set up gridded geometry */
11541 geometry_mask = GDK_HINT_MIN_SIZE |
11542 GDK_HINT_BASE_SIZE |
11543 GDK_HINT_RESIZE_INC;
11545 geometry.min_width = 20;
11546 geometry.min_height = 20;
11547 geometry.base_width = 0;
11548 geometry.base_height = 0;
11549 geometry.width_inc = 10;
11550 geometry.height_inc = 10;
11552 gtk_window_set_geometry_hints (GTK_WINDOW (window),
11553 drawing_area, &geometry, geometry_mask);
11556 if (!GTK_WIDGET_VISIBLE (window))
11557 gtk_widget_show (window);
11559 gtk_widget_destroy (window);
11566 static int timer = 0;
11569 timeout_test (GtkWidget *label)
11571 static int count = 0;
11572 static char buffer[32];
11574 sprintf (buffer, "count: %d", ++count);
11575 gtk_label_set_text (GTK_LABEL (label), buffer);
11581 start_timeout_test (GtkWidget *widget,
11586 timer = gtk_timeout_add (100, (GtkFunction) timeout_test, label);
11591 stop_timeout_test (GtkWidget *widget,
11596 gtk_timeout_remove (timer);
11602 destroy_timeout_test (GtkWidget *widget,
11603 GtkWidget **window)
11605 stop_timeout_test (NULL, NULL);
11611 create_timeout_test (GtkWidget *widget)
11613 static GtkWidget *window = NULL;
11619 window = gtk_dialog_new ();
11621 gtk_window_set_screen (GTK_WINDOW (window),
11622 gtk_widget_get_screen (widget));
11624 g_signal_connect (window, "destroy",
11625 G_CALLBACK (destroy_timeout_test),
11628 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
11629 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11631 label = gtk_label_new ("count: 0");
11632 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11633 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11634 label, TRUE, TRUE, 0);
11635 gtk_widget_show (label);
11637 button = gtk_button_new_with_label ("close");
11638 g_signal_connect_swapped (button, "clicked",
11639 G_CALLBACK (gtk_widget_destroy),
11641 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11642 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11643 button, TRUE, TRUE, 0);
11644 gtk_widget_grab_default (button);
11645 gtk_widget_show (button);
11647 button = gtk_button_new_with_label ("start");
11648 g_signal_connect (button, "clicked",
11649 G_CALLBACK(start_timeout_test),
11651 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11652 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11653 button, TRUE, TRUE, 0);
11654 gtk_widget_show (button);
11656 button = gtk_button_new_with_label ("stop");
11657 g_signal_connect (button, "clicked",
11658 G_CALLBACK (stop_timeout_test),
11660 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11661 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11662 button, TRUE, TRUE, 0);
11663 gtk_widget_show (button);
11666 if (!GTK_WIDGET_VISIBLE (window))
11667 gtk_widget_show (window);
11669 gtk_widget_destroy (window);
11676 static int idle_id = 0;
11679 idle_test (GtkWidget *label)
11681 static int count = 0;
11682 static char buffer[32];
11684 sprintf (buffer, "count: %d", ++count);
11685 gtk_label_set_text (GTK_LABEL (label), buffer);
11691 start_idle_test (GtkWidget *widget,
11696 idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
11701 stop_idle_test (GtkWidget *widget,
11706 gtk_idle_remove (idle_id);
11712 destroy_idle_test (GtkWidget *widget,
11713 GtkWidget **window)
11715 stop_idle_test (NULL, NULL);
11721 toggle_idle_container (GObject *button,
11722 GtkContainer *container)
11724 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
11728 create_idle_test (GtkWidget *widget)
11730 static GtkWidget *window = NULL;
11733 GtkWidget *container;
11737 GtkWidget *button2;
11741 window = gtk_dialog_new ();
11743 gtk_window_set_screen (GTK_WINDOW (window),
11744 gtk_widget_get_screen (widget));
11746 g_signal_connect (window, "destroy",
11747 G_CALLBACK (destroy_idle_test),
11750 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
11751 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11753 label = gtk_label_new ("count: 0");
11754 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
11755 gtk_widget_show (label);
11758 gtk_widget_new (GTK_TYPE_HBOX,
11760 /* "GtkContainer::child", gtk_widget_new (GTK_TYPE_HBOX,
11761 * "GtkWidget::visible", TRUE,
11766 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
11767 container, TRUE, TRUE, 0);
11770 gtk_widget_new (GTK_TYPE_FRAME,
11772 "label", "Label Container",
11774 "parent", GTK_DIALOG (window)->vbox,
11777 gtk_widget_new (GTK_TYPE_VBOX,
11782 g_object_connect (gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11783 "label", "Resize-Parent",
11784 "user_data", (void*)GTK_RESIZE_PARENT,
11788 "signal::clicked", toggle_idle_container, container,
11790 button = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11791 "label", "Resize-Queue",
11792 "user_data", (void*)GTK_RESIZE_QUEUE,
11797 g_object_connect (button,
11798 "signal::clicked", toggle_idle_container, container,
11800 button2 = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
11801 "label", "Resize-Immediate",
11802 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
11804 g_object_connect (button2,
11805 "signal::clicked", toggle_idle_container, container,
11807 g_object_set (button2,
11813 button = gtk_button_new_with_label ("close");
11814 g_signal_connect_swapped (button, "clicked",
11815 G_CALLBACK (gtk_widget_destroy),
11817 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11818 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11819 button, TRUE, TRUE, 0);
11820 gtk_widget_grab_default (button);
11821 gtk_widget_show (button);
11823 button = gtk_button_new_with_label ("start");
11824 g_signal_connect (button, "clicked",
11825 G_CALLBACK (start_idle_test),
11827 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11828 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11829 button, TRUE, TRUE, 0);
11830 gtk_widget_show (button);
11832 button = gtk_button_new_with_label ("stop");
11833 g_signal_connect (button, "clicked",
11834 G_CALLBACK (stop_idle_test),
11836 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11837 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11838 button, TRUE, TRUE, 0);
11839 gtk_widget_show (button);
11842 if (!GTK_WIDGET_VISIBLE (window))
11843 gtk_widget_show (window);
11845 gtk_widget_destroy (window);
11853 reload_all_rc_files (void)
11855 static GdkAtom atom_rcfiles = GDK_NONE;
11857 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
11861 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
11863 for(i = 0; i < 5; i++)
11864 send_event->client.data.l[i] = 0;
11865 send_event->client.data_format = 32;
11866 send_event->client.message_type = atom_rcfiles;
11867 gdk_event_send_clientmessage_toall (send_event);
11869 gdk_event_free (send_event);
11873 create_rc_file (GtkWidget *widget)
11875 static GtkWidget *window = NULL;
11883 window = gtk_dialog_new ();
11885 gtk_window_set_screen (GTK_WINDOW (window),
11886 gtk_widget_get_screen (widget));
11888 g_signal_connect (window, "destroy",
11889 G_CALLBACK (gtk_widget_destroyed),
11892 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
11893 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
11895 vbox = gtk_vbox_new (FALSE, 0);
11896 gtk_container_add (GTK_CONTAINER (frame), vbox);
11898 label = gtk_label_new ("This label should be red");
11899 gtk_widget_set_name (label, "testgtk-red-label");
11900 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11902 label = gtk_label_new ("This label should be green");
11903 gtk_widget_set_name (label, "testgtk-green-label");
11904 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11906 label = gtk_label_new ("This label should be blue");
11907 gtk_widget_set_name (label, "testgtk-blue-label");
11908 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
11910 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
11911 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
11913 button = gtk_button_new_with_label ("Reload");
11914 g_signal_connect (button, "clicked",
11915 G_CALLBACK (gtk_rc_reparse_all), NULL);
11916 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11917 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11918 button, TRUE, TRUE, 0);
11919 gtk_widget_grab_default (button);
11921 button = gtk_button_new_with_label ("Reload All");
11922 g_signal_connect (button, "clicked",
11923 G_CALLBACK (reload_all_rc_files), NULL);
11924 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11925 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11926 button, TRUE, TRUE, 0);
11928 button = gtk_button_new_with_label ("Close");
11929 g_signal_connect_swapped (button, "clicked",
11930 G_CALLBACK (gtk_widget_destroy),
11932 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11933 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
11934 button, TRUE, TRUE, 0);
11937 if (!GTK_WIDGET_VISIBLE (window))
11938 gtk_widget_show_all (window);
11940 gtk_widget_destroy (window);
11944 * Test of recursive mainloop
11948 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
11955 create_mainloop (GtkWidget *widget)
11957 static GtkWidget *window = NULL;
11963 window = gtk_dialog_new ();
11965 gtk_window_set_screen (GTK_WINDOW (window),
11966 gtk_widget_get_screen (widget));
11968 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
11970 g_signal_connect (window, "destroy",
11971 G_CALLBACK (mainloop_destroyed),
11974 label = gtk_label_new ("In recursive main loop...");
11975 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
11977 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
11979 gtk_widget_show (label);
11981 button = gtk_button_new_with_label ("Leave");
11982 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
11985 g_signal_connect_swapped (button, "clicked",
11986 G_CALLBACK (gtk_widget_destroy),
11989 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
11990 gtk_widget_grab_default (button);
11992 gtk_widget_show (button);
11995 if (!GTK_WIDGET_VISIBLE (window))
11997 gtk_widget_show (window);
11999 g_print ("create_mainloop: start\n");
12001 g_print ("create_mainloop: done\n");
12004 gtk_widget_destroy (window);
12008 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
12013 gint imin, imax, jmin, jmax;
12015 layout = GTK_LAYOUT (widget);
12017 if (event->window != layout->bin_window)
12020 imin = (event->area.x) / 10;
12021 imax = (event->area.x + event->area.width + 9) / 10;
12023 jmin = (event->area.y) / 10;
12024 jmax = (event->area.y + event->area.height + 9) / 10;
12026 for (i=imin; i<imax; i++)
12027 for (j=jmin; j<jmax; j++)
12029 gdk_draw_rectangle (layout->bin_window,
12030 widget->style->black_gc,
12038 void create_layout (GtkWidget *widget)
12040 static GtkWidget *window = NULL;
12042 GtkWidget *scrolledwindow;
12051 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12052 gtk_window_set_screen (GTK_WINDOW (window),
12053 gtk_widget_get_screen (widget));
12055 g_signal_connect (window, "destroy",
12056 G_CALLBACK (gtk_widget_destroyed),
12059 gtk_window_set_title (GTK_WINDOW (window), "Layout");
12060 gtk_widget_set_size_request (window, 200, 200);
12062 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
12063 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
12065 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
12066 GTK_CORNER_TOP_RIGHT);
12068 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
12070 layout = gtk_layout_new (NULL, NULL);
12071 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
12073 /* We set step sizes here since GtkLayout does not set
12076 GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
12077 GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
12079 gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
12080 g_signal_connect (layout, "expose_event",
12081 G_CALLBACK (layout_expose_handler), NULL);
12083 gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
12085 for (i=0 ; i < 16 ; i++)
12086 for (j=0 ; j < 16 ; j++)
12088 sprintf(buf, "Button %d, %d", i, j);
12090 button = gtk_button_new_with_label (buf);
12092 button = gtk_label_new (buf);
12094 gtk_layout_put (GTK_LAYOUT (layout), button,
12098 for (i=16; i < 1280; i++)
12100 sprintf(buf, "Button %d, %d", i, 0);
12102 button = gtk_button_new_with_label (buf);
12104 button = gtk_label_new (buf);
12106 gtk_layout_put (GTK_LAYOUT (layout), button,
12111 if (!GTK_WIDGET_VISIBLE (window))
12112 gtk_widget_show_all (window);
12114 gtk_widget_destroy (window);
12118 create_styles (GtkWidget *widget)
12120 static GtkWidget *window = NULL;
12125 static GdkColor red = { 0, 0xffff, 0, 0 };
12126 static GdkColor green = { 0, 0, 0xffff, 0 };
12127 static GdkColor blue = { 0, 0, 0, 0xffff };
12128 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
12129 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
12130 PangoFontDescription *font_desc;
12132 GtkRcStyle *rc_style;
12136 window = gtk_dialog_new ();
12137 gtk_window_set_screen (GTK_WINDOW (window),
12138 gtk_widget_get_screen (widget));
12140 g_signal_connect (window, "destroy",
12141 G_CALLBACK (gtk_widget_destroyed),
12145 button = gtk_button_new_with_label ("Close");
12146 g_signal_connect_swapped (button, "clicked",
12147 G_CALLBACK (gtk_widget_destroy),
12149 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12150 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
12151 button, TRUE, TRUE, 0);
12152 gtk_widget_show (button);
12154 vbox = gtk_vbox_new (FALSE, 5);
12155 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
12156 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
12158 label = gtk_label_new ("Font:");
12159 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12160 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12162 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
12164 button = gtk_button_new_with_label ("Some Text");
12165 gtk_widget_modify_font (GTK_BIN (button)->child, font_desc);
12166 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12168 label = gtk_label_new ("Foreground:");
12169 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12170 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12172 button = gtk_button_new_with_label ("Some Text");
12173 gtk_widget_modify_fg (GTK_BIN (button)->child, GTK_STATE_NORMAL, &red);
12174 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12176 label = gtk_label_new ("Background:");
12177 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12178 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12180 button = gtk_button_new_with_label ("Some Text");
12181 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
12182 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12184 label = gtk_label_new ("Text:");
12185 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12186 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12188 entry = gtk_entry_new ();
12189 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12190 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
12191 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12193 label = gtk_label_new ("Base:");
12194 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12195 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12197 entry = gtk_entry_new ();
12198 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
12199 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
12200 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
12202 label = gtk_label_new ("Multiple:");
12203 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
12204 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
12206 button = gtk_button_new_with_label ("Some Text");
12208 rc_style = gtk_rc_style_new ();
12210 rc_style->font_desc = pango_font_description_copy (font_desc);
12211 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
12212 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
12213 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
12214 rc_style->fg[GTK_STATE_NORMAL] = yellow;
12215 rc_style->bg[GTK_STATE_NORMAL] = blue;
12216 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
12217 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
12218 rc_style->fg[GTK_STATE_ACTIVE] = red;
12219 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
12220 rc_style->xthickness = 5;
12221 rc_style->ythickness = 5;
12223 gtk_widget_modify_style (button, rc_style);
12224 gtk_widget_modify_style (GTK_BIN (button)->child, rc_style);
12226 g_object_unref (rc_style);
12228 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
12231 if (!GTK_WIDGET_VISIBLE (window))
12232 gtk_widget_show_all (window);
12234 gtk_widget_destroy (window);
12238 * Main Window and Exit
12242 do_exit (GtkWidget *widget, GtkWidget *window)
12244 gtk_widget_destroy (window);
12250 void (*func) (GtkWidget *widget);
12251 gboolean do_not_benchmark;
12254 { "big windows", create_big_windows },
12255 { "button box", create_button_box },
12256 { "buttons", create_buttons },
12257 { "check buttons", create_check_buttons },
12258 { "clist", create_clist},
12259 { "color selection", create_color_selection },
12260 { "ctree", create_ctree },
12261 { "cursors", create_cursors },
12262 { "dialog", create_dialog },
12263 { "display & screen", create_display_screen },
12264 { "entry", create_entry },
12265 { "event watcher", create_event_watcher },
12266 { "file selection", create_file_selection },
12267 { "flipping", create_flipping },
12268 { "focus", create_focus },
12269 { "font selection", create_font_selection },
12270 { "gamma curve", create_gamma_curve, TRUE },
12271 { "gridded geometry", create_gridded_geometry, TRUE },
12272 { "handle box", create_handle_box },
12273 { "image from drawable", create_get_image },
12274 { "image", create_image },
12275 { "item factory", create_item_factory },
12276 { "key lookup", create_key_lookup },
12277 { "labels", create_labels },
12278 { "layout", create_layout },
12279 { "list", create_list },
12280 { "menus", create_menus },
12281 { "message dialog", create_message_dialog },
12282 { "modal window", create_modal_window, TRUE },
12283 { "notebook", create_notebook },
12284 { "panes", create_panes },
12285 { "paned keyboard", create_paned_keyboard_navigation },
12286 { "pixmap", create_pixmap },
12287 { "preview color", create_color_preview, TRUE },
12288 { "preview gray", create_gray_preview, TRUE },
12289 { "progress bar", create_progress_bar },
12290 { "properties", create_properties },
12291 { "radio buttons", create_radio_buttons },
12292 { "range controls", create_range_controls },
12293 { "rc file", create_rc_file },
12294 { "reparent", create_reparent },
12295 { "resize grips", create_resize_grips },
12296 { "rulers", create_rulers },
12297 { "saved position", create_saved_position },
12298 { "scrolled windows", create_scrolled_windows },
12299 { "shapes", create_shapes },
12300 { "size groups", create_size_groups },
12301 { "spinbutton", create_spins },
12302 { "statusbar", create_statusbar },
12303 { "styles", create_styles },
12304 { "test idle", create_idle_test },
12305 { "test mainloop", create_mainloop, TRUE },
12306 { "test scrolling", create_scroll_test },
12307 { "test selection", create_selection_test },
12308 { "test timeout", create_timeout_test },
12309 { "text", create_text },
12310 { "toggle buttons", create_toggle_buttons },
12311 { "toolbar", create_toolbar },
12312 { "tooltips", create_tooltips },
12313 { "tree", create_tree_mode_window},
12314 { "WM hints", create_wmhints },
12315 { "window sizing", create_window_sizing },
12316 { "window states", create_window_states }
12318 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
12321 create_main_window (void)
12326 GtkWidget *scrolled_window;
12330 GtkWidget *separator;
12331 GdkGeometry geometry;
12334 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12335 gtk_widget_set_name (window, "main window");
12336 gtk_widget_set_uposition (window, 20, 20);
12337 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
12339 geometry.min_width = -1;
12340 geometry.min_height = -1;
12341 geometry.max_width = -1;
12342 geometry.max_height = G_MAXSHORT;
12343 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
12345 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
12347 g_signal_connect (window, "destroy",
12348 G_CALLBACK (gtk_main_quit),
12350 g_signal_connect (window, "delete-event",
12351 G_CALLBACK (gtk_false),
12354 box1 = gtk_vbox_new (FALSE, 0);
12355 gtk_container_add (GTK_CONTAINER (window), box1);
12357 if (gtk_micro_version > 0)
12362 gtk_micro_version);
12367 gtk_minor_version);
12369 label = gtk_label_new (buffer);
12370 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
12371 gtk_widget_set_name (label, "testgtk-version-label");
12373 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
12374 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
12375 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
12377 GTK_POLICY_AUTOMATIC);
12378 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
12380 box2 = gtk_vbox_new (FALSE, 0);
12381 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12382 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
12383 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
12384 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
12385 gtk_widget_show (box2);
12387 for (i = 0; i < nbuttons; i++)
12389 button = gtk_button_new_with_label (buttons[i].label);
12390 if (buttons[i].func)
12391 g_signal_connect (button,
12393 G_CALLBACK(buttons[i].func),
12396 gtk_widget_set_sensitive (button, FALSE);
12397 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12400 separator = gtk_hseparator_new ();
12401 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
12403 box2 = gtk_vbox_new (FALSE, 10);
12404 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
12405 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
12407 button = gtk_button_new_with_mnemonic ("_Close");
12408 g_signal_connect (button, "clicked",
12409 G_CALLBACK (do_exit),
12411 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
12412 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
12413 gtk_widget_grab_default (button);
12415 gtk_widget_show_all (window);
12421 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
12422 G_FILE_TEST_EXISTS))
12424 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
12425 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/gtk.immodules", TRUE);
12430 pad (const char *str, int to)
12432 static char buf[256];
12433 int len = strlen (str);
12436 for (i = 0; i < to; i++)
12441 memcpy (buf, str, len);
12447 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
12449 fn (widget); /* on */
12450 while (g_main_context_iteration (NULL, FALSE));
12451 fn (widget); /* off */
12452 while (g_main_context_iteration (NULL, FALSE));
12456 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
12462 static gboolean printed_headers = FALSE;
12464 if (!printed_headers) {
12465 g_print ("Test Iters First Other\n");
12466 g_print ("-------------------- ----- ---------- ----------\n");
12467 printed_headers = TRUE;
12470 g_get_current_time (&tv0);
12471 bench_iteration (widget, fn);
12472 g_get_current_time (&tv1);
12474 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12475 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12477 g_get_current_time (&tv0);
12478 for (n = 0; n < num - 1; n++)
12479 bench_iteration (widget, fn);
12480 g_get_current_time (&tv1);
12481 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
12482 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
12484 g_print ("%s %5d ", pad (name, 20), num);
12486 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
12488 g_print ("%10.1f\n", dt_first);
12492 do_bench (char* what, int num)
12496 void (* fn) (GtkWidget *widget);
12498 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
12500 if (g_ascii_strcasecmp (what, "ALL") == 0)
12502 for (i = 0; i < nbuttons; i++)
12504 if (!buttons[i].do_not_benchmark)
12505 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
12512 for (i = 0; i < nbuttons; i++)
12514 if (strcmp (buttons[i].label, what) == 0)
12516 fn = buttons[i].func;
12522 g_print ("Can't bench: \"%s\" not found.\n", what);
12524 do_real_bench (widget, fn, buttons[i].label, num);
12531 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
12536 main (int argc, char *argv[])
12538 GtkBindingSet *binding_set;
12540 gboolean done_benchmarks = FALSE;
12542 srand (time (NULL));
12546 /* Check to see if we are being run from the correct
12549 if (file_exists ("testgtkrc"))
12550 gtk_rc_add_default_file ("testgtkrc");
12552 g_set_application_name ("GTK+ Test Program");
12554 gtk_init (&argc, &argv);
12558 for (i = 1; i < argc; i++)
12560 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
12567 nextarg = strchr (argv[i], '=');
12578 count = strchr (nextarg, ':');
12581 what = g_strndup (nextarg, count - nextarg);
12583 num = atoi (count);
12588 what = g_strdup (nextarg);
12590 do_bench (what, num ? num : 1);
12591 done_benchmarks = TRUE;
12596 if (done_benchmarks)
12601 binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_WIDGET));
12602 gtk_binding_entry_add_signal (binding_set,
12603 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
12606 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
12608 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
12612 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
12613 " fg[NORMAL] = \"#ff0000\"\n"
12614 " font = \"Sans 18\"\n"
12616 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
12618 create_main_window ();
12624 while (g_main_context_pending (NULL))
12625 g_main_context_iteration (NULL, FALSE);
12628 while (g_main_context_pending (NULL))
12629 g_main_context_iteration (NULL, FALSE);