From 2e476c6548218905632c13bf970e918919997c1c Mon Sep 17 00:00:00 2001 From: Maarten van Gompel Date: Fri, 25 Aug 2023 15:58:35 +0200 Subject: [PATCH] Made 'full' and 'simple' layouts less prone to mistyping and improved layout switching - The full layout now squashes less keys in a row, to accomplish this the semicolon/colon, equal/plus and alt keys had to be sacrificed from the full layout (they're on the special/symbols layout still). - The half-keys in the simple layout are removed, giving a bit more space. - The default total keyboard height has been slightly enlarged (10px) - The compose key moved down, it was too close to the 'a' (accidental presses). The tab key moved to the top-right. - The spacing between the buttons is slightly larger (aesthetic only) - The key for layer switching is now labelled more consistently with an icon, and indicates direction of switching with an arrow - An extra "index" layout was added that can be activated by pressing Compose + the next/prev layout button. It has a key for each layout, even those not specified at start. This special layout does not appear in the normal layer cycling. - The "Abc" key on secondary layers returns to the last alphabetical layout - The compose layouts automatically hide when the user presses the space where there are no keys, no need to explicitly press the "Abc" key. --- README.md | 4 +- keyboard.c | 107 +++++++++++++++++++------- keyboard.h | 8 +- layout.mobintl.h | 195 ++++++++++++++++++++++++++--------------------- main.c | 10 ++- 5 files changed, 204 insertions(+), 120 deletions(-) diff --git a/README.md b/README.md index 6da5702..5345bd4 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ new features. - Custom color schemes - Proper font drawing - Intuitive layouts - - International layouts (cyrillic, arabic) + - International layouts (cyrillic, arabic, persian, greek, georgian) - Support for 'Copy' keys which are not on the keymap - Emoji support - Compose key for character variants (e.g. diacritics) @@ -55,7 +55,7 @@ the resulting binary will be `wvkbd-yourlayout` Run `wvkbd-mobintl` (or the binary for your custom layout set). -You can switch between the layouts/layers of the keyboard by pressing the Abc/Sym key in the bottom-left. If you only +You can switch between the layouts/layers of the keyboard by pressing the little keyboard key in the bottom-left. If you only want a subset of the available layers, you can define which wants you want and in what order you want to cycle through them using the `-l` parameter. This takes takes a ordered comma separated list of layout names that are defined in your layout set. diff --git a/keyboard.c b/keyboard.c index bde1127..f7121cb 100644 --- a/keyboard.c +++ b/keyboard.c @@ -1,5 +1,6 @@ #include "proto/virtual-keyboard-unstable-v1-client-protocol.h" #include +#include #include #include #include "keyboard.h" @@ -19,11 +20,16 @@ #include KEYMAP void -kbd_switch_layout(struct kbd *kb, struct layout *l) { +kbd_switch_layout(struct kbd *kb, struct layout *l, size_t layer_index) { kb->prevlayout = kb->layout; + if ((kb->layer_index != kb->last_abc_index) && (kb->layout->abc)) { + kb->last_abc_layout = kb->layout; + kb->last_abc_index = kb->layer_index; + } + kb->layer_index = layer_index; kb->layout = l; if (kb->debug) - fprintf(stderr, "Switching to layout %s)\n", kb->layout->name); + fprintf(stderr, "Switching to layout %s, layer_index %ld\n", kb->layout->name, layer_index); if ((!kb->prevlayout) || (strcmp(kb->prevlayout->keymap_name, kb->layout->keymap_name) != 0)) { fprintf(stderr, "Switching to keymap %s\n", kb->layout->keymap_name); @@ -98,6 +104,7 @@ kbd_init(struct kbd *kb, struct layout *layouts, fprintf(stderr, "Found %d layouts\n", i); kb->layer_index = 0; + kb->last_abc_index = 0; if (layer_names_list) kb->layers = kbd_init_layers(layer_names_list); @@ -119,7 +126,7 @@ kbd_init(struct kbd *kb, struct layout *layouts, } kb->layout = &kb->layouts[layer]; - kb->prevlayout = kb->layout; + kb->last_abc_layout = &kb->layouts[layer]; /* upload keymap */ create_and_upload_keymap(kb, kb->layout->keymap_name, 0, 0); @@ -183,6 +190,16 @@ kbd_get_key(struct kbd *kb, uint32_t x, uint32_t y) { return NULL; } +size_t +kbd_get_layer_index(struct kbd *kb, struct layout *l) { + for (size_t i = 0; i < NumLayouts - 1; i++) { + if (l == &kb->layouts[i]) { + return i; + } + } + return 0; +} + void kbd_unpress_key(struct kbd *kb, uint32_t time) { bool unlatch_shift = false; @@ -205,7 +222,7 @@ kbd_unpress_key(struct kbd *kb, uint32_t time) { if (kb->compose >= 2) { kb->compose = 0; - kbd_switch_layout(kb, kb->prevlayout); + kbd_switch_layout(kb, kb->prevlayout, kb->last_abc_index); } else if (unlatch_shift) { kbd_draw_layout(kb); } else { @@ -257,13 +274,22 @@ kbd_motion_key(struct kbd *kb, uint32_t time, uint32_t x, uint32_t y) { void kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) { - if ((kb->compose == 1) && (k->type != Compose) && (k->type != Mod) && - (k->type != NextLayer) && (k->layout)) { - kb->compose++; - if (kb->debug) - fprintf(stderr, "showing compose %d\n", kb->compose); - kbd_switch_layout(kb, k->layout); - return; + if ((kb->compose == 1) && (k->type != Compose) && (k->type != Mod)) { + if ((k->type == NextLayer) || (k->type == BackLayer) || ((k->type == Code) && (k->code == KEY_SPACE))) { + kb->compose = 0; + if (kb->debug) + fprintf(stderr, "showing layout index\n"); + kbd_switch_layout(kb, &kb->layouts[Index], 0); + return; + } else if (k->layout) { + kb->compose++; + if (kb->debug) + fprintf(stderr, "showing compose %d\n", kb->compose); + kbd_switch_layout(kb, k->layout, kbd_get_layer_index(kb, k->layout)); + return; + } else { + return; + } } switch (k->type) { @@ -304,7 +330,14 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) { break; case Layout: // switch to the layout determined by the key - kbd_switch_layout(kb, k->layout); + kbd_switch_layout(kb, k->layout, kbd_get_layer_index(kb, k->layout)); + //reset previous layout to default/first so we don't get any weird cycles + kb->last_abc_index = 0; + if (kb->landscape) { + kb->last_abc_layout = &kb->layouts[kb->landscape_layers[0]]; + } else { + kb->last_abc_layout = &kb->layouts[kb->layers[0]]; + } break; case Compose: // switch to the associated layout determined by the *next* keypress @@ -319,15 +352,16 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) { kbd_draw_key(kb, k, Unpress); } break; - case NextLayer: + case NextLayer: //(also handles previous layer when shift modifier is on, or "first layer" with other modifiers) + size_t layer_index = kb->layer_index; if ((kb->mods & Ctrl) || (kb->mods & Alt) || (kb->mods & AltGr) || ((bool)kb->compose)) { // with modifiers: switch to the first layer - kb->layer_index = 0; + layer_index = 0; kb->mods = 0; } else if ((kb->mods & Shift) || (kb->mods & CapsLock)) { // with modifiers: switch to the previous layout in the layer sequence - if (kb->layer_index > 0) { - kb->layer_index--; + if (layer_index > 0) { + layer_index--; } else { size_t layercount = 0; for (size_t i = 0; layercount == 0; i++) { @@ -337,37 +371,46 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) { if (kb->layers[i] == NumLayouts) layercount = i; } } - kb->layer_index = layercount - 1; + layer_index = layercount - 1; } kb->mods = 0; } else { // normal behaviour: switch to the next layout in the layer sequence - kb->layer_index++; + layer_index++; } enum layout_id layer; if (kb->landscape) { - layer = kb->landscape_layers[kb->layer_index]; + layer = kb->landscape_layers[layer_index]; } else { - layer = kb->layers[kb->layer_index]; + layer = kb->layers[layer_index]; } if (layer == NumLayouts) { - kb->layer_index = 0; + layer_index = 0; if (kb->landscape) { - layer = kb->landscape_layers[kb->layer_index]; + layer = kb->landscape_layers[layer_index]; } else { - layer = kb->layers[kb->layer_index]; + layer = kb->layers[layer_index]; } } if ((bool)kb->compose) { kb->compose = 0; kbd_draw_key(kb, k, Unpress); } - kbd_switch_layout(kb, &kb->layouts[layer]); + kbd_switch_layout(kb, &kb->layouts[layer], layer_index); break; - case BackLayer: - // switch to the previously active layout - if (kb->prevlayout) - kbd_switch_layout(kb, kb->prevlayout); + case BackLayer: //triggered when "Abc" keys are pressed + // switch to the last active alphabetical layout + if (kb->last_abc_layout) { + kb->compose = 0; + kbd_switch_layout(kb, kb->last_abc_layout, kb->last_abc_index); + //reset previous layout to default/first so we don't get any weird cycles + kb->last_abc_index = 0; + if (kb->landscape) { + kb->last_abc_layout = &kb->layouts[kb->landscape_layers[0]]; + } else { + kb->last_abc_layout = &kb->layouts[kb->layers[0]]; + } + } break; case Copy: // copy code as unicode chr by setting a temporary keymap @@ -455,7 +498,7 @@ kbd_draw_layout(struct kbd *kb) { struct drwsurf *d = kb->surf; struct key *next_key = kb->layout->keys; if (kb->debug) - fprintf(stderr, "Draw layout"); + fprintf(stderr, "Draw layout\n"); drw_fill_rectangle(d, kb->scheme.bg, 0, 0, kb->w, kb->h); @@ -483,6 +526,12 @@ kbd_resize(struct kbd *kb, struct layout *layouts, uint8_t layoutcount) { drwsurf_resize(d, kb->w, kb->h, kb->scale); for (int i = 0; i < layoutcount; i++) { + if (kb->debug) { + if (layouts[i].name) + fprintf(stderr, "Initialising layout %s\n", layouts[i].name); + else + fprintf(stderr, "Initialising unnamed layout %d\n", i); + } kbd_init_layout(&layouts[i], kb->w, kb->h); } kbd_draw_layout(kb); diff --git a/keyboard.h b/keyboard.h index 89116ea..96353f9 100644 --- a/keyboard.h +++ b/keyboard.h @@ -81,6 +81,7 @@ struct layout { struct key *keys; const char *keymap_name; const char *name; + bool abc; //is this an alphabetical/abjad layout or not? (i.e. something that is a primary input layout) uint32_t keyheight; // absolute height (pixels) }; @@ -99,8 +100,10 @@ struct kbd { uint8_t compose; struct key *last_press; struct key *last_swipe; - struct layout *prevlayout; + struct layout *prevlayout; //the previous layout, needed to keep track of keymap changes size_t layer_index; + struct layout *last_abc_layout; //the last alphabetical layout to fall back to (may be further away than prevlayout) + size_t last_abc_index; //the layer index of the last alphabetical layout struct layout *layouts; enum layout_id *layers; @@ -119,6 +122,7 @@ void kbd_init(struct kbd *kb, struct layout *layouts, char *layer_names_list, char *landscape_layer_names_list); void kbd_init_layout(struct layout *l, uint32_t width, uint32_t height); struct key *kbd_get_key(struct kbd *kb, uint32_t x, uint32_t y); +size_t kbd_get_layer_index(struct kbd *kb, struct layout *l); void kbd_unpress_key(struct kbd *kb, uint32_t time); void kbd_release_key(struct kbd *kb, uint32_t time); void kbd_motion_key(struct kbd *kb, uint32_t time, uint32_t x, uint32_t y); @@ -129,7 +133,7 @@ void kbd_draw_layout(struct kbd *kb); void kbd_resize(struct kbd *kb, struct layout *layouts, uint8_t layoutcount); uint8_t kbd_get_rows(struct layout *l); double kbd_get_row_length(struct key *k); -void kbd_switch_layout(struct kbd *kb, struct layout *l); +void kbd_switch_layout(struct kbd *kb, struct layout *l, size_t layer_index); void create_and_upload_keymap(struct kbd *kb, const char *name, uint32_t comp_unichr, uint32_t comp_shift_unichr); diff --git a/layout.mobintl.h b/layout.mobintl.h index 9a48420..7f74a8a 100644 --- a/layout.mobintl.h +++ b/layout.mobintl.h @@ -1,12 +1,12 @@ /* constants */ /* how tall the keyboard should be by default (can be overriden) */ -#define KBD_PIXEL_HEIGHT 240 +#define KBD_PIXEL_HEIGHT 250 /* how tall the keyboard should be by default (can be overriden) */ #define KBD_PIXEL_LANDSCAPE_HEIGHT 120 /* spacing around each key */ -#define KBD_KEY_BORDER 1 +#define KBD_KEY_BORDER 2 /* layout declarations */ enum layout_id { @@ -55,13 +55,14 @@ enum layout_id { ComposeCyrI, ComposeCyrJ, ComposeCyrE, - ComposeCyrU, ComposeCyrL, + ComposeCyrU, ComposeCyrN, ComposeCyrTse, ComposeCyrChe, ComposeCyrG, ComposeCyrK, + Index, NumLayouts, }; @@ -78,24 +79,25 @@ static struct key keys_full[], keys_special[], keys_specialpad[], keys_simple[], keys_compose_cyr_i[], keys_compose_cyr_j[], keys_compose_cyr_e[], keys_compose_cyr_u[], keys_compose_cyr_l[], keys_compose_cyr_n[], keys_compose_cyr_tse[], keys_compose_cyr_che[], keys_compose_cyr_g[], - keys_compose_cyr_k[], keys_dialer[]; + keys_compose_cyr_k[], keys_dialer[], keys_index[]; static struct layout layouts[NumLayouts] = { - [Full] = {keys_full, "latin", "full"}, // second parameter is the keymap name + [Full] = {keys_full, "latin", "full", true}, // second parameter is the keymap name // third parameter is the layout name - [Special] = {keys_special, "latin", "special"}, - [SpecialPad] = {keys_specialpad, "latin", "specialpad"}, - [Simple] = {keys_simple, "latin", "simple"}, - [SimpleGrid] = {keys_simplegrid, "latin", "simplegrid"}, - [Cyrillic] = {keys_cyrillic, "cyrillic", "cyrillic"}, - [Dialer] = {keys_dialer, "latin", "dialer"}, - [Arabic] = {keys_arabic, "arabic", "arabic"}, - [Georgian] = {keys_georgian, "georgian", "georgian"}, - [Persian] = {keys_persian, "persian", "persian"}, - [Greek] = {keys_greek, "greek", "greek"}, - [Emoji] = {keys_emoji, "latin", "emoji"}, - [Nav] = {keys_nav, "latin", "nav"}, - [Landscape] = {keys_landscape, "latin", "landscape"}, + // last parameter indicates if it's an alphabetical/primary layout + [Special] = {keys_special, "latin", "special", false}, + [SpecialPad] = {keys_specialpad, "latin", "specialpad", false}, + [Simple] = {keys_simple, "latin", "simple", true}, + [SimpleGrid] = {keys_simplegrid, "latin", "simplegrid", true}, + [Cyrillic] = {keys_cyrillic, "cyrillic", "cyrillic", true}, + [Dialer] = {keys_dialer, "latin", "dialer", false}, + [Arabic] = {keys_arabic, "arabic", "arabic", true}, + [Georgian] = {keys_georgian, "georgian", "georgian", true}, + [Persian] = {keys_persian, "persian", "persian", true}, + [Greek] = {keys_greek, "greek", "greek", true}, + [Emoji] = {keys_emoji, "latin", "emoji", false}, + [Nav] = {keys_nav, "latin", "nav", false}, + [Landscape] = {keys_landscape, "latin", "landscape", true}, [ComposeA] = {keys_compose_a, "latin"}, [ComposeE] = {keys_compose_e, "latin"}, [ComposeY] = {keys_compose_y, "latin"}, @@ -134,6 +136,8 @@ static struct layout layouts[NumLayouts] = { [ComposeCyrChe] = {keys_compose_cyr_che, "cyrillic"}, [ComposeCyrG] = {keys_compose_cyr_g, "cyrillic"}, [ComposeCyrK] = {keys_compose_cyr_k, "cyrillic"}, + + [Index] = {keys_index,"latin","index", false}, }; /* key layouts @@ -167,14 +171,14 @@ static struct layout layouts[NumLayouts] = { static struct key keys_full[] = { {"Esc", "Esc", 1.0, Code, KEY_ESC, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, - {"Tab", "Tab", 1.0, Code, KEY_TAB, .scheme = 1}, {"↑", "↑", 1.0, Code, KEY_UP, .scheme = 1}, {"↓", "↓", 1.0, Code, KEY_DOWN, .scheme = 1}, {"←", "←", 1.0, Code, KEY_LEFT, .scheme = 1}, {"→", "→", 1.0, Code, KEY_RIGHT, .scheme = 1}, - {"'", "\"", 1.0, Code, KEY_APOSTROPHE, .scheme = 1}, - {";", ":", 1.0, Code, KEY_SEMICOLON, .scheme = 1}, - {"/", ">", 1.0, Code, KEY_SLASH, .scheme = 1}, + {"'", "\"", 1.0, Code, KEY_APOSTROPHE }, + {"-", "_", 1.0, Code, KEY_MINUS }, + {"/", ">", 1.0, Code, KEY_SLASH }, + {"Tab", "Tab", 1.0, Code, KEY_TAB, .scheme = 1}, {"", "", 0.0, EndRow}, {"1", "!", 1.0, Code, KEY_1}, @@ -187,11 +191,8 @@ static struct key keys_full[] = { {"8", "*", 1.0, Code, KEY_8}, {"9", "(", 1.0, Code, KEY_9}, {"0", ")", 1.0, Code, KEY_0}, - {"-", "_", 1.0, Code, KEY_MINUS}, - {"=", "+", 1.0, Code, KEY_EQUAL}, {"", "", 0.0, EndRow}, - {"", "", 0.5, Pad}, {"q", "Q", 1.0, Code, KEY_Q, &layouts[Emoji]}, {"w", "W", 1.0, Code, KEY_W, &layouts[ComposeW]}, {"e", "E", 1.0, Code, KEY_E, &layouts[ComposeE]}, @@ -204,7 +205,7 @@ static struct key keys_full[] = { {"p", "P", 1.0, Code, KEY_P, &layouts[ComposeP]}, {"", "", 0.0, EndRow}, - {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, + {"", "", 0.5, Pad}, {"a", "A", 1.0, Code, KEY_A, &layouts[ComposeA]}, {"s", "S", 1.0, Code, KEY_S, &layouts[ComposeS]}, {"d", "D", 1.0, Code, KEY_D, &layouts[ComposeD]}, @@ -228,12 +229,12 @@ static struct key keys_full[] = { {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Sym", "Sym", 1.0, NextLayer, .scheme = 1}, - {"Alt", "Alt", 1.0, Mod, Alt, .scheme = 1}, + {"⌨→", "←⌨", 1.5, NextLayer, .scheme = 1}, + {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, {".", "?", 1.0, Code, KEY_DOT}, - {"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1}, + {"Enter", "Enter", 1.5, Code, KEY_ENTER, .scheme = 1}, /* end of layout */ {"", "", 0.0, Last}, @@ -241,8 +242,7 @@ static struct key keys_full[] = { static struct key keys_special[] = { {"Esc", "Esc", 1.0, Code, KEY_ESC, .scheme = 1}, - {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, - {"Tab", "Tab", 1.0, Code, KEY_TAB, .scheme = 1}, + {"Alt", "Alt", 1.0, Mod, Alt, .scheme = 1}, {"↑", "↑", 1.0, Code, KEY_UP, .scheme = 1}, {"↓", "↓", 1.0, Code, KEY_DOWN, .scheme = 1}, {"←", "←", 1.0, Code, KEY_LEFT, .scheme = 1}, @@ -265,7 +265,7 @@ static struct key keys_special[] = { {"0", ")", 1.0, Code, KEY_0}, {"", "", 0.0, EndRow}, - {"Caps", "Caps", 1.0, Mod, CapsLock, .scheme = 1}, + {"CpL", "CpL", 1.0, Mod, CapsLock, .scheme = 1}, {"Sup", "Sup", 1.0, Mod, Super, .scheme = 1}, {"`", "~", 1.0, Code, KEY_GRAVE}, {"'", "\"", 1.0, Code, KEY_APOSTROPHE}, @@ -288,8 +288,8 @@ static struct key keys_special[] = { {"⌫", "⌫", 1.0, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, NextLayer, .scheme = 1}, - {"Alt", "Alt", 1.0, Mod, Alt, .scheme = 1}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, {".", "?", 1.0, Code, KEY_DOT}, @@ -335,7 +335,7 @@ static struct key keys_specialpad[] = { {"⌫", "⌫", 1.0, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {"Alt", "Alt", 1.0, Mod, Alt, .scheme = 1}, {"Sup", "Sup", 1.0, Mod, Super, .scheme = 1}, @@ -352,7 +352,6 @@ static struct key keys_specialpad[] = { }; static struct key keys_simple[] = { - {"↹", "↹", 0.5, Code, KEY_TAB, .scheme = 1}, {"q", "Q", 1.0, Code, KEY_Q, &layouts[Emoji]}, {"w", "W", 1.0, Code, KEY_W, &layouts[ComposeW]}, {"e", "E", 1.0, Code, KEY_E, &layouts[ComposeE]}, @@ -365,7 +364,7 @@ static struct key keys_simple[] = { {"p", "P", 1.0, Code, KEY_P, &layouts[ComposeP]}, {"", "", 0.0, EndRow}, - {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, + {"", "", 0.5, Pad}, {"a", "A", 1.0, Code, KEY_A, &layouts[ComposeA]}, {"s", "S", 1.0, Code, KEY_S, &layouts[ComposeS]}, {"d", "D", 1.0, Code, KEY_D, &layouts[ComposeD]}, @@ -375,7 +374,7 @@ static struct key keys_simple[] = { {"j", "J", 1.0, Code, KEY_J, &layouts[ComposeJ]}, {"k", "K", 1.0, Code, KEY_K, &layouts[ComposeK]}, {"l", "L", 1.0, Code, KEY_L, &layouts[ComposeL]}, - {"'", "\"", 0.5, Code, KEY_APOSTROPHE, &layouts[ComposeBracket]}, + {"", "", 0.5, Pad}, {"", "", 0.0, EndRow}, {"⇧", "⇫", 1.5, Mod, Shift, .scheme = 1}, @@ -389,13 +388,14 @@ static struct key keys_simple[] = { {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, + {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, - {",", "'", 1.0, Code, KEY_COMMA, &layouts[ComposeMath]}, - {"-", "_", 1.0, Code, KEY_MINUS, &layouts[ComposeMath]}, + {"-", "_", 0.75, Code, KEY_MINUS, &layouts[ComposeMath]}, + {",", "'", 0.75, Code, KEY_COMMA, &layouts[ComposeMath]}, {"", "", 3.0, Code, KEY_SPACE}, {".", "?", 1.0, Code, KEY_DOT, &layouts[ComposePunctuation]}, - {"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1}, + {"Enter", "Enter", 1.5, Code, KEY_ENTER, .scheme = 1}, /* end of layout */ {"", "", 0.0, Last}, @@ -422,7 +422,7 @@ static struct key keys_dialer[] = { {"0", "0", 1.0, Code, KEY_0}, {"#", "#", 1.0, Code, KEY_3, 0, Shift}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1}, /* end of layout */ @@ -466,7 +466,7 @@ static struct key keys_simplegrid[] = { {"⌫", "⌫", 1.0, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {"-", "_", 1.0, Code, KEY_MINUS, &layouts[ComposeMath]}, {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, @@ -533,7 +533,7 @@ static struct key keys_cyrillic[] = { {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -597,7 +597,7 @@ static struct key keys_arabic[] = { {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {"⇧", "⇫", 1.0, Mod, Shift, .scheme = 1}, {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, {"", "", 5.0, Code, KEY_SPACE}, @@ -657,7 +657,7 @@ static struct key keys_georgian[] = { {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {"⇧", "⇫", 1.0, Mod, Shift, .scheme = 1}, {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, {"", "", 5.0, Code, KEY_SPACE}, @@ -722,7 +722,7 @@ static struct key keys_persian[] = { {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, {".", "،", 1.0, Code, KEY_DOT}, {"", "", 4.0, Code, KEY_SPACE}, @@ -785,7 +785,7 @@ static struct key keys_greek[] = { {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.5, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.5, NextLayer, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 5, Code, KEY_SPACE}, {".", "\"", 1.0, Code, KEY_DOT}, @@ -993,6 +993,7 @@ static struct key keys_emoji[] = { {"⌫", "⌫", 1.0, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {"👆", "👊", 1.0, Copy, 0x1f446, 0, 0x1f44a}, {"👇", "👌", 1.0, Copy, 0x1f447, 0, 0x1f44c}, {"👈", "👏", 1.0, Copy, 0x1f448, 0, 0x1f44f}, @@ -1000,7 +1001,7 @@ static struct key keys_emoji[] = { {"👋", "🙌", 1.0, Copy, 0x1f44b, 0, 0x1f64c}, {"👍", "✅", 1.0, Copy, 0x1f44d, 0, 0x2705}, {"👎", "💪", 1.0, Copy, 0x1f44e, 0, 0x1f4aa}, - {"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1}, + {"Enter", "Enter", 1.0, Code, KEY_ENTER, .scheme = 1}, {"", "", 0.0, Last}, }; @@ -1017,13 +1018,35 @@ static struct key keys_nav[] = { {"→", "→", 1.0, Code, KEY_RIGHT, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Sym", "Sym", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, {"", "", 1.0, Code, KEY_SPACE, .scheme = 1}, {"↓", "↓", 1.0, Code, KEY_DOWN, .scheme = 1}, {"⇊", "⇊", 1.0, Code, KEY_PAGEDOWN, .scheme = 1}, {"", "", 0.0, Last}, }; +static struct key keys_index[] = { + {"Full", "Full", 1.0, Layout, 0, &layouts[Full]}, + {"Landscape", "Landscape", 1.5, Layout, 0, &layouts[Landscape]}, + {"Simple", "Simple", 1.0, Layout, 0, &layouts[Simple]}, + {"SimpleG", "SimpleG", 1.0, Layout, 0, &layouts[SimpleGrid]}, + {"", "", 0.0, EndRow}, + + {"Symbols", "Symbols", 2.0, Layout, 0, &layouts[Special]}, + {"SpecPad", "SpecPad", 1.5, Layout, 0, &layouts[SpecialPad]}, + {"Nav", "Nav", 1.0, Layout, 0, &layouts[Nav]}, + {"123", "123", 1.0, Layout, 0, &layouts[Dialer]}, + {"🙂", "🙂", 1.0, Layout, 0, &layouts[Emoji]}, + {"", "", 0.0, EndRow}, + + {"Абв", "Абв", 1.0, Layout, 0, &layouts[Cyrillic]}, + {"αβγ", "αβγ", 1.0, Layout, 0, &layouts[Greek]}, + {"ابج", "ابج", 1.0, Layout, 0, &layouts[Arabic]}, + {"فر", "فر", 1.0, Layout, 0, &layouts[Persian]}, + {"აბგ", "აბგ", 1.0, Layout, 0, &layouts[Georgian]}, + {"", "", 0.0, Last}, +}; + static struct key keys_landscape[] = { {"Esc", "Esc", 1.0, Code, KEY_ESC, .scheme = 1}, {"q", "Q", 1.0, Code, KEY_Q, &layouts[Emoji]}, @@ -1041,7 +1064,8 @@ static struct key keys_landscape[] = { {"Tab", "Tab", 0.75, Code, KEY_TAB, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Cmp", "Cmp", 1.5, Compose, .scheme = 1}, + {"AGr", "AGr", 1.0, Mod, AltGr, .scheme = 1}, + {"", "", 0.5, Pad, .scheme = 1}, {"a", "A", 1.0, Code, KEY_A, &layouts[ComposeA]}, {"s", "S", 1.0, Code, KEY_S, &layouts[ComposeS]}, {"d", "D", 1.0, Code, KEY_D, &layouts[ComposeD]}, @@ -1070,13 +1094,12 @@ static struct key keys_landscape[] = { {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Sym", "Sym", 1.0, NextLayer, .scheme = 1}, + {"⌨→", "←⌨", 1.0, NextLayer, .scheme = 1}, + {"Cmp", "Cmp", 1.0, Compose, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, - {"Alt", "Alt", 0.5, Mod, Alt, .scheme = 1}, {",", "'", 0.5, Code, KEY_COMMA, &layouts[ComposeMath]}, {"", "", 3.0, Code, KEY_SPACE}, {".", "?", 1.0, Code, KEY_DOT, &layouts[ComposeMath]}, - {"Agr", "AGr", 1.0, Mod, AltGr, .scheme = 1}, {"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1}, /* end of layout */ @@ -1092,7 +1115,7 @@ static struct key keys_compose_w[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1114,7 +1137,7 @@ static struct key keys_compose_r[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1138,7 +1161,7 @@ static struct key keys_compose_t[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1157,7 +1180,7 @@ static struct key keys_compose_p[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1182,7 +1205,7 @@ static struct key keys_compose_s[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1204,7 +1227,7 @@ static struct key keys_compose_d[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1223,7 +1246,7 @@ static struct key keys_compose_f[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1244,7 +1267,7 @@ static struct key keys_compose_g[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1265,7 +1288,7 @@ static struct key keys_compose_h[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1284,7 +1307,7 @@ static struct key keys_compose_j[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1305,7 +1328,7 @@ static struct key keys_compose_k[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1327,7 +1350,7 @@ static struct key keys_compose_l[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1349,7 +1372,7 @@ static struct key keys_compose_z[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1369,7 +1392,7 @@ static struct key keys_compose_x[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1393,7 +1416,7 @@ static struct key keys_compose_c[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1411,7 +1434,7 @@ static struct key keys_compose_v[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1430,7 +1453,7 @@ static struct key keys_compose_b[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1473,7 +1496,7 @@ static struct key keys_compose_m[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1492,7 +1515,7 @@ static struct key keys_compose_cyr_i[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1510,7 +1533,7 @@ static struct key keys_compose_cyr_j[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1528,7 +1551,7 @@ static struct key keys_compose_cyr_e[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1546,7 +1569,7 @@ static struct key keys_compose_cyr_u[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1564,7 +1587,7 @@ static struct key keys_compose_cyr_l[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1582,7 +1605,7 @@ static struct key keys_compose_cyr_n[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1601,7 +1624,7 @@ static struct key keys_compose_cyr_che[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1620,7 +1643,7 @@ static struct key keys_compose_cyr_tse[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1638,7 +1661,7 @@ static struct key keys_compose_cyr_g[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1656,7 +1679,7 @@ static struct key keys_compose_cyr_k[] = { {"", "", 7, Pad}, {"⌫", "⌫", 1.5, Code, KEY_BACKSPACE, .scheme = 1}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Абв", "Абв", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_EQUAL}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1688,7 +1711,7 @@ static struct key keys_compose_math[] = { {"—", "—", 1, Copy, 0x2014, 0, 0x2014}, {"", "", 2, Pad}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {"-", "-", 1, Code, KEY_MINUS}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1721,7 +1744,7 @@ static struct key keys_compose_punctuation[] = { {"·", "·", 1, Copy, 0x2027, 0, 0x2027}, {"", "", 1, Pad}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA, &layouts[ComposeMath]}, {"", "", 4.0, Code, KEY_SPACE}, @@ -1747,7 +1770,7 @@ static struct key keys_compose_bracket[] = { {"⇧", "⇫", 2, Mod, Shift, .scheme = 1}, {"", "", 8, Pad}, {"", "", 0.0, EndRow}, - {"Abc", "Abc", 1.0, BackLayer}, + {"Abc", "Abc", 1.0, BackLayer, .scheme = 1}, {"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1}, {",", "'", 1.0, Code, KEY_COMMA, &layouts[ComposeMath]}, {"", "", 4.0, Code, KEY_SPACE}, diff --git a/main.c b/main.c index 1b461fc..04a62f5 100644 --- a/main.c +++ b/main.c @@ -173,6 +173,9 @@ wl_touch_down(void *data, struct wl_touch *wl_touch, uint32_t serial, next_key = kbd_get_key(&keyboard, touch_x, touch_y); if (next_key) { kbd_press_key(&keyboard, next_key, time); + } else if (keyboard.compose) { + keyboard.compose = 0; + kbd_switch_layout(&keyboard, keyboard.prevlayout, keyboard.last_abc_index); } } @@ -245,6 +248,9 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, next_key = kbd_get_key(&keyboard, cur_x, cur_y); if (next_key) { kbd_press_key(&keyboard, next_key, time); + } else if (keyboard.compose) { + keyboard.compose = 0; + kbd_switch_layout(&keyboard, keyboard.prevlayout, keyboard.last_abc_index); } } } @@ -301,8 +307,10 @@ display_handle_geometry(void *data, struct wl_output *wl_output, int x, int y, } keyboard.layout = &keyboard.layouts[layer]; - keyboard.prevlayout = keyboard.layout; keyboard.layer_index = 0; + keyboard.prevlayout = keyboard.layout; + keyboard.last_abc_layout = keyboard.layout; + keyboard.last_abc_index = 0; if (layer_surface) { zwlr_layer_surface_v1_set_size(layer_surface, 0, height);