From 62a74f9da6263e079bafb2ec3a20849d3e9d8915 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 4 Nov 2008 23:22:45 +0000 Subject: [PATCH] add signal "structure-changed" and API to emit it. 2008-11-05 Michael Natterer * app/core/gimpprojectable.[ch]: add signal "structure-changed" and API to emit it. * app/core/gimpimage.c: emit it when the image emits "mode-changed" and "size-changed". * app/core/gimpprojection.c: connect to the new signal instead of "mode-changed" and "size-changed" to get rid of one more image dependency. svn path=/trunk/; revision=27556 --- ChangeLog | 12 ++++++++++++ app/core/gimpimage.c | 12 +++++++++++- app/core/gimpprojectable.c | 18 ++++++++++++++++++ app/core/gimpprojectable.h | 2 ++ app/core/gimpprojection.c | 19 ++++++------------- 5 files changed, 49 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 507f7f8161..26c63fb3a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-11-05 Michael Natterer + + * app/core/gimpprojectable.[ch]: add signal "structure-changed" + and API to emit it. + + * app/core/gimpimage.c: emit it when the image emits + "mode-changed" and "size-changed". + + * app/core/gimpprojection.c: connect to the new signal instead of + "mode-changed" and "size-changed" to get rid of one more image + dependency. + 2008-11-04 Sven Neumann * app/display/gimpdisplayshell-dnd.c diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c index 0db9cbcfcd..50298ecb22 100644 --- a/app/core/gimpimage.c +++ b/app/core/gimpimage.c @@ -156,6 +156,8 @@ static void gimp_image_invalidate_preview (GimpViewable *viewable); static void gimp_image_size_changed (GimpViewable *viewable); static gchar * gimp_image_get_description (GimpViewable *viewable, gchar **tooltip); + +static void gimp_image_real_mode_changed (GimpImage *image); static void gimp_image_real_size_changed_detailed (GimpImage *image, gint previous_origin_x, @@ -491,7 +493,7 @@ gimp_image_class_init (GimpImageClass *klass) viewable_class->get_new_preview = gimp_image_get_new_preview; viewable_class->get_description = gimp_image_get_description; - klass->mode_changed = NULL; + klass->mode_changed = gimp_image_real_mode_changed; klass->alpha_changed = NULL; klass->floating_selection_changed = NULL; klass->active_layer_changed = NULL; @@ -1067,6 +1069,8 @@ gimp_image_size_changed (GimpViewable *viewable) } gimp_viewable_size_changed (GIMP_VIEWABLE (gimp_image_get_mask (image))); + + gimp_projectable_structure_changed (GIMP_PROJECTABLE (image)); } static gchar * @@ -1092,6 +1096,12 @@ gimp_image_get_description (GimpViewable *viewable, return retval; } +static void +gimp_image_real_mode_changed (GimpImage *image) +{ + gimp_projectable_structure_changed (GIMP_PROJECTABLE (image)); +} + static void gimp_image_real_size_changed_detailed (GimpImage *image, gint previous_origin_x, diff --git a/app/core/gimpprojectable.c b/app/core/gimpprojectable.c index 6ec791ea29..a13fbc6e65 100644 --- a/app/core/gimpprojectable.c +++ b/app/core/gimpprojectable.c @@ -34,6 +34,7 @@ enum { UPDATE, FLUSH, + STRUCTURE_CHANGED, LAST_SIGNAL }; @@ -102,6 +103,15 @@ gimp_projectable_iface_base_init (GimpProjectableInterface *iface) G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + projectable_signals[STRUCTURE_CHANGED] = + g_signal_new ("structure-changed", + G_TYPE_FROM_CLASS (iface), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GimpProjectableInterface, structure_changed), + NULL, NULL, + gimp_marshal_VOID__VOID, + G_TYPE_NONE, 0); + initialized = TRUE; } } @@ -132,6 +142,14 @@ gimp_projectable_flush (GimpProjectable *projectable, preview_invalidated); } +void +gimp_projectable_structure_changed (GimpProjectable *projectable) +{ + g_return_if_fail (GIMP_IS_PROJECTABLE (projectable)); + + g_signal_emit (projectable, projectable_signals[STRUCTURE_CHANGED], 0); +} + GimpImage * gimp_projectable_get_image (GimpProjectable *projectable) { diff --git a/app/core/gimpprojectable.h b/app/core/gimpprojectable.h index 9330c2fb21..84c93adc37 100644 --- a/app/core/gimpprojectable.h +++ b/app/core/gimpprojectable.h @@ -43,6 +43,7 @@ struct _GimpProjectableInterface gint height); void (* flush) (GimpProjectable *projectable, gboolean invalidate_preview); + void (* structure_changed) (GimpProjectable *projectable); /* virtual functions */ GimpImage * (* get_image) (GimpProjectable *projectable); @@ -60,6 +61,7 @@ void gimp_projectable_update (GimpProjectable *projectable, gint height); void gimp_projectable_flush (GimpProjectable *projectable, gboolean preview_invalidated); +void gimp_projectable_structure_changed (GimpProjectable *projectable); GimpImage * gimp_projectable_get_image (GimpProjectable *projectable); GeglNode * gimp_projectable_get_graph (GimpProjectable *projectable); diff --git a/app/core/gimpprojection.c b/app/core/gimpprojection.c index 4af0dbb294..2b8e716249 100644 --- a/app/core/gimpprojection.c +++ b/app/core/gimpprojection.c @@ -110,7 +110,7 @@ static void gimp_projection_projectable_update (GimpProjectable *proje static void gimp_projection_projectable_flush (GimpProjectable *projectable, gboolean invalidate_preview, GimpProjection *proj); -static void gimp_projection_image_changed (GimpImage *image, +static void gimp_projection_projectable_changed (GimpProjectable *projectable, GimpProjection *proj); @@ -345,7 +345,6 @@ GimpProjection * gimp_projection_new (GimpProjectable *projectable) { GimpProjection *proj; - GimpImage *image; g_return_val_if_fail (GIMP_IS_PROJECTABLE (projectable), NULL); @@ -359,14 +358,8 @@ gimp_projection_new (GimpProjectable *projectable) g_signal_connect_object (projectable, "flush", G_CALLBACK (gimp_projection_projectable_flush), proj, 0); - - image = gimp_projectable_get_image (projectable); - - g_signal_connect_object (image, "size-changed", - G_CALLBACK (gimp_projection_image_changed), - proj, 0); - g_signal_connect_object (image, "mode-changed", - G_CALLBACK (gimp_projection_image_changed), + g_signal_connect_object (projectable, "structure-changed", + G_CALLBACK (gimp_projection_projectable_changed), proj, 0); return proj; @@ -789,8 +782,8 @@ gimp_projection_projectable_flush (GimpProjectable *projectable, } static void -gimp_projection_image_changed (GimpImage *image, - GimpProjection *proj) +gimp_projection_projectable_changed (GimpProjectable *projectable, + GimpProjection *proj) { gint width, height; @@ -800,7 +793,7 @@ gimp_projection_image_changed (GimpImage *image, proj->pyramid = NULL; } - gimp_viewable_get_size (GIMP_VIEWABLE (image), &width, &height); + gimp_viewable_get_size (GIMP_VIEWABLE (projectable), &width, &height); gimp_projection_add_update_area (proj, 0, 0, width, height); }