[gimp] app: we were leaking a reference in gimp_tool_rectangle_button_release()



commit e7964e499c292bf8995dc6d74f89da65380ba0fc
Author: Michael Natterer <mitch gimp org>
Date:   Thu Jun 29 15:04:13 2017 +0200

    app: we were leaking a reference in gimp_tool_rectangle_button_release()
    
    because of bailing out early after emitting "response". Instead, don't
    ref the object around this function, and move the "response" emission
    to the end of the function.

 app/display/gimptoolrectangle.c |   20 ++++++++------------
 1 files changed, 8 insertions(+), 12 deletions(-)
---
diff --git a/app/display/gimptoolrectangle.c b/app/display/gimptoolrectangle.c
index 1826ee1..495f4d8 100644
--- a/app/display/gimptoolrectangle.c
+++ b/app/display/gimptoolrectangle.c
@@ -1420,12 +1420,11 @@ gimp_tool_rectangle_button_release (GimpToolWidget        *widget,
 {
   GimpToolRectangle        *rectangle = GIMP_TOOL_RECTANGLE (widget);
   GimpToolRectanglePrivate *private   = rectangle->private;
+  gint                      response  = 0;
 
   if (private->function == GIMP_TOOL_RECTANGLE_EXECUTING)
     gimp_tool_widget_set_status (widget, NULL);
 
-  g_object_ref (rectangle);
-
   /* On button release, we are not rubber-banding the rectangle any longer. */
   private->rect_adjusting = FALSE;
 
@@ -1447,20 +1446,13 @@ gimp_tool_rectangle_button_release (GimpToolWidget        *widget,
 
       /* If the first created rectangle was canceled, halt the tool */
       if (gimp_tool_rectangle_rectangle_is_new (rectangle))
-        {
-          gimp_tool_widget_response (widget, GIMP_TOOL_WIDGET_RESPONSE_CANCEL);
-          return;
-        }
+        response = GIMP_TOOL_WIDGET_RESPONSE_CANCEL;
       break;
 
     case GIMP_BUTTON_RELEASE_CLICK:
-
       /* When a dead area is clicked, don't execute. */
       if (private->function != GIMP_TOOL_RECTANGLE_DEAD)
-        {
-          gimp_tool_widget_response (widget, GIMP_TOOL_WIDGET_RESPONSE_CONFIRM);
-          return;
-        }
+        response = GIMP_TOOL_WIDGET_RESPONSE_CONFIRM;
       break;
 
     case GIMP_BUTTON_RELEASE_NO_MOTION:
@@ -1475,7 +1467,11 @@ gimp_tool_rectangle_button_release (GimpToolWidget        *widget,
 
   gimp_tool_rectangle_changed (widget);
 
-  g_object_unref (rectangle);
+  /*  emit response at the end, so everything is up to date even if
+   *  a signal handler decides hot to shut down the rectangle
+   */
+  if (response != 0)
+    gimp_tool_widget_response (widget, response);
 }
 
 void


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