From: Jan Arne Petersen <jpeter...@openismus.com>

Call invoke_action request when a currently composed word is clicked.

Signed-off-by: Jan Arne Petersen <jpeter...@openismus.com>
---
 clients/editor.c | 52 +++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 41 insertions(+), 11 deletions(-)

diff --git a/clients/editor.c b/clients/editor.c
index e32a639..76847e2 100644
--- a/clients/editor.c
+++ b/clients/editor.c
@@ -633,6 +633,36 @@ text_entry_set_preedit(struct text_entry *entry,
        widget_schedule_redraw(entry->widget);
 }
 
+static uint32_t
+text_entry_try_invoke_preedit_action(struct text_entry *entry,
+                                    int32_t x, int32_t y,
+                                    uint32_t button,
+                                    enum wl_pointer_button_state state)
+{
+       int index, trailing;
+       uint32_t cursor;
+
+       if (!entry->preedit.text)
+               return 0;
+
+       pango_layout_xy_to_index(entry->layout,
+                                x * PANGO_SCALE, y * PANGO_SCALE,
+                                &index, &trailing);
+       cursor = index + trailing;
+
+       if (cursor < entry->cursor ||
+           cursor > entry->cursor + strlen(entry->preedit.text)) {
+               return 0;
+       }
+
+       if (state == WL_POINTER_BUTTON_STATE_PRESSED)
+               text_model_invoke_action(entry->model,
+                                        button,
+                                        cursor - entry->cursor);
+
+       return 1;
+}
+
 static void
 text_entry_set_cursor_position(struct text_entry *entry,
                               int32_t x, int32_t y)
@@ -650,11 +680,6 @@ text_entry_set_cursor_position(struct text_entry *entry,
 
        text_model_reset(entry->model, entry->serial);
 
-       if (entry->preedit.cursor > 0 &&
-           entry->cursor >= (uint32_t)entry->preedit.cursor) {
-               entry->cursor -= entry->preedit.cursor;
-       }
-
        text_entry_update_layout(entry);
 
        widget_schedule_redraw(entry->widget);
@@ -817,19 +842,26 @@ text_entry_button_handler(struct widget *widget,
        struct rectangle allocation;
        struct editor *editor;
        int32_t x, y;
+       uint32_t result;
 
        widget_get_allocation(entry->widget, &allocation);
        input_get_position(input, &x, &y);
 
+       x -= allocation.x + text_offset_left;
+       y -= allocation.y + text_offset_left;
+
        editor = window_get_user_data(entry->window);
 
+       result = text_entry_try_invoke_preedit_action(entry, x, y, button, 
state);
+
+       if (result)
+               return;
+
        if (button != BTN_LEFT) {
                return;
        }
 
-       text_entry_set_cursor_position(entry,
-                                      x - allocation.x - text_offset_left,
-                                      y - allocation.y - text_offset_left);
+       text_entry_set_cursor_position(entry, x, y);
 
        if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
                struct wl_seat *seat = input_get_seat(input);
@@ -837,9 +869,7 @@ text_entry_button_handler(struct widget *widget,
                text_entry_activate(entry, seat);
                editor->active_entry = entry;
 
-               text_entry_set_anchor_position(entry,
-                                              x - allocation.x - 
text_offset_left,
-                                              y - allocation.y - 
text_offset_left);
+               text_entry_set_anchor_position(entry, x, y);
 
                widget_set_motion_handler(entry->widget, 
text_entry_motion_handler);
        } else {
-- 
1.7.11.7

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to