svkbd

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

commit d06db9eb4fb8f1de5f5d144f5b8fb3bbf4cce84c
parent 6633915997619c5e3cb21b12f28d5f1d48e854d5
Author: Maarten van Gompel <proycon@anaproy.nl>
Date:   Sat,  6 Mar 2021 16:30:44 +0100

Added a second key label for the shift-activated symbols

Diffstat:
Mconfig.def.h | 8+++++++-
Mlayout.mobile-intl.h | 843+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msvkbd.c | 37+++++++++++++++++++++++++++++++------
3 files changed, 459 insertions(+), 429 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -10,8 +10,14 @@ static const char *fonts[] = { static const char *colors[SchemeLast][2] = { /* fg bg */ [SchemeNorm] = { "#bbbbbb", "#132a33" }, + [SchemeNormShift] = { "#008ac0", "#132a33" }, [SchemeNormABC] = { "#ffffff", "#14313d" }, - [SchemePress] = { "#ffffff", "#000000" }, + [SchemeNormABCShift] = { "#008ac0", "#14313d" }, + [SchemePress] = { "#ffffff", "#259937" }, + [SchemePressShift] = { "#00c001", "#259937" }, [SchemeHighlight] = { "#58a7c6", "#005577" }, + [SchemeHighlightShift] = { "#008ac0", "#005577" }, [SchemeOverlay] = { "#ffffff", "#2b3313" }, + [SchemeOverlayShift] = { "#008ac0", "#2b3313" }, }; + diff --git a/layout.mobile-intl.h b/layout.mobile-intl.h @@ -1,550 +1,549 @@ #define KEYS 55 static Key keys_en[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 }, + { "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 */ - { 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_apostrophe, 1 }, + { 0, 0, XK_q, 1 }, + { 0, 0, XK_w, 1 }, + { 0, 0, XK_e, 1 }, + { 0, 0, XK_r, 1 }, + { 0, 0, XK_t, 1 }, + { 0, 0, XK_y, 1 }, + { 0, 0, XK_u, 1 }, + { 0, 0, XK_i, 1 }, + { 0, 0, XK_o, 1 }, + { 0, 0, XK_p, 1 }, + { "'", "\"", XK_apostrophe, 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_slash, 1 }, - { "Tab", XK_Tab, 1 }, + { 0, 0, XK_a, 1 }, + { 0, 0, XK_s, 1 }, + { 0, 0, XK_d, 1 }, + { 0, 0, XK_f, 1 }, + { 0, 0, XK_g, 1 }, + { 0, 0, XK_h, 1 }, + { 0, 0, XK_j, 1 }, + { 0, 0, XK_k, 1 }, + { 0, 0, XK_l, 1 }, + { "/", "?", XK_slash, 1 }, + { "Tab", 0, XK_Tab, 1 }, { 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_comma, 1 }, - { ".>", XK_period, 1 }, - { "⌫Bksp", XK_BackSpace, 2 }, + { 0, 0, XK_z, 1 }, + { 0, 0, XK_x, 1 }, + { 0, 0, XK_c, 1 }, + { 0, 0, XK_v, 1 }, + { 0, 0, XK_b, 1 }, + { 0, 0, XK_n, 1 }, + { 0, 0, XK_m, 1 }, + { ",", "<", XK_comma, 1 }, + { ".", ">", XK_period, 1 }, + { "⌫Bksp", 0, 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 }, + { "↺", 0, XK_Cancel, 1}, + { "Shift", 0, XK_Shift_L, 2 }, + { "Ctrl", 0, XK_Control_L, 1 }, + { "Alt", 0, XK_Alt_L, 1 }, + { "", 0, XK_space, 2 }, + { "↓", 0, XK_Down, 1 }, + { "↑", 0, XK_Up, 1 }, + { "↲ Enter", 0, 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, 0, XK_a }, //Overlay for a + //--- + { "à", 0, XK_agrave }, + { "á", 0, XK_aacute }, + { "â", 0, XK_acircumflex }, + { "ä", 0, XK_adiaeresis }, + { "ą", 0, XK_aogonek }, + { "ã", 0, XK_atilde }, + { "ā", 0, XK_amacron }, + { "ă", 0, XK_abreve }, + { "å", 0, XK_aring }, + { "æ", 0, XK_ae }, + { 0, 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, 0, XK_e }, //Overlay for e (first item after boundary defines the trigger) + //--- + { "è", 0, XK_egrave }, + { "é", 0, XK_eacute }, + { "ê", 0, XK_ecircumflex }, + { "ë", 0, XK_ediaeresis }, + { "ę", 0, XK_eogonek }, + { "ē", 0, XK_emacron }, + { "ė", 0, XK_eabovedot }, + { 0, 0, XK_Cancel }, //-- - { 0, XK_y }, //New overlay + { 0, 0, XK_y }, //New overlay //--- - { "ỳ", XK_ygrave }, - { "ý", XK_yacute }, - { "ŷ", XK_ycircumflex }, - { "ÿ", XK_ydiaeresis }, - { 0, XK_Cancel }, + { "ỳ", 0, XK_ygrave }, + { "ý", 0, XK_yacute }, + { "ŷ", 0, XK_ycircumflex }, + { "ÿ", 0, XK_ydiaeresis }, + { 0, 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, 0, XK_u }, //New overlay + //--- + { "ù", 0, XK_ugrave }, + { "ú", 0, XK_uacute }, + { "û", 0, XK_ucircumflex }, + { "ü", 0, XK_udiaeresis }, + { "ų", 0, XK_uogonek }, + { "ū", 0, XK_umacron }, + { "ů", 0, XK_uring}, + { "ŭ", 0, XK_ubreve}, + { "ű", 0, XK_udoubleacute }, + { 0, 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, 0, XK_i }, //New overlay + //--- + { "ì", 0, XK_igrave }, + { "í", 0, XK_iacute }, + { "î", 0, XK_icircumflex }, + { "ï", 0, XK_idiaeresis }, + { "į", 0, XK_iogonek }, + { "ī", 0, XK_imacron }, + { "ı", 0, XK_idotless }, + { 0, 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, 0, XK_o }, //New overlay + //--- + { "ò", 0, XK_ograve }, + { "ó", 0, XK_oacute }, + { "ô", 0, XK_ocircumflex }, + { "ö", 0, XK_odiaeresis }, + { "ǫ", 0, XK_ogonek }, + { "õ", 0, XK_otilde }, + { "ō", 0, XK_omacron }, + { "ø", 0, XK_oslash }, + { "ő", 0, XK_odoubleacute }, + { "œ", 0, XK_oe }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //-- - { 0, XK_d }, //New overlay + { 0, 0, XK_d }, //New overlay //--- - { "ď", XK_dcaron }, - { "ð", XK_eth }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ď", 0, XK_dcaron }, + { "ð", 0, XK_eth }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //-- - { 0, XK_c }, //New overlay + { 0, 0, XK_c }, //New overlay //--- - { "ç", XK_ccedilla }, - { "ĉ", XK_ccircumflex }, - { "č", XK_ccaron }, - { "ć", XK_cacute }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ç", 0, XK_ccedilla }, + { "ĉ", 0, XK_ccircumflex }, + { "č", 0, XK_ccaron }, + { "ć", 0, XK_cacute }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //-- - { 0, XK_s }, //New overlay + { 0, 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_scedilla }, + { "ŝ", 0, XK_scircumflex }, + { "š", 0, XK_scaron }, + { "ś", 0, XK_sacute }, + { "ß", 0, XK_ssharp }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_z }, //New overlay + { 0, 0, XK_z }, //New overlay //--- - { "ž", XK_zcaron }, - { "ż", XK_zabovedot }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ž", 0, XK_zcaron }, + { "ż", 0, XK_zabovedot }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //-- - { 0, XK_n }, //New overlay + { 0, 0, XK_n }, //New overlay //--- - { "ñ", XK_ntilde }, - { "ń", XK_nacute }, - { "ň", XK_ncaron }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ñ", 0, XK_ntilde }, + { "ń", 0, XK_nacute }, + { "ň", 0, XK_ncaron }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ // - { 0, XK_t }, //New overlay + { 0, 0, XK_t }, //New overlay //--- - { "ț", XK_tcedilla }, - { "ť", XK_tcaron }, - { "þ", XK_thorn }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ț", 0, XK_tcedilla }, + { "ť", 0, XK_tcaron }, + { "þ", 0, XK_thorn }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //---- - { 0, XK_g }, //New overlay + { 0, 0, XK_g }, //New overlay //--- - { "ĝ", XK_gcircumflex }, - { "ğ", XK_gbreve }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ĝ", 0, XK_gcircumflex }, + { "ğ", 0, XK_gbreve }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ // - { 0, XK_h }, //New overlay + { 0, 0, XK_h }, //New overlay //--- - { "ĥ", XK_hcircumflex }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ĥ", 0, XK_hcircumflex }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ // - { 0, XK_j }, //New overlay + { 0, 0, XK_j }, //New overlay //--- - { "ĵ", XK_jcircumflex }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ĵ", 0, XK_jcircumflex }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //-- - { 0, XK_l }, //New overlay + { 0, 0, XK_l }, //New overlay //--- - { "ł", XK_lstroke }, - { "ľ", XK_lcaron }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ł", 0, XK_lstroke }, + { "ľ", 0, XK_lcaron }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //-- - { 0, XK_r }, //New overlay + { 0, 0, XK_r }, //New overlay //--- - { "ř", XK_rcaron }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ř", 0, XK_rcaron }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_Cyrillic_softsign }, //New overlay + { 0, 0, XK_Cyrillic_softsign }, //New overlay //--- - { "ъ", XK_Cyrillic_hardsign }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ъ", 0, XK_Cyrillic_hardsign }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_Cyrillic_ie }, //New overlay + { 0, 0, XK_Cyrillic_ie }, //New overlay //--- - { "ё", XK_Cyrillic_io }, - { "э", XK_Cyrillic_e }, - { "Є", XK_Ukrainian_ie }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ё", 0, XK_Cyrillic_io }, + { "э", 0, XK_Cyrillic_e }, + { "Є", 0, XK_Ukrainian_ie }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_Cyrillic_i }, //New overlay + { 0, 0, XK_Cyrillic_i }, //New overlay //--- - { "і", XK_Ukrainian_i }, - { "ї", XK_Ukrainian_yi }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "і", 0, XK_Ukrainian_i }, + { "ї", 0, XK_Ukrainian_yi }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_Cyrillic_u }, //New overlay + { 0, 0, XK_Cyrillic_u }, //New overlay //--- - { "ў", XK_Byelorussian_shortu }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ў", 0, XK_Byelorussian_shortu }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_Cyrillic_shorti }, //New overlay + { 0, 0, XK_Cyrillic_shorti }, //New overlay //--- - { "ј", XK_Cyrillic_je }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ј", 0, XK_Cyrillic_je }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_Cyrillic_el }, //New overlay + { 0, 0, XK_Cyrillic_el }, //New overlay //--- - { "љ", XK_Cyrillic_lje }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "љ", 0, XK_Cyrillic_lje }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_Cyrillic_en }, //New overlay + { 0, 0, XK_Cyrillic_en }, //New overlay //--- - { "њ", XK_Cyrillic_nje }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "њ", 0, XK_Cyrillic_nje }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_Cyrillic_tse }, //New overlay + { 0, 0, XK_Cyrillic_tse }, //New overlay //--- - { "џ", XK_Cyrillic_dzhe }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "џ", 0, XK_Cyrillic_dzhe }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //--- - { 0, XK_Cyrillic_che }, //New overlay + { 0, 0, XK_Cyrillic_che }, //New overlay //--- - { "ћ", XK_Serbian_tshe }, - { "ђ", XK_Serbian_dje }, - { 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ + { "ћ", 0, XK_Serbian_tshe }, + { "ђ", 0, XK_Serbian_dje }, + { 0, 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 */ + { "🙂", 0, 0x101f642 }, //emoji overlay + //--- + { "😀", 0, 0x101f600 }, + { "😁", 0, 0x101f601 }, + { "😂", 0, 0x101f602 }, + { "😃", 0, 0x101f603 }, + { "😄", 0, 0x101f604 }, + { "😅", 0, 0x101f605 }, + { "😆", 0, 0x101f606 }, + { "😇", 0, 0x101f607 }, + { "😈", 0, 0x101f608 }, + { "😉", 0, 0x101f609 }, + { "😊", 0, 0x101f60a }, + { "😋", 0, 0x101f60b }, + { "😌", 0, 0x101f60c }, + { "😍", 0, 0x101f60d }, + { "😎", 0, 0x101f60e }, + { "😏", 0, 0x101f60f }, + { "😐", 0, 0x101f610 }, + { "😒", 0, 0x101f612 }, + { "😓", 0, 0x101f613 }, + { "😛", 0, 0x101f61b }, + { "😮", 0, 0x101f62e }, + { "😟", 0, 0x101f61f }, + { "😟", 0, 0x101f620 }, + { "😢", 0, 0x101f622 }, + { "😭", 0, 0x101f62d }, + { "😳", 0, 0x101f633 }, + { "😴", 0, 0x101f634 }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ //-- - { "/?", XK_slash }, //punctuation overlay + { "/?", 0, 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 */ + { "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 }, + { "¡", 0, XK_exclamdown, 1 }, + { "?", 0, XK_questiondown, 1 }, + { "°", 0, XK_degree, 1 }, + { "£", 0, XK_sterling, 1 }, + { "€", 0, XK_EuroSign, 1 }, + { "¥", 0, XK_yen, 1 }, + { ";", ":", XK_colon, 1 }, + { 0, 0, XK_Cancel }, /* XK_Cancel signifies overlay boundary */ }; static Key keys_symbols[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 }, + { "Esc", 0, XK_Escape, 1 }, + { "F1", 0, XK_F1, 1 }, + { "F2", 0, XK_F2, 1 }, + { "F3", 0, XK_F3, 1 }, + { "F4", 0, XK_F4, 1 }, + { "F5", 0, XK_F5, 1 }, + { "F6", 0, XK_F6, 1 }, + { "F7", 0, XK_F7, 1 }, + { "F8", 0, XK_F8, 1 }, + { "F9", 0, XK_F9, 1 }, + { "F10", 0, XK_F10, 1 }, { 0 }, /* New row */ - { "'\"", XK_apostrophe, 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, XK_apostrophe, 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_period, 1 }, - { ",<", XK_comma, 1 }, - { "`~", XK_grave, 1 }, - { "-_", XK_minus, 1 }, - { "=+", XK_plus, 1 }, - { "\\|", XK_backslash, 1 }, - { ";:", XK_colon, 1 }, - { "/?", XK_slash, 1 }, - { "[{", XK_bracketleft, 1 }, - { "]}", XK_bracketright, 1 }, - { "Del", XK_Delete, 1 }, + { ".", ">", XK_period, 1 }, + { ",", "<", XK_comma, 1 }, + { "`", "~", XK_grave, 1 }, + { "-", "_", XK_minus, 1 }, + { "=", "+", XK_plus, 1 }, + { "\\", "|", XK_backslash, 1 }, + { ";", ":", XK_colon, 1 }, + { "/", "?", XK_slash, 1 }, + { "[", "{", XK_bracketleft, 1 }, + { "]", "}", XK_bracketright, 1 }, + { "Del", 0, XK_Delete, 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 }, + { "abc", 0, XK_Mode_switch, 1 }, + { "☺", 0, 0x101f642, 1 }, + { "⇤", 0, XK_Home, 1 }, + { "←", 0, XK_Left, 1 }, + { "→", 0, XK_Right, 1 }, + { "⇥", 0, XK_End, 1 }, + { "⇊", 0, XK_Next, 1 }, + { "⇈", 0, XK_Prior, 1 }, + { "Tab", 0, XK_Tab, 1 }, + { "⌫Bksp", 0, 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 }, + { "↺", 0, XK_Cancel, 1}, + { "Shift", 0, XK_Shift_L, 2 }, + { "Ctrl", 0, XK_Control_L, 1 }, + { "Alt", 0, XK_Alt_L, 1 }, + { "", 0, XK_space, 2 }, + { "↓", 0, XK_Down, 1 }, + { "↑", 0, XK_Up, 1 }, + { "↲ Enter", 0, XK_Return, 2 }, }; static Key keys_functions[KEYS] = { - { "Esc", XK_Escape, 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 }, + { "Esc", 0, XK_Escape, 1 }, + { "▶", 0, XF86XK_AudioPlay, 1 }, + { "●", 0, XF86XK_AudioRecord, 1 }, + { "■", 0, XF86XK_AudioStop, 1 }, + { "◂◂", 0, XF86XK_AudioPrev, 1 }, + { "▸▸", 0, XF86XK_AudioNext, 1 }, + { "♫M", 0, XF86XK_AudioMute, 1 }, + { "♫-", 0, XF86XK_AudioLowerVolume, 1 }, + { "♫+", 0, XF86XK_AudioRaiseVolume, 1 }, + { "☀-", 0, XF86XK_MonBrightnessDown, 1 }, + { "☀+", 0, XF86XK_MonBrightnessUp, 1 }, { 0 }, /* New row */ - { "≅", XK_KP_Insert, 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, XK_KP_Insert, 1 }, + { "Del", 0, XK_Delete, 1 }, + { "⇤", 0, XK_Home, 1 }, + { "←", 0, XK_Left, 1 }, + { "→", 0, XK_Right, 1 }, + { "⇥", 0, XK_End, 1 }, + { "⇊", 0, XK_Next, 1 }, + { "⇈", 0, XK_Prior, 1 }, + { "Tab", 0, XK_Tab, 1 }, + { "⌫Bksp", 0, 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 }, + { "↺", 0, XK_Cancel, 1}, + { "Shift", 0, XK_Shift_L, 2 }, + { "Ctrl", 0, XK_Control_L, 1 }, + { "Alt", 0, XK_Alt_L, 1 }, + { "", 0, XK_space, 2 }, + { "↓", 0, XK_Down, 1 }, + { "↑", 0, XK_Up, 1 }, + { "↲ Enter", 0, XK_Return, 2 }, { 0 }, /* Last item (double 0) */ { 0 }, /* Last item (double 0) */ }; static Key keys_navigation[KEYS] = { - { "Esc", XK_Escape, 1 }, - { "⇤", XK_Home, 1 }, - { "↑", XK_Up, 1 }, - { "⇥", XK_End, 1 }, - { "⇈", XK_Prior, 1 }, + { "Esc", 0, XK_Escape, 1 }, + { "⇤", 0, XK_Home, 1 }, + { "↑", 0, XK_Up, 1 }, + { "⇥", 0, XK_End, 1 }, + { "⇈", 0, XK_Prior, 1 }, { 0 }, /* New row */ - { "Shift", XK_Shift_L, 1 }, - { "←", XK_Left, 1 }, - { "", XK_space, 1 }, - { "→", XK_Right, 1 }, - { "⇊", XK_Next, 1 }, + { "Shift", 0, XK_Shift_L, 1 }, + { "←", 0, XK_Left, 1 }, + { "", 0, XK_space, 1 }, + { "→", 0, XK_Right, 1 }, + { "⇊", 0, XK_Next, 1 }, { 0 }, /* New row */ - { "↺", XK_Cancel, 1}, - { "⌫Bksp", XK_BackSpace, 1 }, - { "↓", XK_Down, 1 }, - { "Tab", XK_Tab, 1 }, - { "↲ Enter", XK_Return, 1}, + { "↺", 0, XK_Cancel, 1}, + { "⌫Bksp", 0, XK_BackSpace, 1 }, + { "↓", 0, XK_Down, 1 }, + { "Tab", 0, XK_Tab, 1 }, + { "↲ Enter", 0, XK_Return, 1}, { 0 }, /* Last item (double 0) */ { 0 }, /* Last item (double 0) */ }; static Key keys_ru[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 }, - + { "Esc", 0, 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_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, XK_Cyrillic_shorti, 1 }, + { "ц", 0, XK_Cyrillic_tse, 1 }, + { "у", 0, XK_Cyrillic_u, 1 }, + { "к", 0, XK_Cyrillic_ka, 1 }, + { "е", 0, XK_Cyrillic_ie, 1 }, + { "н", 0, XK_Cyrillic_en, 1 }, + { "г", 0, XK_Cyrillic_ghe, 1 }, + { "ш", 0, XK_Cyrillic_sha, 1 }, + { "щ", 0, XK_Cyrillic_shcha, 1 }, + { "з", 0, XK_Cyrillic_ze, 1 }, + { "х", 0, 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_er, 1 }, - { "о", XK_Cyrillic_o, 1 }, - { "л", XK_Cyrillic_el, 1 }, - { "д", XK_Cyrillic_de, 1 }, - { "ж", XK_Cyrillic_zhe, 1 }, - { "ю", XK_Cyrillic_yu, 1 }, + { "ф", 0, XK_Cyrillic_ef, 1 }, + { "ы", 0, XK_Cyrillic_yeru, 1 }, + { "в", 0, XK_Cyrillic_ve, 1 }, + { "а", 0, XK_Cyrillic_a, 1 }, + { "п", 0, XK_Cyrillic_pe, 1 }, + { "р", 0, XK_Cyrillic_er, 1 }, + { "о", 0, XK_Cyrillic_o, 1 }, + { "л", 0, XK_Cyrillic_el, 1 }, + { "д", 0, XK_Cyrillic_de, 1 }, + { "ж", 0, XK_Cyrillic_zhe, 1 }, + { "ю", 0, 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 }, + { "123", 0, XK_Mode_switch, 1 }, + { "я", 0, XK_Cyrillic_ya, 1 }, + { "ч", 0, XK_Cyrillic_che, 1 }, + { "с", 0, XK_Cyrillic_es, 1 }, + { "м", 0, XK_Cyrillic_em, 1 }, + { "и", 0, XK_Cyrillic_i, 1 }, + { "т", 0, XK_Cyrillic_te, 1 }, + { "ь", 0, XK_Cyrillic_softsign, 1 }, + { "б", 0, XK_Cyrillic_be, 1 }, + { "⌫Bksp", 0, 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 }, + { "↺", 0, XK_Cancel, 1}, + { "Shift", 0, XK_Shift_L, 2 }, + { "Ctrl", 0, XK_Control_L, 1 }, + { "Alt", 0, XK_Alt_L, 1 }, + { "", 0, XK_space, 2 }, + { "↓", 0, XK_Down, 1 }, + { "↑", 0, XK_Up, 1 }, + { "↲ Enter", 0, 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 }, + { "Esc", 0, XK_Escape, 1 }, + { "1", "!" , XK_1, 1 }, + { "2", "@", XK_2, 1 }, + { "3", "#", XK_3, 1 }, + { "⌫Bksp", 0, 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 }, + { "Shift", 0, 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 }, + { "abc", 0, 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, XK_Cancel, 1}, + { "", 0, XK_space, 1 }, + { "0", ")", XK_0, 1 }, + { ".", ">", XK_period, 1 }, + { "↲ Enter", 0, XK_Return, 2}, { 0 }, /* New row */ { 0 }, /* Last item (double 0) */ }; diff --git a/svkbd.c b/svkbd.c @@ -33,12 +33,13 @@ #define STRINGTOKEYSYM(X) (XStringToKeySym(X)) /* enums */ -enum { SchemeNorm, SchemeNormABC, SchemePress, SchemeHighlight, SchemeOverlay, SchemeLast }; +enum { SchemeNorm, SchemeNormABC, SchemeNormABCShift, SchemeNormShift, SchemePress, SchemePressShift, SchemeHighlight, SchemeHighlightShift, SchemeOverlay, SchemeOverlayShift, SchemeLast }; enum { NetWMWindowType, NetLast }; /* typedefs */ typedef struct { char *label; + char *label2; KeySym keysym; unsigned int width; KeySym modifier; @@ -303,20 +304,25 @@ void drawkey(Key *k, int idx) { int x, y, w, h; + int x2, y2, w2, h2; const char *l; + int use_scheme = SchemeNorm; + if (k->pressed) - drw_setscheme(drw, scheme[SchemePress]); + use_scheme = SchemePress; else if (k->highlighted) - drw_setscheme(drw, scheme[SchemeHighlight]); + use_scheme = SchemeHighlight; else if (idx < overlaykeycount) - drw_setscheme(drw, scheme[SchemeOverlay]); + use_scheme = SchemeOverlay; else if ((k->keysym == XK_Return) || ((k->keysym >= XK_a) && (k->keysym <= XK_z)) || ((k->keysym >= XK_Cyrillic_io) && (k->keysym <= XK_Cyrillic_hardsign))) - drw_setscheme(drw, scheme[SchemeNormABC]); + use_scheme = SchemeNormABC; else - drw_setscheme(drw, scheme[SchemeNorm]); + use_scheme = SchemeNorm; + + drw_setscheme(drw, scheme[use_scheme]); drw_rect(drw, k->x, k->y, k->w, k->h, 1, 1); if (k->keysym == XK_KP_Insert) { @@ -335,6 +341,24 @@ drawkey(Key *k, int idx) w = TEXTW(l); x = k->x + (k->w / 2) - (w / 2); drw_text(drw, x, y, w, h, 0, l, 0); + if (k->label2) { + if (use_scheme == SchemeNorm) + use_scheme = SchemeNormShift; + else if (use_scheme == SchemeNormABC) + use_scheme = SchemeNormABCShift; + else if (use_scheme == SchemePress) + use_scheme = SchemePressShift; + else if (use_scheme == SchemeHighlight) + use_scheme = SchemeHighlightShift; + else if (use_scheme == SchemeOverlay) + use_scheme = SchemeOverlayShift; + drw_setscheme(drw, scheme[use_scheme]); + x += w; + y -= 15; + l = k->label2; + w = TEXTW(l); + drw_text(drw, x, y, w, h, 0, l, 0); + } drw_map(drw, win, k->x, k->y, k->w, k->h); } @@ -882,6 +906,7 @@ showoverlay(int idx) if (overlay[i].width) j += overlay[i].width; keys[j].label = overlay[i].label; + keys[j].label2 = overlay[i].label2; keys[j].keysym = overlay[i].keysym; keys[j].modifier = overlay[i].modifier; }