app: defer GimpViewable::size-changed signal emission while frozen

In GimpViewable, defer emission of the size-changed signal while
the viewable's preview is frozen, and only emit the signal once
thawed.
This commit is contained in:
Ell
2019-09-04 17:08:46 +03:00
parent 214cda5403
commit 4d2b713a08

View File

@ -69,6 +69,7 @@ struct _GimpViewablePrivate
GdkPixbuf *icon_pixbuf; GdkPixbuf *icon_pixbuf;
gint freeze_count; gint freeze_count;
gboolean invalidate_pending; gboolean invalidate_pending;
gboolean size_changed_prending;
GimpViewable *parent; GimpViewable *parent;
gint depth; gint depth;
@ -604,9 +605,16 @@ gimp_viewable_invalidate_preview (GimpViewable *viewable)
void void
gimp_viewable_size_changed (GimpViewable *viewable) gimp_viewable_size_changed (GimpViewable *viewable)
{ {
GimpViewablePrivate *private;
g_return_if_fail (GIMP_IS_VIEWABLE (viewable)); g_return_if_fail (GIMP_IS_VIEWABLE (viewable));
private = GET_PRIVATE (viewable);
if (private->freeze_count == 0)
g_signal_emit (viewable, viewable_signals[SIZE_CHANGED], 0); g_signal_emit (viewable, viewable_signals[SIZE_CHANGED], 0);
else
private->size_changed_prending = TRUE;
} }
/** /**
@ -1307,6 +1315,13 @@ gimp_viewable_preview_thaw (GimpViewable *viewable)
if (private->freeze_count == 0) if (private->freeze_count == 0)
{ {
if (private->size_changed_prending)
{
private->size_changed_prending = FALSE;
gimp_viewable_size_changed (viewable);
}
if (private->invalidate_pending) if (private->invalidate_pending)
{ {
private->invalidate_pending = FALSE; private->invalidate_pending = FALSE;