From 8e0dd56feb3aa6deba752aec44f8fde96ae611d7 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Thu, 14 Oct 2010 11:01:16 +0200 Subject: [PATCH] app: fix crashes by not trying to navigate on a NULL layout Add boolean return value to gimp_text_tool_ensure_layout() and check it where needed. Also fix the new VISUAL_POSITIONS navigation code yet again. --- app/tools/gimptexttool-editor.c | 37 ++++++++++++++++----------------- app/tools/gimptexttool.c | 4 +++- app/tools/gimptexttool.h | 2 +- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/app/tools/gimptexttool-editor.c b/app/tools/gimptexttool-editor.c index 025687f382..3fd8d2346b 100644 --- a/app/tools/gimptexttool-editor.c +++ b/app/tools/gimptexttool-editor.c @@ -681,45 +681,43 @@ gimp_text_tool_move_cursor (GimpTextTool *text_tool, if (! cancel_selection) { PangoLayout *layout; - gint index; - gint trailing; - index = gimp_text_buffer_get_iter_index (text_tool->buffer, - &cursor, TRUE); + if (! gimp_text_tool_ensure_layout (text_tool)) + break; layout = gimp_text_layout_get_pango_layout (text_tool->layout); while (count != 0) { + gint index; + gint trailing; gint new_index; + index = gimp_text_buffer_get_iter_index (text_tool->buffer, + &cursor, TRUE); + if (count > 0) { pango_layout_move_cursor_visually (layout, TRUE, index, 0, 1, &new_index, &trailing); count--; - - if (new_index != G_MAXINT) - index = new_index; - else - break; } else { pango_layout_move_cursor_visually (layout, TRUE, index, 0, -1, &new_index, &trailing); count++; - - if (new_index != -1) - index = new_index; - else - break; } - } - gimp_text_buffer_get_iter_at_index (text_tool->buffer, - &cursor, index, TRUE); - gtk_text_iter_forward_chars (&cursor, trailing); + if (new_index != G_MAXINT && new_index != -1) + index = new_index; + else + break; + + gimp_text_buffer_get_iter_at_index (text_tool->buffer, + &cursor, index, TRUE); + gtk_text_iter_forward_chars (&cursor, trailing); + } } break; @@ -753,7 +751,8 @@ gimp_text_tool_move_cursor (GimpTextTool *text_tool, cursor_index = gimp_text_buffer_get_iter_index (text_tool->buffer, &cursor, TRUE); - gimp_text_tool_ensure_layout (text_tool); + if (! gimp_text_tool_ensure_layout (text_tool)) + break; layout = gimp_text_layout_get_pango_layout (text_tool->layout); diff --git a/app/tools/gimptexttool.c b/app/tools/gimptexttool.c index 1d36e0aebe..c44b2b2c69 100644 --- a/app/tools/gimptexttool.c +++ b/app/tools/gimptexttool.c @@ -1740,7 +1740,7 @@ gimp_text_tool_clear_layout (GimpTextTool *text_tool) } } -void +gboolean gimp_text_tool_ensure_layout (GimpTextTool *text_tool) { if (! text_tool->layout && text_tool->text) @@ -1749,6 +1749,8 @@ gimp_text_tool_ensure_layout (GimpTextTool *text_tool) text_tool->layout = gimp_text_layout_new (text_tool->layer->text, image); } + + return text_tool->layout != NULL; } void diff --git a/app/tools/gimptexttool.h b/app/tools/gimptexttool.h index 194a426cf4..b93c29ca5e 100644 --- a/app/tools/gimptexttool.h +++ b/app/tools/gimptexttool.h @@ -118,7 +118,7 @@ void gimp_text_tool_create_vectors_warped (GimpTextTool *text_tool); /* only for the text editor */ void gimp_text_tool_clear_layout (GimpTextTool *text_tool); -void gimp_text_tool_ensure_layout (GimpTextTool *text_tool); +gboolean gimp_text_tool_ensure_layout (GimpTextTool *text_tool); #endif /* __GIMP_TEXT_TOOL_H__ */