[gimp] app: streamline text-tool drawing blocking/unblocking logic
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: streamline text-tool drawing blocking/unblocking logic
- Date: Wed, 12 Sep 2018 11:55:45 +0000 (UTC)
commit a03183b266f1d21cfcf254551ef20031ff325ee5
Author: Ell <ell_se yahoo com>
Date: Thu Sep 6 11:09:01 2018 -0400
app: streamline text-tool drawing blocking/unblocking logic
The various functions of the text tool currently block and unblock
drawing (through gimp_text_tool_[un]block_drawing()) implicitly,
and in a non-symmetric fashion, which makes the tool's logic rather
fragile. Instead, require blocking/unblocking to be done
symmetrically, and explicitly block/unblock drawing as necessary in
all functions.
app/tools/gimptexttool.c | 65 +++++++++++++++++++++++++++++-------------------
app/tools/gimptexttool.h | 4 +--
2 files changed, 41 insertions(+), 28 deletions(-)
---
diff --git a/app/tools/gimptexttool.c b/app/tools/gimptexttool.c
index cab776249f..b5d8874e0b 100644
--- a/app/tools/gimptexttool.c
+++ b/app/tools/gimptexttool.c
@@ -1330,9 +1330,15 @@ gimp_text_tool_layer_notify (GimpTextLayer *layer,
}
static gboolean
-gimp_text_tool_apply_idle (gpointer text_tool)
+gimp_text_tool_apply_idle (GimpTextTool *text_tool)
{
- return gimp_text_tool_apply (text_tool, TRUE);
+ text_tool->idle_id = 0;
+
+ gimp_text_tool_apply (text_tool, TRUE);
+
+ gimp_text_tool_unblock_drawing (text_tool);
+
+ return G_SOURCE_REMOVE;
}
static void
@@ -1366,6 +1372,7 @@ gimp_text_tool_proxy_notify (GimpText *text,
{
gimp_text_tool_block_drawing (text_tool);
gimp_text_tool_apply (text_tool, TRUE);
+ gimp_text_tool_unblock_drawing (text_tool);
}
gimp_text_tool_block_drawing (text_tool);
@@ -1386,18 +1393,19 @@ gimp_text_tool_proxy_notify (GimpText *text,
* including undo
*/
- gimp_text_tool_block_drawing (text_tool);
-
text_tool->pending = g_list_append (text_tool->pending,
(gpointer) pspec);
- if (text_tool->idle_id)
- g_source_remove (text_tool->idle_id);
+ if (! text_tool->idle_id)
+ {
+ gimp_text_tool_block_drawing (text_tool);
- text_tool->idle_id =
- g_idle_add_full (G_PRIORITY_LOW,
- gimp_text_tool_apply_idle, text_tool,
- NULL);
+ text_tool->idle_id =
+ g_idle_add_full (G_PRIORITY_LOW,
+ (GSourceFunc) gimp_text_tool_apply_idle,
+ text_tool,
+ NULL);
+ }
}
}
}
@@ -1461,12 +1469,16 @@ gimp_text_tool_text_notify (GimpText *text,
gimp_text_tool_buffer_begin_edit,
text_tool);
}
+
+ gimp_text_tool_unblock_drawing (text_tool);
}
static void
gimp_text_tool_text_changed (GimpText *text,
GimpTextTool *text_tool)
{
+ gimp_text_tool_block_drawing (text_tool);
+
/* we need to redraw the rectangle in any case because whatever
* changes to the text can change its size
*/
@@ -1645,8 +1657,6 @@ gimp_text_tool_create_layer (GimpTextTool *text_tool,
else
{
gimp_text_tool_frame_item (text_tool);
-
- gimp_text_tool_unblock_drawing (text_tool);
}
gimp_image_undo_group_end (image);
@@ -1654,6 +1664,8 @@ gimp_text_tool_create_layer (GimpTextTool *text_tool,
gimp_image_flush (image);
gimp_text_tool_set_drawable (text_tool, GIMP_DRAWABLE (layer), FALSE);
+
+ gimp_text_tool_unblock_drawing (text_tool);
}
#define RESPONSE_NEW 1
@@ -1880,24 +1892,25 @@ gimp_text_tool_set_drawable (GimpTextTool *text_tool,
static void
gimp_text_tool_block_drawing (GimpTextTool *text_tool)
{
- if (! text_tool->drawing_blocked)
+ if (text_tool->drawing_blocked == 0)
{
gimp_draw_tool_pause (GIMP_DRAW_TOOL (text_tool));
gimp_text_tool_clear_layout (text_tool);
-
- text_tool->drawing_blocked = TRUE;
}
+
+ text_tool->drawing_blocked++;
}
static void
gimp_text_tool_unblock_drawing (GimpTextTool *text_tool)
{
- g_return_if_fail (text_tool->drawing_blocked == TRUE);
+ g_return_if_fail (text_tool->drawing_blocked > 0);
- text_tool->drawing_blocked = FALSE;
+ text_tool->drawing_blocked--;
- gimp_draw_tool_resume (GIMP_DRAW_TOOL (text_tool));
+ if (text_tool->drawing_blocked == 0)
+ gimp_draw_tool_resume (GIMP_DRAW_TOOL (text_tool));
}
static void
@@ -1938,6 +1951,8 @@ gimp_text_tool_buffer_end_edit (GimpTextBuffer *buffer,
{
gimp_text_tool_create_layer (text_tool, NULL);
}
+
+ gimp_text_tool_unblock_drawing (text_tool);
}
static void
@@ -1982,7 +1997,7 @@ gimp_text_tool_ensure_layout (GimpTextTool *text_tool)
return text_tool->layout != NULL;
}
-gboolean
+void
gimp_text_tool_apply (GimpTextTool *text_tool,
gboolean push_undo)
{
@@ -1996,15 +2011,17 @@ gimp_text_tool_apply (GimpTextTool *text_tool,
{
g_source_remove (text_tool->idle_id);
text_tool->idle_id = 0;
+
+ gimp_text_tool_unblock_drawing (text_tool);
}
- g_return_val_if_fail (text_tool->text != NULL, FALSE);
- g_return_val_if_fail (text_tool->layer != NULL, FALSE);
+ g_return_if_fail (text_tool->text != NULL);
+ g_return_if_fail (text_tool->layer != NULL);
layer = text_tool->layer;
image = gimp_item_get_image (GIMP_ITEM (layer));
- g_return_val_if_fail (layer->text == text_tool->text, FALSE);
+ g_return_if_fail (layer->text == text_tool->text);
/* Walk over the list of changes and figure out if we are changing
* a single property or need to push a full text undo.
@@ -2083,10 +2100,6 @@ gimp_text_tool_apply (GimpTextTool *text_tool,
gimp_text_tool_frame_item (text_tool);
gimp_image_flush (image);
-
- gimp_text_tool_unblock_drawing (text_tool);
-
- return FALSE;
}
gboolean
diff --git a/app/tools/gimptexttool.h b/app/tools/gimptexttool.h
index b463524440..b939d1856b 100644
--- a/app/tools/gimptexttool.h
+++ b/app/tools/gimptexttool.h
@@ -62,7 +62,7 @@ struct _GimpTextTool
gboolean text_box_fixed;
GimpTextLayout *layout;
- gboolean drawing_blocked;
+ gint drawing_blocked;
GimpToolWidget *widget;
GimpToolWidget *grab_widget;
@@ -125,7 +125,7 @@ GimpTextDirection
/* only for the text editor */
void gimp_text_tool_clear_layout (GimpTextTool *text_tool);
gboolean gimp_text_tool_ensure_layout (GimpTextTool *text_tool);
-gboolean gimp_text_tool_apply (GimpTextTool *text_tool,
+void gimp_text_tool_apply (GimpTextTool *text_tool,
gboolean push_undo);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]