Probably the most obvious/reported icon container glitch [1,2]. Proposed patch attached. [1] http://bugzilla.gnome.org/show_bug.cgi?id=45953 [2] http://bugzilla.gnome.org/attachment.cgi?id=31279&action=view -- Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-icon-container.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-container.c,v retrieving revision 1.393 diff -u -p -r1.393 nautilus-icon-container.c --- libnautilus-private/nautilus-icon-container.c 12 Aug 2005 18:11:29 -0000 1.393 +++ libnautilus-private/nautilus-icon-container.c 14 Aug 2005 22:43:48 -0000 @@ -5152,7 +5152,7 @@ finish_adding_icon (NautilusIconContaine static void finish_adding_new_icons (NautilusIconContainer *container) { - GList *p, *new_icons, *no_position_icons; + GList *p, *new_icons, *no_position_icons, *semi_position_icons; NautilusIcon *icon; double bottom; @@ -5161,16 +5161,57 @@ finish_adding_new_icons (NautilusIconCon /* Position most icons (not unpositioned manual-layout icons). */ new_icons = g_list_reverse (new_icons); - no_position_icons = NULL; + no_position_icons = semi_position_icons = NULL; for (p = new_icons; p != NULL; p = p->next) { icon = p->data; if (!assign_icon_position (container, icon)) { no_position_icons = g_list_prepend (no_position_icons, icon); + } else if (!container->details->auto_layout && + icon->has_lazy_position) { + semi_position_icons = g_list_prepend (semi_position_icons, icon); } finish_adding_icon (container, icon); } g_list_free (new_icons); + if (semi_position_icons != NULL) { + PlacementGrid *grid; + + g_assert (!container->details->auto_layout); + + semi_position_icons = g_list_reverse (semi_position_icons); + + grid = placement_grid_new (container, TRUE); + + for (p = container->details->icons; p != NULL; p = p->next) { + icon = p->data; + + if (icon_is_positioned (icon) && !icon->has_lazy_position) { + placement_grid_mark_icon (grid, icon); + } + } + + for (p = semi_position_icons; p != NULL; p = p->next) { + NautilusIcon *icon; + int x, y; + + icon = p->data; + x = icon->x; + y = icon->y; + + find_empty_location (container, grid, + icon, x, y, &x, &y); + + icon_set_position (icon, x, y); + + placement_grid_mark_icon (grid, icon); + } + + placement_grid_free (grid); + + g_list_free (semi_position_icons); + } + /* Position the unpositioned manual layout icons. */ if (no_position_icons != NULL) { g_assert (!container->details->auto_layout); @@ -5186,13 +5227,18 @@ finish_adding_new_icons (NautilusIconCon * nautilus_icon_container_add: * @container: A NautilusIconContainer * @data: Icon data. + * @has_lazy_position: Whether the saved icon position should only be used + * if the previous icon position is free. If the position + * is occupied, another position near the last one will + * be used. * * Add icon to represent @data to container. * Returns FALSE if there was already such an icon. **/ gboolean nautilus_icon_container_add (NautilusIconContainer *container, - NautilusIconData *data) + NautilusIconData *data, + gboolean has_lazy_position) { NautilusIconContainerDetails *details; NautilusIcon *icon; @@ -5212,6 +5258,7 @@ nautilus_icon_container_add (NautilusIco icon->data = data; icon->x = ICON_UNPOSITIONED_VALUE; icon->y = ICON_UNPOSITIONED_VALUE; + icon->has_lazy_position = has_lazy_position; icon->scale_x = 1.0; icon->scale_y = 1.0; icon->item = NAUTILUS_ICON_CANVAS_ITEM Index: libnautilus-private/nautilus-icon-container.h =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-container.h,v retrieving revision 1.87 diff -u -p -r1.87 nautilus-icon-container.h --- libnautilus-private/nautilus-icon-container.h 5 Jul 2005 12:23:34 -0000 1.87 +++ libnautilus-private/nautilus-icon-container.h 14 Aug 2005 22:43:48 -0000 @@ -204,7 +204,8 @@ GtkWidget * nautilus_icon_containe /* adding, removing, and managing icons */ void nautilus_icon_container_clear (NautilusIconContainer *view); gboolean nautilus_icon_container_add (NautilusIconContainer *view, - NautilusIconData *data); + NautilusIconData *data, + gboolean has_lazy_position); void nautilus_icon_container_layout_now (NautilusIconContainer *container); gboolean nautilus_icon_container_remove (NautilusIconContainer *view, NautilusIconData *data); Index: libnautilus-private/nautilus-icon-dnd.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-dnd.c,v retrieving revision 1.148 diff -u -p -r1.148 nautilus-icon-dnd.c --- libnautilus-private/nautilus-icon-dnd.c 13 Jul 2005 08:17:29 -0000 1.148 +++ libnautilus-private/nautilus-icon-dnd.c 14 Aug 2005 22:43:49 -0000 @@ -844,7 +844,8 @@ handle_local_move (NautilusIconContainer g_free (screen_string); nautilus_icon_container_add (container, - NAUTILUS_ICON_CONTAINER_ICON_DATA (file)); + NAUTILUS_ICON_CONTAINER_ICON_DATA (file), + FALSE); icon = nautilus_icon_container_get_icon_by_uri (container, item->uri); Index: libnautilus-private/nautilus-icon-private.h =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-private.h,v retrieving revision 1.77 diff -u -p -r1.77 nautilus-icon-private.h --- libnautilus-private/nautilus-icon-private.h 6 Jul 2005 11:45:08 -0000 1.77 +++ libnautilus-private/nautilus-icon-private.h 14 Aug 2005 22:43:49 -0000 @@ -57,6 +57,7 @@ typedef struct { /* Whether a monitor was set on this icon. */ eel_boolean_bit is_monitored : 1; + eel_boolean_bit has_lazy_position : 1; } NautilusIcon; Index: src/file-manager/fm-icon-view.c =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/fm-icon-view.c,v retrieving revision 1.313 diff -u -p -r1.313 fm-icon-view.c --- src/file-manager/fm-icon-view.c 12 Aug 2005 18:11:30 -0000 1.313 +++ src/file-manager/fm-icon-view.c 14 Aug 2005 22:44:00 -0000 @@ -535,7 +535,9 @@ fm_icon_view_add_file (FMDirectoryView * } if (nautilus_icon_container_add (icon_container, - NAUTILUS_ICON_CONTAINER_ICON_DATA (file))) { + NAUTILUS_ICON_CONTAINER_ICON_DATA (file), + nautilus_file_has_volume (file) + || nautilus_file_has_drive (file))) { nautilus_file_ref (file); } } @@ -2018,7 +2020,9 @@ fm_icon_view_screen_changed (GtkWidget * fm_icon_view_remove_file (view, file); } else { if (nautilus_icon_container_add (icon_container, - NAUTILUS_ICON_CONTAINER_ICON_DATA (file))) { + NAUTILUS_ICON_CONTAINER_ICON_DATA (file), + nautilus_file_has_volume (file) + || nautilus_file_has_drive (file))) { nautilus_file_ref (file); } }
Attachment:
signature.asc
Description: This is a digitally signed message part