[gimp] Refuse to edit locked drawables



commit ec6600a0b3dab3ccd3e99fb1096031e375e72a07
Author: Michael Natterer <mitch gimp org>
Date:   Thu Aug 20 17:05:23 2009 +0200

    Refuse to edit locked drawables
    
    Check whether the drawable to edit is locked in GimpTool::initialize()
    and bail out with an appropriate error if it is. This currently
    prevents cloning from locked drawables, will fix that later.

 app/tools/gimpblendtool.c              |    7 +++++++
 app/tools/gimpbrightnesscontrasttool.c |    4 +---
 app/tools/gimpbucketfilltool.c         |   27 +++++++++++++++++++++++++++
 app/tools/gimpcolorbalancetool.c       |    4 +---
 app/tools/gimpcolorizetool.c           |    5 ++++-
 app/tools/gimpcurvestool.c             |    5 ++++-
 app/tools/gimpdesaturatetool.c         |    5 ++++-
 app/tools/gimpgegltool.c               |    4 +---
 app/tools/gimphuesaturationtool.c      |    4 +---
 app/tools/gimpimagemaptool.c           |   12 ++++++++++--
 app/tools/gimplevelstool.c             |    5 ++++-
 app/tools/gimppainttool.c              |   28 ++++++++++++++++++++++++++++
 app/tools/gimpperspectiveclonetool.c   |    5 +++++
 app/tools/gimpposterizetool.c          |    5 ++++-
 app/tools/gimpthresholdtool.c          |    5 ++++-
 app/tools/gimptransformtool.c          |   18 +++++++++++++++++-
 16 files changed, 122 insertions(+), 21 deletions(-)
---
diff --git a/app/tools/gimpblendtool.c b/app/tools/gimpblendtool.c
index e41d919..6643f0e 100644
--- a/app/tools/gimpblendtool.c
+++ b/app/tools/gimpblendtool.c
@@ -167,6 +167,13 @@ gimp_blend_tool_initialize (GimpTool     *tool,
       return FALSE;
     }
 
+  if (gimp_item_get_lock_content (GIMP_ITEM (drawable)))
+    {
+      g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
+			   _("The active layer's pixels are locked."));
+      return FALSE;
+    }
+
   return TRUE;
 }
 
diff --git a/app/tools/gimpbrightnesscontrasttool.c b/app/tools/gimpbrightnesscontrasttool.c
index a2424ed..c10421f 100644
--- a/app/tools/gimpbrightnesscontrasttool.c
+++ b/app/tools/gimpbrightnesscontrasttool.c
@@ -188,9 +188,7 @@ gimp_brightness_contrast_tool_initialize (GimpTool     *tool,
 
   gimp_config_reset (GIMP_CONFIG (bc_tool->config));
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
-
-  return TRUE;
+  return GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
 }
 
 static GeglNode *
diff --git a/app/tools/gimpbucketfilltool.c b/app/tools/gimpbucketfilltool.c
index e93d815..2af8f8d 100644
--- a/app/tools/gimpbucketfilltool.c
+++ b/app/tools/gimpbucketfilltool.c
@@ -26,6 +26,7 @@
 
 #include "core/gimp.h"
 #include "core/gimpdrawable-bucket-fill.h"
+#include "core/gimperror.h"
 #include "core/gimpimage.h"
 #include "core/gimpitem.h"
 #include "core/gimppickable.h"
@@ -43,6 +44,9 @@
 
 /*  local function prototypes  */
 
+static gboolean gimp_bucket_fill_tool_initialize   (GimpTool              *tool,
+                                                    GimpDisplay           *display,
+                                                    GError               **error);
 static void   gimp_bucket_fill_tool_button_release (GimpTool              *tool,
                                                     const GimpCoords      *coords,
                                                     guint32                time,
@@ -91,6 +95,7 @@ gimp_bucket_fill_tool_class_init (GimpBucketFillToolClass *klass)
 {
   GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass);
 
+  tool_class->initialize     = gimp_bucket_fill_tool_initialize;
   tool_class->button_release = gimp_bucket_fill_tool_button_release;
   tool_class->modifier_key   = gimp_bucket_fill_tool_modifier_key;
   tool_class->cursor_update  = gimp_bucket_fill_tool_cursor_update;
@@ -111,6 +116,28 @@ gimp_bucket_fill_tool_init (GimpBucketFillTool *bucket_fill_tool)
                                          "context/context-pattern-select-set");
 }
 
+static gboolean
+gimp_bucket_fill_tool_initialize (GimpTool     *tool,
+                                  GimpDisplay  *display,
+                                  GError      **error)
+{
+  GimpDrawable *drawable = gimp_image_get_active_drawable (display->image);
+
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
+
+  if (gimp_item_get_lock_content (GIMP_ITEM (drawable)))
+    {
+      g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
+			   _("The active layer's pixels are locked."));
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
 static void
 gimp_bucket_fill_tool_button_release (GimpTool              *tool,
                                       const GimpCoords      *coords,
diff --git a/app/tools/gimpcolorbalancetool.c b/app/tools/gimpcolorbalancetool.c
index 3282059..07ab627 100644
--- a/app/tools/gimpcolorbalancetool.c
+++ b/app/tools/gimpcolorbalancetool.c
@@ -166,9 +166,7 @@ gimp_color_balance_tool_initialize (GimpTool     *tool,
 
   gimp_config_reset (GIMP_CONFIG (cb_tool->config));
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
-
-  return TRUE;
+  return GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
 }
 
 static GeglNode *
diff --git a/app/tools/gimpcolorizetool.c b/app/tools/gimpcolorizetool.c
index 0ac5010..c797d62 100644
--- a/app/tools/gimpcolorizetool.c
+++ b/app/tools/gimpcolorizetool.c
@@ -159,7 +159,10 @@ gimp_colorize_tool_initialize (GimpTool     *tool,
 
   gimp_config_reset (GIMP_CONFIG (col_tool->config));
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
 
   gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
 
diff --git a/app/tools/gimpcurvestool.c b/app/tools/gimpcurvestool.c
index d17bff4..87e3d8a 100644
--- a/app/tools/gimpcurvestool.c
+++ b/app/tools/gimpcurvestool.c
@@ -224,7 +224,10 @@ gimp_curves_tool_initialize (GimpTool     *tool,
 
   gimp_config_reset (GIMP_CONFIG (c_tool->config));
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
 
   /*  always pick colors  */
   gimp_color_tool_enable (GIMP_COLOR_TOOL (tool),
diff --git a/app/tools/gimpdesaturatetool.c b/app/tools/gimpdesaturatetool.c
index 2c65b10..e1add99 100644
--- a/app/tools/gimpdesaturatetool.c
+++ b/app/tools/gimpdesaturatetool.c
@@ -128,7 +128,10 @@ gimp_desaturate_tool_initialize (GimpTool     *tool,
 
   gimp_config_reset (GIMP_CONFIG (desaturate_tool->config));
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
 
   gimp_int_radio_group_set_active (GTK_RADIO_BUTTON (desaturate_tool->button),
                                    desaturate_tool->config->mode);
diff --git a/app/tools/gimpgegltool.c b/app/tools/gimpgegltool.c
index 3c1e91e..b63507f 100644
--- a/app/tools/gimpgegltool.c
+++ b/app/tools/gimpgegltool.c
@@ -162,9 +162,7 @@ gimp_gegl_tool_initialize (GimpTool     *tool,
   if (g_tool->config)
     gimp_config_reset (GIMP_CONFIG (g_tool->config));
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
-
-  return TRUE;
+  return GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
 }
 
 static GeglNode *
diff --git a/app/tools/gimphuesaturationtool.c b/app/tools/gimphuesaturationtool.c
index 066b467..b27bc8c 100644
--- a/app/tools/gimphuesaturationtool.c
+++ b/app/tools/gimphuesaturationtool.c
@@ -174,9 +174,7 @@ gimp_hue_saturation_tool_initialize (GimpTool     *tool,
 
   gimp_config_reset (GIMP_CONFIG (hs_tool->config));
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
-
-  return TRUE;
+  return GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
 }
 
 static GeglNode *
diff --git a/app/tools/gimpimagemaptool.c b/app/tools/gimpimagemaptool.c
index cfcb9ce..32c35c4 100644
--- a/app/tools/gimpimagemaptool.c
+++ b/app/tools/gimpimagemaptool.c
@@ -33,6 +33,7 @@
 
 #include "core/gimp.h"
 #include "core/gimpdrawable.h"
+#include "core/gimperror.h"
 #include "core/gimpimage.h"
 #include "core/gimpimage-pick-color.h"
 #include "core/gimpimagemap.h"
@@ -266,6 +267,15 @@ gimp_image_map_tool_initialize (GimpTool     *tool,
   GimpToolInfo     *tool_info      = tool->tool_info;
   GimpDrawable     *drawable;
 
+  drawable = gimp_image_get_active_drawable (display->image);
+
+  if (gimp_item_get_lock_content (GIMP_ITEM (drawable)))
+    {
+      g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
+			   _("The active layer's pixels are locked."));
+      return FALSE;
+    }
+
   /*  set display so the dialog can be hidden on display destruction  */
   tool->display = display;
 
@@ -334,8 +344,6 @@ gimp_image_map_tool_initialize (GimpTool     *tool,
                                  image_map_tool, 0);
     }
 
-  drawable = gimp_image_get_active_drawable (display->image);
-
   gimp_viewable_dialog_set_viewable (GIMP_VIEWABLE_DIALOG (image_map_tool->shell),
                                      GIMP_VIEWABLE (drawable),
                                      GIMP_CONTEXT (tool_info->tool_options));
diff --git a/app/tools/gimplevelstool.c b/app/tools/gimplevelstool.c
index a742838..4ee84d8 100644
--- a/app/tools/gimplevelstool.c
+++ b/app/tools/gimplevelstool.c
@@ -235,7 +235,10 @@ gimp_levels_tool_initialize (GimpTool     *tool,
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l_tool->active_picker),
                                   FALSE);
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
 
   gimp_int_combo_box_set_sensitivity (GIMP_INT_COMBO_BOX (l_tool->channel_menu),
                                       levels_menu_sensitivity, drawable, NULL);
diff --git a/app/tools/gimppainttool.c b/app/tools/gimppainttool.c
index 3458ed3..34ad4fd 100644
--- a/app/tools/gimppainttool.c
+++ b/app/tools/gimppainttool.c
@@ -27,6 +27,7 @@
 #include "core/gimp.h"
 #include "core/gimp-utils.h"
 #include "core/gimpdrawable.h"
+#include "core/gimperror.h"
 #include "core/gimpimage.h"
 #include "core/gimppaintinfo.h"
 #include "core/gimpprojection.h"
@@ -58,6 +59,9 @@ static GObject * gimp_paint_tool_constructor (GType                  type,
                                               GObjectConstructParam *params);
 static void   gimp_paint_tool_finalize       (GObject               *object);
 
+static gboolean  gimp_paint_tool_initialize  (GimpTool              *tool,
+                                              GimpDisplay           *display,
+                                              GError               **error);
 static void   gimp_paint_tool_control        (GimpTool              *tool,
                                               GimpToolAction         action,
                                               GimpDisplay           *display);
@@ -111,6 +115,7 @@ gimp_paint_tool_class_init (GimpPaintToolClass *klass)
   object_class->constructor  = gimp_paint_tool_constructor;
   object_class->finalize     = gimp_paint_tool_finalize;
 
+  tool_class->initialize     = gimp_paint_tool_initialize;
   tool_class->control        = gimp_paint_tool_control;
   tool_class->button_press   = gimp_paint_tool_button_press;
   tool_class->button_release = gimp_paint_tool_button_release;
@@ -216,6 +221,29 @@ gimp_paint_tool_enable_color_picker (GimpPaintTool     *tool,
   GIMP_COLOR_TOOL (tool)->pick_mode = mode;
 }
 
+static gboolean
+gimp_paint_tool_initialize (GimpTool     *tool,
+                            GimpDisplay  *display,
+                            GError      **error)
+{
+  GimpDrawable *drawable = gimp_image_get_active_drawable (display->image);
+
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
+
+  if (! gimp_color_tool_is_enabled (GIMP_COLOR_TOOL (tool)) &&
+      gimp_item_get_lock_content (GIMP_ITEM (drawable)))
+    {
+      g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
+			   _("The active layer's pixels are locked."));
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
 static void
 gimp_paint_tool_control (GimpTool       *tool,
                          GimpToolAction  action,
diff --git a/app/tools/gimpperspectiveclonetool.c b/app/tools/gimpperspectiveclonetool.c
index 51338bf..1235459 100644
--- a/app/tools/gimpperspectiveclonetool.c
+++ b/app/tools/gimpperspectiveclonetool.c
@@ -216,6 +216,11 @@ gimp_perspective_clone_tool_initialize (GimpTool     *tool,
 {
   GimpPerspectiveCloneTool *clone_tool = GIMP_PERSPECTIVE_CLONE_TOOL (tool);
 
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
+
   if (display != tool->display)
     {
       gint i;
diff --git a/app/tools/gimpposterizetool.c b/app/tools/gimpposterizetool.c
index 8a504cc..f75f6fc 100644
--- a/app/tools/gimpposterizetool.c
+++ b/app/tools/gimpposterizetool.c
@@ -154,7 +154,10 @@ gimp_posterize_tool_initialize (GimpTool     *tool,
 
   gimp_config_reset (GIMP_CONFIG (posterize_tool->config));
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
 
   gtk_adjustment_set_value (posterize_tool->levels_data,
                             posterize_tool->config->levels);
diff --git a/app/tools/gimpthresholdtool.c b/app/tools/gimpthresholdtool.c
index 64044aa..ba781aa 100644
--- a/app/tools/gimpthresholdtool.c
+++ b/app/tools/gimpthresholdtool.c
@@ -164,7 +164,10 @@ gimp_threshold_tool_initialize (GimpTool     *tool,
 
   gimp_config_reset (GIMP_CONFIG (t_tool->config));
 
-  GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error);
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
 
   gimp_drawable_calculate_histogram (drawable, t_tool->histogram);
   gimp_histogram_view_set_histogram (t_tool->histogram_box->view,
diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c
index 2a8adfc..5afe407 100644
--- a/app/tools/gimptransformtool.c
+++ b/app/tools/gimptransformtool.c
@@ -35,6 +35,7 @@
 #include "core/gimp.h"
 #include "core/gimpcontext.h"
 #include "core/gimpdrawable-transform.h"
+#include "core/gimperror.h"
 #include "core/gimpimage.h"
 #include "core/gimpimage-undo.h"
 #include "core/gimpimage-undo-push.h"
@@ -333,6 +334,21 @@ gimp_transform_tool_initialize (GimpTool     *tool,
                                 GError      **error)
 {
   GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tool);
+  GimpDrawable      *drawable;
+
+  drawable = gimp_image_get_active_drawable (display->image);
+
+  if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
+    {
+      return FALSE;
+    }
+
+  if (gimp_item_get_lock_content (GIMP_ITEM (drawable)))
+    {
+      g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
+			   _("The active layer's pixels are locked."));
+      return FALSE;
+    }
 
   if (display != tool->display)
     {
@@ -340,7 +356,7 @@ gimp_transform_tool_initialize (GimpTool     *tool,
 
       /*  Set the pointer to the active display  */
       tool->display  = display;
-      tool->drawable = gimp_image_get_active_drawable (display->image);
+      tool->drawable = drawable;
 
       /*  Initialize the transform tool dialog */
       if (! tr_tool->dialog)



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