diff options
| author | Přemysl Eric Janouch <p@janouch.name> | 2024-01-30 01:36:05 +0100 | 
|---|---|---|
| committer | Přemysl Eric Janouch <p@janouch.name> | 2024-01-30 02:16:17 +0100 | 
| commit | 9ca18f52d58e82f60d023feae6ed7c4669f7ea81 (patch) | |
| tree | 618602acf065641221112207966bad03e608d5a4 /fiv-browser.c | |
| parent | 604594a8f1d048b516120ba98eba71302e2043b4 (diff) | |
| download | fiv-9ca18f52d58e82f60d023feae6ed7c4669f7ea81.tar.gz fiv-9ca18f52d58e82f60d023feae6ed7c4669f7ea81.tar.xz fiv-9ca18f52d58e82f60d023feae6ed7c4669f7ea81.zip  | |
Clean up thumbnailing
Diffstat (limited to 'fiv-browser.c')
| -rw-r--r-- | fiv-browser.c | 36 | 
1 files changed, 18 insertions, 18 deletions
diff --git a/fiv-browser.c b/fiv-browser.c index 2e7024a..500cdf8 100644 --- a/fiv-browser.c +++ b/fiv-browser.c @@ -92,7 +92,8 @@ struct _FivBrowser {  	Thumbnailer *thumbnailers;          ///< Parallelized thumbnailers  	size_t thumbnailers_len;            ///< Thumbnailers array size -	GQueue thumbnailers_queue;          ///< Queued up Entry pointers +	GQueue thumbnailers_queue_1;        ///< Queued up Entry pointers, hi-prio +	GQueue thumbnailers_queue_2;        ///< Queued up Entry pointers, lo-prio  	GdkCursor *pointer;                 ///< Cached pointer cursor  	cairo_pattern_t *glow;              ///< CAIRO_FORMAT_A8 mask for corners @@ -742,7 +743,7 @@ thumbnailer_reprocess_entry(FivBrowser *self, GBytes *output, Entry *entry)  	if ((flags & FIV_IO_SERIALIZE_LOW_QUALITY)) {  		cairo_surface_set_user_data(entry->thumbnail, &fiv_thumbnail_key_lq,  			(void *) (intptr_t) 1, NULL); -		g_queue_push_tail(&self->thumbnailers_queue, entry); +		g_queue_push_tail(&self->thumbnailers_queue_2, entry);  	}  	entry_set_surface_user_data(entry); @@ -801,7 +802,8 @@ thumbnailer_next(Thumbnailer *t)  {  	// TODO(p): Try to keep the minions alive (stdout will be a problem).  	FivBrowser *self = t->self; -	if (!(t->target = g_queue_pop_head(&self->thumbnailers_queue))) +	if (!(t->target = g_queue_pop_head(&self->thumbnailers_queue_1)) && +		!(t->target = g_queue_pop_head(&self->thumbnailers_queue_2)))  		return FALSE;  	// Case analysis: @@ -839,7 +841,8 @@ thumbnailer_next(Thumbnailer *t)  static void  thumbnailers_abort(FivBrowser *self)  { -	g_queue_clear(&self->thumbnailers_queue); +	g_queue_clear(&self->thumbnailers_queue_1); +	g_queue_clear(&self->thumbnailers_queue_2);  	for (size_t i = 0; i < self->thumbnailers_len; i++) {  		Thumbnailer *t = self->thumbnailers + i; @@ -855,29 +858,23 @@ thumbnailers_abort(FivBrowser *self)  }  static void -thumbnailers_start(FivBrowser *self) +thumbnailers_restart(FivBrowser *self)  {  	thumbnailers_abort(self);  	if (!self->model)  		return; -	GQueue lq = G_QUEUE_INIT;  	for (guint i = 0; i < self->entries->len; i++) {  		Entry *entry = self->entries->pdata[i];  		if (entry->removed)  			continue;  		if (entry->icon) -			g_queue_push_tail(&self->thumbnailers_queue, entry); +			g_queue_push_tail(&self->thumbnailers_queue_1, entry);  		else if (cairo_surface_get_user_data(  			entry->thumbnail, &fiv_thumbnail_key_lq)) -			g_queue_push_tail(&lq, entry); +			g_queue_push_tail(&self->thumbnailers_queue_2, entry);  	} -	while (!g_queue_is_empty(&lq)) { -		g_queue_push_tail_link( -			&self->thumbnailers_queue, g_queue_pop_head_link(&lq)); -	} -  	for (size_t i = 0; i < self->thumbnailers_len; i++) {  		if (!thumbnailer_next(self->thumbnailers + i))  			break; @@ -1004,7 +1001,7 @@ set_item_size(FivBrowser *self, FivThumbnailSize size)  		g_hash_table_remove_all(self->thumbnail_cache);  		reload_thumbnails(self); -		thumbnailers_start(self); +		thumbnailers_restart(self);  		g_object_notify_by_pspec(  			G_OBJECT(self), browser_properties[PROP_THUMBNAIL_SIZE]); @@ -1872,7 +1869,8 @@ fiv_browser_init(FivBrowser *self)  		g_malloc0_n(self->thumbnailers_len, sizeof *self->thumbnailers);  	for (size_t i = 0; i < self->thumbnailers_len; i++)  		self->thumbnailers[i].self = self; -	g_queue_init(&self->thumbnailers_queue); +	g_queue_init(&self->thumbnailers_queue_1); +	g_queue_init(&self->thumbnailers_queue_2);  	set_item_size(self, FIV_THUMBNAIL_SIZE_NORMAL);  	self->show_labels = FALSE; @@ -1918,7 +1916,7 @@ on_model_reloaded(FivIoModel *model, FivBrowser *self)  	g_free(selected_uri);  	reload_thumbnails(self); -	thumbnailers_start(self); +	thumbnailers_restart(self);  }  static void @@ -1933,8 +1931,10 @@ on_model_changed(FivIoModel *model, FivIoModelEntry *old, FivIoModelEntry *new,  		g_ptr_array_add(self->entries, entry);  		reload_one_thumbnail(self, entry); +		// TODO(p): This is important! +		// thumbnailers_restart() disowns existing processes.  		// TODO(p): Try to add to thumbnailer queue if already started. -		thumbnailers_start(self); +		thumbnailers_restart(self);  		return;  	} @@ -1961,7 +1961,7 @@ on_model_changed(FivIoModel *model, FivIoModelEntry *old, FivIoModelEntry *new,  		// move the thumbnail cache entry to the new URI.  		reload_one_thumbnail(self, found);  		// TODO(p): Try to add to thumbnailer queue if already started. -		thumbnailers_start(self); +		thumbnailers_restart(self);  	} else {  		found->removed = TRUE;  		gtk_widget_queue_draw(GTK_WIDGET(self));  | 
