[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