[PATCH weston] editor: unify key handling

Weng Xuetian wengxt at gmail.com
Wed Feb 1 03:22:16 UTC 2017


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
-- 
2.10.0



More information about the wayland-devel mailing list