svkbd

simple virtual keyboard
git clone git://git.suckless.org/svkbd
Log | Files | Refs | README | LICENSE

commit 13d20da8efda2fc025279cf22b8b66bd0beff6c7
parent eae90f28d998af064ec163074a026a585ccb6417
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:
DREADME | 66------------------------------------------------------------------
AREADME.md | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mconfig.mk | 2+-
Mlayout.arrows.h | 18++++++++++++++++--
Mlayout.de.h | 18++++++++++++++++--
Alayout.en.h | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alayout.mobile-intl.h | 522+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alayout.mobile-plain.h | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlayout.ru.h | 17+++++++++++++++--
Mlayout.sh.h | 17+++++++++++++++--
Dlayout.sxmo.h | 523-------------------------------------------------------------------------------
Msvkbd.c | 10++++++++--
12 files changed, 889 insertions(+), 600 deletions(-)

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 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 diff --git a/config.mk b/config.mk @@ -1,4 +1,4 @@ -LAYOUT = sxmo +LAYOUT = mobile-intl # paths PREFIX = /usr/local 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, +}; + 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, +}; + 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, +}; + 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 }, +}; + 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, +}; 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, +}; 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, +}; 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 }, -}; - 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);