Ping :) On Tuesday, 31 January 2017 19:22:16 PST, You wrote: > Key event from input method may send key from text_input_keysym, which > should share the same logic with real keyboard event. Right now keysym > like latin characters are not handled by text_input_keysym. > > Signed-off-by: Weng Xuetian <[email protected]> > --- > clients/editor.c | 150 > +++++++++++++++++-------------------------------------- 1 file changed, 45 > insertions(+), 105 deletions(-) > > diff --git a/clients/editor.c b/clients/editor.c > index a0cc97a..b84687b 100644 > --- a/clients/editor.c > +++ b/clients/editor.c > @@ -47,6 +47,8 @@ > struct text_entry { > struct widget *widget; > struct window *window; > + struct input *input; > + struct editor *editor; > char *text; > int active; > uint32_t cursor; > @@ -185,6 +187,11 @@ static void text_entry_get_cursor_rectangle(struct > text_entry *entry, struct rec static void text_entry_update(struct > text_entry *entry); > > static void > +handle_key(struct text_entry *entry, uint32_t time, > + uint32_t sym, enum wl_keyboard_key_state state, > + uint32_t modifiers); > + > +static void > text_input_commit_string(void *data, > struct zwp_text_input_v1 *text_input, > uint32_t serial, > @@ -395,81 +402,8 @@ text_input_keysym(void *data, > uint32_t modifiers) > { > struct text_entry *entry = data; > - const char *new_char; > - > - if (key == XKB_KEY_Left || > - key == XKB_KEY_Right) { > - if (state != WL_KEYBOARD_KEY_STATE_RELEASED) > - return; > - > - if (key == XKB_KEY_Left) > - new_char = utf8_prev_char(entry->text, entry->text + > entry->cursor); > - else > - new_char = utf8_next_char(entry->text + entry->cursor); > - > - if (new_char != NULL) { > - entry->cursor = new_char - entry->text; > - } > - > - if (!(modifiers & entry->keysym.shift_mask)) > - entry->anchor = entry->cursor; > - widget_schedule_redraw(entry->widget); > - > - return; > - } > - > - if (key == XKB_KEY_Up || > - key == XKB_KEY_Down) { > - if (state != WL_KEYBOARD_KEY_STATE_RELEASED) > - return; > - > - if (key == XKB_KEY_Up) > - move_up(entry->text, &entry->cursor); > - else > - move_down(entry->text, &entry->cursor); > - > - if (!(modifiers & entry->keysym.shift_mask)) > - entry->anchor = entry->cursor; > - widget_schedule_redraw(entry->widget); > - > - return; > - } > - > - if (key == XKB_KEY_BackSpace) { > - const char *start, *end; > - > - if (state != WL_KEYBOARD_KEY_STATE_RELEASED) > - return; > - > - text_entry_commit_and_reset(entry); > - > - start = utf8_prev_char(entry->text, entry->text + > entry->cursor); > - if (start == NULL) > - return; > - > - end = utf8_next_char(start); > - > - text_entry_delete_text(entry, > - start - entry->text, > - end - start); > - > - return; > - } > - > - if (key == XKB_KEY_Tab || > - key == XKB_KEY_KP_Enter || > - key == XKB_KEY_Return) { > - char text[16]; > - > - if (state != WL_KEYBOARD_KEY_STATE_RELEASED) > - return; > - > - xkb_keysym_to_utf8(key, text, sizeof(text)); > - > - text_entry_insert_at_cursor(entry, text, 0, 0); > > - return; > - } > + handle_key(entry, time, key, state, modifiers); > } > > static void > @@ -697,6 +631,7 @@ text_entry_create(struct editor *editor, const char > *text) > > entry->widget = widget_add_widget(editor->widget, entry); > entry->window = editor->window; > + entry->editor = editor; > entry->text = strdup(text); > entry->active = 0; > entry->cursor = strlen(text); > @@ -782,8 +717,9 @@ resize_handler(struct widget *widget, > > static void > text_entry_activate(struct text_entry *entry, > - struct wl_seat *seat) > + struct input *input) > { > + struct wl_seat *seat = input_get_seat(input); > struct wl_surface *surface = window_get_wl_surface(entry->window); > > if (entry->click_to_show && entry->active) { > @@ -795,6 +731,7 @@ text_entry_activate(struct text_entry *entry, > if (!entry->click_to_show) > zwp_text_input_v1_show_input_panel(entry->text_input); > > + entry->input = input; > zwp_text_input_v1_activate(entry->text_input, > seat, > surface); > @@ -802,8 +739,10 @@ text_entry_activate(struct text_entry *entry, > > static void > text_entry_deactivate(struct text_entry *entry, > - struct wl_seat *seat) > + struct input *input) > { > + struct wl_seat *seat = input_get_seat(input); > + entry->input = NULL; > zwp_text_input_v1_deactivate(entry->text_input, > seat); > } > @@ -1285,9 +1224,7 @@ text_entry_button_handler(struct widget *widget, > > if (state == WL_POINTER_BUTTON_STATE_PRESSED && > button == BTN_LEFT) { > - struct wl_seat *seat = input_get_seat(input); > - > - text_entry_activate(entry, seat); > + text_entry_activate(entry, input); > editor->active_entry = entry; > > text_entry_set_cursor_position(entry, x, y, true); > @@ -1300,7 +1237,6 @@ text_entry_touch_handler(struct widget *widget, struct > input *input, float tx, float ty, void *data) > { > struct text_entry *entry = data; > - struct wl_seat *seat = input_get_seat(input); > struct rectangle allocation; > struct editor *editor; > int32_t x, y; > @@ -1311,7 +1247,7 @@ text_entry_touch_handler(struct widget *widget, struct > input *input, y = ty - (allocation.y + text_offset_top(&allocation)); > > editor = window_get_user_data(entry->window); > - text_entry_activate(entry, seat); > + text_entry_activate(entry, input); > editor->active_entry = entry; > > text_entry_set_cursor_position(entry, x, y, true); > @@ -1330,10 +1266,8 @@ editor_button_handler(struct widget *widget, > } > > if (state == WL_POINTER_BUTTON_STATE_PRESSED) { > - struct wl_seat *seat = input_get_seat(input); > - > - text_entry_deactivate(editor->entry, seat); > - text_entry_deactivate(editor->editor, seat); > + text_entry_deactivate(editor->entry, input); > + text_entry_deactivate(editor->editor, input); > editor->active_entry = NULL; > } > } > @@ -1345,10 +1279,8 @@ editor_touch_handler(struct widget *widget, struct > input *input, { > struct editor *editor = data; > > - struct wl_seat *seat = input_get_seat(input); > - > - text_entry_deactivate(editor->entry, seat); > - text_entry_deactivate(editor->editor, seat); > + text_entry_deactivate(editor->entry, input); > + text_entry_deactivate(editor->editor, input); > editor->active_entry = NULL; > } > > @@ -1381,29 +1313,19 @@ handle_bound_key(struct editor *editor, > } > > static void > -key_handler(struct window *window, > - struct input *input, uint32_t time, > - uint32_t key, uint32_t sym, enum wl_keyboard_key_state state, > - void *data) > -{ > - struct editor *editor = data; > - struct text_entry *entry; > +handle_key(struct text_entry *entry, uint32_t time, > + uint32_t sym, enum wl_keyboard_key_state state, > + uint32_t modifiers) { > + struct input *input = entry->input; > const char *new_char; > char text[16]; > - uint32_t modifiers; > - > - if (!editor->active_entry) > - return; > - > - entry = editor->active_entry; > - > - if (state != WL_KEYBOARD_KEY_STATE_PRESSED) > + if (!input || state != WL_KEYBOARD_KEY_STATE_PRESSED) > return; > > modifiers = input_get_modifiers(input); > if ((modifiers & MOD_CONTROL_MASK) && > (modifiers & MOD_SHIFT_MASK) && > - handle_bound_key(editor, input, sym, time)) > + handle_bound_key(entry->editor, input, sym, time)) > return; > > switch (sym) { > @@ -1476,6 +1398,24 @@ key_handler(struct window *window, > } > > widget_schedule_redraw(entry->widget); > + > +} > + > +static void > +key_handler(struct window *window, > + struct input *input, uint32_t time, > + uint32_t key, uint32_t sym, enum wl_keyboard_key_state state, > + void *data) > +{ > + struct editor *editor = data; > + struct text_entry *entry; > + > + if (!editor->active_entry) > + return; > + > + entry = editor->active_entry; > + entry->input = input; > + handle_key(entry, time, sym, state, input_get_modifiers(input)); > } > > static void
_______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
