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 Library 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 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library 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.
20 #include "gtklistitem.h"
22 #include "gtksignal.h"
32 static void gtk_list_class_init (GtkListClass *klass);
33 static void gtk_list_init (GtkList *list);
34 static void gtk_list_shutdown (GtkObject *object);
35 static void gtk_list_destroy (GtkObject *object);
36 static void gtk_list_map (GtkWidget *widget);
37 static void gtk_list_unmap (GtkWidget *widget);
38 static void gtk_list_realize (GtkWidget *widget);
39 static void gtk_list_draw (GtkWidget *widget,
41 static gint gtk_list_expose (GtkWidget *widget,
42 GdkEventExpose *event);
43 static gint gtk_list_enter_notify (GtkWidget *widget,
44 GdkEventCrossing *event);
45 static gint gtk_list_button_press (GtkWidget *widget,
46 GdkEventButton *event);
47 static gint gtk_list_button_release (GtkWidget *widget,
48 GdkEventButton *event);
49 static void gtk_list_size_request (GtkWidget *widget,
50 GtkRequisition *requisition);
51 static void gtk_list_size_allocate (GtkWidget *widget,
52 GtkAllocation *allocation);
53 static void gtk_list_add (GtkContainer *container,
55 static void gtk_list_remove (GtkContainer *container,
57 static void gtk_list_foreach (GtkContainer *container,
59 gpointer callback_data);
61 static void gtk_real_list_select_child (GtkList *list,
63 static void gtk_real_list_unselect_child (GtkList *list,
66 static GtkType gtk_list_child_type (GtkContainer *container);
69 static GtkContainerClass *parent_class = NULL;
70 static guint list_signals[LAST_SIGNAL] = { 0 };
74 gtk_list_get_type (void)
76 static guint list_type = 0;
80 GtkTypeInfo list_info =
84 sizeof (GtkListClass),
85 (GtkClassInitFunc) gtk_list_class_init,
86 (GtkObjectInitFunc) gtk_list_init,
87 /* reserved_1 */ NULL,
88 /* reserved_2 */ NULL,
89 (GtkClassInitFunc) NULL,
92 list_type = gtk_type_unique (gtk_container_get_type (), &list_info);
99 gtk_list_class_init (GtkListClass *class)
101 GtkObjectClass *object_class;
102 GtkWidgetClass *widget_class;
103 GtkContainerClass *container_class;
105 object_class = (GtkObjectClass*) class;
106 widget_class = (GtkWidgetClass*) class;
107 container_class = (GtkContainerClass*) class;
109 parent_class = gtk_type_class (gtk_container_get_type ());
111 list_signals[SELECTION_CHANGED] =
112 gtk_signal_new ("selection_changed",
115 GTK_SIGNAL_OFFSET (GtkListClass, selection_changed),
116 gtk_marshal_NONE__NONE,
118 list_signals[SELECT_CHILD] =
119 gtk_signal_new ("select_child",
122 GTK_SIGNAL_OFFSET (GtkListClass, select_child),
123 gtk_marshal_NONE__POINTER,
126 list_signals[UNSELECT_CHILD] =
127 gtk_signal_new ("unselect_child",
130 GTK_SIGNAL_OFFSET (GtkListClass, unselect_child),
131 gtk_marshal_NONE__POINTER,
135 gtk_object_class_add_signals (object_class, list_signals, LAST_SIGNAL);
137 object_class->shutdown = gtk_list_shutdown;
138 object_class->destroy = gtk_list_destroy;
140 widget_class->map = gtk_list_map;
141 widget_class->unmap = gtk_list_unmap;
142 widget_class->realize = gtk_list_realize;
143 widget_class->draw = gtk_list_draw;
144 widget_class->expose_event = gtk_list_expose;
145 widget_class->button_press_event = gtk_list_button_press;
146 widget_class->button_release_event = gtk_list_button_release;
147 widget_class->enter_notify_event = gtk_list_enter_notify;
148 widget_class->size_request = gtk_list_size_request;
149 widget_class->size_allocate = gtk_list_size_allocate;
151 container_class->add = gtk_list_add;
152 container_class->remove = gtk_list_remove;
153 container_class->foreach = gtk_list_foreach;
154 container_class->child_type = gtk_list_child_type;
156 class->selection_changed = NULL;
157 class->select_child = gtk_real_list_select_child;
158 class->unselect_child = gtk_real_list_unselect_child;
162 gtk_list_child_type (GtkContainer *container)
164 return GTK_TYPE_LIST_ITEM;
168 gtk_list_init (GtkList *list)
170 list->children = NULL;
171 list->selection = NULL;
173 list->selection_start_pos = 0;
174 list->selection_end_pos = 0;
175 list->selection_mode = GTK_SELECTION_SINGLE;
176 list->scroll_direction = 0;
183 return GTK_WIDGET (gtk_type_new (gtk_list_get_type ()));
187 gtk_list_shutdown (GtkObject *object)
189 gtk_list_clear_items (GTK_LIST (object), 0, -1);
191 GTK_OBJECT_CLASS (parent_class)->shutdown (object);
195 gtk_list_destroy (GtkObject *object)
199 GtkList *list = GTK_LIST (object);
201 for (node = list->children; node; node = node->next)
205 child = (GtkWidget *)node->data;
206 gtk_widget_ref (child);
207 gtk_widget_unparent (child);
208 gtk_widget_destroy (child);
209 gtk_widget_unref (child);
211 g_list_free (list->children);
212 list->children = NULL;
214 for (node = list->selection; node; node = node->next)
218 child = (GtkWidget *)node->data;
219 gtk_widget_unref (child);
221 g_list_free (list->selection);
222 list->selection = NULL;
224 if (GTK_OBJECT_CLASS (parent_class)->destroy)
225 (*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
229 gtk_list_ungrab (GtkList *list)
231 g_return_if_fail (list != NULL);
232 g_return_if_fail (GTK_IS_LIST (list));
237 gtk_grab_remove (GTK_WIDGET (list));
238 gdk_pointer_ungrab (GDK_CURRENT_TIME);
243 gtk_list_insert_items (GtkList *list,
252 g_return_if_fail (list != NULL);
253 g_return_if_fail (GTK_IS_LIST (list));
258 gtk_list_ungrab (list);
263 widget = tmp_list->data;
264 tmp_list = tmp_list->next;
266 gtk_widget_set_parent (widget, GTK_WIDGET (list));
268 if (GTK_WIDGET_VISIBLE (widget->parent))
270 if (GTK_WIDGET_REALIZED (widget->parent) &&
271 !GTK_WIDGET_REALIZED (widget))
272 gtk_widget_realize (widget);
274 if (GTK_WIDGET_MAPPED (widget->parent) &&
275 !GTK_WIDGET_MAPPED (widget))
276 gtk_widget_map (widget);
280 nchildren = g_list_length (list->children);
281 if ((position < 0) || (position > nchildren))
282 position = nchildren;
284 if (position == nchildren)
288 tmp_list = g_list_last (list->children);
289 tmp_list->next = items;
290 items->prev = tmp_list;
294 list->children = items;
299 tmp_list = g_list_nth (list->children, position);
300 last = g_list_last (items);
303 tmp_list->prev->next = items;
304 last->next = tmp_list;
305 items->prev = tmp_list->prev;
306 tmp_list->prev = last;
308 if (tmp_list == list->children)
309 list->children = items;
312 if (list->children && !list->selection &&
313 (list->selection_mode == GTK_SELECTION_BROWSE))
315 widget = list->children->data;
316 gtk_list_select_child (list, widget);
319 if (GTK_WIDGET_VISIBLE (list))
320 gtk_widget_queue_resize (GTK_WIDGET (list));
324 gtk_list_append_items (GtkList *list,
327 g_return_if_fail (list != NULL);
328 g_return_if_fail (GTK_IS_LIST (list));
330 gtk_list_insert_items (list, items, -1);
334 gtk_list_prepend_items (GtkList *list,
337 g_return_if_fail (list != NULL);
338 g_return_if_fail (GTK_IS_LIST (list));
340 gtk_list_insert_items (list, items, 0);
344 gtk_list_remove_items_internal (GtkList *list,
349 GList *selected_widgets;
352 g_return_if_fail (list != NULL);
353 g_return_if_fail (GTK_IS_LIST (list));
358 gtk_list_ungrab (list);
361 selected_widgets = NULL;
366 widget = tmp_list->data;
367 tmp_list = tmp_list->next;
370 gtk_widget_ref (widget);
372 list->children = g_list_remove (list->children, widget);
374 if (widget->state == GTK_STATE_SELECTED)
375 selected_widgets = g_list_prepend (selected_widgets, widget);
377 gtk_widget_unparent (widget);
380 if (selected_widgets)
382 tmp_list = selected_widgets;
385 widget = tmp_list->data;
386 tmp_list = tmp_list->next;
388 gtk_list_unselect_child (list, widget);
390 gtk_widget_unparent (widget);
393 gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECTION_CHANGED]);
396 g_list_free (selected_widgets);
398 if (list->children && !list->selection &&
399 (list->selection_mode == GTK_SELECTION_BROWSE))
401 widget = list->children->data;
402 gtk_list_select_child (list, widget);
405 if (GTK_WIDGET_VISIBLE (list))
406 gtk_widget_queue_resize (GTK_WIDGET (list));
410 gtk_list_remove_items (GtkList *list,
413 gtk_list_remove_items_internal (list, items, FALSE);
417 gtk_list_remove_items_no_unref (GtkList *list,
420 gtk_list_remove_items_internal (list, items, TRUE);
424 gtk_list_clear_items (GtkList *list,
434 g_return_if_fail (list != NULL);
435 g_return_if_fail (GTK_IS_LIST (list));
437 nchildren = g_list_length (list->children);
441 gboolean selection_changed;
443 if ((end < 0) || (end > nchildren))
449 start_list = g_list_nth (list->children, start);
450 end_list = g_list_nth (list->children, end);
452 gtk_list_ungrab (list);
454 if (start_list->prev)
455 start_list->prev->next = end_list;
456 if (end_list && end_list->prev)
457 end_list->prev->next = NULL;
459 end_list->prev = start_list->prev;
460 if (start_list == list->children)
461 list->children = end_list;
463 selection_changed = FALSE;
465 tmp_list = start_list;
469 widget = tmp_list->data;
470 tmp_list = tmp_list->next;
472 if (widget->state == GTK_STATE_SELECTED)
474 gtk_list_unselect_child (list, widget);
475 selection_changed = TRUE;
478 gtk_widget_unparent (widget);
481 g_list_free (start_list);
483 if (list->children && !list->selection &&
484 (list->selection_mode == GTK_SELECTION_BROWSE))
486 widget = list->children->data;
487 gtk_list_select_child (list, widget);
489 else if (selection_changed)
490 gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECTION_CHANGED]);
492 gtk_widget_queue_resize (GTK_WIDGET (list));
497 gtk_list_select_item (GtkList *list,
502 g_return_if_fail (list != NULL);
503 g_return_if_fail (GTK_IS_LIST (list));
505 tmp_list = g_list_nth (list->children, item);
507 gtk_list_select_child (list, GTK_WIDGET (tmp_list->data));
511 gtk_list_unselect_item (GtkList *list,
516 g_return_if_fail (list != NULL);
517 g_return_if_fail (GTK_IS_LIST (list));
519 tmp_list = g_list_nth (list->children, item);
521 gtk_list_unselect_child (list, GTK_WIDGET (tmp_list->data));
525 gtk_list_select_child (GtkList *list,
528 gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECT_CHILD], child);
532 gtk_list_unselect_child (GtkList *list,
535 gtk_signal_emit (GTK_OBJECT (list), list_signals[UNSELECT_CHILD], child);
539 gtk_list_child_position (GtkList *list,
545 g_return_val_if_fail (list != NULL, -1);
546 g_return_val_if_fail (GTK_IS_LIST (list), -1);
547 g_return_val_if_fail (child != NULL, -1);
550 children = list->children;
554 if (child == GTK_WIDGET (children->data))
558 children = children->next;
565 gtk_list_set_selection_mode (GtkList *list,
566 GtkSelectionMode mode)
568 g_return_if_fail (list != NULL);
569 g_return_if_fail (GTK_IS_LIST (list));
571 list->selection_mode = mode;
576 gtk_list_map (GtkWidget *widget)
582 g_return_if_fail (widget != NULL);
583 g_return_if_fail (GTK_IS_LIST (widget));
585 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
586 list = GTK_LIST (widget);
588 gdk_window_show (widget->window);
590 children = list->children;
593 child = children->data;
594 children = children->next;
596 if (GTK_WIDGET_VISIBLE (child) &&
597 !GTK_WIDGET_MAPPED (child))
598 gtk_widget_map (child);
603 gtk_list_unmap (GtkWidget *widget)
605 g_return_if_fail (widget != NULL);
606 g_return_if_fail (GTK_IS_LIST (widget));
608 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
609 gdk_window_hide (widget->window);
613 gtk_list_realize (GtkWidget *widget)
615 GdkWindowAttr attributes;
616 gint attributes_mask;
618 g_return_if_fail (widget != NULL);
619 g_return_if_fail (GTK_IS_LIST (widget));
621 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
623 attributes.window_type = GDK_WINDOW_CHILD;
624 attributes.x = widget->allocation.x;
625 attributes.y = widget->allocation.y;
626 attributes.width = widget->allocation.width;
627 attributes.height = widget->allocation.height;
628 attributes.wclass = GDK_INPUT_OUTPUT;
629 attributes.visual = gtk_widget_get_visual (widget);
630 attributes.colormap = gtk_widget_get_colormap (widget);
631 attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
633 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
635 widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
636 gdk_window_set_user_data (widget->window, widget);
638 widget->style = gtk_style_attach (widget->style, widget->window);
639 gdk_window_set_background (widget->window,
640 &widget->style->base[GTK_STATE_NORMAL]);
644 gtk_list_draw (GtkWidget *widget,
649 GdkRectangle child_area;
652 g_return_if_fail (widget != NULL);
653 g_return_if_fail (GTK_IS_LIST (widget));
654 g_return_if_fail (area != NULL);
656 if (GTK_WIDGET_DRAWABLE (widget))
658 list = GTK_LIST (widget);
660 children = list->children;
663 child = children->data;
664 children = children->next;
666 if (gtk_widget_intersect (child, area, &child_area))
667 gtk_widget_draw (child, &child_area);
673 gtk_list_expose (GtkWidget *widget,
674 GdkEventExpose *event)
678 GdkEventExpose child_event;
681 g_return_val_if_fail (widget != NULL, FALSE);
682 g_return_val_if_fail (GTK_IS_LIST (widget), FALSE);
683 g_return_val_if_fail (event != NULL, FALSE);
685 if (GTK_WIDGET_DRAWABLE (widget))
687 list = GTK_LIST (widget);
689 child_event = *event;
691 children = list->children;
694 child = children->data;
695 children = children->next;
697 if (GTK_WIDGET_NO_WINDOW (child) &&
698 gtk_widget_intersect (child, &event->area, &child_event.area))
699 gtk_widget_event (child, (GdkEvent*) &child_event);
707 gtk_list_enter_notify (GtkWidget *widget,
708 GdkEventCrossing *event)
713 g_return_val_if_fail (widget != NULL, FALSE);
714 g_return_val_if_fail (GTK_IS_LIST (widget), FALSE);
715 g_return_val_if_fail (event != NULL, FALSE);
717 list = GTK_LIST (widget);
718 item = gtk_get_event_widget ((GdkEvent*) event);
723 while (item && !GTK_IS_LIST_ITEM (item))
726 if (item && (item->parent == widget))
728 gtk_list_select_child (list, item);
730 if (!GTK_WIDGET_HAS_FOCUS (item))
731 gtk_widget_grab_focus (item);
738 gtk_list_button_press (GtkWidget *widget,
739 GdkEventButton *event)
744 g_return_val_if_fail (widget != NULL, FALSE);
745 g_return_val_if_fail (GTK_IS_LIST (widget), FALSE);
746 g_return_val_if_fail (event != NULL, FALSE);
748 list = GTK_LIST (widget);
749 item = gtk_get_event_widget ((GdkEvent*) event);
751 if ((event->button != 1) || (list->button))
754 while (item && !GTK_IS_LIST_ITEM (item))
757 list->button = event->button;
758 gdk_pointer_grab (widget->window, TRUE,
759 GDK_BUTTON_PRESS_MASK |
760 GDK_BUTTON_RELEASE_MASK,
761 NULL, NULL, event->time);
762 gtk_grab_add (widget);
764 /* note: gtk_list_select_child() may cause the grab to be removed again!
766 if (item && (item->parent == widget))
767 gtk_list_select_child (list, item);
773 gtk_list_button_release (GtkWidget *widget,
774 GdkEventButton *event)
779 g_return_val_if_fail (widget != NULL, FALSE);
780 g_return_val_if_fail (GTK_IS_LIST (widget), FALSE);
781 g_return_val_if_fail (event != NULL, FALSE);
783 list = GTK_LIST (widget);
784 item = gtk_get_event_widget ((GdkEvent*) event);
786 if (list->button == event->button)
787 gtk_list_ungrab (list);
793 gtk_list_size_request (GtkWidget *widget,
794 GtkRequisition *requisition)
800 g_return_if_fail (widget != NULL);
801 g_return_if_fail (GTK_IS_LIST (widget));
802 g_return_if_fail (requisition != NULL);
804 list = GTK_LIST (widget);
805 requisition->width = 0;
806 requisition->height = 0;
808 children = list->children;
811 child = children->data;
812 children = children->next;
814 if (GTK_WIDGET_VISIBLE (child))
816 gtk_widget_size_request (child, &child->requisition);
818 requisition->width = MAX (requisition->width, child->requisition.width);
819 requisition->height += child->requisition.height;
823 requisition->width += GTK_CONTAINER (list)->border_width * 2;
824 requisition->height += GTK_CONTAINER (list)->border_width * 2;
826 requisition->width = MAX (requisition->width, 1);
827 requisition->height = MAX (requisition->height, 1);
831 gtk_list_size_allocate (GtkWidget *widget,
832 GtkAllocation *allocation)
836 GtkAllocation child_allocation;
839 g_return_if_fail (widget != NULL);
840 g_return_if_fail (GTK_IS_LIST (widget));
841 g_return_if_fail (allocation != NULL);
843 list = GTK_LIST (widget);
845 widget->allocation = *allocation;
846 if (GTK_WIDGET_REALIZED (widget))
847 gdk_window_move_resize (widget->window,
848 allocation->x, allocation->y,
849 allocation->width, allocation->height);
853 child_allocation.x = GTK_CONTAINER (list)->border_width;
854 child_allocation.y = GTK_CONTAINER (list)->border_width;
855 child_allocation.width = MAX (1, allocation->width - child_allocation.x * 2);
857 children = list->children;
861 child = children->data;
862 children = children->next;
864 if (GTK_WIDGET_VISIBLE (child))
866 child_allocation.height = child->requisition.height;
868 gtk_widget_size_allocate (child, &child_allocation);
870 child_allocation.y += child_allocation.height;
877 gtk_list_add (GtkContainer *container,
882 g_return_if_fail (container != NULL);
883 g_return_if_fail (GTK_IS_LIST (container));
884 g_return_if_fail (widget != NULL);
885 g_return_if_fail (GTK_IS_LIST_ITEM (widget));
887 item_list = g_list_alloc ();
888 item_list->data = widget;
890 gtk_list_append_items (GTK_LIST (container), item_list);
894 gtk_list_remove (GtkContainer *container,
899 g_return_if_fail (container != NULL);
900 g_return_if_fail (GTK_IS_LIST (container));
901 g_return_if_fail (widget != NULL);
902 g_return_if_fail (container == GTK_CONTAINER (widget->parent));
905 item_list = g_list_alloc ();
906 item_list->data = widget;
908 gtk_list_remove_items (GTK_LIST (container), item_list);
910 g_list_free (item_list);
914 gtk_list_foreach (GtkContainer *container,
915 GtkCallback callback,
916 gpointer callback_data)
922 g_return_if_fail (container != NULL);
923 g_return_if_fail (GTK_IS_LIST (container));
924 g_return_if_fail (callback != NULL);
926 list = GTK_LIST (container);
927 children = list->children;
931 child = children->data;
932 children = children->next;
934 (* callback) (child, callback_data);
940 gtk_real_list_select_child (GtkList *list,
947 g_return_if_fail (list != NULL);
948 g_return_if_fail (GTK_IS_LIST (list));
949 g_return_if_fail (child != NULL);
950 g_return_if_fail (GTK_IS_LIST_ITEM (child));
952 switch (list->selection_mode)
954 case GTK_SELECTION_SINGLE:
955 selection = list->selection;
959 tmp_item = selection->data;
961 if (tmp_item != child)
963 tmp_list = selection;
964 selection = selection->next;
966 list->selection = g_list_remove_link (list->selection, tmp_list);
967 g_list_free (tmp_list);
969 gtk_list_item_deselect (GTK_LIST_ITEM (tmp_item));
970 gtk_widget_unref (GTK_WIDGET (tmp_item));
973 selection = selection->next;
976 if (child->state == GTK_STATE_NORMAL)
978 list->selection = g_list_prepend (list->selection, child);
979 gtk_widget_ref (child);
980 gtk_list_item_select (GTK_LIST_ITEM (child));
982 else if (child->state == GTK_STATE_SELECTED)
984 list->selection = g_list_remove (list->selection, child);
985 gtk_list_item_deselect (GTK_LIST_ITEM (child));
986 gtk_widget_unref (child);
989 gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECTION_CHANGED]);
992 case GTK_SELECTION_BROWSE:
993 selection = list->selection;
997 tmp_item = selection->data;
999 if (tmp_item != child)
1001 tmp_list = selection;
1002 selection = selection->next;
1004 list->selection = g_list_remove_link (list->selection, tmp_list);
1005 g_list_free (tmp_list);
1007 gtk_list_item_deselect (GTK_LIST_ITEM (tmp_item));
1008 gtk_widget_unref (GTK_WIDGET (tmp_item));
1011 selection = selection->next;
1014 if (child->state == GTK_STATE_NORMAL)
1016 list->selection = g_list_prepend (list->selection, child);
1017 gtk_widget_ref (child);
1018 gtk_list_item_select (GTK_LIST_ITEM (child));
1019 gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECTION_CHANGED]);
1023 case GTK_SELECTION_MULTIPLE:
1024 if (child->state == GTK_STATE_NORMAL)
1026 list->selection = g_list_prepend (list->selection, child);
1027 gtk_widget_ref (child);
1028 gtk_list_item_select (GTK_LIST_ITEM (child));
1029 gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECTION_CHANGED]);
1031 else if (child->state == GTK_STATE_SELECTED)
1033 list->selection = g_list_remove (list->selection, child);
1034 gtk_list_item_deselect (GTK_LIST_ITEM (child));
1035 gtk_widget_unref (child);
1036 gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECTION_CHANGED]);
1040 case GTK_SELECTION_EXTENDED:
1046 gtk_real_list_unselect_child (GtkList *list,
1049 g_return_if_fail (list != NULL);
1050 g_return_if_fail (GTK_IS_LIST (list));
1051 g_return_if_fail (child != NULL);
1052 g_return_if_fail (GTK_IS_LIST_ITEM (child));
1054 switch (list->selection_mode)
1056 case GTK_SELECTION_SINGLE:
1057 case GTK_SELECTION_MULTIPLE:
1058 case GTK_SELECTION_BROWSE:
1059 if (child->state == GTK_STATE_SELECTED)
1061 list->selection = g_list_remove (list->selection, child);
1062 gtk_list_item_deselect (GTK_LIST_ITEM (child));
1063 gtk_widget_unref (child);
1064 gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECTION_CHANGED]);
1068 case GTK_SELECTION_EXTENDED: