[PATCH weston] editor: unify key handling
Weng Xuetian
wengxt at gmail.com
Wed Mar 1 01:29:51 UTC 2017
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 <wengxt at gmail.com>
> ---
> 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
More information about the wayland-devel
mailing list