Skip to content

Commit bb049a4

Browse files
committed
thumbnails: generate/load thumbnails on visible items only, and drop
background loading. Views load much more quickly when delaying any thumbnail processing until all items are fully loaded. An attempt is made to load 'ahead' and 'behind' the visible range, but in the list view, the current api does not allow scanning for rows 'above' the current view position, only below. As a result, scrolling a view down in the list view will reveal icons that have already been queued to load their thumbnail, but scrolling up will not. This behavior works properly in the icon views in both directions.
1 parent 6ae5ef8 commit bb049a4

17 files changed

+392
-109
lines changed

libnemo-private/nemo-directory-async.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -1645,7 +1645,7 @@ lacks_btime (NemoFile *file)
16451645
static gboolean
16461646
lacks_filesystem_info (NemoFile *file)
16471647
{
1648-
return !file->details->filesystem_info_is_up_to_date;
1648+
return nemo_file_is_directory (file) && !file->details->filesystem_info_is_up_to_date;
16491649
}
16501650

16511651
static gboolean
@@ -1692,7 +1692,8 @@ lacks_extension_info (NemoFile *file)
16921692
static gboolean
16931693
lacks_thumbnail (NemoFile *file)
16941694
{
1695-
return nemo_file_should_show_thumbnail (file) &&
1695+
return file->details->load_thumb &&
1696+
nemo_file_should_show_thumbnail (file) &&
16961697
file->details->thumbnail_path != NULL &&
16971698
!file->details->thumbnail_is_up_to_date;
16981699
}

libnemo-private/nemo-file-private.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ struct NemoFileDetails
5656

5757
eel_ref_str name;
5858

59+
gchar *cached_uri;
60+
5961
/* File info: */
6062
GFileType type;
6163

@@ -221,7 +223,8 @@ struct NemoFileDetails
221223

222224
eel_boolean_bit filesystem_readonly : 1;
223225
eel_boolean_bit filesystem_use_preview : 2; /* GFilesystemPreviewType */
224-
eel_boolean_bit filesystem_info_is_up_to_date : 1;
226+
eel_boolean_bit filesystem_info_is_up_to_date : 1;
227+
eel_boolean_bit load_thumb : 1;
225228

226229
NemoFilePinning pinning;
227230

libnemo-private/nemo-file.c

+35-7
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ nemo_file_clear_info (NemoFile *file)
501501
file->details->ctime = 0;
502502
file->details->btime = 0;
503503
file->details->trash_time = 0;
504+
file->details->load_thumb = FALSE;
504505
g_free (file->details->symlink_name);
505506
file->details->symlink_name = NULL;
506507
eel_ref_str_unref (file->details->mime_type);
@@ -564,7 +565,7 @@ nemo_file_new_from_filename (NemoDirectory *directory,
564565
file->details->name = eel_ref_str_new (filename);
565566

566567
#ifdef NEMO_FILE_DEBUG_REF
567-
DEBUG_REF_PRINTF("%10p ref'd", file);
568+
DEBUG_REF_PRINTF("%10p ref'd\n", file);
568569
#endif
569570

570571
return file;
@@ -676,7 +677,7 @@ nemo_file_new_from_info (NemoDirectory *directory,
676677
update_info_and_name (file, info);
677678

678679
#ifdef NEMO_FILE_DEBUG_REF
679-
DEBUG_REF_PRINTF("%10p ref'd", file);
680+
DEBUG_REF_PRINTF("%10p ref'd\n", file);
680681
#endif
681682

682683
return file;
@@ -865,6 +866,8 @@ finalize (GObject *object)
865866
metadata_hash_free (file->details->metadata);
866867
}
867868

869+
g_free (file->details->cached_uri);
870+
868871
G_OBJECT_CLASS (nemo_file_parent_class)->finalize (object);
869872
}
870873

@@ -877,7 +880,7 @@ nemo_file_ref (NemoFile *file)
877880
g_return_val_if_fail (NEMO_IS_FILE (file), NULL);
878881

879882
#ifdef NEMO_FILE_DEBUG_REF
880-
DEBUG_REF_PRINTF("%10p ref'd", file);
883+
DEBUG_REF_PRINTF("%10p ref'd\n", file);
881884
#endif
882885

883886
return g_object_ref (file);
@@ -893,7 +896,7 @@ nemo_file_unref (NemoFile *file)
893896
g_return_if_fail (NEMO_IS_FILE (file));
894897

895898
#ifdef NEMO_FILE_DEBUG_REF
896-
DEBUG_REF_PRINTF("%10p unref'd", file);
899+
DEBUG_REF_PRINTF("%10p unref'd\n", file);
897900
#endif
898901

899902
g_object_unref (file);
@@ -1639,6 +1642,18 @@ nemo_file_get_uri (NemoFile *file)
16391642
return uri;
16401643
}
16411644

1645+
const char *
1646+
nemo_file_peek_uri (NemoFile *file)
1647+
{
1648+
g_return_val_if_fail (NEMO_IS_FILE (file), NULL);
1649+
1650+
if (file->details->cached_uri == NULL) {
1651+
file->details->cached_uri = nemo_file_get_uri (file);
1652+
}
1653+
1654+
return file->details->cached_uri;
1655+
}
1656+
16421657
/* Return the actual path associated with the passed-in file. */
16431658
char *
16441659
nemo_file_get_path (NemoFile *file)
@@ -4342,6 +4357,12 @@ nemo_file_delete_thumbnail (NemoFile *file)
43424357
}
43434358
}
43444359

4360+
gboolean
4361+
nemo_file_has_loaded_thumbnail (NemoFile *file)
4362+
{
4363+
return file->details->thumbnail_is_up_to_date;
4364+
}
4365+
43454366
static void
43464367
prepend_icon_name (const char *name,
43474368
GThemedIcon *icon)
@@ -4636,7 +4657,7 @@ nemo_file_get_icon (NemoFile *file,
46364657
DEBUG ("Called file_get_icon(), at size %d, force thumbnail %d", size,
46374658
flags & NEMO_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE);
46384659

4639-
if (flags & NEMO_FILE_ICON_FLAGS_USE_THUMBNAILS &&
4660+
if ((flags & NEMO_FILE_ICON_FLAGS_USE_THUMBNAILS) &&
46404661
nemo_file_should_show_thumbnail (file)) {
46414662

46424663
if (flags & NEMO_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE) {
@@ -4727,12 +4748,12 @@ nemo_file_get_icon (NemoFile *file,
47274748
!file->details->is_thumbnailing &&
47284749
!file->details->thumbnailing_failed) {
47294750
if (nemo_can_thumbnail (file)) {
4730-
nemo_create_thumbnail (file, get_throttle_count (file));
4751+
nemo_create_thumbnail (file, get_throttle_count (file), TRUE);
47314752
}
47324753
}
47334754
}
47344755

4735-
if (file->details->is_thumbnailing &&
4756+
if (file->details->thumbnail_path == NULL && nemo_can_thumbnail (file) &&
47364757
flags & NEMO_FILE_ICON_FLAGS_USE_THUMBNAILS)
47374758
gicon = g_themed_icon_new (ICON_NAME_THUMBNAIL_LOADING);
47384759
else
@@ -8019,6 +8040,13 @@ nemo_file_invalidate_extension_info_internal (NemoFile *file)
80198040
nemo_module_get_extensions_for_type (NEMO_TYPE_INFO_PROVIDER);
80208041
}
80218042

8043+
void
8044+
nemo_file_set_load_thumb (NemoFile *file,
8045+
gboolean load_thumb)
8046+
{
8047+
file->details->load_thumb = load_thumb;
8048+
}
8049+
80228050
void
80238051
nemo_file_invalidate_attributes_internal (NemoFile *file,
80248052
NemoFileAttributes file_attributes)

libnemo-private/nemo-file.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ const char * nemo_file_peek_name (NemoFile
189189
GFile * nemo_file_get_location (NemoFile *file);
190190
char * nemo_file_get_description (NemoFile *file);
191191
char * nemo_file_get_uri (NemoFile *file);
192+
const char * nemo_file_peek_uri (NemoFile *file);
192193
char * nemo_file_get_path (NemoFile *file);
193194
char * nemo_file_get_uri_scheme (NemoFile *file);
194195
NemoFile * nemo_file_get_parent (NemoFile *file);
@@ -240,6 +241,7 @@ NemoRequestStatus nemo_file_get_deep_counts (NemoFile
240241
gboolean force);
241242
gboolean nemo_file_should_show_thumbnail (NemoFile *file);
242243
void nemo_file_delete_thumbnail (NemoFile *file);
244+
gboolean nemo_file_has_loaded_thumbnail (NemoFile *file);
243245
gboolean nemo_file_should_show_directory_item_count (NemoFile *file);
244246
gboolean nemo_file_should_show_type (NemoFile *file);
245247
GList * nemo_file_get_keywords (NemoFile *file);
@@ -521,7 +523,7 @@ void nemo_file_set_is_desktop_orphan (NemoFile *file, gboolean is_d
521523

522524
gboolean nemo_file_get_pinning (NemoFile *file);
523525
void nemo_file_set_pinning (NemoFile *file, gboolean pin);
524-
526+
void nemo_file_set_load_thumb (NemoFile *file, gboolean load_thumb);
525527
/* Debugging */
526528
void nemo_file_dump (NemoFile *file);
527529

0 commit comments

Comments
 (0)