<div dir="ltr"><div>Hi folks,</div><div> </div><div>I recently played with weston's virtual keyboard which has the following shortcomings :</div><div> </div><div>- pressing "123?" (symbols keys) doesn't work ; thus you cannot send digits nor special characters with it ;</div>
<div>- arabic layout is incomplete, and thus apparently deactivated ;</div><div> </div><div>I worked a bit and came up with this result :</div><div><a href="https://www.youtube.com/watch?v=4ppmOQs6DUg">https://www.youtube.com/watch?v=4ppmOQs6DUg</a></div>
<div> </div><div>Here's what been done :</div><div>- there's now a "symbols" layout and pressing "123?" works. You can switch back to lowercase/uppercase letters directly ;</div><div>- arabic layout has been heavily reworked, and has now a "symbols" layout, too.</div>
<div> </div><div>Patch code for git master follows.</div><div>I'm pretty unsure about the arabic layout, so if someone with hands-on knowledge about arabic could review/correct it, it would be grealty appreciated !</div>
<div> </div><div>Regards,</div><div>------------</div><div>diff --git a/clients/keyboard.c b/clients/keyboard.c<br>index 6876cde..006484a 100644<br>--- a/clients/keyboard.c<br>+++ b/clients/keyboard.c<br>@@ -73,7 +73,8 @@ struct key {<br>
  enum key_type key_type;<br> <br>  char *label;<br>- char *alt;<br>+ char *uppercase;<br>+ char *symbol;<br> <br>  unsigned int width;<br> };<br>@@ -90,120 +91,119 @@ struct layout {<br> };<br> <br> static const struct key normal_keys[] = {<br>
- { keytype_default, "q", "Q", 1},<br>- { keytype_default, "w", "W", 1},<br>- { keytype_default, "e", "E", 1},<br>- { keytype_default, "r", "R", 1},<br>
- { keytype_default, "t", "T", 1},<br>- { keytype_default, "y", "Y", 1},<br>- { keytype_default, "u", "U", 1},<br>- { keytype_default, "i", "I", 1},<br>
- { keytype_default, "o", "O", 1},<br>- { keytype_default, "p", "P", 1},<br>- { keytype_backspace, "<--", "<--", 2},<br>-<br>- { keytype_tab, "->|", "->|", 1},<br>
- { keytype_default, "a", "A", 1},<br>- { keytype_default, "s", "S", 1},<br>- { keytype_default, "d", "D", 1},<br>- { keytype_default, "f", "F", 1},<br>
- { keytype_default, "g", "G", 1},<br>- { keytype_default, "h", "H", 1},<br>- { keytype_default, "j", "J", 1},<br>- { keytype_default, "k", "K", 1},<br>
- { keytype_default, "l", "L", 1},<br>- { keytype_enter, "Enter", "Enter", 2},<br>-<br>- { keytype_switch, "ABC", "abc", 2},<br>- { keytype_default, "z", "Z", 1},<br>
- { keytype_default, "x", "X", 1},<br>- { keytype_default, "c", "C", 1},<br>- { keytype_default, "v", "V", 1},<br>- { keytype_default, "b", "B", 1},<br>
- { keytype_default, "n", "N", 1},<br>- { keytype_default, "m", "M", 1},<br>- { keytype_default, ",", ",", 1},<br>- { keytype_default, ".", ".", 1},<br>
- { keytype_switch, "ABC", "abc", 1},<br>-<br>- { keytype_symbols, "?123", "?123", 1},<br>- { keytype_space, "", "", 5},<br>- { keytype_arrow_up, "/\\", "/\\", 1},<br>
- { keytype_arrow_left, "<", "<", 1},<br>- { keytype_arrow_right, ">", ">", 1},<br>- { keytype_arrow_down, "\\/", "\\/", 1},<br>- { keytype_style, "", "", 2}<br>
+ { keytype_default, "q", "Q", "1", 1},<br>+ { keytype_default, "w", "W", "2", 1},<br>+ { keytype_default, "e", "E", "3", 1},<br>+ { keytype_default, "r", "R", "4", 1},<br>
+ { keytype_default, "t", "T", "5", 1},<br>+ { keytype_default, "y", "Y", "6", 1},<br>+ { keytype_default, "u", "U", "7", 1},<br>+ { keytype_default, "i", "I", "8", 1},<br>
+ { keytype_default, "o", "O", "9", 1},<br>+ { keytype_default, "p", "P", "0", 1},<br>+ { keytype_backspace, "<--", "<--", "<--", 2},<br>
+<br>+ { keytype_tab, "->|", "->|", "->|", 1},<br>+ { keytype_default, "a", "A", "-", 1},<br>+ { keytype_default, "s", "S", "@", 1},<br>
+ { keytype_default, "d", "D", "*", 1},<br>+ { keytype_default, "f", "F", "^", 1},<br>+ { keytype_default, "g", "G", ":", 1},<br>+ { keytype_default, "h", "H", ";", 1},<br>
+ { keytype_default, "j", "J", "(", 1},<br>+ { keytype_default, "k", "K", ")", 1},<br>+ { keytype_default, "l", "L", "~", 1},<br>+ { keytype_enter, "Enter", "Enter", "Enter", 2},<br>
+<br>+ { keytype_switch, "ABC", "abc", "ABC", 2},<br>+ { keytype_default, "z", "Z", "/", 1},<br>+ { keytype_default, "x", "X", "\'", 1},<br>
+ { keytype_default, "c", "C", "\"", 1},<br>+ { keytype_default, "v", "V", "+", 1},<br>+ { keytype_default, "b", "B", "=", 1},<br>
+ { keytype_default, "n", "N", "?", 1},<br>+ { keytype_default, "m", "M", "!", 1},<br>+ { keytype_default, ",", ",", "\\", 1},<br>+ { keytype_default, ".", ".", "|", 1},<br>
+ { keytype_switch, "ABC", "abc", "ABC", 1},<br>+<br>+ { keytype_symbols, "?123", "?123", "abc", 1},<br>+ { keytype_space, "", "", "", 5},<br>
+ { keytype_arrow_up, "/\\", "/\\", "/\\", 1},<br>+ { keytype_arrow_left, "<", "<", "<", 1},<br>+ { keytype_arrow_right, ">", ">", ">", 1},<br>
+ { keytype_arrow_down, "\\/", "\\/", "\\/", 1},<br>+ { keytype_style, "", "", "", 2}<br> };<br> <br> static const struct key numeric_keys[] = {<br>- { keytype_default, "1", "1", 1},<br>
- { keytype_default, "2", "2", 1},<br>- { keytype_default, "3", "3", 1},<br>- { keytype_default, "4", "4", 1},<br>- { keytype_default, "5", "5", 1},<br>
- { keytype_default, "6", "6", 1},<br>- { keytype_default, "7", "7", 1},<br>- { keytype_default, "8", "8", 1},<br>- { keytype_default, "9", "9", 1},<br>
- { keytype_default, "0", "0", 1},<br>- { keytype_backspace, "<--", "<--", 2},<br>-<br>- { keytype_space, "", "", 4},<br>- { keytype_enter, "Enter", "Enter", 2},<br>
- { keytype_arrow_up, "/\\", "/\\", 1},<br>- { keytype_arrow_left, "<", "<", 1},<br>- { keytype_arrow_right, ">", ">", 1},<br>- { keytype_arrow_down, "\\/", "\\/", 1},<br>
- { keytype_style, "", "", 2}<br>+ { keytype_default, "1", "1", "1", 1},<br>+ { keytype_default, "2", "2", "2", 1},<br>+ { keytype_default, "3", "3", "3", 1},<br>
+ { keytype_default, "4", "4", "4", 1},<br>+ { keytype_default, "5", "5", "5", 1},<br>+ { keytype_default, "6", "6", "6", 1},<br>+ { keytype_default, "7", "7", "7", 1},<br>
+ { keytype_default, "8", "8", "8", 1},<br>+ { keytype_default, "9", "9", "9", 1},<br>+ { keytype_default, "0", "0", "0", 1},<br>+ { keytype_backspace, "<--", "<--", "<--", 2},<br>
+<br>+ { keytype_space, "", "", "", 4},<br>+ { keytype_enter, "Enter", "Enter", "Enter", 2},<br>+ { keytype_arrow_up, "/\\", "/\\", "/\\", 1},<br>
+ { keytype_arrow_left, "<", "<", "<", 1},<br>+ { keytype_arrow_right, ">", ">", ">", 1},<br>+ { keytype_arrow_down, "\\/", "\\/", "\\/", 1},<br>
+ { keytype_style, "", "", "", 2}<br> };<br> <br> static const struct key arabic_keys[] = {<br>- { keytype_default, "ض", "ض", 1},<br>- { keytype_default, "ص", "ص", 1},<br>
- { keytype_default, "ث", "ث", 1},<br>- { keytype_default, "ق", "ق", 1},<br>- { keytype_default, "ف", "ف", 1},<br>- { keytype_default, "غ", "إ", 1},<br>
- { keytype_default, "ع", "ع", 1},<br>- { keytype_default, "ه", "ه", 1},<br>- { keytype_default, "خ", "خ", 1},<br>- { keytype_default, "ح", "ح", 1},<br>
- { keytype_default, "ج", "ج", 1},<br>- { keytype_backspace, "-->", "-->", 2},<br>-<br>- { keytype_tab, "->|", "->|", 1},<br>- { keytype_default, "ش", "ش", 1},<br>
- { keytype_default, "س", "س", 1},<br>- { keytype_default, "ي", "ي", 1},<br>- { keytype_default, "ب", "ب", 1},<br>- { keytype_default, "ل", "ل", 1},<br>
- { keytype_default, "ا", "أ", 1},<br>- { keytype_default, "ت", "ت", 1},<br>- { keytype_default, "ن", "ن", 1},<br>- { keytype_default, "م", "م", 1},<br>
- { keytype_default, "ك", "ك", 1},<br>- { keytype_default, "د", "د", 1},<br>- { keytype_enter, "Enter", "Enter", 2},<br>-<br>- { keytype_switch, "ABC", "abc", 2},<br>
- { keytype_default, "ئ", "ئ", 1},<br>- { keytype_default, "ء", "ء", 1},<br>- { keytype_default, "ؤ", "ؤ", 1},<br>- { keytype_default, "ر", "ر", 1},<br>
- { keytype_default, "ى", "آ", 1},<br>- { keytype_default, "ة", "ة", 1},<br>- { keytype_default, "و", "و", 1},<br>- { keytype_default, "ز", "ز", 1},<br>
- { keytype_default, "ظ", "ظ", 1},<br>- { keytype_switch, "ABC", "abc", 2},<br>-<br>- { keytype_symbols, "؟٣٢١", "؟٣٢١", 1},<br>- { keytype_default, "ذ", "ذ", 1},<br>
- { keytype_default, "،", "،", 1},<br>- { keytype_space, "", "", 6},<br>- { keytype_default, ".", ".", 1},<br>- { keytype_default, "ط", "ط", 1},<br>
- { keytype_style, "", "", 2}<br>+ { keytype_default, "ض", "ﹶ", "۱", 1},<br>+ { keytype_default, "ص", "ﹰ", "۲", 1},<br>+ { keytype_default, "ث", "ﹸ", "۳", 1},<br>
+ { keytype_default, "ق", "ﹲ", "۴", 1},<br>+ { keytype_default, "ف", "ﻹ", "۵", 1},<br>+ { keytype_default, "غ", "ﺇ", "۶", 1},<br>+ { keytype_default, "ع", "`", "۷", 1},<br>
+ { keytype_default, "ه", "٪", "۸", 1},<br>+ { keytype_default, "خ", ">", "۹", 1},<br>+ { keytype_default, "ح", "<", "۰", 1},<br>
+ { keytype_backspace, "-->", "-->", "-->", 2},<br>+<br>+ { keytype_tab, "->|", "->|", "->|", 1},<br>+ { keytype_default, "ش", "ﹺ", "ﹼ", 1},<br>
+ { keytype_default, "س", "ﹴ", "!", 1},<br>+ { keytype_default, "ي", "[", "@", 1},<br>+ { keytype_default, "ب", "]", "#", 1},<br>+ { keytype_default, "ل", "ﻷ", "$", 1},<br>
+ { keytype_default, "ا", "أ", "%", 1},<br>+ { keytype_default, "ت", "-", "^", 1},<br>+ { keytype_default, "ن", "x", "&", 1},<br>
+ { keytype_default, "م", "/", "*", 1},<br>+ { keytype_default, "ك", ":", "_", 1},<br>+ { keytype_default, "د", "\"", "+", 1},<br>
+ { keytype_enter, "Enter", "Enter", "Enter", 2},<br>+<br>+ { keytype_switch, "Shift", "Base", "Shift", 2},<br>+ { keytype_default, "ئ", "~", ")", 1},<br>
+ { keytype_default, "ء", "°", "(", 1},<br>+ { keytype_default, "ؤ", "{", "\"", 1},<br>+ { keytype_default, "ر", "}", "\'", 1},<br>
+ { keytype_default, "ى", "ﺁ", "؟", 1},<br>+ { keytype_default, "ة", "'", "!", 1},<br>+ { keytype_default, "و", ",", ";", 1},<br>
+ { keytype_default, "ﺯ", ".", "\\", 1},<br>+ { keytype_default, "ظ", "؟", "=", 1},<br>+ { keytype_switch, "Shift", "Base", "Shift", 2},<br>
+<br>+ { keytype_symbols, "؟٣٢١", "؟٣٢١", "Base", 1},<br>+ { keytype_default, "ﻻ", "ﻵ", "|", 1},<br>+ { keytype_default, ",", "،", "،", 1},<br>
+ { keytype_space, "", "", "", 6},<br>+ { keytype_default, ".", "ذ", "]", 1},<br>+ { keytype_default, "ط", "ﺝ", "[", 1},<br>+ { keytype_style, "", "", "", 2}<br>
 };<br> <br> <br>@@ -249,8 +249,9 @@ static const double key_width = 60;<br> static const double key_height = 50;<br> <br> enum keyboard_state {<br>- keyboardstate_default,<br>- keyboardstate_uppercase<br>+ KEYBOARD_STATE_DEFAULT,<br>
+ KEYBOARD_STATE_UPPERCASE,<br>+ KEYBOARD_STATE_SYMBOLS<br> };<br> <br> struct keyboard {<br>@@ -281,10 +282,16 @@ label_from_key(struct keyboard *keyboard,<br>  if (key->key_type == keytype_style)<br>   return style_labels[keyboard->keyboard->preedit_style];<br>
 <br>- if (keyboard->state == keyboardstate_default)<br>+ switch(keyboard->state) {<br>+ case KEYBOARD_STATE_DEFAULT:<br>   return key->label;<br>- else<br>-  return key->alt;<br>+ case KEYBOARD_STATE_UPPERCASE:<br>
+  return key->uppercase;<br>+ case KEYBOARD_STATE_SYMBOLS:<br>+  return key->symbol;<br>+ }<br>+<br>+ return "";<br> }<br> <br> static void<br>@@ -521,8 +528,21 @@ append(char *s1, const char *s2)<br> static void<br>
 keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *key, struct input *input, enum wl_pointer_button_state state)<br> {<br>- const char *label = keyboard->state == keyboardstate_default ? key->label : key->alt;<br>
- xkb_mod_mask_t mod_mask = keyboard->state == keyboardstate_default ? 0 : keyboard->keyboard->keysym.shift_mask;<br>+ const char *label;<br>+<br>+ switch(keyboard->state) {<br>+ case KEYBOARD_STATE_DEFAULT :<br>
+  label = key->label;<br>+  break;<br>+ case KEYBOARD_STATE_UPPERCASE :<br>+  label = key->uppercase;<br>+  break;<br>+ case KEYBOARD_STATE_SYMBOLS :<br>+  label = key->symbol;<br>+  break;<br>+ }<br>+<br>+ xkb_mod_mask_t mod_mask = keyboard->state == KEYBOARD_STATE_DEFAULT ? 0 : keyboard->keyboard->keysym.shift_mask;<br>
  uint32_t key_state = (state == WL_POINTER_BUTTON_STATE_PRESSED) ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED;<br> <br>  switch (key->key_type) {<br>@@ -563,14 +583,32 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *<br>
   case keytype_switch:<br>    if (state != WL_POINTER_BUTTON_STATE_PRESSED)<br>     break;<br>-   if (keyboard->state == keyboardstate_default)<br>-    keyboard->state = keyboardstate_uppercase;<br>-   else<br>-    keyboard->state = keyboardstate_default;<br>
+   switch(keyboard->state) {<br>+   case KEYBOARD_STATE_DEFAULT:<br>+    keyboard->state = KEYBOARD_STATE_UPPERCASE;<br>+    break;<br>+   case KEYBOARD_STATE_UPPERCASE:<br>+    keyboard->state = KEYBOARD_STATE_DEFAULT;<br>
+    break;<br>+   case KEYBOARD_STATE_SYMBOLS:<br>+    keyboard->state = KEYBOARD_STATE_UPPERCASE;<br>+    break;<br>+   }<br>    break;<br>   case keytype_symbols:<br>    if (state != WL_POINTER_BUTTON_STATE_PRESSED)<br>
     break;<br>+   switch(keyboard->state) {<br>+   case KEYBOARD_STATE_DEFAULT:<br>+    keyboard->state = KEYBOARD_STATE_SYMBOLS;<br>+    break;<br>+   case KEYBOARD_STATE_UPPERCASE:<br>+    keyboard->state = KEYBOARD_STATE_SYMBOLS;<br>
+    break;<br>+   case KEYBOARD_STATE_SYMBOLS:<br>+    keyboard->state = KEYBOARD_STATE_DEFAULT;<br>+    break;<br>+   }<br>    break;<br>   case keytype_tab:<br>    virtual_keyboard_commit_preedit(keyboard->keyboard);<br>
@@ -821,7 +859,7 @@ input_method_activate(void *data,<br>  struct wl_array modifiers_map;<br>  const struct layout *layout;<br> <br>- keyboard->keyboard->state = keyboardstate_default;<br>+ keyboard->keyboard->state = KEYBOARD_STATE_DEFAULT;<br>
 <br>  if (keyboard->context)<br>   wl_input_method_context_destroy(keyboard->context);<br clear="all"><br>-- <br></div><div dir="ltr"><font>Regards,<br>
<br>
<i><b>Manuel BACHMANN</b><br>
Tizen Project<br>
VANNES-FR</i><br>
</font></div>
</div>