summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYevgen Muntyan <muntyan@tamu.edu>2007-06-28 06:30:21 +0000
committerYevgen Muntyan <muntyan@src.gnome.org>2007-06-28 06:30:21 +0000
commit55ac5cd7d9cc4d44b3f60437fc60e45881c1a7a2 (patch)
tree8f9b8ad76564a049370bcf1e0effbe60ba4cd2a2
parent60782920e2a499710f9e829aa7ebd3ea45944856 (diff)
downloadgtk+-55ac5cd7d9cc4d44b3f60437fc60e45881c1a7a2.tar.gz
do right thing in one-character lines and at paragraph end (#448313).
2007-06-28 Yevgen Muntyan <muntyan@tamu.edu> * gtk/gtktextutil.c (_gtk_text_util_get_block_cursor_location): do right thing in one-character lines and at paragraph end (#448313). * configure.in: require pango-1.17.3 to get fixed pango_layout_index_to_line_x() (pango #448342). svn path=/trunk/; revision=18273
-rw-r--r--ChangeLog8
-rw-r--r--configure.in2
-rw-r--r--gtk/gtktextutil.c53
3 files changed, 35 insertions, 28 deletions
diff --git a/ChangeLog b/ChangeLog
index 195b0c43a3..d530463109 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-06-28 Yevgen Muntyan <muntyan@tamu.edu>
+
+ * gtk/gtktextutil.c (_gtk_text_util_get_block_cursor_location):
+ do right thing in one-character lines and at paragraph end (#448313).
+
+ * configure.in: require pango-1.17.3 to get fixed pango_layout_index_to_line_x()
+ (pango #448342).
+
2007-06-27 Johan Dahlin <jdahlin@async.com.br>
* gtk/gtkbuilderparser.c (parse_property): Use
diff --git a/configure.in b/configure.in
index d03f9dfb67..27cdb5f03a 100644
--- a/configure.in
+++ b/configure.in
@@ -32,7 +32,7 @@ m4_define([gtk_binary_version], [2.10.0])
# required versions of other packages
m4_define([glib_required_version], [2.13.5])
-m4_define([pango_required_version], [1.15.3])
+m4_define([pango_required_version], [1.17.3])
m4_define([atk_required_version], [1.9.0])
m4_define([cairo_required_version], [1.2.0])
diff --git a/gtk/gtktextutil.c b/gtk/gtktextutil.c
index f601e2f9bd..dbeb4086f7 100644
--- a/gtk/gtktextutil.c
+++ b/gtk/gtktextutil.c
@@ -387,7 +387,9 @@ layout_get_char_width (PangoLayout *layout)
* _gtk_text_util_get_block_cursor_location
* @layout: a #PangoLayout
* @index: index at which cursor is located
- * @rect: cursor location
+ * @pos: cursor location
+ * @at_line_end: whether cursor i sdrawn at line end, not over some
+ * character
*
* Returns: whether cursor should actually be drawn as a rectangle.
* It may not be the case if character at index is invisible.
@@ -402,6 +404,7 @@ _gtk_text_util_get_block_cursor_location (PangoLayout *layout,
PangoLayoutLine *layout_line;
gboolean rtl;
gint line_no;
+ const gchar *text;
g_return_val_if_fail (layout != NULL, FALSE);
g_return_val_if_fail (index >= 0, FALSE);
@@ -423,23 +426,23 @@ _gtk_text_util_get_block_cursor_location (PangoLayout *layout,
}
pango_layout_index_to_line_x (layout, index, FALSE, &line_no, NULL);
- g_return_val_if_fail (line_no >= 0, FALSE);
layout_line = pango_layout_get_line_readonly (layout, line_no);
-
- /* end of layout, get last line */
- if (!layout_line)
- {
- line_no -= 1;
- layout_line = pango_layout_get_line_readonly (layout, line_no);
- }
-
g_return_val_if_fail (layout_line != NULL, FALSE);
+ text = pango_layout_get_text (layout);
+
if (index < layout_line->start_index + layout_line->length)
{
- /* cursor points to some zero-width character, do not
- * bother with block cursor */
- return FALSE;
+ /* this may be a zero-width character in the middle of the line,
+ * or it could be a character where line is wrapped, we do want
+ * block cursor in latter case */
+ if (g_utf8_next_char (text + index) - text !=
+ layout_line->start_index + layout_line->length)
+ {
+ /* zero-width character in the middle of the line, do not
+ * bother with block cursor */
+ return FALSE;
+ }
}
/* Cursor is at the line end. It may be an empty line, or it could
@@ -459,23 +462,19 @@ _gtk_text_util_get_block_cursor_location (PangoLayout *layout,
* pixel of the layout line, so we need to correct it for RTL text. */
if (layout_line->length)
{
- gint left, right;
- const gchar *text;
- const gchar *p;
-
- text = pango_layout_get_text (layout);
- p = g_utf8_prev_char (text + index);
-
- pango_layout_line_index_to_x (layout_line, p - text, FALSE, &left);
- pango_layout_line_index_to_x (layout_line, p - text, TRUE, &right);
-
- if (MIN (left, right) <= 0)
+ if (layout_line->resolved_dir == PANGO_DIRECTION_RTL)
{
- /* last character is on the left, RTL */
-
PangoLayoutIter *iter;
PangoRectangle line_rect;
gint i;
+ gint left, right;
+ const gchar *p;
+
+ p = g_utf8_prev_char (text + index);
+
+ pango_layout_line_index_to_x (layout_line, p - text, FALSE, &left);
+ pango_layout_line_index_to_x (layout_line, p - text, TRUE, &right);
+ pos->x = MIN (left, right);
iter = pango_layout_get_iter (layout);
for (i = 0; i < line_no; i++)
@@ -484,7 +483,7 @@ _gtk_text_util_get_block_cursor_location (PangoLayout *layout,
pango_layout_iter_free (iter);
rtl = TRUE;
- pos->x = MIN (left, right) + line_rect.x;
+ pos->x += line_rect.x;
}
else
rtl = FALSE;