[nautilus] Support HiDpi icons



commit 0d4555d76f86ba2d49f48836b7eea11f1adfb2fd
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Fri Aug 2 14:37:13 2013 +0200

    Support HiDpi icons
    
    Port the rendering of icons to cairo surfaces, so that we can apply the
    GDK scale factor when rendering icons.

 libnautilus-private/nautilus-canvas-item.c         |  153 +++++++++++---------
 .../nautilus-file-conflict-dialog.c                |    4 +
 libnautilus-private/nautilus-file.c                |   30 ++--
 libnautilus-private/nautilus-file.h                |    2 +
 libnautilus-private/nautilus-icon-info.c           |   64 +++++----
 libnautilus-private/nautilus-icon-info.h           |   12 +-
 libnautilus-private/nautilus-program-choosing.c    |    4 +-
 libnautilus-private/nautilus-ui-utilities.c        |   14 ++-
 libnautilus-private/nautilus-ui-utilities.h        |    6 +-
 src/nautilus-autorun-software.c                    |    3 +-
 src/nautilus-canvas-view-container.c               |    6 +-
 src/nautilus-list-model.c                          |   40 +++++-
 src/nautilus-list-view.c                           |   14 ++-
 src/nautilus-properties-window.c                   |   15 ++-
 src/nautilus-shell-search-provider.c               |    4 +
 src/nautilus-view.c                                |   16 ++-
 src/nautilus-window-menus.c                        |    2 +-
 17 files changed, 250 insertions(+), 139 deletions(-)
---
diff --git a/libnautilus-private/nautilus-canvas-item.c b/libnautilus-private/nautilus-canvas-item.c
index 9747349..b976fe5 100644
--- a/libnautilus-private/nautilus-canvas-item.c
+++ b/libnautilus-private/nautilus-canvas-item.c
@@ -74,7 +74,7 @@ struct NautilusCanvasItemDetails {
        /* The image, text, font. */
        double x, y;
        GdkPixbuf *pixbuf;
-       GdkPixbuf *rendered_pixbuf;
+       cairo_surface_t *rendered_surface;
        char *editable_text;            /* Text that can be modified by a renaming function */
        char *additional_text;          /* Text that cannot be modifed, such as file size, etc. */
        GdkPoint *attach_points;
@@ -222,9 +222,9 @@ nautilus_canvas_item_finalize (GObject *object)
        g_free (details->editable_text);
        g_free (details->additional_text);
        g_free (details->attach_points);
-       
-       if (details->rendered_pixbuf != NULL) {
-               g_object_unref (details->rendered_pixbuf);
+
+       if (details->rendered_surface != NULL) {
+               cairo_surface_destroy (details->rendered_surface);
        }
 
        if (details->editable_text_layout != NULL) {
@@ -428,12 +428,34 @@ nautilus_canvas_item_get_property (GObject        *object,
        }
 }
 
+static void
+get_scaled_icon_size (NautilusCanvasItem *item,
+                     gint *width,
+                     gint *height)
+{
+       EelCanvas *canvas;
+       GdkPixbuf *pixbuf = NULL;
+       gint scale;
+
+       if (item != NULL) {
+               canvas = EEL_CANVAS_ITEM (item)->canvas;
+               scale = gtk_widget_get_scale_factor (GTK_WIDGET (canvas));
+               pixbuf = item->details->pixbuf;
+       }
+
+       if (width)
+               *width = (pixbuf == NULL) ? 0 : (gdk_pixbuf_get_width (pixbuf) / scale);
+       if (height)
+               *height = (pixbuf == NULL) ? 0 : (gdk_pixbuf_get_height (pixbuf) / scale);
+}
+
 cairo_surface_t *
 nautilus_canvas_item_get_drag_surface (NautilusCanvasItem *item)
 {
        cairo_surface_t *surface;
        EelCanvas *canvas;
        int width, height;
+       int pix_width, pix_height;
        int item_offset_x, item_offset_y;
        EelIRect icon_rect;
        double item_x, item_y;
@@ -469,12 +491,14 @@ nautilus_canvas_item_get_drag_surface (NautilusCanvasItem *item)
        cr = cairo_create (surface);
 
        gtk_render_icon (context, cr, item->details->pixbuf,
-                          item_offset_x, item_offset_y);
+                        item_offset_x, item_offset_y);
+
+       get_scaled_icon_size (item, &pix_width, &pix_height);
 
        icon_rect.x0 = item_offset_x;
        icon_rect.y0 = item_offset_y;
-       icon_rect.x1 = item_offset_x + gdk_pixbuf_get_width (item->details->pixbuf);
-       icon_rect.y1 = item_offset_y + gdk_pixbuf_get_height (item->details->pixbuf);
+       icon_rect.x1 = item_offset_x + pix_width;
+       icon_rect.y1 = item_offset_y + pix_height;
 
        draw_embedded_text (item, cr,
                            item_offset_x, item_offset_y);
@@ -506,9 +530,9 @@ nautilus_canvas_item_set_image (NautilusCanvasItem *item,
        if (details->pixbuf != NULL) {
                g_object_unref (details->pixbuf);
        }
-       if (details->rendered_pixbuf != NULL) {
-               g_object_unref (details->rendered_pixbuf);
-               details->rendered_pixbuf = NULL;
+       if (details->rendered_surface != NULL) {
+               cairo_surface_destroy (details->rendered_surface);
+               details->rendered_surface = NULL;
        }
 
        details->pixbuf = image;
@@ -1236,13 +1260,14 @@ draw_pixbuf (GdkPixbuf *pixbuf,
 }
 
 /* shared code to highlight or dim the passed-in pixbuf */
-static GdkPixbuf *
-real_map_pixbuf (NautilusCanvasItem *canvas_item)
+static cairo_surface_t *
+real_map_surface (NautilusCanvasItem *canvas_item)
 {
        EelCanvas *canvas;
        GdkPixbuf *temp_pixbuf, *old_pixbuf;
        GtkStyleContext *style;
        GdkRGBA color;
+       cairo_surface_t *surface;
        
        temp_pixbuf = canvas_item->details->pixbuf;
        canvas = EEL_CANVAS_ITEM(canvas_item)->canvas;
@@ -1272,23 +1297,28 @@ real_map_pixbuf (NautilusCanvasItem *canvas_item)
 
                g_object_unref (old_pixbuf);
        }
-       
-       return temp_pixbuf;
+
+       surface = gdk_cairo_surface_create_from_pixbuf (temp_pixbuf,
+                                                       gtk_widget_get_scale_factor (GTK_WIDGET (canvas)),
+                                                       gtk_widget_get_window (GTK_WIDGET (canvas)));
+       g_object_unref (temp_pixbuf);
+
+       return surface;
 }
 
-static GdkPixbuf *
-map_pixbuf (NautilusCanvasItem *canvas_item)
+static cairo_surface_t *
+map_surface (NautilusCanvasItem *canvas_item)
 {
-       if (!(canvas_item->details->rendered_pixbuf != NULL
+       if (!(canvas_item->details->rendered_surface != NULL
              && canvas_item->details->rendered_is_prelit == canvas_item->details->is_prelit
              && canvas_item->details->rendered_is_highlighted_for_selection == 
canvas_item->details->is_highlighted_for_selection
              && canvas_item->details->rendered_is_highlighted_for_drop == 
canvas_item->details->is_highlighted_for_drop
              && canvas_item->details->rendered_is_highlighted_for_clipboard == 
canvas_item->details->is_highlighted_for_clipboard
              && (canvas_item->details->is_highlighted_for_selection && 
canvas_item->details->rendered_is_focused == gtk_widget_has_focus (GTK_WIDGET (EEL_CANVAS_ITEM 
(canvas_item)->canvas))))) {
-               if (canvas_item->details->rendered_pixbuf != NULL) {
-                       g_object_unref (canvas_item->details->rendered_pixbuf);
+               if (canvas_item->details->rendered_surface != NULL) {
+                       cairo_surface_destroy (canvas_item->details->rendered_surface);
                }
-               canvas_item->details->rendered_pixbuf = real_map_pixbuf (canvas_item);
+               canvas_item->details->rendered_surface = real_map_surface (canvas_item);
                canvas_item->details->rendered_is_prelit = canvas_item->details->is_prelit;
                canvas_item->details->rendered_is_highlighted_for_selection = 
canvas_item->details->is_highlighted_for_selection;
                canvas_item->details->rendered_is_highlighted_for_drop = 
canvas_item->details->is_highlighted_for_drop;
@@ -1296,9 +1326,9 @@ map_pixbuf (NautilusCanvasItem *canvas_item)
                canvas_item->details->rendered_is_focused = gtk_widget_has_focus (GTK_WIDGET (EEL_CANVAS_ITEM 
(canvas_item)->canvas));
        }
 
-       g_object_ref (canvas_item->details->rendered_pixbuf);
+       cairo_surface_reference (canvas_item->details->rendered_surface);
 
-       return canvas_item->details->rendered_pixbuf;
+       return canvas_item->details->rendered_surface;
 }
 
 static void
@@ -1368,7 +1398,7 @@ nautilus_canvas_item_draw (EelCanvasItem *item,
        NautilusCanvasItem *canvas_item;
        NautilusCanvasItemDetails *details;
        EelIRect icon_rect;
-       GdkPixbuf *temp_pixbuf;
+       cairo_surface_t *temp_surface;
        GtkStyleContext *context;
 
        container = NAUTILUS_CANVAS_CONTAINER (item->canvas);
@@ -1385,12 +1415,12 @@ nautilus_canvas_item_draw (EelCanvasItem *item,
        gtk_style_context_add_class (context, "nautilus-canvas-item");
 
        icon_rect = canvas_item->details->icon_rect;
-       temp_pixbuf = map_pixbuf (canvas_item);
+       temp_surface = map_surface (canvas_item);
 
-       gtk_render_icon (context, cr,
-                          temp_pixbuf,
-                          icon_rect.x0, icon_rect.y0);
-       g_object_unref (temp_pixbuf);
+       gtk_render_icon_surface (context, cr,
+                                temp_surface,
+                                icon_rect.x0, icon_rect.y0);
+       cairo_surface_destroy (temp_surface);
 
        draw_embedded_text (canvas_item, cr, icon_rect.x0, icon_rect.y0);
        
@@ -1710,6 +1740,7 @@ nautilus_canvas_item_ensure_bounds_up_to_date (NautilusCanvasItem *canvas_item)
        EelIRect total_rect, total_rect_for_layout, total_rect_for_entire_text;
        EelCanvasItem *item;
        double pixels_per_unit;
+       gint width, height;
        
        details = canvas_item->details;
        item = EEL_CANVAS_ITEM (canvas_item);
@@ -1724,17 +1755,13 @@ nautilus_canvas_item_ensure_bounds_up_to_date (NautilusCanvasItem *canvas_item)
                icon_rect.y0 = 0;
                icon_rect_raw.x0 = 0;
                icon_rect_raw.y0 = 0;
-               if (details->pixbuf == NULL) {
-                       icon_rect.x1 = icon_rect.x0;
-                       icon_rect.y1 = icon_rect.y0;
-                       icon_rect_raw.x1 = icon_rect_raw.x0;
-                       icon_rect_raw.y1 = icon_rect_raw.y0;
-               } else {
-                       icon_rect_raw.x1 = icon_rect_raw.x0 + gdk_pixbuf_get_width (details->pixbuf);
-                       icon_rect_raw.y1 = icon_rect_raw.y0 + gdk_pixbuf_get_height (details->pixbuf);
-                       icon_rect.x1 = icon_rect_raw.x1 / pixels_per_unit;
-                       icon_rect.y1 = icon_rect_raw.y1 / pixels_per_unit;
-               }
+
+               get_scaled_icon_size (canvas_item, &width, &height);
+
+               icon_rect_raw.x1 = icon_rect_raw.x0 + width;
+               icon_rect_raw.y1 = icon_rect_raw.y0 + height;
+               icon_rect.x1 = icon_rect_raw.x1 / pixels_per_unit;
+               icon_rect.y1 = icon_rect_raw.y1 / pixels_per_unit;
                
                /* Compute text rectangle. */
                text_rect = compute_text_rectangle (canvas_item, icon_rect, FALSE, BOUNDS_USAGE_FOR_DISPLAY);
@@ -1759,18 +1786,17 @@ nautilus_canvas_item_get_icon_rectangle (const NautilusCanvasItem *item)
 {
        EelDRect rectangle;
        double pixels_per_unit;
-       GdkPixbuf *pixbuf;
+       gint width, height;
        
        g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), eel_drect_empty);
 
        rectangle.x0 = item->details->x;
        rectangle.y0 = item->details->y;
        
-       pixbuf = item->details->pixbuf;
-       
        pixels_per_unit = EEL_CANVAS_ITEM (item)->canvas->pixels_per_unit;
-       rectangle.x1 = rectangle.x0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_width (pixbuf)) / pixels_per_unit;
-       rectangle.y1 = rectangle.y0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_height (pixbuf)) / pixels_per_unit;
+       get_scaled_icon_size (NAUTILUS_CANVAS_ITEM (item), &width, &height);
+       rectangle.x1 = rectangle.x0 + width / pixels_per_unit;
+       rectangle.y1 = rectangle.y0 + height / pixels_per_unit;
 
        eel_canvas_item_i2w (EEL_CANVAS_ITEM (item),
                             &rectangle.x0,
@@ -1791,18 +1817,17 @@ nautilus_canvas_item_get_text_rectangle (NautilusCanvasItem *item,
        EelIRect text_rectangle;
        EelDRect ret;
        double pixels_per_unit;
-       GdkPixbuf *pixbuf;
+       gint width, height;
        
        g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), eel_drect_empty);
 
        icon_rectangle.x0 = item->details->x;
        icon_rectangle.y0 = item->details->y;
        
-       pixbuf = item->details->pixbuf;
-       
        pixels_per_unit = EEL_CANVAS_ITEM (item)->canvas->pixels_per_unit;
-       icon_rectangle.x1 = icon_rectangle.x0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_width (pixbuf)) / 
pixels_per_unit;
-       icon_rectangle.y1 = icon_rectangle.y0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_height (pixbuf)) / 
pixels_per_unit;
+       get_scaled_icon_size (item, &width, &height);
+       icon_rectangle.x1 = icon_rectangle.x0 + width / pixels_per_unit;
+       icon_rectangle.y1 = icon_rectangle.y0 + height / pixels_per_unit;
 
        measure_label_text (item);
 
@@ -1824,27 +1849,27 @@ nautilus_canvas_item_get_text_rectangle (NautilusCanvasItem *item,
         return ret;
 }
 
-
 /* Get the rectangle of the icon only, in canvas coordinates. */
 static void
 get_icon_rectangle (NautilusCanvasItem *item,
-                     EelIRect *rect)
+                   EelIRect *rect)
 {
-       GdkPixbuf *pixbuf;
+       gint width, height;
 
        g_assert (NAUTILUS_IS_CANVAS_ITEM (item));
        g_assert (rect != NULL);
 
+
        eel_canvas_w2c (EEL_CANVAS_ITEM (item)->canvas,
                        item->details->x,
                        item->details->y,
                        &rect->x0,
                        &rect->y0);
        
-       pixbuf = item->details->pixbuf;
+       get_scaled_icon_size (item, &width, &height);
        
-       rect->x1 = rect->x0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_width (pixbuf));
-       rect->y1 = rect->y0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_height (pixbuf));
+       rect->x1 = rect->x0 + width;
+       rect->y1 = rect->y0 + height;
 }
 
 void
@@ -2385,13 +2410,7 @@ nautilus_canvas_item_accessible_get_image_size
        NautilusCanvasItem *item;
 
        item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (image)));
-
-       if (!item || !item->details->pixbuf) {
-               *width = *height = 0;
-       } else {
-               *width = gdk_pixbuf_get_width (item->details->pixbuf);
-               *height = gdk_pixbuf_get_height (item->details->pixbuf);
-       }
+       get_scaled_icon_size (item, width, height);
 }
 
 static void
@@ -2471,7 +2490,7 @@ nautilus_canvas_item_accessible_get_offset_at_point (AtkText       *text,
        char *canvas_text;
        gboolean have_editable;
        gboolean have_additional;
-       gint text_offset;
+       gint text_offset, height;
 
        atk_component_get_extents (ATK_COMPONENT (text), &real_x, &real_y,
                                    &real_width, &real_height, coords);
@@ -2482,7 +2501,8 @@ nautilus_canvas_item_accessible_get_offset_at_point (AtkText       *text,
        item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (text)));
 
        if (item->details->pixbuf) {
-               y -= gdk_pixbuf_get_height (item->details->pixbuf);
+               get_scaled_icon_size (item, NULL, &height);
+               y -= height;
        }
        have_editable = item->details->editable_text != NULL &&
                item->details->editable_text[0] != '\0';
@@ -2578,13 +2598,14 @@ nautilus_canvas_item_accessible_get_character_extents (AtkText     *text,
        PangoRectangle rect;
        PangoRectangle rect0;
        gboolean have_editable;
-       gint text_offset;
+       gint text_offset, pix_height;
 
        atk_component_get_position (ATK_COMPONENT (text), &pos_x, &pos_y, coords);
        item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (text)));
 
        if (item->details->pixbuf) {
-               pos_y += gdk_pixbuf_get_height (item->details->pixbuf);
+               get_scaled_icon_size (item, NULL, &pix_height);
+               pos_y += pix_height;
        }
 
        have_editable = item->details->editable_text != NULL &&
diff --git a/libnautilus-private/nautilus-file-conflict-dialog.c 
b/libnautilus-private/nautilus-file-conflict-dialog.c
index 7290fe4..c20e081 100644
--- a/libnautilus-private/nautilus-file-conflict-dialog.c
+++ b/libnautilus-private/nautilus-file-conflict-dialog.c
@@ -78,6 +78,7 @@ file_icons_changed (NautilusFile *file,
        pixbuf = nautilus_file_get_icon_pixbuf (fcd->details->destination,
                                                NAUTILUS_ICON_SIZE_LARGE,
                                                TRUE,
+                                               gtk_widget_get_scale_factor (fcd->details->dest_image),
                                                NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS);
 
        gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->details->dest_image), pixbuf);
@@ -86,6 +87,7 @@ file_icons_changed (NautilusFile *file,
        pixbuf = nautilus_file_get_icon_pixbuf (fcd->details->source,
                                                NAUTILUS_ICON_SIZE_LARGE,
                                                TRUE,
+                                               gtk_widget_get_scale_factor (fcd->details->src_image),
                                                NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS);
 
        gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->details->src_image), pixbuf);
@@ -221,6 +223,7 @@ file_list_ready_cb (GList *files,
        pixbuf = nautilus_file_get_icon_pixbuf (dest,
                                                NAUTILUS_ICON_SIZE_LARGE,
                                                TRUE,
+                                               gtk_widget_get_scale_factor (fcd->details->titles_vbox),
                                                NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS);
        details->dest_image = gtk_image_new_from_pixbuf (pixbuf);
        gtk_box_pack_start (GTK_BOX (details->first_hbox),
@@ -231,6 +234,7 @@ file_list_ready_cb (GList *files,
        pixbuf = nautilus_file_get_icon_pixbuf (src,
                                                NAUTILUS_ICON_SIZE_LARGE,
                                                TRUE,
+                                               gtk_widget_get_scale_factor (fcd->details->titles_vbox),
                                                NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS);
        details->src_image = gtk_image_new_from_pixbuf (pixbuf);
        gtk_box_pack_start (GTK_BOX (details->second_hbox),
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 5ae7cc4..75fadfb 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -4230,6 +4230,7 @@ nautilus_file_get_thumbnail_path (NautilusFile *file)
 NautilusIconInfo *
 nautilus_file_get_icon (NautilusFile *file,
                        int size,
+                       int scale,
                        NautilusFileIconFlags flags)
 {
        NautilusIconInfo *icon;
@@ -4247,7 +4248,7 @@ nautilus_file_get_icon (NautilusFile *file,
        }
 
        if (gicon != NULL) {
-               icon = nautilus_icon_info_lookup (gicon, size);
+               icon = nautilus_icon_info_lookup (gicon, size, scale);
                g_object_unref (gicon);
 
                return icon;
@@ -4268,7 +4269,7 @@ nautilus_file_get_icon (NautilusFile *file,
            nautilus_file_should_show_thumbnail (file)) {
                if (file->details->thumbnail) {
                        int w, h, s;
-                       double scale;
+                       double thumb_scale;
 
                        raw_pixbuf = g_object_ref (file->details->thumbnail);
 
@@ -4278,19 +4279,19 @@ nautilus_file_get_icon (NautilusFile *file,
                        s = MAX (w, h);                 
                        /* Don't scale up small thumbnails in the standard view */
                        if (s <= cached_thumbnail_size) {
-                               scale = (double)size / NAUTILUS_ICON_SIZE_STANDARD;
+                               thumb_scale = (double)size / NAUTILUS_ICON_SIZE_STANDARD;
                        }
                        else {
-                               scale = (double)modified_size / s;
+                               thumb_scale = (double)modified_size / s;
                        }
                        /* Make sure that icons don't get smaller than NAUTILUS_ICON_SIZE_SMALLEST */
-                       if (s*scale <= NAUTILUS_ICON_SIZE_SMALLEST) {
-                               scale = (double) NAUTILUS_ICON_SIZE_SMALLEST / s;
+                       if (s*thumb_scale <= NAUTILUS_ICON_SIZE_SMALLEST) {
+                               thumb_scale = (double) NAUTILUS_ICON_SIZE_SMALLEST / s;
                        }
 
                        scaled_pixbuf = gdk_pixbuf_scale_simple (raw_pixbuf,
-                                                                MAX (w * scale, 1),
-                                                                MAX (h * scale, 1),
+                                                                MAX (w * thumb_scale, 1),
+                                                                MAX (h * thumb_scale, 1),
                                                                 GDK_INTERP_BILINEAR);
 
                        /* We don't want frames around small icons */
@@ -4313,9 +4314,9 @@ nautilus_file_get_icon (NautilusFile *file,
                        }
 
                        DEBUG ("Returning thumbnailed image, at size %d %d",
-                              (int) (w * scale), (int) (h * scale));
+                              (int) (w * thumb_scale), (int) (h * thumb_scale));
                        
-                       icon = nautilus_icon_info_new_for_pixbuf (scaled_pixbuf);
+                       icon = nautilus_icon_info_new_for_pixbuf (scaled_pixbuf, scale);
                        g_object_unref (scaled_pixbuf);
                        return icon;
                } else if (file->details->thumbnail_path == NULL &&
@@ -4335,15 +4336,15 @@ nautilus_file_get_icon (NautilusFile *file,
                gicon = nautilus_file_get_gicon (file, flags);
        
        if (gicon) {
-               icon = nautilus_icon_info_lookup (gicon, size);
+               icon = nautilus_icon_info_lookup (gicon, size, scale);
                if (nautilus_icon_info_is_fallback (icon)) {
                        g_object_unref (icon);
-                       icon = nautilus_icon_info_lookup (get_default_file_icon (flags), size);
+                       icon = nautilus_icon_info_lookup (get_default_file_icon (flags), size, scale);
                }
                g_object_unref (gicon);
                return icon;
        } else {
-               return nautilus_icon_info_lookup (get_default_file_icon (flags), size);
+               return nautilus_icon_info_lookup (get_default_file_icon (flags), size, scale);
        }
 }
 
@@ -4351,12 +4352,13 @@ GdkPixbuf *
 nautilus_file_get_icon_pixbuf (NautilusFile *file,
                               int size,
                               gboolean force_size,
+                              int scale,
                               NautilusFileIconFlags flags)
 {
        NautilusIconInfo *info;
        GdkPixbuf *pixbuf;
 
-       info = nautilus_file_get_icon (file, size, flags);
+       info = nautilus_file_get_icon (file, size, scale, flags);
        if (force_size) {
                pixbuf =  nautilus_icon_info_get_pixbuf_at_size (info, size);
        } else {
diff --git a/libnautilus-private/nautilus-file.h b/libnautilus-private/nautilus-file.h
index 488d856..fb1c62c 100644
--- a/libnautilus-private/nautilus-file.h
+++ b/libnautilus-private/nautilus-file.h
@@ -435,10 +435,12 @@ GIcon *                 nautilus_file_get_gicon                         (Nautilu
                                                                         NautilusFileIconFlags           
flags);
 NautilusIconInfo *      nautilus_file_get_icon                          (NautilusFile                   
*file,
                                                                         int                             size,
+                                                                        int                             
scale,
                                                                         NautilusFileIconFlags           
flags);
 GdkPixbuf *             nautilus_file_get_icon_pixbuf                   (NautilusFile                   
*file,
                                                                         int                             size,
                                                                         gboolean                        
force_size,
+                                                                        int                             
scale,
                                                                         NautilusFileIconFlags           
flags);
 
 gboolean                nautilus_file_has_open_window                   (NautilusFile                   
*file);
diff --git a/libnautilus-private/nautilus-icon-info.c b/libnautilus-private/nautilus-icon-info.c
index 57ea3a2..81894d2 100644
--- a/libnautilus-private/nautilus-icon-info.c
+++ b/libnautilus-private/nautilus-icon-info.c
@@ -40,6 +40,8 @@ struct _NautilusIconInfo
        GdkPoint *attach_points;
        char *display_name;
         char *icon_name;
+
+       gint  orig_scale;
 };
 
 struct _NautilusIconInfoClass
@@ -118,7 +120,8 @@ nautilus_icon_info_class_init (NautilusIconInfoClass *icon_info_class)
 }
 
 NautilusIconInfo *
-nautilus_icon_info_new_for_pixbuf (GdkPixbuf *pixbuf)
+nautilus_icon_info_new_for_pixbuf (GdkPixbuf *pixbuf,
+                                  gint       scale)
 {
        NautilusIconInfo *icon;
 
@@ -126,13 +129,16 @@ nautilus_icon_info_new_for_pixbuf (GdkPixbuf *pixbuf)
 
        if (pixbuf) {
                icon->pixbuf = g_object_ref (pixbuf);
-       } 
+       }
+
+       icon->orig_scale = scale;
        
        return icon;
 }
 
 static NautilusIconInfo *
-nautilus_icon_info_new_for_icon_info (GtkIconInfo *icon_info)
+nautilus_icon_info_new_for_icon_info (GtkIconInfo *icon_info,
+                                     gint         scale)
 {
        NautilusIconInfo *icon;
        GdkPoint *points;
@@ -163,6 +169,8 @@ nautilus_icon_info_new_for_icon_info (GtkIconInfo *icon_info)
                }
                icon->icon_name = basename;
        }
+
+       icon->orig_scale = scale;
        
        return icon;
 }
@@ -326,7 +334,8 @@ themed_icon_key_free (ThemedIconKey *key)
 
 NautilusIconInfo *
 nautilus_icon_info_lookup (GIcon *icon,
-                          int size)
+                          int size,
+                          int scale)
 {
        NautilusIconInfo *icon_info;
        GdkPixbuf *pixbuf;
@@ -354,17 +363,18 @@ nautilus_icon_info_lookup (GIcon *icon,
 
                pixbuf = NULL;
                stream = g_loadable_icon_load (G_LOADABLE_ICON (icon),
-                                              size,
+                                              size * scale,
                                               NULL, NULL, NULL);
                if (stream) {
                        pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
-                                                                     size, size, TRUE,
+                                                                     size * scale, size * scale,
+                                                                     TRUE,
                                                                      NULL, NULL);
                        g_input_stream_close (stream, NULL, NULL);
                        g_object_unref (stream);
                }
 
-               icon_info = nautilus_icon_info_new_for_pixbuf (pixbuf);
+               icon_info = nautilus_icon_info_new_for_pixbuf (pixbuf, scale);
 
                key = loadable_icon_key_new (icon, size);
                g_hash_table_insert (loadable_icon_cache, key, icon_info);
@@ -389,16 +399,17 @@ nautilus_icon_info_lookup (GIcon *icon,
                names = g_themed_icon_get_names (G_THEMED_ICON (icon));
 
                icon_theme = gtk_icon_theme_get_default ();
-               gtkicon_info = gtk_icon_theme_choose_icon (icon_theme, (const char **)names, size, 0);
+               gtkicon_info = gtk_icon_theme_choose_icon_for_scale (icon_theme, (const char **)names,
+                                                                    size, scale, 0);
 
                if (gtkicon_info == NULL) {
-                       return nautilus_icon_info_new_for_pixbuf (NULL);
+                       return nautilus_icon_info_new_for_pixbuf (NULL, scale);
                }
 
                filename = gtk_icon_info_get_filename (gtkicon_info);
                if (filename == NULL) {
                        g_object_unref (gtkicon_info);
-                       return nautilus_icon_info_new_for_pixbuf (NULL);
+                       return nautilus_icon_info_new_for_pixbuf (NULL, scale);
                }
 
                lookup_key.filename = (char *)filename;
@@ -410,7 +421,7 @@ nautilus_icon_info_lookup (GIcon *icon,
                        return g_object_ref (icon_info);
                }
                
-               icon_info = nautilus_icon_info_new_for_icon_info (gtkicon_info);
+               icon_info = nautilus_icon_info_new_for_icon_info (gtkicon_info, scale);
                
                key = themed_icon_key_new (filename, size);
                g_hash_table_insert (themed_icon_cache, key, icon_info);
@@ -422,10 +433,11 @@ nautilus_icon_info_lookup (GIcon *icon,
                 GdkPixbuf *pixbuf;
                 GtkIconInfo *gtk_icon_info;
 
-                gtk_icon_info = gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_default (),
-                                                                icon,
-                                                                size,
-                                                                GTK_ICON_LOOKUP_GENERIC_FALLBACK);
+                gtk_icon_info = gtk_icon_theme_lookup_by_gicon_for_scale (gtk_icon_theme_get_default (),
+                                                                         icon,
+                                                                         size,
+                                                                         scale,
+                                                                         GTK_ICON_LOOKUP_GENERIC_FALLBACK);
                 if (gtk_icon_info != NULL) {
                         pixbuf = gtk_icon_info_load_icon (gtk_icon_info, NULL);
                         g_object_unref (gtk_icon_info);
@@ -433,7 +445,7 @@ nautilus_icon_info_lookup (GIcon *icon,
                         pixbuf = NULL;
                 }
 
-               icon_info = nautilus_icon_info_new_for_pixbuf (pixbuf);
+               icon_info = nautilus_icon_info_new_for_pixbuf (pixbuf, scale);
 
                if (pixbuf != NULL) {
                        g_object_unref (pixbuf);
@@ -445,20 +457,22 @@ nautilus_icon_info_lookup (GIcon *icon,
 
 NautilusIconInfo *
 nautilus_icon_info_lookup_from_name (const char *name,
-                                    int size)
+                                    int size,
+                                    int scale)
 {
        GIcon *icon;
        NautilusIconInfo *info;
 
        icon = g_themed_icon_new (name);
-       info = nautilus_icon_info_lookup (icon, size);
+       info = nautilus_icon_info_lookup (icon, size, scale);
        g_object_unref (icon);
        return info;
 }
 
 NautilusIconInfo *
 nautilus_icon_info_lookup_from_path (const char *path,
-                                    int size)
+                                    int size,
+                                    int scale)
 {
        GFile *icon_file;
        GIcon *icon;
@@ -466,7 +480,7 @@ nautilus_icon_info_lookup_from_path (const char *path,
 
        icon_file = g_file_new_for_path (path);
        icon = g_file_icon_new (icon_file);
-       info = nautilus_icon_info_lookup (icon, size);
+       info = nautilus_icon_info_lookup (icon, size, scale);
        g_object_unref (icon);
        g_object_unref (icon_file);
        return info;
@@ -527,9 +541,9 @@ nautilus_icon_info_get_pixbuf_nodefault_at_size (NautilusIconInfo  *icon,
 
        if (pixbuf == NULL)
          return NULL;
-         
-       w = gdk_pixbuf_get_width (pixbuf);
-       h = gdk_pixbuf_get_height (pixbuf);
+
+       w = gdk_pixbuf_get_width (pixbuf) / icon->orig_scale;
+       h = gdk_pixbuf_get_height (pixbuf) / icon->orig_scale;
        s = MAX (w, h);
        if (s == forced_size) {
                return pixbuf;
@@ -554,8 +568,8 @@ nautilus_icon_info_get_pixbuf_at_size (NautilusIconInfo  *icon,
 
        pixbuf = nautilus_icon_info_get_pixbuf (icon);
 
-       w = gdk_pixbuf_get_width (pixbuf);
-       h = gdk_pixbuf_get_height (pixbuf);
+       w = gdk_pixbuf_get_width (pixbuf) / icon->orig_scale;
+       h = gdk_pixbuf_get_height (pixbuf) / icon->orig_scale;
        s = MAX (w, h);
        if (s == forced_size) {
                return pixbuf;
diff --git a/libnautilus-private/nautilus-icon-info.h b/libnautilus-private/nautilus-icon-info.h
index 6a0f95a..1f87b2d 100644
--- a/libnautilus-private/nautilus-icon-info.h
+++ b/libnautilus-private/nautilus-icon-info.h
@@ -53,13 +53,17 @@ typedef struct _NautilusIconInfoClass NautilusIconInfoClass;
 
 GType    nautilus_icon_info_get_type (void) G_GNUC_CONST;
 
-NautilusIconInfo *    nautilus_icon_info_new_for_pixbuf               (GdkPixbuf         *pixbuf);
+NautilusIconInfo *    nautilus_icon_info_new_for_pixbuf               (GdkPixbuf         *pixbuf,
+                                                                      int                scale);
 NautilusIconInfo *    nautilus_icon_info_lookup                       (GIcon             *icon,
-                                                                      int                size);
+                                                                      int                size,
+                                                                      int                scale);
 NautilusIconInfo *    nautilus_icon_info_lookup_from_name             (const char        *name,
-                                                                      int                size);
+                                                                      int                size,
+                                                                      int                scale);
 NautilusIconInfo *    nautilus_icon_info_lookup_from_path             (const char        *path,
-                                                                      int                size);
+                                                                      int                size,
+                                                                      int                scale);
 gboolean              nautilus_icon_info_is_fallback                  (NautilusIconInfo  *icon);
 GdkPixbuf *           nautilus_icon_info_get_pixbuf                   (NautilusIconInfo  *icon);
 GdkPixbuf *           nautilus_icon_info_get_pixbuf_nodefault         (NautilusIconInfo  *icon);
diff --git a/libnautilus-private/nautilus-program-choosing.c b/libnautilus-private/nautilus-program-choosing.c
index 25b99b2..6c74760 100644
--- a/libnautilus-private/nautilus-program-choosing.c
+++ b/libnautilus-private/nautilus-program-choosing.c
@@ -136,7 +136,9 @@ nautilus_launch_application_by_uri (GAppInfo *application,
        }
 
        file = nautilus_file_get_by_uri (uris->data);
-       icon = nautilus_file_get_icon (file, 48, 0);
+       icon = nautilus_file_get_icon (file,
+                                      48, gtk_widget_get_scale_factor (GTK_WIDGET (parent_window)),
+                                      0);
        nautilus_file_unref (file);
        if (icon) {
                gdk_app_launch_context_set_icon_name (launch_context,
diff --git a/libnautilus-private/nautilus-ui-utilities.c b/libnautilus-private/nautilus-ui-utilities.c
index 0a1e374..7a1ec36 100644
--- a/libnautilus-private/nautilus-ui-utilities.c
+++ b/libnautilus-private/nautilus-ui-utilities.c
@@ -69,7 +69,8 @@ extension_action_callback (GtkAction *action,
 }
 
 GtkAction *
-nautilus_action_from_menu_item (NautilusMenuItem *item)
+nautilus_action_from_menu_item (NautilusMenuItem *item,
+                               GtkWidget        *parent_widget)
 {
        char *name, *label, *tip, *icon_name;
        gboolean sensitive, priority;
@@ -89,7 +90,7 @@ nautilus_action_from_menu_item (NautilusMenuItem *item)
                                 NULL);
 
        if (icon_name != NULL) {
-               pixbuf = nautilus_ui_get_menu_icon (icon_name);
+               pixbuf = nautilus_ui_get_menu_icon (icon_name, parent_widget);
                if (pixbuf != NULL) {
                        gtk_action_set_gicon (action, G_ICON (pixbuf));
                        g_object_unref (pixbuf);
@@ -113,18 +114,21 @@ nautilus_action_from_menu_item (NautilusMenuItem *item)
 }
 
 GdkPixbuf *
-nautilus_ui_get_menu_icon (const char *icon_name)
+nautilus_ui_get_menu_icon (const char *icon_name,
+                          GtkWidget  *parent_widget)
 {
        NautilusIconInfo *info;
        GdkPixbuf *pixbuf;
        int size;
+       int scale;
 
        size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU);
+       scale = gtk_widget_get_scale_factor (parent_widget);
 
        if (g_path_is_absolute (icon_name)) {
-               info = nautilus_icon_info_lookup_from_path (icon_name, size);
+               info = nautilus_icon_info_lookup_from_path (icon_name, size, scale);
        } else {
-               info = nautilus_icon_info_lookup_from_name (icon_name, size);
+               info = nautilus_icon_info_lookup_from_name (icon_name, size, scale);
        }
        pixbuf = nautilus_icon_info_get_pixbuf_nodefault_at_size (info, size);
        g_object_unref (info);
diff --git a/libnautilus-private/nautilus-ui-utilities.h b/libnautilus-private/nautilus-ui-utilities.h
index 12e2e5e..333285e 100644
--- a/libnautilus-private/nautilus-ui-utilities.h
+++ b/libnautilus-private/nautilus-ui-utilities.h
@@ -34,9 +34,11 @@ void        nautilus_ui_prepare_merge_ui           (GtkUIManager      *ui_manage
                                                    const char        *name,
                                                    guint             *merge_id,
                                                    GtkActionGroup   **action_group);
-GtkAction * nautilus_action_from_menu_item         (NautilusMenuItem  *item);
+GtkAction * nautilus_action_from_menu_item         (NautilusMenuItem  *item,
+                                                   GtkWidget         *parent_widget);
 
-GdkPixbuf * nautilus_ui_get_menu_icon              (const char        *icon_name);
+GdkPixbuf * nautilus_ui_get_menu_icon              (const char        *icon_name,
+                                                   GtkWidget         *parent_widget);
 
 char * nautilus_escape_action_name                 (const char        *action_name,
                                                    const char        *prefix);
diff --git a/src/nautilus-autorun-software.c b/src/nautilus-autorun-software.c
index 8e3dd1e..d63a682 100644
--- a/src/nautilus-autorun-software.c
+++ b/src/nautilus-autorun-software.c
@@ -218,7 +218,8 @@ present_autorun_for_software_dialog (GMount *mount)
 
        icon = g_mount_get_icon (mount);
        icon_size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_DIALOG);
-       icon_info = nautilus_icon_info_lookup (icon, icon_size);
+       icon_info = nautilus_icon_info_lookup (icon, icon_size,
+                                              gtk_widget_get_scale_factor (GTK_WIDGET (dialog)));
        pixbuf = nautilus_icon_info_get_pixbuf_at_size (icon_info, icon_size);
        image = gtk_image_new_from_pixbuf (pixbuf);
        gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
diff --git a/src/nautilus-canvas-view-container.c b/src/nautilus-canvas-view-container.c
index 9498c89..e786e4a 100644
--- a/src/nautilus-canvas-view-container.c
+++ b/src/nautilus-canvas-view-container.c
@@ -67,6 +67,7 @@ nautilus_canvas_view_container_get_icon_images (NautilusCanvasContainer *contain
        GIcon *emblemed_icon;
        GEmblem *emblem;
        GList *emblem_icons, *l;
+       gint scale;
 
        file = (NautilusFile *) data;
 
@@ -92,7 +93,8 @@ nautilus_canvas_view_container_get_icon_images (NautilusCanvasContainer *contain
                flags |= NAUTILUS_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT;
        }
 
-       icon_info = nautilus_file_get_icon (file, size, flags);
+       scale = gtk_widget_get_scale_factor (GTK_WIDGET (canvas_view));
+       icon_info = nautilus_file_get_icon (file, size, scale, flags);
        emblem_icons = nautilus_file_get_emblem_icons (file);
 
        /* apply emblems */
@@ -112,7 +114,7 @@ nautilus_canvas_view_container_get_icon_images (NautilusCanvasContainer *contain
                }
 
                g_clear_object (&icon_info);
-               icon_info = nautilus_icon_info_lookup (emblemed_icon, size);
+               icon_info = nautilus_icon_info_lookup (emblemed_icon, size, scale);
 
                g_object_unref (pixbuf);
                g_object_unref (emblemed_icon);
diff --git a/src/nautilus-list-model.c b/src/nautilus-list-model.c
index 74faf7f..dc861c5 100644
--- a/src/nautilus-list-model.c
+++ b/src/nautilus-list-model.c
@@ -32,12 +32,14 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
+#include <cairo-gobject.h>
 
 #include <eel/eel-graphic-effects.h>
 #include <libnautilus-private/nautilus-dnd.h>
 
 enum {
        SUBDIRECTORY_UNLOADED,
+       GET_ICON_SCALE,
        LAST_SIGNAL
 };
 
@@ -150,7 +152,7 @@ nautilus_list_model_get_column_type (GtkTreeModel *tree_model, int index)
        case NAUTILUS_LIST_MODEL_LARGE_ICON_COLUMN:
        case NAUTILUS_LIST_MODEL_LARGER_ICON_COLUMN:
        case NAUTILUS_LIST_MODEL_LARGEST_ICON_COLUMN:
-               return GDK_TYPE_PIXBUF;
+               return CAIRO_GOBJECT_TYPE_SURFACE;
        case NAUTILUS_LIST_MODEL_FILE_NAME_IS_EDITABLE_COLUMN:
                return G_TYPE_BOOLEAN;
        default:
@@ -235,6 +237,21 @@ nautilus_list_model_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter)
        return path;
 }
 
+static gint
+nautilus_list_model_get_icon_scale (NautilusListModel *model)
+{
+       gint retval = -1;
+
+       g_signal_emit (model, list_model_signals[GET_ICON_SCALE], 0,
+                      &retval);
+
+       if (retval == -1) {
+               retval = gdk_screen_get_monitor_scale_factor (gdk_screen_get_default (), 0);
+       }
+
+       return retval;
+}
+
 static void
 nautilus_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int column, GValue *value)
 {
@@ -247,9 +264,10 @@ nautilus_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int
        NautilusIconInfo *icon_info;
        GEmblem *emblem;
        GList *emblem_icons, *l;
-       int icon_size;
+       int icon_size, icon_scale;
        NautilusZoomLevel zoom_level;
        NautilusFileIconFlags flags;
+       cairo_surface_t *surface;
        
        model = (NautilusListModel *)tree_model;
 
@@ -277,11 +295,12 @@ nautilus_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int
        case NAUTILUS_LIST_MODEL_LARGE_ICON_COLUMN:
        case NAUTILUS_LIST_MODEL_LARGER_ICON_COLUMN:
        case NAUTILUS_LIST_MODEL_LARGEST_ICON_COLUMN:
-               g_value_init (value, GDK_TYPE_PIXBUF);
+               g_value_init (value, CAIRO_GOBJECT_TYPE_SURFACE);
 
                if (file != NULL) {
                        zoom_level = nautilus_list_model_get_zoom_level_from_column_id (column);
                        icon_size = nautilus_get_icon_size_for_zoom_level (zoom_level);
+                       icon_scale = nautilus_list_model_get_icon_scale (model);
 
                        flags = NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS |
                                NAUTILUS_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE |
@@ -304,7 +323,7 @@ nautilus_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int
                                }
                        }
 
-                       gicon = G_ICON (nautilus_file_get_icon_pixbuf (file, icon_size, TRUE, flags));
+                       gicon = G_ICON (nautilus_file_get_icon_pixbuf (file, icon_size, TRUE, icon_scale, 
flags));
                        emblem_icons = nautilus_file_get_emblem_icons (file);
 
                        /* pick only the first emblem we can render for the list view */
@@ -324,7 +343,7 @@ nautilus_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int
 
                        g_list_free_full (emblem_icons, g_object_unref);
 
-                       icon_info = nautilus_icon_info_lookup (gicon, icon_size);
+                       icon_info = nautilus_icon_info_lookup (gicon, icon_size, icon_scale);
                        icon = nautilus_icon_info_get_pixbuf_at_size (icon_info, icon_size);
 
                        g_object_unref (icon_info);
@@ -342,7 +361,8 @@ nautilus_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int
                                }
                        }
 
-                       g_value_set_object (value, icon);
+                       surface = gdk_cairo_surface_create_from_pixbuf (icon, icon_scale, NULL);
+                       g_value_take_boxed (value, surface);
                        g_object_unref (icon);
                }
                break;
@@ -1459,6 +1479,14 @@ nautilus_list_model_class_init (NautilusListModelClass *klass)
                       g_cclosure_marshal_VOID__OBJECT,
                       G_TYPE_NONE, 1,
                       NAUTILUS_TYPE_DIRECTORY);
+
+      list_model_signals[GET_ICON_SCALE] =
+             g_signal_new ("get-icon-scale",
+                           NAUTILUS_TYPE_LIST_MODEL,
+                           G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
+                           0, NULL, NULL,
+                           NULL,
+                           G_TYPE_INT, 0);
 }
 
 static void
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 08e8c5d..f81682b 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -1886,6 +1886,13 @@ set_up_pixbuf_size (NautilusListView *view)
        gtk_tree_view_columns_autosize (view->details->tree_view);
 }
 
+static gint
+get_icon_scale_callback (NautilusListModel *model,
+                        NautilusListView  *view)
+{
+       return gtk_widget_get_scale_factor (GTK_WIDGET (view->details->tree_view));
+}
+
 static void
 create_and_set_up_tree_view (NautilusListView *view)
 {
@@ -1972,6 +1979,9 @@ create_and_set_up_tree_view (NautilusListView *view)
        g_signal_connect_object (view->details->model, "subdirectory-unloaded",
                                 G_CALLBACK (subdirectory_unloaded_callback), view, 0);
 
+       g_signal_connect_object (view->details->model, "get-icon-scale",
+                                G_CALLBACK (get_icon_scale_callback), view, 0);
+
        gtk_tree_selection_set_mode (gtk_tree_view_get_selection (view->details->tree_view), 
GTK_SELECTION_MULTIPLE);
        gtk_tree_view_set_rules_hint (view->details->tree_view, TRUE);
 
@@ -2042,7 +2052,7 @@ create_and_set_up_tree_view (NautilusListView *view)
                        gtk_tree_view_column_pack_start (view->details->file_name_column, cell, FALSE);
                        gtk_tree_view_column_set_attributes (view->details->file_name_column,
                                                             cell,
-                                                            "pixbuf", 
nautilus_list_model_get_column_id_from_zoom_level (view->details->zoom_level),
+                                                            "surface", 
nautilus_list_model_get_column_id_from_zoom_level (view->details->zoom_level),
                                                             NULL);
                        
                        cell = gtk_cell_renderer_text_new ();
@@ -3127,7 +3137,7 @@ nautilus_list_view_set_zoom_level (NautilusListView *view,
        column = nautilus_list_model_get_column_id_from_zoom_level (new_level);
        gtk_tree_view_column_set_attributes (view->details->file_name_column,
                                             GTK_CELL_RENDERER (view->details->pixbuf_cell),
-                                            "pixbuf", column,
+                                            "surface", column,
                                             NULL);
 
        nautilus_view_update_menus (NAUTILUS_VIEW (view));
diff --git a/src/nautilus-properties-window.c b/src/nautilus-properties-window.c
index 6793b7a..7b56981 100644
--- a/src/nautilus-properties-window.c
+++ b/src/nautilus-properties-window.c
@@ -364,17 +364,24 @@ get_image_for_properties_window (NautilusPropertiesWindow *window,
 {
        NautilusIconInfo *icon, *new_icon;
        GList *l;
+       gint icon_scale;
        
        icon = NULL;
+       icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (window->details->notebook));
+
        for (l = window->details->original_files; l != NULL; l = l->next) {
                NautilusFile *file;
                
                file = NAUTILUS_FILE (l->data);
                
                if (!icon) {
-                       icon = nautilus_file_get_icon (file, NAUTILUS_ICON_SIZE_STANDARD, 
NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS | NAUTILUS_FILE_ICON_FLAGS_IGNORE_VISITING);
+                       icon = nautilus_file_get_icon (file, NAUTILUS_ICON_SIZE_STANDARD, icon_scale,
+                                                      NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS |
+                                                      NAUTILUS_FILE_ICON_FLAGS_IGNORE_VISITING);
                } else {
-                       new_icon = nautilus_file_get_icon (file, NAUTILUS_ICON_SIZE_STANDARD, 
NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS | NAUTILUS_FILE_ICON_FLAGS_IGNORE_VISITING);
+                       new_icon = nautilus_file_get_icon (file, NAUTILUS_ICON_SIZE_STANDARD, icon_scale,
+                                                          NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS |
+                                                          NAUTILUS_FILE_ICON_FLAGS_IGNORE_VISITING);
                        if (!new_icon || new_icon != icon) {
                                g_object_unref (icon);
                                g_object_unref (new_icon);
@@ -386,7 +393,9 @@ get_image_for_properties_window (NautilusPropertiesWindow *window,
        }
 
        if (!icon) {
-               icon = nautilus_icon_info_lookup_from_name ("text-x-generic", NAUTILUS_ICON_SIZE_STANDARD);
+               icon = nautilus_icon_info_lookup_from_name ("text-x-generic",
+                                                           NAUTILUS_ICON_SIZE_STANDARD,
+                                                           icon_scale);
        }
 
        if (icon_name != NULL) {
diff --git a/src/nautilus-shell-search-provider.c b/src/nautilus-shell-search-provider.c
index 2b45890..b1d2c45 100644
--- a/src/nautilus-shell-search-provider.c
+++ b/src/nautilus-shell-search-provider.c
@@ -520,6 +520,9 @@ result_list_attributes_ready_cb (GList    *file_list,
   GIcon *gicon;
   GFile *location;
   GVariant *meta_variant;
+  gint icon_scale;
+
+  icon_scale = gdk_screen_get_monitor_scale_factor (gdk_screen_get_default (), 0);
 
   for (l = file_list; l != NULL; l = l->next) {
     file = l->data;
@@ -548,6 +551,7 @@ result_list_attributes_ready_cb (GList    *file_list,
 
     if (gicon == NULL) {
       gicon = G_ICON (nautilus_file_get_icon_pixbuf (file, 128, TRUE,
+                                                    icon_scale,
                                                      NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS));
     }
 
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 4a3e01d..f499b37 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -4714,15 +4714,17 @@ extension_action_callback (GtkAction *action,
 }
 
 static GdkPixbuf *
-get_menu_icon_for_file (NautilusFile *file)
+get_menu_icon_for_file (NautilusFile *file,
+                       GtkWidget    *widget)
 {
        NautilusIconInfo *info;
        GdkPixbuf *pixbuf;
-       int size;
+       int size, scale;
 
        size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU);
+       scale = gtk_widget_get_scale_factor (widget);
        
-       info = nautilus_file_get_icon (file, size, 0);
+       info = nautilus_file_get_icon (file, size, scale, 0);
        pixbuf = nautilus_icon_info_get_pixbuf_nodefault_at_size (info, size);
        g_object_unref (info);
        
@@ -4753,7 +4755,7 @@ add_extension_action_for_files (NautilusView *view,
                                 NULL);
 
        if (icon != NULL) {
-               pixbuf = nautilus_ui_get_menu_icon (icon);
+               pixbuf = nautilus_ui_get_menu_icon (icon, GTK_WIDGET (view));
                if (pixbuf != NULL) {
                        gtk_action_set_gicon (action, G_ICON (pixbuf));
                        g_object_unref (pixbuf);
@@ -5145,7 +5147,7 @@ add_script_to_scripts_menus (NautilusView *directory_view,
                                 tip,
                                 NULL);
 
-       pixbuf = get_menu_icon_for_file (file);
+       pixbuf = get_menu_icon_for_file (file, GTK_WIDGET (directory_view));
        if (pixbuf != NULL) {
                gtk_action_set_gicon (action, G_ICON (pixbuf));
                g_object_unref (pixbuf);
@@ -5212,7 +5214,7 @@ add_submenu_to_directory_menus (NautilusView *directory_view,
        ui_manager = nautilus_view_get_ui_manager (directory_view);
        uri = nautilus_file_get_uri (file);
        name = nautilus_file_get_display_name (file);
-       pixbuf = get_menu_icon_for_file (file);
+       pixbuf = get_menu_icon_for_file (file, GTK_WIDGET (directory_view));
        add_submenu (ui_manager, action_group, merge_id, menu_path, uri, name, pixbuf, TRUE);
        add_submenu (ui_manager, action_group, merge_id, popup_path, uri, name, pixbuf, FALSE);
        add_submenu (ui_manager, action_group, merge_id, popup_bg_path, uri, name, pixbuf, FALSE);
@@ -5399,7 +5401,7 @@ add_template_to_templates_menus (NautilusView *directory_view,
                                 tip,
                                 NULL);
        
-       pixbuf = get_menu_icon_for_file (file);
+       pixbuf = get_menu_icon_for_file (file, GTK_WIDGET (directory_view));
        if (pixbuf != NULL) {
                gtk_action_set_gicon (action, G_ICON (pixbuf));
                g_object_unref (pixbuf);
diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c
index 330bff2..dfcdf35 100644
--- a/src/nautilus-window-menus.c
+++ b/src/nautilus-window-menus.c
@@ -820,7 +820,7 @@ add_extension_menu_items (NautilusWindow *window,
                
                g_object_get (item, "menu", &menu, NULL);
                
-               action = nautilus_action_from_menu_item (item);
+               action = nautilus_action_from_menu_item (item, GTK_WIDGET (window));
                gtk_action_group_add_action_with_accel (action_group, action, NULL);
                
                path = g_build_path ("/", POPUP_PATH_EXTENSION_ACTIONS, subdirectory, NULL);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]