[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