[Librem-5-dev] [PATCH v3] Add more opinionated keyboard layout

Drew DeVault sir at cmpwn.com
Fri Feb 22 07:55:35 PST 2019


More useful for use on sway
---
 clients/keyboard.c | 54 ++++++++++++++++++++++++++++------------------
 1 file changed, 33 insertions(+), 21 deletions(-)

diff --git a/clients/keyboard.c b/clients/keyboard.c
index 076c0322..8bce8964 100644
--- a/clients/keyboard.c
+++ b/clients/keyboard.c
@@ -98,6 +98,7 @@ enum key_modifier_type {
     modifier_shift = 1,
     modifier_capslock = 2,
     modifier_ctrl = 4,
+    modifier_logo = 64,
     modifier_altgr = 128,
 };
 
@@ -114,6 +115,8 @@ enum key_type {
     keytype_arrow_right,
     keytype_arrow_down,
     keytype_ctrl,
+    keytype_logo,
+    keytype_esc,
 };
 
 struct key {
@@ -165,7 +168,7 @@ static const struct key normal_keys[] = {
     { keytype_default, "j", "J", "(", NULL, KEY_J, 1},
     { keytype_default, "k", "K", ")", NULL, KEY_K, 1},
     { keytype_default, "l", "L", "~", NULL, KEY_L, 1},
-    { keytype_enter, "↵", "↵", "↵", NULL, 0, 2},
+    { keytype_enter, "↵", "↵", "↵", NULL, KEY_ENTER, 2},
 
     { keytype_caps, "ABC", "abc", "ABC", NULL, 0, 2},
     { keytype_default, "z", "Z", "/", NULL, KEY_Z, 1},
@@ -177,15 +180,16 @@ static const struct key normal_keys[] = {
     { keytype_default, "m", "M", "!", NULL, KEY_M, 1},
     { keytype_default, ",", ",", "\\", NULL, KEY_COMMA, 1},
     { keytype_default, ".", ".", "|", NULL, KEY_DOT, 1},
-    { keytype_caps, "ABC", "abc", "ABC", NULL, 0, 1},
+    { keytype_esc, "esc", "esc", "esc", NULL, KEY_ESC, 1},
 
-    { keytype_altgr, "123", "123", "abc", NULL, 0, 1},
-    { keytype_space, "", "", "", NULL, 0, 5},
+    { keytype_ctrl, "Ctrl", "Ctrl", "Ctrl", NULL, 0, 2},
+    { keytype_logo, "Logo", "Logo", "Logo", NULL, 0, 2},
+    { keytype_space, "", "", "", NULL, 0, 3},
     { keytype_arrow_up, "↑", "↑", "↑", NULL, 0, 1},
     { keytype_arrow_left, "←", "←", "←", NULL, 0, 1},
     { keytype_arrow_right, "→", "→", "→", NULL, 0, 1},
     { keytype_arrow_down, "↓", "↓", "↓", NULL, 0, 1},
-    { keytype_ctrl, "Ctrl", "Ctrl", "Ctrl", NULL, 0, 2}
+    { keytype_altgr, "123", "123", "abc", NULL, 0, 1},
 };
 
 static const struct key polish_keys[] = {
@@ -211,7 +215,7 @@ static const struct key polish_keys[] = {
     { keytype_default, "j", "J", ")", "}", KEY_J, 1},
     { keytype_default, "k", "K", "ó", "Ó", KEY_K, 1},
     { keytype_default, "l", "L", "ł", "Ł", KEY_L, 1},
-    { keytype_enter, "↵", "↵", "↵", NULL, 0, 2},
+    { keytype_enter, "↵", "↵", "↵", NULL, KEY_ENTER, 2},
 
     { keytype_caps, "ABC", "abc", "abc", NULL, 0, 2},
     { keytype_default, "z", "Z", "ż", "Ż", KEY_Z, 1},
@@ -248,7 +252,7 @@ static const struct key numeric_keys[] = {
     { keytype_backspace, "<--", "<--", "<--", NULL, 0, 2},
 
     { keytype_space, "", "", "", NULL, 0, 4},
-    { keytype_enter, "Enter", "Enter", "Enter", NULL, 0, 2},
+    { keytype_enter, "Enter", "Enter", "Enter", NULL, KEY_ENTER, 2},
     { keytype_arrow_up, "/\\", "/\\", "/\\", NULL, 0, 1},
     { keytype_arrow_left, "<", "<", "<", NULL, 0, 1},
     { keytype_arrow_right, ">", ">", ">", NULL, 0, 1},
@@ -280,7 +284,7 @@ static const struct key arabic_keys[] = {
     { keytype_default, "م", "/", "*", NULL, 0,  1},
     { keytype_default, "ك", ":", "_", NULL, 0,  1},
     { keytype_default, "د", "\"", "+", NULL, 0,  1},
-    { keytype_enter, "Enter", "Enter", "Enter", NULL, 0, 2},
+    { keytype_enter, "Enter", "Enter", "Enter", NULL, KEY_ENTER, 2},
 
     { keytype_caps, "Shift", "Base", "Shift", NULL, 0, 2},
     { keytype_default, "ئ", "~", ")", NULL, 0,  1},
@@ -369,6 +373,7 @@ struct keyboard {
 
     enum keyboard_state state;
     bool ctrl_on;
+    bool logo_on;
 
     uint32_t scale; // output scale
     double width; // width in output units
@@ -440,7 +445,8 @@ draw_key(struct keyboard *keyboard, const struct key *key, cairo_t *cr,
                     key->width * key_width, key_height);
     cairo_clip(cr);
 
-    if (key->key_type == keytype_ctrl && keyboard->ctrl_on) {
+    if ((key->key_type == keytype_ctrl && keyboard->ctrl_on) ||
+            (key->key_type == keytype_logo && keyboard->logo_on)) {
         cairo_rectangle(cr,
                         col * key_width, row * key_height,
                         key->width * key_width, key_height);
@@ -677,6 +683,7 @@ append(char *s1, const char *s2)
 
 static void keyboard_update_mods(struct keyboard *keyboard) {
     unsigned mods = keyboard->ctrl_on ? modifier_ctrl : modifier_none;
+    mods |= keyboard->logo_on ? modifier_logo : modifier_none;
     unsigned locked = 0;
     switch(keyboard->state) {
     case KEYBOARD_STATE_DEFAULT:
@@ -717,7 +724,9 @@ keyboard_handle_key(struct keyboard *keyboard, const struct layout *layout,
 
     switch (key->key_type) {
     case keytype_default:
-        if (!keyboard->keyboard->current.active || keyboard->ctrl_on) {
+        if (!keyboard->keyboard->current.active
+                || keyboard->ctrl_on
+                || keyboard->logo_on) {
             zwp_virtual_keyboard_v1_key(keyboard->keyboard->virtual_keyboard,
                                         time, key->keycode, key_state);
             break;
@@ -734,7 +743,8 @@ keyboard_handle_key(struct keyboard *keyboard, const struct layout *layout,
         if (!keyboard->keyboard->current.active
                 || (strlen(keyboard->keyboard->preedit_string) == 0
                     && strlen(keyboard->keyboard->current.surrounding_text) == 0)
-                || keyboard->ctrl_on) {
+                || keyboard->ctrl_on
+                || keyboard->logo_on) {
             zwp_virtual_keyboard_v1_key(keyboard->keyboard->virtual_keyboard,
                                         time,
                                         KEY_BACKSPACE, key_state);
@@ -751,16 +761,20 @@ keyboard_handle_key(struct keyboard *keyboard, const struct layout *layout,
             virtual_keyboard_send_preedit(keyboard->keyboard, -1);
         }
         break;
+    case keytype_tab:
+    case keytype_esc:
     case keytype_enter:
         if (state == WL_POINTER_BUTTON_STATE_PRESSED
                 && keyboard->keyboard->current.active) {
             virtual_keyboard_commit_preedit(keyboard->keyboard);
         }
         zwp_virtual_keyboard_v1_key(keyboard->keyboard->virtual_keyboard,
-                                    time, KEY_ENTER, key_state);
+                                    time, key->keycode, key_state);
         break;
     case keytype_space:
-        if (!keyboard->keyboard->current.active || keyboard->ctrl_on) {
+        if (!keyboard->keyboard->current.active
+                || keyboard->ctrl_on
+                || keyboard->logo_on) {
             zwp_virtual_keyboard_v1_key(keyboard->keyboard->virtual_keyboard,
                                         time, KEY_SPACE, key_state);
             break;
@@ -818,14 +832,6 @@ keyboard_handle_key(struct keyboard *keyboard, const struct layout *layout,
         }
         keyboard_update_mods(keyboard);
         break;
-    case keytype_tab:
-        if (state != WL_POINTER_BUTTON_STATE_PRESSED
-                && keyboard->keyboard->current.active) {
-            virtual_keyboard_commit_preedit(keyboard->keyboard);
-        }
-        zwp_virtual_keyboard_v1_key(keyboard->keyboard->virtual_keyboard,
-                                    time, KEY_TAB, key_state);
-        break;
     case keytype_arrow_up:
         if (state != WL_POINTER_BUTTON_STATE_PRESSED
                 && keyboard->keyboard->current.active) {
@@ -865,6 +871,12 @@ keyboard_handle_key(struct keyboard *keyboard, const struct layout *layout,
         keyboard->ctrl_on ^= true;
         keyboard_update_mods(keyboard);
         break;
+    case keytype_logo:
+        if (state != WL_POINTER_BUTTON_STATE_PRESSED)
+            break;
+        keyboard->logo_on ^= true;
+        keyboard_update_mods(keyboard);
+        break;
     default:
         dbg("Keytype invalid\n");
     }
-- 
2.20.1



More information about the Librem-5-dev mailing list