Made the old layouts compatible with the new svkbd, re-added the old english layout that was removed, and re-added the initial sxmo layout and renamed the mobile layouts. Documentation updated accordingly. Final cleanup and fixes for the whole patch series. - svkbd - simple virtual keyboard
  HTML git clone git://git.suckless.org/svkbd
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 13d20da8efda2fc025279cf22b8b66bd0beff6c7
   DIR parent eae90f28d998af064ec163074a026a585ccb6417
  HTML Author: Maarten van Gompel <proycon@anaproy.nl>
       Date:   Sun,  2 Aug 2020 15:46:19 +0200
       
       Made the old layouts compatible with the new svkbd, re-added the old english layout that was removed, and re-added the initial sxmo layout and renamed the mobile layouts. Documentation updated accordingly. Final cleanup and fixes for the whole patch series.
       
       Diffstat:
         D README                              |      66 -------------------------------
         A README.md                           |      87 +++++++++++++++++++++++++++++++
         M config.mk                           |       2 +-
         M layout.arrows.h                     |      18 ++++++++++++++++--
         M layout.de.h                         |      18 ++++++++++++++++--
         A layout.en.h                         |      84 +++++++++++++++++++++++++++++++
         A layout.mobile-intl.h                |     522 +++++++++++++++++++++++++++++++
         A layout.mobile-plain.h               |     125 +++++++++++++++++++++++++++++++
         M layout.ru.h                         |      17 +++++++++++++++--
         M layout.sh.h                         |      17 +++++++++++++++--
         D layout.sxmo.h                       |     523 -------------------------------
         M svkbd.c                             |      10 ++++++++--
       
       12 files changed, 889 insertions(+), 600 deletions(-)
       ---
   DIR diff --git a/README b/README
       @@ -1,66 +0,0 @@
       -SVKBD
       -=====
       -
       -This is a simple virtual keyboard, intended to be used in environments,
       -where no keyboard is available.
       -
       -Installation
       -------------
       -
       -        $ make
       -        $ make install
       -
       -This will create by default `svkbd-sxmo`, which is svkbd using an versatile
       -layout with multiple layers and overlays, and optimised for mobile devices.
       -It was designed for [Simple X Mobile](https://sr.ht/~mil/Sxmo).
       -
       -You can create svkbd for additional layouts by doing:
       -
       -        $ make LAYOUT=$layout
       -
       -This will take the file `layout.$layout.h` and create `svkbd-$layout`.
       -`make install` will then pick up the new file and install it accordingly.
       -
       -Usage
       ------
       -
       -        % svkbd-sxmo
       -
       -This will open svkbd at the bottom of the screen, showing the default
       -English layout.
       -
       -        % svkbd-sxmo -d
       -
       -This tells svkbd-sxmo to announce itself being a dock window, which then
       -is managed differently between different window managers. If using dwm
       -and the dock patch, then this will make svkbd being managed by dwm and
       -some space of the screen being reserved for it.
       -
       -        % svkbd-sxmo -g 400x200+1+1
       -
       -This will start svkbd-en with a size of 400x200 and at the upper left
       -window corner.
       -
       -You can enable layers on the fly through either the ``-l`` flag or through the ``SVKBD_LAYERS`` environment variable.
       -They both take a comma separated list of layer names (as defined in your ``layout.*.h``). Use the ``↺`` button in the
       -bottom-left to cycle through all the layers.
       -
       -The virtual keyboard comes with overlays that will show when certain keys are hold pressed for a longer time. For
       -example, a long press on the ``a`` key will enable an overview showing all kinds of diacritic combinations for ``a``.
       -
       -Overlay functionality interferes with the ability to hold a key and have it outputted repeatedly.  You can disable
       -overlay functionality with the ``-O`` flag or by setting the environment variable ``SVKBD_ENABLEOVERLAYS=0``. There is
       -also a key on the function layer of the keyboard itself to enable/disable this behaviour on the fly. Its label shows
       -``≅`` when the overlay functionality is enabled and ``≇`` when not.
       -
       -Notes
       ----------
       -
       -This virtual keyboard does not actually modify the X keyboard layout, it simply relies on a standard US QWERTY layout
       -(setxkbmap us) being activated. If you use another XKB layout you will get unpredictable output that does not match the
       -labels on the virtual keycaps.
       -
       -Repository
       -----------
       -
       -        git clone http://git.suckless.org/svkbd
   DIR diff --git a/README.md b/README.md
       @@ -0,0 +1,87 @@
       +SVKBD: Simple Virtual Keyboard
       +=================================
       +
       +This is a simple virtual keyboard, intended to be used in environments,
       +where no keyboard is available.
       +
       +Installation
       +------------
       +
       +        $ make
       +        $ make install
       +
       +This will create by default `svkbd-intl`, which is svkbd using an international
       +layout with multiple layers and overlays, and optimised for mobile devices.
       +
       +You can create svkbd for additional layouts by doing:
       +
       +        $ make LAYOUT=$layout
       +
       +This will take the file `layout.$layout.h` and create `svkbd-$layout`.
       +`make install` will then pick up the new file and install it accordingly.
       +
       +Layouts
       +---------
       +
       +The following layouts are available:
       +
       +* **Mobile Layouts:**
       +    * ``mobile-intl`` - A small international layout optimised for mobile devices. This layout consists of multiple layers which
       +        can be switched on the fly, and overlays that appear on long-press of certain keys, adding input ability for
       +        diacritics and other variants, as well as some emoji. The layers are:
       +        * a basic qwerty layer
       +        * a layer for numeric input, arrows, and punctuation
       +        * a layer for function keys, media keys, and arrows
       +        * a cyrillic layer (ЙЦУКЕН)
       +        * a dialer/numeric layer
       +    * ``mobile-plain`` - This is a plain layout with only a qwerty layer and numeric/punctuation layer. It was
       +        originally made for [sxmo](https://sr.ht/~mil/Sxmo/).
       +* **Traditional layouts**:
       +    * ``en`` - An english layout without layers (QWERTY)
       +    * ``de`` - A german layout (QWERTZ)
       +    * ``ru`` - A russian layout (ЙЦУКЕН)
       +    * ``sh`` - A serbo-croatian layout using latin script (QWERTZ)
       +
       +Usage
       +-----
       +
       +        $ svkbd-mobile-intl
       +
       +This will open svkbd at the bottom of the screen, showing the default
       +international layout.
       +
       +        $ svkbd-mobile-intl -d
       +
       +This tells svkbd to announce itself being a dock window, which then
       +is managed differently between different window managers. If using dwm
       +and the dock patch, then this will make svkbd being managed by dwm and
       +some space of the screen being reserved for it.
       +
       +        $ svkbd-mobile-intl -g 400x200+1+1
       +
       +This will start svkbd-intl with a size of 400x200 and at the upper left
       +window corner.
       +
       +For layouts that consist of multiple layers, you can enable layers on program start through either the ``-l`` flag or
       +through the ``SVKBD_LAYERS`` environment variable.  They both take a comma separated list of layer names (as defined in
       +your ``layout.*.h``). Use the ``↺`` button in the bottom-left to cycle through all the layers.
       +
       +Some layouts come with overlays that will show when certain keys are hold pressed for a longer time. For
       +example, a long press on the ``a`` key will enable an overview showing all kinds of diacritic combinations for ``a``.
       +
       +Overlay functionality interferes with the ability to hold a key and have it outputted repeatedly.  You can disable
       +overlay functionality with the ``-O`` flag or by setting the environment variable ``SVKBD_ENABLEOVERLAYS=0``. There is
       +also a key on the function layer of the keyboard itself to enable/disable this behaviour on the fly. Its label shows
       +``≅`` when the overlay functionality is enabled and ``≇`` when not.
       +
       +Notes
       +---------
       +
       +This virtual keyboard does not actually modify the X keyboard layout, the ``mobile-intl``, ``mobile-plain`` and ``en`` layouts simply rely on a standard US QWERTY layout (setxkbmap us) being activated, the other layouts (``de``, ``ru``, ``sh``) require their respective XKB keymaps to be active.
       +
       +If you use another XKB layout you will get unpredictable output that does not match the labels on the virtual keycaps!
       +
       +Repository
       +----------
       +
       +        git clone https://git.suckless.org/svkbd
   DIR diff --git a/config.mk b/config.mk
       @@ -1,4 +1,4 @@
       -LAYOUT = sxmo
       +LAYOUT = mobile-intl
        
        # paths
        PREFIX = /usr/local
   DIR diff --git a/layout.arrows.h b/layout.arrows.h
       @@ -1,11 +1,11 @@
       -static Key keys[] = {
       +#define KEYS 6
       +static Key keys_arrows[] = {
                { 0, XK_Shift_L, 2 },
                { "←", XK_Left, 1 },
                { "↓", XK_Down, 1 },
                { "↑", XK_Up, 1 },
                { "→", XK_Right, 1},
                { "Alt", XK_Alt_L, 2 },
       -        { "[X]", XK_Cancel, 1 },
        };
        
        Buttonmod buttonmods[] = {
       @@ -13,3 +13,17 @@ Buttonmod buttonmods[] = {
                { XK_Alt_L, Button3 },
        };
        
       +#define OVERLAYS 1
       +static Key overlay[OVERLAYS] = {
       +                { 0, XK_Cancel },
       +};
       +
       +#define LAYERS 1
       +static char* layer_names[LAYERS] = {
       +        "arrows",
       +};
       +
       +static Key* available_layers[LAYERS] = {
       +        keys_arrows,
       +};
       +
   DIR diff --git a/layout.de.h b/layout.de.h
       @@ -1,4 +1,5 @@
       -static Key keys[] = {
       +#define KEYS 66
       +static Key keys_de[KEYS] = {
                { "^°′", XK_dead_circumflex, 1},
                { "1!¹", XK_1, 1 },
                { "2\"²", XK_2, 1 },
       @@ -65,7 +66,6 @@ static Key keys[] = {
                { "Alt Gr", XK_ISO_Level3_Shift, 2 },
                { "Menu", XK_Menu, 2 },
                { "Ctrl", XK_Control_R, 2 },
       -        { "[X]", XK_Cancel, 1},
        };
        
        Buttonmod buttonmods[] = {
       @@ -73,3 +73,17 @@ Buttonmod buttonmods[] = {
                { XK_Alt_L, Button3 },
        };
        
       +#define OVERLAYS 1
       +static Key overlay[OVERLAYS] = {
       +        { 0, XK_Cancel },
       +};
       +
       +#define LAYERS 1
       +static char* layer_names[LAYERS] = {
       +        "de",
       +};
       +
       +static Key* available_layers[LAYERS] = {
       +        keys_de,
       +};
       +
   DIR diff --git a/layout.en.h b/layout.en.h
       @@ -0,0 +1,84 @@
       +#define KEYS 61
       +static Key keys_en[] = {
       +        { "1!", XK_1, 1 },
       +        { "2@", XK_2, 1 },
       +        { "3#", XK_3, 1 },
       +        { "4$", XK_4, 1 },
       +        { "5%", XK_5, 1 },
       +        { "6^", XK_6, 1 },
       +        { "7&", XK_7, 1 },
       +        { "8*", XK_8, 1 },
       +        { "9(", XK_9, 1 },
       +        { "0)", XK_0, 1 },
       +        { "-_", XK_minus, 1 },
       +        { "=+", XK_plus, 1 },
       +        { "<-", XK_BackSpace, 2 },
       +        { 0 }, /* New row */
       +        { "->|", XK_Tab, 1 },
       +        { 0, XK_q, 1 },
       +        { 0, XK_w, 1 },
       +        { 0, XK_e, 1 },
       +        { 0, XK_r, 1 },
       +        { 0, XK_t, 1 },
       +        { 0, XK_y, 1 },
       +        { 0, XK_u, 1 },
       +        { 0, XK_i, 1 },
       +        { 0, XK_o, 1 },
       +        { 0, XK_p, 1 },
       +        { "[", XK_bracketleft, 1 },
       +        { "]", XK_bracketright, 1 },
       +        { "Return", XK_Return, 3 },
       +        { 0 }, /* New row */
       +        { 0, XK_Caps_Lock, 2 },
       +        { 0, XK_a, 1 },
       +        { 0, XK_s, 1 },
       +        { 0, XK_d, 1 },
       +        { 0, XK_f, 1 },
       +        { 0, XK_g, 1 },
       +        { 0, XK_h, 1 },
       +        { 0, XK_j, 1 },
       +        { 0, XK_k, 1 },
       +        { 0, XK_l, 1 },
       +        { ":;", XK_semicolon, 1 },
       +        { "'\"", XK_exclam, 1 },
       +        { "\\|", XK_backslash, 1 },
       +        { 0 }, /* New row */
       +        { 0, XK_Shift_L, 3 },
       +        { 0, XK_z, 1 },
       +        { 0, XK_x, 1 },
       +        { 0, XK_c, 1 },
       +        { 0, XK_v, 1 },
       +        { 0, XK_b, 1 },
       +        { 0, XK_n, 1 },
       +        { 0, XK_m, 1 },
       +        { ",", XK_colon, 1 },
       +        { ".", XK_period, 1 },
       +        { "/?", XK_slash, 1 },
       +        { 0, XK_Shift_R, 2 },
       +        { 0 }, /* New row */
       +        { "Ctrl", XK_Control_L, 2 },
       +        { "Alt", XK_Alt_L, 2 },
       +        { "", XK_space, 5 },
       +        { "Alt", XK_Alt_R, 2 },
       +        { "Ctrl", XK_Control_R, 2 },
       +};
       +
       +Buttonmod buttonmods[] = {
       +        { XK_Shift_L, Button2 },
       +        { XK_Alt_L, Button3 },
       +};
       +
       +#define OVERLAYS 1
       +static Key overlay[OVERLAYS] = {
       +        { 0, XK_Cancel },
       +};
       +
       +#define LAYERS 1
       +static char* layer_names[LAYERS] = {
       +    "en",
       +};
       +
       +static Key* available_layers[LAYERS] = {
       +    keys_en,
       +};
       +
   DIR diff --git a/layout.mobile-intl.h b/layout.mobile-intl.h
       @@ -0,0 +1,522 @@
       +#define KEYS 43
       +
       +static Key keys_en[KEYS] = {
       +        { "Esc", XK_Escape, 1 },
       +        { 0, XK_q, 1 },
       +        { 0, XK_w, 1 },
       +        { 0, XK_e, 1 },
       +        { 0, XK_r, 1 },
       +        { 0, XK_t, 1 },
       +        { 0, XK_y, 1 },
       +        { 0, XK_u, 1 },
       +        { 0, XK_i, 1 },
       +        { 0, XK_o, 1 },
       +        { 0, XK_p, 1 },
       +
       +        { 0 }, /* New row */
       +
       +        { "'\"", XK_apostrophe, 1 },
       +        { 0, XK_a, 1 },
       +        { 0, XK_s, 1 },
       +        { 0, XK_d, 1 },
       +        { 0, XK_f, 1 },
       +        { 0, XK_g, 1 },
       +        { 0, XK_h, 1 },
       +        { 0, XK_j, 1 },
       +        { 0, XK_k, 1 },
       +        { 0, XK_l, 1 },
       +        { "/?", XK_slash, 1 },
       +
       +        { 0 }, /* New row */
       +
       +        { "123", XK_Mode_switch, 1 },
       +        { 0, XK_z, 1 },
       +        { 0, XK_x, 1 },
       +        { 0, XK_c, 1 },
       +        { 0, XK_v, 1 },
       +        { 0, XK_b, 1 },
       +        { 0, XK_n, 1 },
       +        { 0, XK_m, 1 },
       +        { "Tab", XK_Tab, 1 },
       +        { "⌫Bksp", XK_BackSpace, 2 },
       +
       +        { 0 }, /* New row */
       +        { "↺", XK_Cancel, 1},
       +        { "Shift", XK_Shift_L, 2 },
       +        { "Ctrl", XK_Control_L, 1 },
       +        { "Alt", XK_Alt_L, 1 },
       +        { "", XK_space, 2 },
       +        { "↓", XK_Down, 1 },
       +        { "↑", XK_Up, 1 },
       +        { "↲ Enter", XK_Return, 2 },
       +};
       +
       +#define OVERLAYS 197
       +static Key overlay[OVERLAYS] = {
       +        { 0, XK_a }, //Overlay for a
       +        //---
       +        { "à", XK_agrave },
       +        { "á", XK_aacute },
       +        { "â", XK_acircumflex },
       +        { "ä", XK_adiaeresis },
       +        { "ą", XK_aogonek },
       +        { "ã", XK_atilde },
       +        { "ā", XK_amacron },
       +        { "ă", XK_abreve },
       +        { "å", XK_aring },
       +        { "æ", XK_ae },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //--
       +        { 0, XK_e }, //Overlay for e (first item after boundary defines the trigger)
       +        //---
       +        { "è", XK_egrave },
       +        { "é", XK_eacute },
       +        { "ê", XK_ecircumflex },
       +        { "ë", XK_ediaeresis },
       +        { "ę", XK_eogonek },
       +        { "ē", XK_emacron },
       +        { "ė", XK_eabovedot },
       +        { 0, XK_Cancel },
       +        //--
       +        { 0, XK_y }, //New overlay
       +        //---
       +        { "ỳ", XK_ygrave },
       +        { "ý", XK_yacute },
       +        { "ŷ", XK_ycircumflex },
       +        { "ÿ", XK_ydiaeresis },
       +        { 0, XK_Cancel },
       +        //--
       +        { 0, XK_u }, //New overlay
       +        //---
       +        { "ù", XK_ugrave },
       +        { "ú", XK_uacute },
       +        { "û", XK_ucircumflex },
       +        { "ü", XK_udiaeresis },
       +        { "ų", XK_uogonek },
       +        { "ū", XK_umacron },
       +        { "ů", XK_uring},
       +        { "ŭ", XK_ubreve},
       +        { "ű", XK_udoubleacute },
       +        { 0, XK_Cancel },
       +        //--
       +        { 0, XK_i }, //New overlay
       +        //---
       +        { "ì", XK_igrave },
       +        { "í", XK_iacute },
       +        { "î", XK_icircumflex },
       +        { "ï", XK_idiaeresis },
       +        { "į", XK_iogonek },
       +        { "ī", XK_imacron },
       +        { "ı", XK_idotless },
       +        { 0, XK_Cancel },
       +        //--
       +        { 0, XK_o }, //New overlay
       +        //---
       +        { "ò", XK_ograve },
       +        { "ó", XK_oacute },
       +        { "ô", XK_ocircumflex },
       +        { "ö", XK_odiaeresis },
       +        { "ǫ", XK_ogonek },
       +        { "õ", XK_otilde },
       +        { "ō", XK_omacron },
       +        { "ø", XK_oslash },
       +        { "ő", XK_odoubleacute },
       +        { "œ", XK_oe },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //--
       +        { 0, XK_d }, //New overlay
       +        //---
       +        { "ď", XK_dcaron },
       +        { "ð", XK_eth },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //--
       +        { 0, XK_c }, //New overlay
       +        //---
       +        { "ç", XK_ccedilla },
       +        { "ĉ", XK_ccircumflex },
       +        { "č", XK_ccaron },
       +        { "ć", XK_cacute },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //--
       +        { 0, XK_s }, //New overlay
       +        //---
       +        { "ş", XK_scedilla },
       +        { "ŝ", XK_scircumflex },
       +        { "š", XK_scaron },
       +        { "ś", XK_sacute },
       +        { "ß", XK_ssharp },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //---
       +        { 0, XK_z }, //New overlay
       +        //---
       +        { "ž", XK_zcaron },
       +        { "ż", XK_zabovedot },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //--
       +        { 0, XK_n }, //New overlay
       +        //---
       +        { "ñ", XK_ntilde },
       +        { "ń", XK_nacute },
       +        { "ň", XK_ncaron },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //
       +        { 0, XK_t }, //New overlay
       +        //---
       +        { "ț", XK_tcedilla },
       +        { "ť", XK_tcaron },
       +        { "þ", XK_thorn },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //----
       +        { 0, XK_g }, //New overlay
       +        //---
       +        { "ĝ", XK_gcircumflex },
       +        { "ğ", XK_gbreve },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //
       +        { 0, XK_h }, //New overlay
       +        //---
       +        { "ĥ", XK_hcircumflex },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //
       +        { 0, XK_j }, //New overlay
       +        //---
       +        { "ĵ", XK_jcircumflex },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //--
       +        { 0, XK_l }, //New overlay
       +        //---
       +        { "ł", XK_lstroke },
       +        { "ľ", XK_lcaron },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //--
       +        { 0, XK_r }, //New overlay
       +        //---
       +        { "ř", XK_rcaron },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //---
       +        { 0, XK_Cyrillic_softsign }, //New overlay
       +        //---
       +        { "ъ", XK_Cyrillic_hardsign },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //---
       +        { 0, XK_Cyrillic_ie }, //New overlay
       +        //---
       +        { "ё", XK_Cyrillic_io },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //---
       +        { 0, XK_Cyrillic_e }, //New overlay
       +        //---
       +        { "Є", XK_Ukrainian_ie },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //---
       +        { 0, XK_Cyrillic_i }, //New overlay
       +        //---
       +        { "і", XK_Ukrainian_i },
       +        { "ї", XK_Ukrainian_yi },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //---
       +        { 0, XK_Cyrillic_u }, //New overlay
       +        //---
       +        { "ў", XK_Byelorussian_shortu },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +                //---
       +        { 0, XK_Cyrillic_shorti }, //New overlay
       +        //---
       +        { "ј", XK_Cyrillic_je },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +                //---
       +        { 0, XK_Cyrillic_el }, //New overlay
       +        //---
       +        { "љ", XK_Cyrillic_lje },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +                //---
       +        { 0, XK_Cyrillic_en }, //New overlay
       +        //---
       +        { "њ", XK_Cyrillic_nje },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +                //---
       +        { 0, XK_Cyrillic_tse }, //New overlay
       +        //---
       +        { "џ", XK_Cyrillic_dzhe },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +                //---
       +        { 0, XK_Cyrillic_che }, //New overlay
       +        //---
       +        { "ћ", XK_Serbian_tshe },
       +        { "ђ", XK_Serbian_dje },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +                //---
       +        { "🙂", 0x101f642 }, //emoji overlay
       +        //---
       +        { "😀", 0x101f600 },
       +        { "😁", 0x101f601 },
       +        { "😂", 0x101f602 },
       +        { "😃", 0x101f603 },
       +        { "😄", 0x101f604 },
       +        { "😅", 0x101f605 },
       +        { "😆", 0x101f606 },
       +        { "😇", 0x101f607 },
       +        { "😈", 0x101f608 },
       +        { "😉", 0x101f609 },
       +        { "😊", 0x101f60a },
       +        { "😋", 0x101f60b },
       +        { "😌", 0x101f60c },
       +        { "😍", 0x101f60d },
       +        { "😎", 0x101f60e },
       +        { "😏", 0x101f60f },
       +        { "😐", 0x101f610 },
       +        { "😒", 0x101f612 },
       +        { "😓", 0x101f613 },
       +        { "😛", 0x101f61b },
       +        { "😮", 0x101f62e },
       +        { "😟", 0x101f61f },
       +        { "😟", 0x101f620 },
       +        { "😢", 0x101f622 },
       +        { "😭", 0x101f62d },
       +        { "😳", 0x101f633 },
       +        { "😴", 0x101f634 },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +        //--
       +                { "/?", XK_slash }, //punctuation overlay
       +                //--
       +                { "1!", XK_1, 1 },
       +                { "2@", XK_2, 1 },
       +                { "3#", XK_3, 1 },
       +                { "4$", XK_4, 1 },
       +                { "5%", XK_5, 1 },
       +                { "6^", XK_6, 1 },
       +                { "7&", XK_7, 1 },
       +                { "8*", XK_8, 1 },
       +                { "9(", XK_9, 1 },
       +                { "0)", XK_0, 1 },
       +                { "'\"", XK_apostrophe, 1 },
       +                { "`~", XK_grave, 1 },
       +                { "-_", XK_minus, 1 },
       +                { "=+", XK_plus, 1 },
       +                { "[{", XK_bracketleft, 1 },
       +                { "]}", XK_bracketright, 1 },
       +                { ",<", XK_comma, 1 },
       +                { ".>", XK_period, 1 },
       +                { "/?", XK_slash, 1 },
       +                { "\\|", XK_backslash, 1 },
       +                { "¡", XK_exclamdown, 1 },
       +                { "?", XK_questiondown, 1 },
       +                { "°", XK_degree, 1 },
       +                { "£", XK_sterling, 1 },
       +                { "€", XK_EuroSign, 1 },
       +                { "¥", XK_yen, 1 },
       +                { ";:", XK_colon, 1 },
       +        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       +};
       +
       +
       +static Key keys_symbols[KEYS] = {
       +  { "Esc", XK_Escape, 1 },
       +  { "1!", XK_1, 1 },
       +  { "2@", XK_2, 1 },
       +  { "3#", XK_3, 1 },
       +  { "4$", XK_4, 1 },
       +  { "5%", XK_5, 1 },
       +  { "6^", XK_6, 1 },
       +  { "7&", XK_7, 1 },
       +  { "8*", XK_8, 1 },
       +  { "9(", XK_9, 1 },
       +  { "0)", XK_0, 1 },
       +
       +  { 0 }, /* New row */
       +
       +  { "'\"", XK_apostrophe, 1 },
       +  { "`~", XK_grave, 1 },
       +  { "-_", XK_minus, 1 },
       +  { "=+", XK_plus, 1 },
       +  { "[{", XK_bracketleft, 1 },
       +  { "]}", XK_bracketright, 1 },
       +  { ",<", XK_comma, 1 },
       +  { ".>", XK_period, 1 },
       +  { "/?", XK_slash, 1 },
       +  { "\\|", XK_backslash, 1 },
       +  { ";:", XK_colon, 1 },
       +
       +  { 0 }, /* New row */
       +
       +  { "abc", XK_Mode_switch, 1 },
       +  { "☺", 0x101f642, 1 },
       +  { "⇤", XK_Home, 1 },
       +  { "←", XK_Left, 1 },
       +  { "→", XK_Right, 1 },
       +  { "⇥", XK_End, 1 },
       +  { "⇊", XK_Next, 1 },
       +  { "⇈", XK_Prior, 1 },
       +  { "Tab", XK_Tab, 1 },
       +  { "⌫Bksp", XK_BackSpace, 2 },
       +
       +  { 0 }, /* New row */
       +  { "↺", XK_Cancel, 1},
       +  { "Shift", XK_Shift_L, 2 },
       +  { "Ctrl", XK_Control_L, 1 },
       +  { "Alt", XK_Alt_L, 1 },
       +  { "", XK_space, 2 },
       +  { "↓", XK_Down, 1 },
       +  { "↑", XK_Up, 1 },
       +  { "↲ Enter", XK_Return, 2 },
       +};
       +
       +static Key keys_functions[KEYS] = {
       +  { "Esc", XK_Escape, 1 },
       +  { "F1", XK_F1, 1 },
       +  { "F2", XK_F2, 1 },
       +  { "F3", XK_F3, 1 },
       +  { "F4", XK_F4, 1 },
       +  { "F5", XK_F5, 1 },
       +  { "F6", XK_F6, 1 },
       +  { "F7", XK_F7, 1 },
       +  { "F8", XK_F8, 1 },
       +  { "F9", XK_F9, 1 },
       +  { "F10", XK_F10, 1 },
       +
       +  { 0 }, /* New row */
       +
       +  { "≅", XK_KP_Insert, 1 },
       +  { "▶", XF86XK_AudioPlay, 1 },
       +  { "●", XF86XK_AudioRecord, 1 },
       +  { "■", XF86XK_AudioStop, 1 },
       +  { "◂◂", XF86XK_AudioPrev, 1 },
       +  { "▸▸", XF86XK_AudioNext, 1 },
       +  { "♫M", XF86XK_AudioMute, 1 },
       +  { "♫-", XF86XK_AudioLowerVolume, 1 },
       +  { "♫+", XF86XK_AudioRaiseVolume, 1 },
       +  { "☀-", XF86XK_MonBrightnessDown, 1 },
       +  { "☀+", XF86XK_MonBrightnessUp, 1 },
       +
       +  { 0 }, /* New row */
       +
       +  { "abc", XK_Mode_switch, 1 },
       +  { "Del", XK_Delete, 1 },
       +  { "⇤", XK_Home, 1 },
       +  { "←", XK_Left, 1 },
       +  { "→", XK_Right, 1 },
       +  { "⇥", XK_End, 1 },
       +  { "⇊", XK_Next, 1 },
       +  { "⇈", XK_Prior, 1 },
       +  { "Tab", XK_Tab, 1 },
       +  { "⌫Bksp", XK_BackSpace, 2 },
       +
       +  { 0 }, /* New row */
       +  { "↺", XK_Cancel, 1},
       +  { "Shift", XK_Shift_L, 2 },
       +  { "Ctrl", XK_Control_L, 1 },
       +  { "Alt", XK_Alt_L, 1 },
       +  { "", XK_space, 2 },
       +  { "↓", XK_Down, 1 },
       +  { "↑", XK_Up, 1 },
       +  { "↲ Enter", XK_Return, 2 },
       +};
       +
       +
       +static Key keys_ru[KEYS] = {
       +        { "и", XK_Cyrillic_shorti, 1 },
       +        { "ц", XK_Cyrillic_tse, 1 },
       +        { "у", XK_Cyrillic_u, 1 },
       +        { "к", XK_Cyrillic_ka, 1 },
       +        { "е", XK_Cyrillic_ie, 1 },
       +        { "н", XK_Cyrillic_en, 1 },
       +        { "г", XK_Cyrillic_ghe, 1 },
       +        { "ш", XK_Cyrillic_sha, 1 },
       +        { "щ", XK_Cyrillic_shcha, 1 },
       +        { "з", XK_Cyrillic_ze, 1 },
       +        { "х", XK_Cyrillic_ha, 1 },
       +
       +        { 0 }, /* New row */
       +
       +        { "ф", XK_Cyrillic_ef, 1 },
       +        { "ы", XK_Cyrillic_yeru, 1 },
       +        { "в", XK_Cyrillic_ve, 1 },
       +        { "а", XK_Cyrillic_a, 1 },
       +        { "п", XK_Cyrillic_pe, 1 },
       +        { "о", XK_Cyrillic_o, 1 },
       +        { "л", XK_Cyrillic_el, 1 },
       +        { "д", XK_Cyrillic_de, 1 },
       +        { "ж", XK_Cyrillic_zhe, 1 },
       +        { "э", XK_Cyrillic_e, 1 },
       +        { "ю", XK_Cyrillic_yu, 1 },
       +
       +        { 0 }, /* New row */
       +
       +        { "123", XK_Mode_switch, 1 },
       +        { "я", XK_Cyrillic_ya, 1 },
       +        { "ч", XK_Cyrillic_che, 1 },
       +        { "с", XK_Cyrillic_es, 1 },
       +        { "м", XK_Cyrillic_em, 1 },
       +        { "и", XK_Cyrillic_i, 1 },
       +        { "т", XK_Cyrillic_te, 1 },
       +        { "ь", XK_Cyrillic_softsign, 1 },
       +        { "б", XK_Cyrillic_be, 1 },
       +        { "⌫Bksp", XK_BackSpace, 2 },
       +
       +        { 0 }, /* New row */
       +        { "↺", XK_Cancel, 1},
       +        { "Shift", XK_Shift_L, 2 },
       +        { "Ctrl", XK_Control_L, 1 },
       +        { "Alt", XK_Alt_L, 1 },
       +        { "", XK_space, 2 },
       +        { "↓", XK_Down, 1 },
       +        { "↑", XK_Up, 1 },
       +        { "↲ Enter", XK_Return, 2 },
       +};
       +
       +static Key keys_dialer[KEYS] = {
       +        { "Esc", XK_Escape, 1 },
       +        { "1!", XK_1, 1 },
       +        { "2@", XK_2, 1 },
       +        { "3#", XK_3, 1 },
       +        { "⌫Bksp", XK_BackSpace, 2 },
       +        { 0 }, /* New row */
       +
       +        { "Shift", XK_Shift_L, 1 },
       +        { "4$", XK_4, 1 },
       +        { "5%", XK_5, 1 },
       +        { "6^", XK_6, 1 },
       +        { "-_", XK_minus, 1 },
       +        { ",<", XK_comma, 1 },
       +        { 0 }, /* New row */
       +
       +        { "abc", XK_Mode_switch, 1 },
       +        { "7&", XK_7, 1 },
       +        { "8*", XK_8, 1 },
       +        { "9(", XK_9, 1 },
       +        { "=+", XK_equal, 1 },
       +        { "/?", XK_slash, 1 },
       +        { 0 }, /* New row */
       +
       +        { "↺", XK_Cancel, 1},
       +        { "", XK_space, 1 },
       +        { "0)", XK_0, 1 },
       +        { ".>", XK_period, 1 },
       +        { "↲ Enter", XK_Return, 2},
       +        { 0 }, /* New row */
       +        { 0 }, /* Last item (double 0) */
       +};
       +
       +#define LAYERS 5
       +static char* layer_names[LAYERS] = {
       +    "en",
       +    "symbols",
       +    "functions",
       +    "dialer",
       +    "ru",
       +};
       +
       +static Key* available_layers[LAYERS] = {
       +    keys_en,
       +    keys_symbols,
       +    keys_functions,
       +    keys_dialer,
       +    keys_ru
       +};
       +
       +
       +Buttonmod buttonmods[] = {
       +        { XK_Shift_L, Button2 },
       +        { XK_Alt_L, Button3 },
       +};
       +
   DIR diff --git a/layout.mobile-plain.h b/layout.mobile-plain.h
       @@ -0,0 +1,125 @@
       +#define KEYS 40
       +static Key keys_en[KEYS] = {
       +        { 0, XK_q, 1 },
       +        { 0, XK_w, 1 },
       +        { 0, XK_e, 1 },
       +        { 0, XK_r, 1 },
       +        { 0, XK_t, 1 },
       +        { 0, XK_y, 1 },
       +        { 0, XK_u, 1 },
       +        { 0, XK_i, 1 },
       +        { 0, XK_o, 1 },
       +        { 0, XK_p, 1 },
       +
       +        { 0 }, /* New row */
       +
       +        { 0, XK_a, 1 },
       +        { 0, XK_s, 1 },
       +        { 0, XK_d, 1 },
       +        { 0, XK_f, 1 },
       +        { 0, XK_g, 1 },
       +        { 0, XK_h, 1 },
       +        { 0, XK_j, 1 },
       +        { 0, XK_k, 1 },
       +        { 0, XK_l, 1 },
       +        { ";:", XK_colon, 1 },
       +        /*{ "'", XK_apostrophe, 2 },*/
       +
       +        { 0 }, /* New row */
       +
       +        { 0, XK_z, 1 },
       +        { 0, XK_x, 1 },
       +        { 0, XK_c, 1 },
       +        { 0, XK_v, 1 },
       +        { 0, XK_b, 1 },
       +        { 0, XK_n, 1 },
       +        { 0, XK_m, 1 },
       +        /*{ "/?", XK_slash, 1 },*/
       +        { "Tab", XK_Tab, 1 },
       +        { "⇍ Bksp", XK_BackSpace, 2 },
       +
       +        { 0 }, /* New row */
       +        { "↺", XK_Cancel, 1},
       +        { "Shft", XK_Shift_L, 1 },
       +        /*{ "L", XK_Left, 1 },*/
       +        { "↓", XK_Down, 1 },
       +        { "↑", XK_Up, 1 },
       +        /*{ "R", XK_Right, 1 },*/
       +        { "", XK_space, 2 },
       +        { "Esc", XK_Escape, 1 },
       +        { "Ctrl", XK_Control_L, 1 },
       +        /*{ "Alt", XK_Alt_L, 1 },*/
       +        { "↲ Enter", XK_Return, 2 },
       +};
       +
       +static Key keys_symbols[40] = {
       +  { "1!", XK_1, 1 },
       +  { "2@", XK_2, 1 },
       +  { "3#", XK_3, 1 },
       +  { "4$", XK_4, 1 },
       +  { "5%", XK_5, 1 },
       +  { "6^", XK_6, 1 },
       +  { "7&", XK_7, 1 },
       +  { "8*", XK_8, 1 },
       +  { "9(", XK_9, 1 },
       +  { "0)", XK_0, 1 },
       +
       +  { 0 }, /* New row */
       +
       +  { "'\"", XK_apostrophe, 1 },
       +  { "`~", XK_grave, 1 },
       +  { "-_", XK_minus, 1 },
       +  { "=+", XK_plus, 1 },
       +  { "[{", XK_bracketleft, 1 },
       +  { "]}", XK_bracketright, 1 },
       +  { ",<", XK_comma, 1 },
       +  { ".>", XK_period, 1 },
       +  { "/?", XK_slash, 1 },
       +  { "\\|", XK_backslash, 1 },
       +
       +  { 0 }, /* New row */
       +
       +  { "", XK_Shift_L|XK_bar, 1 },
       +  { "⇤", XK_Home, 1 },
       +  { "←", XK_Left, 1 },
       +  { "→", XK_Right, 1 },
       +  { "⇥", XK_End, 1 },
       +  { "⇊", XK_Next, 1 },
       +  { "⇈", XK_Prior, 1 },
       +  { "Tab", XK_Tab, 1 },
       +  { "⇍ Bksp", XK_BackSpace, 2 },
       +
       +  { 0 }, /* New row */
       +  { "↺", XK_Cancel, 1},
       +  { "Shft", XK_Shift_L, 1 },
       +  /*{ "L", XK_Left, 1 },*/
       +  { "↓", XK_Down, 1 },
       +  { "↑", XK_Up, 1 },
       +  /*{ "R", XK_Right, 1 },*/
       +  { "", XK_space, 2 },
       +  { "Esc", XK_Escape, 1 },
       +  { "Ctrl", XK_Control_L, 1 },
       +  /*{ "Alt", XK_Alt_L, 1 },*/
       +  { "↲ Enter", XK_Return, 2 },
       +};
       +
       +Buttonmod buttonmods[] = {
       +        { XK_Shift_L, Button2 },
       +        { XK_Alt_L, Button3 },
       +};
       +
       +#define OVERLAYS 1
       +static Key overlay[OVERLAYS] = {
       +        { 0, XK_Cancel },
       +};
       +
       +#define LAYERS 2
       +static char* layer_names[LAYERS] = {
       +    "en",
       +    "symbols",
       +};
       +
       +static Key* available_layers[LAYERS] = {
       +    keys_en,
       +    keys_symbols,
       +};
   DIR diff --git a/layout.ru.h b/layout.ru.h
       @@ -1,4 +1,5 @@
       -static Key keys[] = {
       +#define KEYS 63
       +static Key keys_ru[] = {
                { "ёЁ", XK_Cyrillic_io, 1 },
                { "1!", XK_1, 1 },
                { "2\"", XK_2, 1 },
       @@ -62,7 +63,6 @@ static Key keys[] = {
                { "", XK_space, 5 },
                { "Alt", XK_Alt_R, 2 },
                { "Ctrl", XK_Control_R, 2 },
       -        { "[X]", XK_Cancel, 1},
        };
        
        Buttonmod buttonmods[] = {
       @@ -70,3 +70,16 @@ Buttonmod buttonmods[] = {
                { XK_Alt_L, Button3 },
        };
        
       +#define OVERLAYS 1
       +static Key overlay[OVERLAYS] = {
       +        { 0, XK_Cancel },
       +};
       +
       +#define LAYERS 1
       +static char* layer_names[LAYERS] = {
       +        "ru",
       +};
       +
       +static Key* available_layers[LAYERS] = {
       +        keys_ru,
       +};
   DIR diff --git a/layout.sh.h b/layout.sh.h
       @@ -1,4 +1,5 @@
       -static Key keys[] = {
       +#define KEYS 66
       +static Key keys_sh[] = {
                { "`~", XK_quoteleft, 1},
                { "1!~", XK_1, 1 },
                { "2\"ˇ", XK_2, 1 },
       @@ -65,7 +66,6 @@ static Key keys[] = {
                { "Alt Gr", XK_ISO_Level3_Shift, 2 },
                { "Menu", XK_Menu, 2 },
                { "Ctrl", XK_Control_R, 2 },
       -        { "[X]", XK_Cancel, 1},
        };
        
        Buttonmod buttonmods[] = {
       @@ -73,3 +73,16 @@ Buttonmod buttonmods[] = {
                { XK_Alt_L, Button3 },
        };
        
       +#define OVERLAYS 1
       +static Key overlay[OVERLAYS] = {
       +        { 0, XK_Cancel },
       +};
       +
       +#define LAYERS 1
       +static char* layer_names[LAYERS] = {
       +        "sh",
       +};
       +
       +static Key* available_layers[LAYERS] = {
       +        keys_sh,
       +};
   DIR diff --git a/layout.sxmo.h b/layout.sxmo.h
       @@ -1,523 +0,0 @@
       -#define KEYS 43
       -static Key keys[KEYS] = { NULL };
       -
       -static Key keys_en[KEYS] = {
       -        { "Esc", XK_Escape, 1 },
       -        { 0, XK_q, 1 },
       -        { 0, XK_w, 1 },
       -        { 0, XK_e, 1 },
       -        { 0, XK_r, 1 },
       -        { 0, XK_t, 1 },
       -        { 0, XK_y, 1 },
       -        { 0, XK_u, 1 },
       -        { 0, XK_i, 1 },
       -        { 0, XK_o, 1 },
       -        { 0, XK_p, 1 },
       -
       -        { 0 }, /* New row */
       -
       -        { "'\"", XK_apostrophe, 1 },
       -        { 0, XK_a, 1 },
       -        { 0, XK_s, 1 },
       -        { 0, XK_d, 1 },
       -        { 0, XK_f, 1 },
       -        { 0, XK_g, 1 },
       -        { 0, XK_h, 1 },
       -        { 0, XK_j, 1 },
       -        { 0, XK_k, 1 },
       -        { 0, XK_l, 1 },
       -        { "/?", XK_slash, 1 },
       -
       -        { 0 }, /* New row */
       -
       -        { "123", XK_Mode_switch, 1 },
       -        { 0, XK_z, 1 },
       -        { 0, XK_x, 1 },
       -        { 0, XK_c, 1 },
       -        { 0, XK_v, 1 },
       -        { 0, XK_b, 1 },
       -        { 0, XK_n, 1 },
       -        { 0, XK_m, 1 },
       -        { "Tab", XK_Tab, 1 },
       -        { "⌫Bksp", XK_BackSpace, 2 },
       -
       -        { 0 }, /* New row */
       -        { "↺", XK_Cancel, 1},
       -        { "Shift", XK_Shift_L, 2 },
       -        { "Ctrl", XK_Control_L, 1 },
       -        { "Alt", XK_Alt_L, 1 },
       -        { "", XK_space, 2 },
       -        { "↓", XK_Down, 1 },
       -        { "↑", XK_Up, 1 },
       -        { "↲ Enter", XK_Return, 2 },
       -};
       -
       -#define OVERLAYS 197
       -static Key overlay[OVERLAYS] = {
       -        { 0, XK_a }, //Overlay for a
       -        //---
       -        { "à", XK_agrave },
       -        { "á", XK_aacute },
       -        { "â", XK_acircumflex },
       -        { "ä", XK_adiaeresis },
       -        { "ą", XK_aogonek },
       -        { "ã", XK_atilde },
       -        { "ā", XK_amacron },
       -        { "ă", XK_abreve },
       -        { "å", XK_aring },
       -        { "æ", XK_ae },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //--
       -        { 0, XK_e }, //Overlay for e (first item after boundary defines the trigger)
       -        //---
       -        { "è", XK_egrave },
       -        { "é", XK_eacute },
       -        { "ê", XK_ecircumflex },
       -        { "ë", XK_ediaeresis },
       -        { "ę", XK_eogonek },
       -        { "ē", XK_emacron },
       -        { "ė", XK_eabovedot },
       -        { 0, XK_Cancel },
       -        //--
       -        { 0, XK_y }, //New overlay
       -        //---
       -        { "ỳ", XK_ygrave },
       -        { "ý", XK_yacute },
       -        { "ŷ", XK_ycircumflex },
       -        { "ÿ", XK_ydiaeresis },
       -        { 0, XK_Cancel },
       -        //--
       -        { 0, XK_u }, //New overlay
       -        //---
       -        { "ù", XK_ugrave },
       -        { "ú", XK_uacute },
       -        { "û", XK_ucircumflex },
       -        { "ü", XK_udiaeresis },
       -        { "ų", XK_uogonek },
       -        { "ū", XK_umacron },
       -        { "ů", XK_uring},
       -        { "ŭ", XK_ubreve},
       -        { "ű", XK_udoubleacute },
       -        { 0, XK_Cancel },
       -        //--
       -        { 0, XK_i }, //New overlay
       -        //---
       -        { "ì", XK_igrave },
       -        { "í", XK_iacute },
       -        { "î", XK_icircumflex },
       -        { "ï", XK_idiaeresis },
       -        { "į", XK_iogonek },
       -        { "ī", XK_imacron },
       -        { "ı", XK_idotless },
       -        { 0, XK_Cancel },
       -        //--
       -        { 0, XK_o }, //New overlay
       -        //---
       -        { "ò", XK_ograve },
       -        { "ó", XK_oacute },
       -        { "ô", XK_ocircumflex },
       -        { "ö", XK_odiaeresis },
       -        { "ǫ", XK_ogonek },
       -        { "õ", XK_otilde },
       -        { "ō", XK_omacron },
       -        { "ø", XK_oslash },
       -        { "ő", XK_odoubleacute },
       -        { "œ", XK_oe },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //--
       -        { 0, XK_d }, //New overlay
       -        //---
       -        { "ď", XK_dcaron },
       -        { "ð", XK_eth },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //--
       -        { 0, XK_c }, //New overlay
       -        //---
       -        { "ç", XK_ccedilla },
       -        { "ĉ", XK_ccircumflex },
       -        { "č", XK_ccaron },
       -        { "ć", XK_cacute },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //--
       -        { 0, XK_s }, //New overlay
       -        //---
       -        { "ş", XK_scedilla },
       -        { "ŝ", XK_scircumflex },
       -        { "š", XK_scaron },
       -        { "ś", XK_sacute },
       -        { "ß", XK_ssharp },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //---
       -        { 0, XK_z }, //New overlay
       -        //---
       -        { "ž", XK_zcaron },
       -        { "ż", XK_zabovedot },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //--
       -        { 0, XK_n }, //New overlay
       -        //---
       -        { "ñ", XK_ntilde },
       -        { "ń", XK_nacute },
       -        { "ň", XK_ncaron },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //
       -        { 0, XK_t }, //New overlay
       -        //---
       -        { "ț", XK_tcedilla },
       -        { "ť", XK_tcaron },
       -        { "þ", XK_thorn },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //----
       -        { 0, XK_g }, //New overlay
       -        //---
       -        { "ĝ", XK_gcircumflex },
       -        { "ğ", XK_gbreve },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //
       -        { 0, XK_h }, //New overlay
       -        //---
       -        { "ĥ", XK_hcircumflex },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //
       -        { 0, XK_j }, //New overlay
       -        //---
       -        { "ĵ", XK_jcircumflex },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //--
       -        { 0, XK_l }, //New overlay
       -        //---
       -        { "ł", XK_lstroke },
       -        { "ľ", XK_lcaron },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //--
       -        { 0, XK_r }, //New overlay
       -        //---
       -        { "ř", XK_rcaron },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //---
       -        { 0, XK_Cyrillic_softsign }, //New overlay
       -        //---
       -        { "ъ", XK_Cyrillic_hardsign },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //---
       -        { 0, XK_Cyrillic_ie }, //New overlay
       -        //---
       -        { "ё", XK_Cyrillic_io },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //---
       -        { 0, XK_Cyrillic_e }, //New overlay
       -        //---
       -        { "Є", XK_Ukrainian_ie },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //---
       -        { 0, XK_Cyrillic_i }, //New overlay
       -        //---
       -        { "і", XK_Ukrainian_i },
       -        { "ї", XK_Ukrainian_yi },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //---
       -        { 0, XK_Cyrillic_u }, //New overlay
       -        //---
       -        { "ў", XK_Byelorussian_shortu },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -                //---
       -        { 0, XK_Cyrillic_shorti }, //New overlay
       -        //---
       -        { "ј", XK_Cyrillic_je },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -                //---
       -        { 0, XK_Cyrillic_el }, //New overlay
       -        //---
       -        { "љ", XK_Cyrillic_lje },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -                //---
       -        { 0, XK_Cyrillic_en }, //New overlay
       -        //---
       -        { "њ", XK_Cyrillic_nje },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -                //---
       -        { 0, XK_Cyrillic_tse }, //New overlay
       -        //---
       -        { "џ", XK_Cyrillic_dzhe },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -                //---
       -        { 0, XK_Cyrillic_che }, //New overlay
       -        //---
       -        { "ћ", XK_Serbian_tshe },
       -        { "ђ", XK_Serbian_dje },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -                //---
       -        { "🙂", 0x101f642 }, //emoji overlay
       -        //---
       -        { "😀", 0x101f600 },
       -        { "😁", 0x101f601 },
       -        { "😂", 0x101f602 },
       -        { "😃", 0x101f603 },
       -        { "😄", 0x101f604 },
       -        { "😅", 0x101f605 },
       -        { "😆", 0x101f606 },
       -        { "😇", 0x101f607 },
       -        { "😈", 0x101f608 },
       -        { "😉", 0x101f609 },
       -        { "😊", 0x101f60a },
       -        { "😋", 0x101f60b },
       -        { "😌", 0x101f60c },
       -        { "😍", 0x101f60d },
       -        { "😎", 0x101f60e },
       -        { "😏", 0x101f60f },
       -        { "😐", 0x101f610 },
       -        { "😒", 0x101f612 },
       -        { "😓", 0x101f613 },
       -        { "😛", 0x101f61b },
       -        { "😮", 0x101f62e },
       -        { "😟", 0x101f61f },
       -        { "😟", 0x101f620 },
       -        { "😢", 0x101f622 },
       -        { "😭", 0x101f62d },
       -        { "😳", 0x101f633 },
       -        { "😴", 0x101f634 },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -        //--
       -                { "/?", XK_slash }, //punctuation overlay
       -                //--
       -                { "1!", XK_1, 1 },
       -                { "2@", XK_2, 1 },
       -                { "3#", XK_3, 1 },
       -                { "4$", XK_4, 1 },
       -                { "5%", XK_5, 1 },
       -                { "6^", XK_6, 1 },
       -                { "7&", XK_7, 1 },
       -                { "8*", XK_8, 1 },
       -                { "9(", XK_9, 1 },
       -                { "0)", XK_0, 1 },
       -                { "'\"", XK_apostrophe, 1 },
       -                { "`~", XK_grave, 1 },
       -                { "-_", XK_minus, 1 },
       -                { "=+", XK_plus, 1 },
       -                { "[{", XK_bracketleft, 1 },
       -                { "]}", XK_bracketright, 1 },
       -                { ",<", XK_comma, 1 },
       -                { ".>", XK_period, 1 },
       -                { "/?", XK_slash, 1 },
       -                { "\\|", XK_backslash, 1 },
       -                { "¡", XK_exclamdown, 1 },
       -                { "?", XK_questiondown, 1 },
       -                { "°", XK_degree, 1 },
       -                { "£", XK_sterling, 1 },
       -                { "€", XK_EuroSign, 1 },
       -                { "¥", XK_yen, 1 },
       -                { ";:", XK_colon, 1 },
       -        { 0, XK_Cancel }, /* XK_Cancel signifies  overlay boundary */
       -};
       -
       -
       -static Key keys_symbols[KEYS] = {
       -  { "Esc", XK_Escape, 1 },
       -  { "1!", XK_1, 1 },
       -  { "2@", XK_2, 1 },
       -  { "3#", XK_3, 1 },
       -  { "4$", XK_4, 1 },
       -  { "5%", XK_5, 1 },
       -  { "6^", XK_6, 1 },
       -  { "7&", XK_7, 1 },
       -  { "8*", XK_8, 1 },
       -  { "9(", XK_9, 1 },
       -  { "0)", XK_0, 1 },
       -
       -  { 0 }, /* New row */
       -
       -  { "'\"", XK_apostrophe, 1 },
       -  { "`~", XK_grave, 1 },
       -  { "-_", XK_minus, 1 },
       -  { "=+", XK_plus, 1 },
       -  { "[{", XK_bracketleft, 1 },
       -  { "]}", XK_bracketright, 1 },
       -  { ",<", XK_comma, 1 },
       -  { ".>", XK_period, 1 },
       -  { "/?", XK_slash, 1 },
       -  { "\\|", XK_backslash, 1 },
       -  { ";:", XK_colon, 1 },
       -
       -  { 0 }, /* New row */
       -
       -  { "abc", XK_Mode_switch, 1 },
       -  { "☺", 0x101f642, 1 },
       -  { "⇤", XK_Home, 1 },
       -  { "←", XK_Left, 1 },
       -  { "→", XK_Right, 1 },
       -  { "⇥", XK_End, 1 },
       -  { "⇊", XK_Next, 1 },
       -  { "⇈", XK_Prior, 1 },
       -  { "Tab", XK_Tab, 1 },
       -  { "⌫Bksp", XK_BackSpace, 2 },
       -
       -  { 0 }, /* New row */
       -  { "↺", XK_Cancel, 1},
       -  { "Shift", XK_Shift_L, 2 },
       -  { "Ctrl", XK_Control_L, 1 },
       -  { "Alt", XK_Alt_L, 1 },
       -  { "", XK_space, 2 },
       -  { "↓", XK_Down, 1 },
       -  { "↑", XK_Up, 1 },
       -  { "↲ Enter", XK_Return, 2 },
       -};
       -
       -static Key keys_functions[KEYS] = {
       -  { "Esc", XK_Escape, 1 },
       -  { "F1", XK_F1, 1 },
       -  { "F2", XK_F2, 1 },
       -  { "F3", XK_F3, 1 },
       -  { "F4", XK_F4, 1 },
       -  { "F5", XK_F5, 1 },
       -  { "F6", XK_F6, 1 },
       -  { "F7", XK_F7, 1 },
       -  { "F8", XK_F8, 1 },
       -  { "F9", XK_F9, 1 },
       -  { "F10", XK_F10, 1 },
       -
       -  { 0 }, /* New row */
       -
       -  { "≅", XK_KP_Insert, 1 },
       -  { "▶", XF86XK_AudioPlay, 1 },
       -  { "●", XF86XK_AudioRecord, 1 },
       -  { "■", XF86XK_AudioStop, 1 },
       -  { "◂◂", XF86XK_AudioPrev, 1 },
       -  { "▸▸", XF86XK_AudioNext, 1 },
       -  { "♫M", XF86XK_AudioMute, 1 },
       -  { "♫-", XF86XK_AudioLowerVolume, 1 },
       -  { "♫+", XF86XK_AudioRaiseVolume, 1 },
       -  { "☀-", XF86XK_MonBrightnessDown, 1 },
       -  { "☀+", XF86XK_MonBrightnessUp, 1 },
       -
       -  { 0 }, /* New row */
       -
       -  { "abc", XK_Mode_switch, 1 },
       -  { "Del", XK_Delete, 1 },
       -  { "⇤", XK_Home, 1 },
       -  { "←", XK_Left, 1 },
       -  { "→", XK_Right, 1 },
       -  { "⇥", XK_End, 1 },
       -  { "⇊", XK_Next, 1 },
       -  { "⇈", XK_Prior, 1 },
       -  { "Tab", XK_Tab, 1 },
       -  { "⌫Bksp", XK_BackSpace, 2 },
       -
       -  { 0 }, /* New row */
       -  { "↺", XK_Cancel, 1},
       -  { "Shift", XK_Shift_L, 2 },
       -  { "Ctrl", XK_Control_L, 1 },
       -  { "Alt", XK_Alt_L, 1 },
       -  { "", XK_space, 2 },
       -  { "↓", XK_Down, 1 },
       -  { "↑", XK_Up, 1 },
       -  { "↲ Enter", XK_Return, 2 },
       -};
       -
       -
       -static Key keys_ru[KEYS] = {
       -        { "и", XK_Cyrillic_shorti, 1 },
       -        { "ц", XK_Cyrillic_tse, 1 },
       -        { "у", XK_Cyrillic_u, 1 },
       -        { "к", XK_Cyrillic_ka, 1 },
       -        { "е", XK_Cyrillic_ie, 1 },
       -        { "н", XK_Cyrillic_en, 1 },
       -        { "г", XK_Cyrillic_ghe, 1 },
       -        { "ш", XK_Cyrillic_sha, 1 },
       -        { "щ", XK_Cyrillic_shcha, 1 },
       -        { "з", XK_Cyrillic_ze, 1 },
       -        { "х", XK_Cyrillic_ha, 1 },
       -
       -        { 0 }, /* New row */
       -
       -        { "ф", XK_Cyrillic_ef, 1 },
       -        { "ы", XK_Cyrillic_yeru, 1 },
       -        { "в", XK_Cyrillic_ve, 1 },
       -        { "а", XK_Cyrillic_a, 1 },
       -        { "п", XK_Cyrillic_pe, 1 },
       -        { "о", XK_Cyrillic_o, 1 },
       -        { "л", XK_Cyrillic_el, 1 },
       -        { "д", XK_Cyrillic_de, 1 },
       -        { "ж", XK_Cyrillic_zhe, 1 },
       -        { "э", XK_Cyrillic_e, 1 },
       -        { "ю", XK_Cyrillic_yu, 1 },
       -
       -        { 0 }, /* New row */
       -
       -        { "123", XK_Mode_switch, 1 },
       -        { "я", XK_Cyrillic_ya, 1 },
       -        { "ч", XK_Cyrillic_che, 1 },
       -        { "с", XK_Cyrillic_es, 1 },
       -        { "м", XK_Cyrillic_em, 1 },
       -        { "и", XK_Cyrillic_i, 1 },
       -        { "т", XK_Cyrillic_te, 1 },
       -        { "ь", XK_Cyrillic_softsign, 1 },
       -        { "б", XK_Cyrillic_be, 1 },
       -        { "⌫Bksp", XK_BackSpace, 2 },
       -
       -        { 0 }, /* New row */
       -        { "↺", XK_Cancel, 1},
       -        { "Shift", XK_Shift_L, 2 },
       -        { "Ctrl", XK_Control_L, 1 },
       -        { "Alt", XK_Alt_L, 1 },
       -        { "", XK_space, 2 },
       -        { "↓", XK_Down, 1 },
       -        { "↑", XK_Up, 1 },
       -        { "↲ Enter", XK_Return, 2 },
       -};
       -
       -static Key keys_dialer[KEYS] = {
       -        { "Esc", XK_Escape, 1 },
       -        { "1!", XK_1, 1 },
       -        { "2@", XK_2, 1 },
       -        { "3#", XK_3, 1 },
       -        { "⌫Bksp", XK_BackSpace, 2 },
       -        { 0 }, /* New row */
       -
       -        { "Shift", XK_Shift_L, 1 },
       -        { "4$", XK_4, 1 },
       -        { "5%", XK_5, 1 },
       -        { "6^", XK_6, 1 },
       -        { "-_", XK_minus, 1 },
       -        { ",<", XK_comma, 1 },
       -        { 0 }, /* New row */
       -
       -        { "abc", XK_Mode_switch, 1 },
       -        { "7&", XK_7, 1 },
       -        { "8*", XK_8, 1 },
       -        { "9(", XK_9, 1 },
       -        { "=+", XK_equal, 1 },
       -        { "/?", XK_slash, 1 },
       -        { 0 }, /* New row */
       -
       -        { "↺", XK_Cancel, 1},
       -        { "", XK_space, 1 },
       -        { "0)", XK_0, 1 },
       -        { ".>", XK_period, 1 },
       -        { "↲ Enter", XK_Return, 2},
       -        { 0 }, /* New row */
       -        { 0 }, /* Last item (double 0) */
       -};
       -
       -#define LAYERS 5
       -static char* layer_names[LAYERS] = {
       -    "en",
       -    "symbols",
       -    "functions",
       -    "dialer",
       -    "ru",
       -};
       -
       -static Key* available_layers[LAYERS] = {
       -    keys_en,
       -    keys_symbols,
       -    keys_functions,
       -    keys_dialer,
       -    keys_ru
       -};
       -
       -
       -Buttonmod buttonmods[] = {
       -        { XK_Shift_L, Button2 },
       -        { XK_Alt_L, Button3 },
       -};
       -
   DIR diff --git a/svkbd.c b/svkbd.c
       @@ -125,6 +125,7 @@ Bool sigtermd = False;
        #endif
        #include LAYOUT
        
       +static Key keys[KEYS] = { NULL };
        static Key* layers[LAYERS];
        
        void
       @@ -876,9 +877,14 @@ main(int argc, char *argv[]) {
        
                signal(SIGTERM, sigterm);
        
       +
                //parse environment variables
       -        const char* enableoverlays_env = getenv("SVKBD_ENABLEOVERLAYS");
       -        if (enableoverlays_env != NULL) enableoverlays = atoi(enableoverlays_env);
       +        if (OVERLAYS <= 1) {
       +                enableoverlays = 0;
       +    } else {
       +                const char* enableoverlays_env = getenv("SVKBD_ENABLEOVERLAYS");
       +                if (enableoverlays_env != NULL) enableoverlays = atoi(enableoverlays_env);
       +        }
                const char* layers_env = getenv("SVKBD_LAYERS");
                if (layers_env != NULL) {
                        layer_names_list = malloc(128);