[PATCH 1/4] editor, keyboard: Add support for arrow keys

Jan Arne Petersen jpetersen at openismus.com
Mon Sep 17 06:28:07 PDT 2012


From: Jan Arne Petersen <jpetersen at openismus.com>

Add support for arrow keys on the virtual keyboard and make it possible
to move around the cursor in the editor example.
---
 clients/editor.c   | 19 ++++++++++++++++---
 clients/keyboard.c | 32 ++++++++++++++++++++++++++++----
 2 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/clients/editor.c b/clients/editor.c
index 301cbe2..5ad1aa2 100644
--- a/clients/editor.c
+++ b/clients/editor.c
@@ -288,13 +288,12 @@ text_model_key(void *data,
                uint32_t key,
                uint32_t state)
 {
+	struct text_entry *entry = data;
 	const char *state_label;
-	const char *key_label;
+	const char *key_label = "released";
 
 	if (state == WL_KEYBOARD_KEY_STATE_PRESSED) {
 		state_label = "pressed";
-	} else {
-		state_label = "released";
 	}
 
 	switch (key) {
@@ -304,6 +303,20 @@ text_model_key(void *data,
 		case XKB_KEY_KP_Enter:
 			key_label = "Enter";
 			break;
+		case XKB_KEY_Left:
+			if (entry->cursor > 0) {
+				entry->cursor--;
+				entry->anchor = entry->cursor;
+				widget_schedule_redraw(entry->widget);
+			}
+			break;
+		case XKB_KEY_Right:
+			if (entry->cursor < strlen(entry->text)) {
+				entry->cursor++;
+				entry->anchor = entry->cursor;
+				widget_schedule_redraw(entry->widget);
+			}
+			break;
 		default:
 			key_label = "Unknown";
 	}
diff --git a/clients/keyboard.c b/clients/keyboard.c
index c90c5b2..bf0e9f0 100644
--- a/clients/keyboard.c
+++ b/clients/keyboard.c
@@ -47,7 +47,11 @@ enum key_type {
 	keytype_space,
 	keytype_switch,
 	keytype_symbols,
-	keytype_tab
+	keytype_tab,
+	keytype_arrow_up,
+	keytype_arrow_left,
+	keytype_arrow_right,
+	keytype_arrow_down
 };
 
 struct key {
@@ -96,9 +100,13 @@ static const struct key keys[] = {
 	{ keytype_default, ".", ".", 1},
 	{ keytype_switch, "ABC", "abc", 1},
 
-	{ keytype_symbols, "?123", "?123", 2},
-	{ keytype_space, "", "", 8},
-	{ keytype_symbols, "?123", "?123", 2}
+	{ keytype_symbols, "?123", "?123", 1},
+	{ keytype_space, "", "", 6},
+	{ keytype_arrow_up, "/\\", "/\\", 1},
+	{ keytype_arrow_left, "<", "<", 1},
+	{ keytype_arrow_right, ">", ">", 1},
+	{ keytype_arrow_down, "\\/", "\\/", 1},
+	{ keytype_symbols, "?123", "?123", 1}
 };
 
 static const unsigned int columns = 12;
@@ -255,6 +263,22 @@ keyboard_handle_key(struct keyboard *keyboard, const struct key *key)
 			input_method_context_key(keyboard->keyboard->context,
 						 XKB_KEY_Tab, WL_KEYBOARD_KEY_STATE_PRESSED);
 			break;
+		case keytype_arrow_up:
+			input_method_context_key(keyboard->keyboard->context,
+						 XKB_KEY_Up, WL_KEYBOARD_KEY_STATE_PRESSED);
+			break;
+		case keytype_arrow_left:
+			input_method_context_key(keyboard->keyboard->context,
+						 XKB_KEY_Left, WL_KEYBOARD_KEY_STATE_PRESSED);
+			break;
+		case keytype_arrow_right:
+			input_method_context_key(keyboard->keyboard->context,
+						 XKB_KEY_Right, WL_KEYBOARD_KEY_STATE_PRESSED);
+			break;
+		case keytype_arrow_down:
+			input_method_context_key(keyboard->keyboard->context,
+						 XKB_KEY_Down, WL_KEYBOARD_KEY_STATE_PRESSED);
+			break;
 	}
 }
 
-- 
1.7.11.4



More information about the wayland-devel mailing list