editor: add support for invoke_action

Call invoke_action request when a currently composed word is clicked.

Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
dev
Jan Arne Petersen 12 years ago committed by Kristian Høgsberg
parent adfedc1965
commit 3489ba9c21
  1. 52
      clients/editor.c

@ -633,6 +633,36 @@ text_entry_set_preedit(struct text_entry *entry,
widget_schedule_redraw(entry->widget); 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 static void
text_entry_set_cursor_position(struct text_entry *entry, text_entry_set_cursor_position(struct text_entry *entry,
int32_t x, int32_t y) 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); 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); text_entry_update_layout(entry);
widget_schedule_redraw(entry->widget); widget_schedule_redraw(entry->widget);
@ -817,19 +842,26 @@ text_entry_button_handler(struct widget *widget,
struct rectangle allocation; struct rectangle allocation;
struct editor *editor; struct editor *editor;
int32_t x, y; int32_t x, y;
uint32_t result;
widget_get_allocation(entry->widget, &allocation); widget_get_allocation(entry->widget, &allocation);
input_get_position(input, &x, &y); 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); 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) { if (button != BTN_LEFT) {
return; return;
} }
text_entry_set_cursor_position(entry, text_entry_set_cursor_position(entry, x, y);
x - allocation.x - text_offset_left,
y - allocation.y - text_offset_left);
if (state == WL_POINTER_BUTTON_STATE_PRESSED) { if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
struct wl_seat *seat = input_get_seat(input); struct wl_seat *seat = input_get_seat(input);
@ -837,9 +869,7 @@ text_entry_button_handler(struct widget *widget,
text_entry_activate(entry, seat); text_entry_activate(entry, seat);
editor->active_entry = entry; editor->active_entry = entry;
text_entry_set_anchor_position(entry, text_entry_set_anchor_position(entry, x, y);
x - allocation.x - text_offset_left,
y - allocation.y - text_offset_left);
widget_set_motion_handler(entry->widget, text_entry_motion_handler); widget_set_motion_handler(entry->widget, text_entry_motion_handler);
} else { } else {

Loading…
Cancel
Save