Skip to content

Commit 4bf67ac

Browse files
cosimocraveit65
authored andcommitted
Support HiDpi icons
Port the rendering of icons to cairo surfaces, so that we can apply the GDK scale factor when rendering icons. origin commit: https://gitlab.gnome.org/GNOME/nautilus/commit/0d4555d7
1 parent 35c4dc6 commit 4bf67ac

32 files changed

+332
-185
lines changed

libcaja-private/caja-autorun.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ caja_autorun_prepare_combo_box (GtkWidget *combo_box,
468468
GtkListStore *list_store;
469469
GtkTreeIter iter;
470470
GdkPixbuf *pixbuf;
471-
int icon_size;
471+
int icon_size, icon_scale;
472472
int set_active;
473473
int n;
474474
int num_apps;
@@ -484,6 +484,7 @@ caja_autorun_prepare_combo_box (GtkWidget *combo_box,
484484
pref_ask = !pref_start_app && !pref_ignore && !pref_open_folder;
485485

486486
icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU);
487+
icon_scale = gtk_widget_get_scale_factor (combo_box);
487488

488489
set_active = -1;
489490
data = NULL;
@@ -593,7 +594,7 @@ caja_autorun_prepare_combo_box (GtkWidget *combo_box,
593594
*/
594595

595596
icon = g_app_info_get_icon (app_info);
596-
icon_info = caja_icon_info_lookup (icon, icon_size);
597+
icon_info = caja_icon_info_lookup (icon, icon_size, icon_scale);
597598
pixbuf = caja_icon_info_get_pixbuf_at_size (icon_info, icon_size);
598599
g_object_unref (icon_info);
599600

@@ -934,7 +935,7 @@ do_autorun_for_content_type (GMount *mount, const char *x_content_type, CajaAuto
934935
GIcon *icon;
935936
GdkPixbuf *pixbuf;
936937
CajaIconInfo *icon_info;
937-
int icon_size;
938+
int icon_size, icon_scale;
938939
gboolean user_forced_dialog;
939940
gboolean pref_ask;
940941
gboolean pref_start_app;
@@ -998,7 +999,8 @@ do_autorun_for_content_type (GMount *mount, const char *x_content_type, CajaAuto
998999

9991000
icon = g_mount_get_icon (mount);
10001001
icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_DIALOG);
1001-
icon_info = caja_icon_info_lookup (icon, icon_size);
1002+
icon_scale = gtk_widget_get_scale_factor (dialog);
1003+
icon_info = caja_icon_info_lookup (icon, icon_size, icon_scale);
10021004
pixbuf = caja_icon_info_get_pixbuf_at_size (icon_info, icon_size);
10031005
g_object_unref (icon_info);
10041006
g_object_unref (icon);

libcaja-private/caja-bookmark.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ caja_bookmark_get_pixbuf (CajaBookmark *bookmark,
220220
GdkPixbuf *result;
221221
GIcon *icon;
222222
CajaIconInfo *info;
223-
int pixel_size;
223+
int pixel_size, pixel_scale;
224224

225225

226226
g_return_val_if_fail (CAJA_IS_BOOKMARK (bookmark), NULL);
@@ -232,7 +232,8 @@ caja_bookmark_get_pixbuf (CajaBookmark *bookmark,
232232
}
233233

234234
pixel_size = caja_get_icon_size_for_stock_size (stock_size);
235-
info = caja_icon_info_lookup (icon, pixel_size);
235+
pixel_scale = gdk_window_get_scale_factor (gdk_get_default_root_window ());
236+
info = caja_icon_info_lookup (icon, pixel_size, pixel_scale);
236237
result = caja_icon_info_get_pixbuf_at_size (info, pixel_size);
237238
g_object_unref (info);
238239

libcaja-private/caja-file-conflict-dialog.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ file_icons_changed (CajaFile *file,
7979
pixbuf = caja_file_get_icon_pixbuf (fcd->details->destination,
8080
CAJA_ICON_SIZE_LARGE,
8181
TRUE,
82+
gtk_widget_get_scale_factor (fcd->details->dest_image),
8283
CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS);
8384

8485
gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->details->dest_image), pixbuf);
@@ -87,6 +88,7 @@ file_icons_changed (CajaFile *file,
8788
pixbuf = caja_file_get_icon_pixbuf (fcd->details->source,
8889
CAJA_ICON_SIZE_LARGE,
8990
TRUE,
91+
gtk_widget_get_scale_factor (fcd->details->src_image),
9092
CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS);
9193

9294
gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->details->src_image), pixbuf);
@@ -238,6 +240,7 @@ file_list_ready_cb (GList *files,
238240
pixbuf = caja_file_get_icon_pixbuf (dest,
239241
CAJA_ICON_SIZE_LARGE,
240242
TRUE,
243+
gtk_widget_get_scale_factor (fcd->details->titles_vbox),
241244
CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS);
242245
details->dest_image = gtk_image_new_from_pixbuf (pixbuf);
243246
gtk_box_pack_start (GTK_BOX (details->first_hbox),
@@ -248,6 +251,7 @@ file_list_ready_cb (GList *files,
248251
pixbuf = caja_file_get_icon_pixbuf (src,
249252
CAJA_ICON_SIZE_LARGE,
250253
TRUE,
254+
gtk_widget_get_scale_factor (fcd->details->titles_vbox),
251255
CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS);
252256
details->src_image = gtk_image_new_from_pixbuf (pixbuf);
253257
gtk_box_pack_start (GTK_BOX (details->second_hbox),

libcaja-private/caja-file.c

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4288,6 +4288,7 @@ get_default_file_icon (CajaFileIconFlags flags)
42884288
CajaIconInfo *
42894289
caja_file_get_icon (CajaFile *file,
42904290
int size,
4291+
int scale,
42914292
CajaFileIconFlags flags)
42924293
{
42934294
CajaIconInfo *icon;
@@ -4303,7 +4304,7 @@ caja_file_get_icon (CajaFile *file,
43034304
if (gicon) {
43044305
GdkPixbuf *pixbuf;
43054306

4306-
icon = caja_icon_info_lookup (gicon, size);
4307+
icon = caja_icon_info_lookup (gicon, size, scale);
43074308
g_object_unref (gicon);
43084309

43094310
pixbuf = caja_icon_info_get_pixbuf (icon);
@@ -4313,7 +4314,7 @@ caja_file_get_icon (CajaFile *file,
43134314
}
43144315
g_object_unref (icon);
43154316

4316-
icon = caja_icon_info_new_for_pixbuf (pixbuf);
4317+
icon = caja_icon_info_new_for_pixbuf (pixbuf, scale);
43174318
g_object_unref (pixbuf);
43184319
}
43194320

@@ -4329,7 +4330,7 @@ caja_file_get_icon (CajaFile *file,
43294330
caja_file_should_show_thumbnail (file)) {
43304331
if (file->details->thumbnail) {
43314332
int w, h, s;
4332-
double scale;
4333+
double thumb_scale;
43334334

43344335
raw_pixbuf = g_object_ref (file->details->thumbnail);
43354336

@@ -4339,19 +4340,19 @@ caja_file_get_icon (CajaFile *file,
43394340
s = MAX (w, h);
43404341
/* Don't scale up small thumbnails in the standard view */
43414342
if (s <= cached_thumbnail_size) {
4342-
scale = (double)size / CAJA_ICON_SIZE_STANDARD;
4343+
thumb_scale = (double)size / CAJA_ICON_SIZE_STANDARD;
43434344
}
43444345
else {
4345-
scale = (double)modified_size / s;
4346+
thumb_scale = (double)modified_size / s;
43464347
}
43474348
/* Make sure that icons don't get smaller than CAJA_ICON_SIZE_SMALLEST */
4348-
if (s*scale <= CAJA_ICON_SIZE_SMALLEST) {
4349-
scale = (double) CAJA_ICON_SIZE_SMALLEST / s;
4349+
if (s*thumb_scale <= CAJA_ICON_SIZE_SMALLEST) {
4350+
thumb_scale = (double) CAJA_ICON_SIZE_SMALLEST / s;
43504351
}
43514352

43524353
scaled_pixbuf = gdk_pixbuf_scale_simple (raw_pixbuf,
4353-
MAX (w * scale, 1),
4354-
MAX (h * scale, 1),
4354+
MAX (w * thumb_scale, 1),
4355+
MAX (h * thumb_scale, 1),
43554356
GDK_INTERP_BILINEAR);
43564357

43574358
/* Render frames only for thumbnails of non-image files
@@ -4377,7 +4378,7 @@ caja_file_get_icon (CajaFile *file,
43774378
caja_file_invalidate_attributes (file, CAJA_FILE_ATTRIBUTE_THUMBNAIL);
43784379
}
43794380

4380-
icon = caja_icon_info_new_for_pixbuf (scaled_pixbuf);
4381+
icon = caja_icon_info_new_for_pixbuf (scaled_pixbuf, scale);
43814382
g_object_unref (scaled_pixbuf);
43824383
return icon;
43834384
} else if (file->details->thumbnail_path == NULL &&
@@ -4397,28 +4398,29 @@ caja_file_get_icon (CajaFile *file,
43974398
gicon = caja_file_get_gicon (file, flags);
43984399

43994400
if (gicon) {
4400-
icon = caja_icon_info_lookup (gicon, size);
4401+
icon = caja_icon_info_lookup (gicon, size, scale);
44014402
if (caja_icon_info_is_fallback (icon)) {
44024403
g_object_unref (icon);
4403-
icon = caja_icon_info_lookup (get_default_file_icon (flags), size);
4404+
icon = caja_icon_info_lookup (get_default_file_icon (flags), size, scale);
44044405
}
44054406
g_object_unref (gicon);
44064407
return icon;
44074408
} else {
4408-
return caja_icon_info_lookup (get_default_file_icon (flags), size);
4409+
return caja_icon_info_lookup (get_default_file_icon (flags), size, scale);
44094410
}
44104411
}
44114412

44124413
GdkPixbuf *
44134414
caja_file_get_icon_pixbuf (CajaFile *file,
44144415
int size,
44154416
gboolean force_size,
4417+
int scale,
44164418
CajaFileIconFlags flags)
44174419
{
44184420
CajaIconInfo *info;
44194421
GdkPixbuf *pixbuf;
44204422

4421-
info = caja_file_get_icon (file, size, flags);
4423+
info = caja_file_get_icon (file, size, scale, flags);
44224424
if (force_size) {
44234425
pixbuf = caja_icon_info_get_pixbuf_at_size (info, size);
44244426
} else {
@@ -6719,7 +6721,7 @@ caja_file_get_emblem_pixbufs (CajaFile *file,
67196721
for (l = icons; l != NULL; l = l->next) {
67206722
icon = l->data;
67216723

6722-
icon_info = caja_icon_info_lookup (icon, size);
6724+
icon_info = caja_icon_info_lookup (icon, size, 1);
67236725
if (force_size) {
67246726
pixbuf = caja_icon_info_get_pixbuf_nodefault_at_size (icon_info, size);
67256727
} else {

libcaja-private/caja-file.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,10 +453,12 @@ GIcon * caja_file_get_gicon (CajaFile
453453
CajaFileIconFlags flags);
454454
CajaIconInfo * caja_file_get_icon (CajaFile *file,
455455
int size,
456+
int scale,
456457
CajaFileIconFlags flags);
457458
GdkPixbuf * caja_file_get_icon_pixbuf (CajaFile *file,
458459
int size,
459460
gboolean force_size,
461+
int scale,
460462
CajaFileIconFlags flags);
461463

462464
gboolean caja_file_has_open_window (CajaFile *file);

0 commit comments

Comments
 (0)