2007-08-10 Federico Mena Quintero Fix http://bugzilla.gnome.org/show_bug.cgi?id=330298 once again (desktop icons overlap when placing a volume icon, and in various other situations): * libnautilus-private/nautilus-icon-container.c (icon_set_position): Clear icon->has_lazy_position, since the icon will be well-positioned once this function exits. (finish_adding_new_icons): Don't clear icon->has_lazy_position here, since it is now done in icon_set_position(). Emit the "icon-position-changed" signal so that the upstream code will save the final position for icons which were semi-positioned. (finish_adding_new_icons): Remember the original icon->has_lazy_position before calling assign_icon_position(); later, if the icon was to be lazily positioned, add it to the semi_position_icons list. Previously we were ignoring semi-positioned icons when populating the placement grid; that's why overlaps would happen. * src/file-manager/fm-icon-view.c (file_has_lazy_position): Also use lazy positioning for drives, not just volumes. diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c index dbf1da5..7a17479 100644 --- a/libnautilus-private/nautilus-icon-container.c +++ b/libnautilus-private/nautilus-icon-container.c @@ -298,6 +298,8 @@ icon_set_position (NautilusIcon *icon, int x1, y1, x2, y2; int container_x, container_y, container_width, container_height; + icon->has_lazy_position = FALSE; + if (icon->x == x && icon->y == y) { return; } @@ -5859,9 +5861,13 @@ finish_adding_new_icons (NautilusIconContainer *container) new_icons = g_list_reverse (new_icons); no_position_icons = semi_position_icons = NULL; for (p = new_icons; p != NULL; p = p->next) { + gboolean had_lazy_position; + icon = p->data; + had_lazy_position = icon->has_lazy_position; + if (assign_icon_position (container, icon)) { - if (!container->details->auto_layout && icon->has_lazy_position) { + if (!container->details->auto_layout && had_lazy_position) { semi_position_icons = g_list_prepend (semi_position_icons, icon); } } else { @@ -5894,6 +5900,7 @@ finish_adding_new_icons (NautilusIconContainer *container) for (p = semi_position_icons; p != NULL; p = p->next) { NautilusIcon *icon; int x, y; + NautilusIconPosition position; icon = p->data; x = icon->x; @@ -5906,9 +5913,10 @@ finish_adding_new_icons (NautilusIconContainer *container) placement_grid_mark_icon (grid, icon); - /* ensure that next time we run this code, the formerly semi-positioned - * icons are treated as being positioned. */ - icon->has_lazy_position = FALSE; + position.x = icon->x; + position.y = icon->y; + g_signal_emit (container, signals[ICON_POSITION_CHANGED], 0, + icon->data, &position); } placement_grid_free (grid); diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c index 864382e..efff989 100644 --- a/src/file-manager/fm-icon-view.c +++ b/src/file-manager/fm-icon-view.c @@ -538,7 +538,7 @@ file_has_lazy_position (FMDirectoryView *view, * icon we don't overlap that one. We don't do this in general though, * as it can cause icons moving around. */ - lazy_position = nautilus_file_has_volume (file); + lazy_position = nautilus_file_has_volume (file) || nautilus_file_has_drive (file); if (lazy_position && fm_directory_view_get_loading (view)) { /* if volumes are loaded during directory load, don't mark them * as lazy. This is wrong for files that were mounted during user