[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