[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