Skip to content

Commit bc1405c

Browse files
cosimoclukefromdc
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 779e0af commit bc1405c

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
@@ -469,7 +469,7 @@ caja_autorun_prepare_combo_box (GtkWidget *combo_box,
469469
GtkListStore *list_store;
470470
GtkTreeIter iter;
471471
GdkPixbuf *pixbuf;
472-
int icon_size;
472+
int icon_size, icon_scale;
473473
int set_active;
474474
int n;
475475
int num_apps;
@@ -485,6 +485,7 @@ caja_autorun_prepare_combo_box (GtkWidget *combo_box,
485485
pref_ask = !pref_start_app && !pref_ignore && !pref_open_folder;
486486

487487
icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU);
488+
icon_scale = gtk_widget_get_scale_factor (combo_box);
488489

489490
set_active = -1;
490491
data = NULL;
@@ -594,7 +595,7 @@ caja_autorun_prepare_combo_box (GtkWidget *combo_box,
594595
*/
595596

596597
icon = g_app_info_get_icon (app_info);
597-
icon_info = caja_icon_info_lookup (icon, icon_size);
598+
icon_info = caja_icon_info_lookup (icon, icon_size, icon_scale);
598599
pixbuf = caja_icon_info_get_pixbuf_at_size (icon_info, icon_size);
599600
g_object_unref (icon_info);
600601

@@ -935,7 +936,7 @@ do_autorun_for_content_type (GMount *mount, const char *x_content_type, CajaAuto
935936
GIcon *icon;
936937
GdkPixbuf *pixbuf;
937938
CajaIconInfo *icon_info;
938-
int icon_size;
939+
int icon_size, icon_scale;
939940
gboolean user_forced_dialog;
940941
gboolean pref_ask;
941942
gboolean pref_start_app;
@@ -999,7 +1000,8 @@ do_autorun_for_content_type (GMount *mount, const char *x_content_type, CajaAuto
9991000

10001001
icon = g_mount_get_icon (mount);
10011002
icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_DIALOG);
1002-
icon_info = caja_icon_info_lookup (icon, icon_size);
1003+
icon_scale = gtk_widget_get_scale_factor (dialog);
1004+
icon_info = caja_icon_info_lookup (icon, icon_size, icon_scale);
10031005
pixbuf = caja_icon_info_get_pixbuf_at_size (icon_info, icon_size);
10041006
g_object_unref (icon_info);
10051007
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
@@ -80,6 +80,7 @@ file_icons_changed (CajaFile *file,
8080
pixbuf = caja_file_get_icon_pixbuf (fcd->details->destination,
8181
CAJA_ICON_SIZE_LARGE,
8282
TRUE,
83+
gtk_widget_get_scale_factor (fcd->details->dest_image),
8384
CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS);
8485

8586
gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->details->dest_image), pixbuf);
@@ -88,6 +89,7 @@ file_icons_changed (CajaFile *file,
8889
pixbuf = caja_file_get_icon_pixbuf (fcd->details->source,
8990
CAJA_ICON_SIZE_LARGE,
9091
TRUE,
92+
gtk_widget_get_scale_factor (fcd->details->src_image),
9193
CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS);
9294

9395
gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->details->src_image), pixbuf);
@@ -239,6 +241,7 @@ file_list_ready_cb (GList *files,
239241
pixbuf = caja_file_get_icon_pixbuf (dest,
240242
CAJA_ICON_SIZE_LARGE,
241243
TRUE,
244+
gtk_widget_get_scale_factor (fcd->details->titles_vbox),
242245
CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS);
243246
details->dest_image = gtk_image_new_from_pixbuf (pixbuf);
244247
gtk_box_pack_start (GTK_BOX (details->first_hbox),
@@ -249,6 +252,7 @@ file_list_ready_cb (GList *files,
249252
pixbuf = caja_file_get_icon_pixbuf (src,
250253
CAJA_ICON_SIZE_LARGE,
251254
TRUE,
255+
gtk_widget_get_scale_factor (fcd->details->titles_vbox),
252256
CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS);
253257
details->src_image = gtk_image_new_from_pixbuf (pixbuf);
254258
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)