[PATCH v2 2/3] editor: add support for invoke_action
Jan Arne Petersen
jpetersen at openismus.com
Thu Dec 6 06:35:46 PST 2012
From: Jan Arne Petersen <jpetersen at openismus.com>
Call invoke_action request when a currently composed word is clicked.
Signed-off-by: Jan Arne Petersen <jpetersen at openismus.com>
---
clients/editor.c | 52 +++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 41 insertions(+), 11 deletions(-)
diff --git a/clients/editor.c b/clients/editor.c
index 90ee4cd..462c400 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_RELEASED)
+ 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
More information about the wayland-devel
mailing list