editor: Fix cursor positioning with pointer and touch
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Thu, 8 May 2014 11:55:50 +0000 (14:55 +0300)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 9 May 2014 22:32:20 +0000 (15:32 -0700)
The calculation off the vertical offset between the widget coordinates
and where the text was rendered was wrong. It was using the constant for
horizontal offset for that too.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=78411

clients/editor.c

index 3b00833..f3f6141 100644 (file)
@@ -1011,7 +1011,17 @@ text_entry_draw_cursor(struct text_entry *entry, cairo_t *cr)
        cairo_stroke(cr);
 }
 
-static const int text_offset_left = 10;
+static int
+text_offset_left(struct rectangle *allocation)
+{
+       return 10;
+}
+
+static int
+text_offset_top(struct rectangle *allocation)
+{
+       return allocation->height / 2;
+}
 
 static void
 text_entry_redraw_handler(struct widget *widget, void *data)
@@ -1048,7 +1058,9 @@ text_entry_redraw_handler(struct widget *widget, void *data)
 
        cairo_set_source_rgba(cr, 0, 0, 0, 1);
 
-       cairo_translate(cr, text_offset_left, allocation.height / 2);
+       cairo_translate(cr,
+                       text_offset_left(&allocation),
+                       text_offset_top(&allocation));
 
        if (!entry->layout)
                entry->layout = pango_cairo_create_layout(cr);
@@ -1075,6 +1087,7 @@ text_entry_motion_handler(struct widget *widget,
 {
        struct text_entry *entry = data;
        struct rectangle allocation;
+       int tx, ty;
 
        if (!entry->button_pressed) {
                return CURSOR_IBEAM;
@@ -1082,10 +1095,10 @@ text_entry_motion_handler(struct widget *widget,
 
        widget_get_allocation(entry->widget, &allocation);
 
-       text_entry_set_cursor_position(entry,
-                                      x - allocation.x - text_offset_left,
-                                      y - allocation.y - text_offset_left,
-                                      false);
+       tx = x - allocation.x - text_offset_left(&allocation);
+       ty = y - allocation.y - text_offset_top(&allocation);
+
+       text_entry_set_cursor_position(entry, tx, ty, false);
 
        return CURSOR_IBEAM;
 }
@@ -1105,8 +1118,8 @@ text_entry_button_handler(struct widget *widget,
        widget_get_allocation(entry->widget, &allocation);
        input_get_position(input, &x, &y);
 
-       x -= allocation.x + text_offset_left;
-       y -= allocation.y + text_offset_left;
+       x -= allocation.x + text_offset_left(&allocation);
+       y -= allocation.y + text_offset_top(&allocation);
 
        editor = window_get_user_data(entry->window);
 
@@ -1149,8 +1162,8 @@ text_entry_touch_handler(struct widget *widget, struct input *input,
 
        widget_get_allocation(entry->widget, &allocation);
 
-       x = tx - (allocation.x + text_offset_left);
-       y = ty - (allocation.y + text_offset_left);
+       x = tx - (allocation.x + text_offset_left(&allocation));
+       y = ty - (allocation.y + text_offset_top(&allocation));
 
        editor = window_get_user_data(entry->window);
        text_entry_activate(entry, seat);