[gimp] app: must set GimpDrawTool's widget to NULL when a tools is halted



commit a7e706f7b58af59487d6c92c1b62d6c5fbf7c3b2
Author: Michael Natterer <mitch gimp org>
Date:   Tue Jun 27 22:30:17 2017 +0200

    app: must set GimpDrawTool's widget to NULL when a tools is halted
    
    We were leaking all tool widgets set with gimp_draw_tool_set_widget(),
    and those having signal connections to e.g. the display shell were
    doing things when they were supposed to be gone. Fixes make check.

 app/tools/gimpblendtool.c           |   13 +++++--------
 app/tools/gimpcroptool.c            |    1 +
 app/tools/gimpfreeselecttool.c      |    1 +
 app/tools/gimpmeasuretool.c         |    8 +++++---
 app/tools/gimprectangleselecttool.c |    1 +
 app/tools/gimptransformtool.c       |    1 +
 app/tools/gimpvectortool.c          |    8 +++++---
 7 files changed, 19 insertions(+), 14 deletions(-)
---
diff --git a/app/tools/gimpblendtool.c b/app/tools/gimpblendtool.c
index 285b0f6..cb488cf 100644
--- a/app/tools/gimpblendtool.c
+++ b/app/tools/gimpblendtool.c
@@ -686,17 +686,14 @@ gimp_blend_tool_halt (GimpBlendTool *blend_tool)
   if (tool->display)
     gimp_tool_pop_status (tool, tool->display);
 
-  tool->display  = NULL;
-  tool->drawable = NULL;
-
   if (gimp_draw_tool_is_active (GIMP_DRAW_TOOL (blend_tool)))
     gimp_draw_tool_stop (GIMP_DRAW_TOOL (blend_tool));
 
-  if (blend_tool->line)
-    {
-      g_object_unref (blend_tool->line);
-      blend_tool->line = NULL;
-    }
+  gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), NULL);
+  g_clear_object (&blend_tool->line);
+
+  tool->display  = NULL;
+  tool->drawable = NULL;
 }
 
 static void
diff --git a/app/tools/gimpcroptool.c b/app/tools/gimpcroptool.c
index d2cab37..b8ad67a 100644
--- a/app/tools/gimpcroptool.c
+++ b/app/tools/gimpcroptool.c
@@ -493,6 +493,7 @@ gimp_crop_tool_halt (GimpCropTool *crop_tool)
   if (gimp_draw_tool_is_active (GIMP_DRAW_TOOL (tool)))
     gimp_draw_tool_stop (GIMP_DRAW_TOOL (tool));
 
+  gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), NULL);
   g_clear_object (&crop_tool->rectangle);
 
   tool->display  = NULL;
diff --git a/app/tools/gimpfreeselecttool.c b/app/tools/gimpfreeselecttool.c
index daaf1e0..88a77a6 100644
--- a/app/tools/gimpfreeselecttool.c
+++ b/app/tools/gimpfreeselecttool.c
@@ -244,6 +244,7 @@ gimp_free_select_tool_halt (GimpFreeSelectTool *fst)
 {
   GimpFreeSelectToolPrivate *private = fst->private;
 
+  gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (fst), NULL);
   g_clear_object (&private->polygon);
 }
 
diff --git a/app/tools/gimpmeasuretool.c b/app/tools/gimpmeasuretool.c
index 955b4dc..33d35b2 100644
--- a/app/tools/gimpmeasuretool.c
+++ b/app/tools/gimpmeasuretool.c
@@ -420,13 +420,15 @@ gimp_measure_tool_halt (GimpMeasureTool *measure)
 {
   GimpTool *tool = GIMP_TOOL (measure);
 
-  if (gimp_draw_tool_is_active (GIMP_DRAW_TOOL (measure)))
-    gimp_draw_tool_stop (GIMP_DRAW_TOOL (measure));
-
   if (tool->display)
     gimp_tool_pop_status (tool, tool->display);
 
+  if (gimp_draw_tool_is_active (GIMP_DRAW_TOOL (measure)))
+    gimp_draw_tool_stop (GIMP_DRAW_TOOL (measure));
+
+  gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), NULL);
   g_clear_object (&measure->compass);
+
   g_clear_object (&measure->gui);
 
   tool->display = NULL;
diff --git a/app/tools/gimprectangleselecttool.c b/app/tools/gimprectangleselecttool.c
index 3537d3c..199f2b6 100644
--- a/app/tools/gimprectangleselecttool.c
+++ b/app/tools/gimprectangleselecttool.c
@@ -853,6 +853,7 @@ gimp_rectangle_select_tool_halt (GimpRectangleSelectTool *rect_tool)
   if (gimp_draw_tool_is_active (GIMP_DRAW_TOOL (tool)))
     gimp_draw_tool_stop (GIMP_DRAW_TOOL (tool));
 
+  gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), NULL);
   g_clear_object (&priv->rectangle);
 
   tool->display = NULL;
diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c
index dd65115..b1e4728 100644
--- a/app/tools/gimptransformtool.c
+++ b/app/tools/gimptransformtool.c
@@ -1078,6 +1078,7 @@ gimp_transform_tool_halt (GimpTransformTool *tr_tool)
   if (gimp_draw_tool_is_active (GIMP_DRAW_TOOL (tr_tool)))
     gimp_draw_tool_stop (GIMP_DRAW_TOOL (tr_tool));
 
+  gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tr_tool), NULL);
   g_clear_object (&tr_tool->widget);
 
   if (tr_tool->gui)
diff --git a/app/tools/gimpvectortool.c b/app/tools/gimpvectortool.c
index 9555686..e3c4b01 100644
--- a/app/tools/gimpvectortool.c
+++ b/app/tools/gimpvectortool.c
@@ -430,13 +430,15 @@ gimp_vector_tool_halt (GimpVectorTool *vector_tool)
 {
   GimpTool *tool = GIMP_TOOL (vector_tool);
 
-  if (gimp_draw_tool_is_active (GIMP_DRAW_TOOL (tool)))
-    gimp_draw_tool_stop (GIMP_DRAW_TOOL (tool));
-
   if (tool->display)
     gimp_tool_pop_status (tool, tool->display);
 
   gimp_vector_tool_set_vectors (vector_tool, NULL);
+
+  if (gimp_draw_tool_is_active (GIMP_DRAW_TOOL (tool)))
+    gimp_draw_tool_stop (GIMP_DRAW_TOOL (tool));
+
+  gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), NULL);
   g_clear_object (&vector_tool->path);
 
   tool->display = NULL;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]