#!/bin/bash
# ===================================================================#
# Copyright (c) 2022 Guilherme Esmeraldo - License GPLv3+:           #
# GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.    #
# This is free software: you are free to change and redistribute it. # 
# There is NO WARRANTY, to the extent permitted by law.              #
#                                                                    #
# Version: 0.2                                                       #
#====================================================================#


PIS_DIR="/var/log/PIS"
DIALOG_OK=0
DIALOG_CANCEL=1
DIALOG_ESC=255

LAYOUTS=$(echo " 'ad' 'Andorra' 'af' 'Afghanistan' 'al' 'Albania' 'am' 'Armenia' 'ara' 'Arabic' 'az' 'Azerbaijan' 'ba' 'Bosnia and Herzegovina' 'bd' 'Bangladesh' 'be' 'Belgium' 'bg' 'Bulgaria' 'brai' 'Braille' 'br' 'Brazil' 'bt' 'Bhutan' 'by' 'Belarus' 'ca' 'Canada' 'cd' 'Congo, Democratic Republic of the' 'ch' 'Switzerland' 'cn' 'China' 'cz' 'Czechia' 'de' 'Germany' 'dk' 'Denmark' 'ee' 'Estonia' 'epo' 'Esperanto' 'es' 'Spain' 'et' 'Ethiopia' 'fi' 'Finland' 'fo' 'Faroe Islands' 'fr' 'France' 'gb' 'United Kingdom' 'ge ' 'Georgia' 'gh' 'Ghana' 'gn' 'Guinea' 'gr' 'Greece' 'hr' 'Croatia' 'hu' 'Hungary' 'ie' 'Ireland' 'il' 'Israel' 'in' 'India' 'iq' 'Iraq' 'ir' 'Iran' 'is' 'Iceland' 'it' 'Italy' 'jp' 'Japan' 'kg' 'Kyrgyzstan' 'kh' 'Cambodia' 'kr' 'Korea, Republic of' 'kz' 'Kazakhstan' 'la' 'Laos' 'latam' 'Latin American' 'lk' 'Sri Lanka' 'lt' 'Lithuania' 'lv' 'Latvia' 'ma' 'Morocco' 'mao' 'Maori' 'me' 'Montenegro' 'mk' 'Macedonia' 'ml' 'Mali' 'mm' 'Myanmar' 'mn' 'Mongolia' 'mt' 'Malta' 'mv' 'Maldives' 'nec_vndr/jp' 'Japan (PC-98xx Series)' 'ng' 'Nigeria' 'nl' 'Netherlands' 'no' 'Norway' 'np' 'Nepal' 'pk' 'Pakistan' 'pl' 'Poland' 'pt' 'Portugal' 'ro' 'Romania' 'rs' 'Serbia' 'ru' 'Russia' 'se' 'Sweden' 'si' 'Slovenia' 'sk' 'Slovakia' 'sn' 'Senegal' 'sy' 'Syria' 'th' 'Thailand' 'tj' 'Tajikistan' 'tm' 'Turkmenistan' 'tr' 'Turkey' 'tw' 'Taiwan' 'tz' 'Tanzania' 'ua' 'Ukraine' 'us' 'USA' 'uz' 'Uzbekistan' 'vn' 'Vietnam' 'za' 'South Africa' ")


VARIANTS=$(echo " 'chr' 'us: Cherokee' 'euro' 'us: With EuroSign on 5' 'intl' 'us: International (with dead keys)' 'alt-intl' 'us: Alternative international (former us_intl)' 'colemak' 'us: Colemak' 'dvorak' 'us: Dvorak' 'dvorak-intl' 'us: Dvorak international' 'dvorak-l' 'us: Left handed Dvorak' 'dvorak-r' 'us: Right handed Dvorak' 'dvorak-classic' 'us: Classic Dvorak' 'dvp' 'us: Programmer Dvorak' 'rus' 'us: Russian phonetic' 'mac' 'us: Macintosh' 'altgr-intl' 'us: International (AltGr dead keys)' 'olpc2' 'us: Group toggle on multiply/divide key' 'srp' 'us: Serbian' 'ps' 'af: Pashto' 'uz' 'af: Southern Uzbek' 'olpc-ps' 'af: OLPC Pashto' 'olpc-fa' 'af: OLPC Dari' 'olpc-uz' 'af: OLPC Southern Uzbek' 'azerty' 'ara: azerty' 'azerty_digits' 'ara: azerty/digits' 'digits' 'ara: digits' 'qwerty' 'ara: qwerty' 'qwerty_digits' 'ara: qwerty/digits' 'buckwalter' 'ara: Buckwalter' 'phonetic' 'am: Phonetic' 'phonetic-alt' 'am: Alternative Phonetic' 'eastern' 'am: Eastern' 'western ' 'am: Western' 'eastern-alt' 'am: Alternative Eastern' 'cyrillic' 'az: Cyrillic' 'legacy' 'by: Legacy' 'latin' 'by: Latin' 'oss' 'be: Alternative' 'oss_latin9' 'be: Alternative, latin-9 only' 'oss_sundeadkeys' 'be: Alternative, Sun dead keys' 'iso-alternate' 'be: ISO Alternate' 'nodeadkeys' 'be: Eliminate dead keys' 'sundeadkeys' 'be: Sun dead keys' 'wang' 'be: Wang model 724 azerty' 'probhat' 'bd: Probhat' 'ben' 'in: Bengali' 'ben_probhat' 'in: Bengali Probhat' 'guj' 'in: Gujarati' 'guru' 'in: Gurmukhi' 'jhelum' 'in: Gurmukhi Jhelum' 'kan' 'in: Kannada' 'mal' 'in: Malayalam' 'mal_lalitha' 'in: Malayalam Lalitha' 'ori' 'in: Oriya' 'tam_unicode' 'in: Tamil Unicode' 'tam_keyboard_with_numerals' 'in: Tamil Keyboard with Numerals' 'tam_TAB' 'in: Tamil TAB Typewriter' 'tam_TSCII' 'in: Tamil TSCII Typewriter' 'tam' 'in: Tamil' 'tel' 'in: Telugu' 'urd-phonetic' 'in: Urdu, Phonetic' 'urd-phonetic3' 'in: Urdu, Alternative phonetic' 'urd-winkeys' 'in: Urdu, Winkeys' 'bolnagri' 'in: Hindi Bolnagri' 'hin-wx' 'in: Hindi Wx' 'alternatequotes' 'ba: Use guillemets for quotes' 'unicode' 'ba: Use Bosnian digraphs' 'unicodeus' 'ba: US keyboard with Bosnian digraphs' 'us' 'ba: US keyboard with Bosnian letters' 'nodeadkeys' 'br: Eliminate dead keys' 'dvorak' 'br: Dvorak' 'nativo' 'br: Nativo' 'nativo-us' 'br: Nativo for USA keyboards' 'nativo-epo' 'br: Nativo for Esperanto' 'phonetic' 'bg: Traditional phonetic' 'bas_phonetic' 'bg: New phonetic' 'french' 'ma: French' 'tifinagh' 'ma: Tifinagh' 'tifinagh-alt' 'ma: Tifinagh Alternative' 'tifinagh-alt-phonetic' 'ma: Tifinagh Alternative Phonetic' 'tifinagh-extended' 'ma: Tifinagh Extended' 'tifinagh-phonetic' 'ma: Tifinagh Phonetic' 'tifinagh-extended-phonetic' 'ma: Tifinagh Extended Phonetic' 'fr-dvorak' 'ca: French Dvorak' 'fr-legacy' 'ca: French (legacy)' 'multix' 'ca: Multilingual' 'multi' 'ca: Multilingual, first part' 'multi-2gr' 'ca: Multilingual, second part' 'ike' 'ca: Inuktitut' 'shs' 'ca: Secwepemctsin' 'kut' 'ca: Ktunaxa' 'eng' 'ca: English' \'tib\' 'cn: Tibetan' 'tib_asciinum' 'cn: Tibetan (with ASCII numerals)' 'alternatequotes' 'hr: Use guillemets for quotes' 'unicode' 'hr: Use Croatian digraphs' 'unicodeus' 'hr: US keyboard with Croatian digraphs' 'us' 'hr: US keyboard with Croatian letters' 'bksl' 'cz: With &lt;\|&gt; key' 'qwerty' 'cz: qwerty' 'qwerty_bksl' 'cz: qwerty, extended Backslash' 'ucw' 'cz: UCW layout (accented letters only)' 'dvorak-ucw' 'cz: US Dvorak with CZ UCW support' 'nodeadkeys' 'dk: Eliminate dead keys' 'mac' 'dk: Macintosh' 'mac_nodeadkeys' 'dk: Macintosh, eliminate dead keys' 'dvorak' 'dk: Dvorak' 'sundeadkeys' 'nl: Sun dead keys' 'mac' 'nl: Macintosh' 'std' 'nl: Standard' 'nodeadkeys' 'ee: Eliminate dead keys' 'dvorak' 'ee: Dvorak' 'us' 'ee: US keyboard with Estonian letters' 'pes_keypad' 'ir: Persian, with Persian Keypad' 'ku' 'ir: Kurdish, Latin Q' 'ku_f' 'ir: Kurdish, (F)' 'ku_alt' 'ir: Kurdish, Latin Alt-Q' 'ku_ara' 'ir: Kurdish, Arabic-Latin' 'ku' 'iq: Kurdish, Latin Q' 'ku_f' 'iq: Kurdish, (F)' 'ku_alt' 'iq: Kurdish, Latin Alt-Q' 'ku_ara' 'iq: Kurdish, Arabic-Latin' 'nodeadkeys' 'fo: Eliminate dead keys' 'nodeadkeys' 'fi: Eliminate dead keys' 'smi' 'fi: Northern Saami' 'classic' 'fi: Classic' 'mac' 'fi: Macintosh' 'nodeadkeys' 'fr: Eliminate dead keys' 'sundeadkeys' 'fr: Sun dead keys' 'oss' 'fr: Alternative' 'oss_latin9' 'fr: Alternative, latin-9 only' 'oss_nodeadkeys' 'fr: Alternative, eliminate dead keys' 'oss_sundeadkeys' 'fr: Alternative, Sun dead keys' 'latin9' 'fr: (Legacy) Alternative' 'latin9_nodeadkeys' 'fr: (Legacy) Alternative, eliminate dead keys' 'latin9_sundeadkeys' 'fr: (Legacy) Alternative, Sun dead keys' 'bepo' 'fr: Bepo, ergonomic, Dvorak way' 'bepo_latin9' 'fr: Bepo, ergonomic, Dvorak way, latin-9 only' 'dvorak' 'fr: Dvorak' 'mac' 'fr: Macintosh' 'bre' 'fr: Breton' 'oci' 'fr: Occitan' 'geo' 'fr: Georgian AZERTY Tskapo' 'generic' 'gh: Multilingual' 'akan' 'gh: Akan' 'ewe' 'gh: Ewe' 'fula' 'gh: Fula' 'ga' 'gh: Ga' 'hausa' 'gh: Hausa' 'ergonomic' 'ge: Ergonomic' 'mess' 'ge: MESS' 'ru' 'ge: Russian' 'os' 'ge: Ossetian' 'deadacute' 'de: Dead acute' 'deadgraveacute' 'de: Dead grave acute' 'nodeadkeys' 'de: Eliminate dead keys' 'ro' 'de: Romanian keyboard with German letters' 'ro_nodeadkeys' 'de: Romanian keyboard with German letters, eliminate dead keys' 'dvorak' 'de: Dvorak' 'sundeadkeys' 'de: Sun dead keys' 'neo' 'de: Neo 2' 'mac' 'de: Macintosh' 'mac_nodeadkeys' 'de: Macintosh, eliminate dead keys' 'dsb' 'de: Lower Sorbian' 'dsb_qwertz' 'de: Lower Sorbian (qwertz)' 'qwerty' 'de: qwerty' 'simple' 'gr: Simple' 'extended' 'gr: Extended' 'nodeadkeys' 'gr: Eliminate dead keys' 'polytonic' 'gr: Polytonic' 'standard' 'hu: Standard' 'nodeadkeys' 'hu: Eliminate dead keys' 'qwerty' 'hu: qwerty' '101_qwertz_comma_dead' 'hu: 101/qwertz/comma/Dead keys' '101_qwertz_comma_nodead' 'hu: 101/qwertz/comma/Eliminate dead keys' '101_qwertz_dot_dead' 'hu: 101/qwertz/dot/Dead keys' '101_qwertz_dot_nodead' 'hu: 101/qwertz/dot/Eliminate dead keys' '101_qwerty_comma_dead' 'hu: 101/qwerty/comma/Dead keys' '101_qwerty_comma_nodead' 'hu: 101/qwerty/comma/Eliminate dead keys' '101_qwerty_dot_dead' 'hu: 101/qwerty/dot/Dead keys' '101_qwerty_dot_nodead' 'hu: 101/qwerty/dot/Eliminate dead keys' '102_qwertz_comma_dead' 'hu: 102/qwertz/comma/Dead keys' '102_qwertz_comma_nodead' 'hu: 102/qwertz/comma/Eliminate dead keys' '102_qwertz_dot_dead' 'hu: 102/qwertz/dot/Dead keys' '102_qwertz_dot_nodead' 'hu: 102/qwertz/dot/Eliminate dead keys' '102_qwerty_comma_dead' 'hu: 102/qwerty/comma/Dead keys' '102_qwerty_comma_nodead' 'hu: 102/qwerty/comma/Eliminate dead keys' '102_qwerty_dot_dead' 'hu: 102/qwerty/dot/Dead keys' '102_qwerty_dot_nodead' 'hu: 102/qwerty/dot/Eliminate dead keys' 'Sundeadkeys' 'is: Sun dead keys' 'nodeadkeys' 'is: Eliminate dead keys' 'mac' 'is: Macintosh' 'dvorak' 'is: Dvorak' 'lyx' 'il: lyx' 'phonetic' 'il: Phonetic' 'biblical' 'il: Biblical Hebrew (Tiro)' 'nodeadkeys' 'it: Eliminate dead keys' 'mac' 'it: Macintosh' 'us' 'it: US keyboard with Italian letters' 'geo' 'it: Georgian' 'kana' 'jp: Kana' 'OADG109A' 'jp: OADG 109A' 'mac' 'jp: Macintosh' 'phonetic' 'kg: Phonetic' 'ruskaz' 'kz: Russian with Kazakh' 'kazrus' 'kz: Kazakh with Russian' 'basic' 'la: Laos' 'stea' 'la: Laos - STEA (proposed standard layout)' 'nodeadkeys' 'latam: Eliminate dead keys' 'deadtilde' 'latam: Include dead tilde' 'sundeadkeys' 'latam: Sun dead keys' 'std' 'lt: Standard' 'us' 'lt: US keyboard with Lithuanian letters' 'ibm' 'lt: IBM (LST 1205-92)' 'lekp' 'lt: LEKP' 'lekpa' 'lt: LEKPa' 'apostrophe' 'lv: Apostrophe variant' 'tilde' 'lv: Tilde (~) variant' 'fkey' 'lv: F-letter (F) variant' 'cyrillic' 'me: Cyrillic' 'cyrillicyz' 'me: Cyrillic, Z and ZHE swapped' 'latinunicode' 'me: Latin unicode' 'latinyz' 'me: Latin qwerty' 'latinunicodeyz' 'me: Latin unicode qwerty' 'cyrillicalternatequotes' 'me: Cyrillic with guillemets' 'latinalternatequotes' 'me: Latin with guillemets' 'nodeadkeys' 'mk: Eliminate dead keys' 'us' 'mt: Maltese keyboard with US layout' 'nodeadkeys' 'no: Eliminate dead keys' 'dvorak' 'no: Dvorak' 'smi' 'no: Northern Saami' 'smi_nodeadkeys' 'no: Northern Saami, eliminate dead keys' 'mac' 'no: Macintosh' 'mac_nodeadkeys' 'no: Macintosh, eliminate dead keys' 'qwertz' 'pl: qwertz' 'dvorak' 'pl: Dvorak' 'dvorak_quotes' 'pl: Dvorak, Polish quotes on quotemark key' 'dvorak_altquotes' 'pl: Dvorak, Polish quotes on key 1' 'csb' 'pl: Kashubian' 'ru_phonetic_dvorak' 'pl: Russian phonetic Dvorak' 'dvp' 'pl: Programmer Dvorak' 'nodeadkeys' 'pt: Eliminate dead keys' 'sundeadkeys' 'pt: Sun dead keys' 'mac' 'pt: Macintosh' 'mac_nodeadkeys' 'pt: Macintosh, eliminate dead keys' 'mac_sundeadkeys' 'pt: Macintosh, Sun dead keys' 'nativo' 'pt: Nativo' 'nativo-us' 'pt: Nativo for USA keyboards' 'nativo-epo' 'pt: Nativo for Esperanto' 'cedilla' 'ro: Cedilla' 'std' 'ro: Standard' 'std_cedilla' 'ro: Standard (Cedilla)' 'winkeys' 'ro: Winkeys' 'crh_f' 'ro: Crimean Tatar (Turkish F)' 'crh_alt' 'ro: Crimean Tatar (Turkish Alt-Q)' 'crh_dobruca1' 'ro: Crimean Tatar (Dobruca-1 Q)' 'crh_dobruca2' 'ro: Crimean Tatar (Dobruca-2 Q)' 'phonetic' 'ru: Phonetic' 'phonetic_winkeys' 'ru: Phonetic Winkeys' 'typewriter' 'ru: Typewriter' 'legacy' 'ru: Legacy' 'typewriter-legacy' 'ru: Typewriter, legacy' 'tt' 'ru: Tatar' 'os_legacy' 'ru: Ossetian, legacy' 'os_winkeys' 'ru: Ossetian, Winkeys' 'cv' 'ru: Chuvash' 'cv_latin' 'ru: Chuvash Latin' 'udm' 'ru: Udmurt' 'kom' 'ru: Komi' 'sah' 'ru: Yakut' 'xal' 'ru: Kalmyk' 'dos' 'ru: DOS' 'srp' 'ru: Serbian' 'bak' 'ru: Bashkirian' 'yz' 'rs: Z and ZHE swapped' 'latin' 'rs: Latin' 'latinunicode' 'rs: Latin Unicode' 'latinyz' 'rs: Latin qwerty' 'latinunicodeyz' 'rs: Latin Unicode qwerty' 'alternatequotes' 'rs: With guillemets' 'latinalternatequotes' 'rs: Latin with guillemets' 'alternatequotes' 'si: Use guillemets for quotes' 'us' 'si: US keyboard with Slovenian letters' 'bksl' 'sk: Extended Backslash' 'qwerty' 'sk: qwerty' 'qwerty_bksl' 'sk: qwerty, extended Backslash' 'nodeadkeys' 'es: Eliminate dead keys' 'deadtilde' 'es: Include dead tilde' 'sundeadkeys' 'es: Sun dead keys' 'dvorak' 'es: Dvorak' 'ast' 'es: Asturian variant with bottom-dot H and bottom-dot L' 'cat' 'es: Catalan variant with middle-dot L' 'mac' 'es: Macintosh' 'nodeadkeys' 'se: Eliminate dead keys' 'dvorak' 'se: Dvorak' 'rus' 'se: Russian phonetic' 'rus_nodeadkeys' 'se: Russian phonetic, eliminate dead keys' 'smi' 'se: Northern Saami' 'mac' 'se: Macintosh' 'svdvorak' 'se: Svdvorak' 'legacy' 'ch: Legacy' 'de_nodeadkeys' 'ch: German, eliminate dead keys' 'de_sundeadkeys' 'ch: German, Sun dead keys' 'fr' 'ch: French' 'fr_nodeadkeys' 'ch: French, eliminate dead keys' 'fr_sundeadkeys' 'ch: French, Sun dead keys' 'fr_mac' 'ch: French (Macintosh)' 'de_mac' 'ch: German (Macintosh)' 'syc' 'sy: Syriac' 'syc_phonetic' 'sy: Syriac phonetic' 'ku' 'sy: Kurdish, Latin Q' 'ku_f' 'sy: Kurdish, (F)' 'ku_alt' 'sy: Kurdish, Latin Alt-Q' 'legacy' 'tj: Legacy' 'tam_unicode' 'lk: Tamil Unicode' 'tam_TAB' 'lk: Tamil TAB Typewriter' 'tis' 'th: TIS-820.2538' 'pat' 'th: Pattachote' 'f' 'tr: (F)' 'alt' 'tr: Alt-Q' 'sundeadkeys' 'tr: Sun dead keys' 'ku' 'tr: Kurdish, Latin Q' 'ku_f' 'tr: Kurdish, (F)' 'ku_alt' 'tr: Kurdish, Latin Alt-Q' 'intl' 'tr: International (with dead keys)' 'crh' 'tr: Crimean Tatar (Turkish Q)' 'crh_f' 'tr: Crimean Tatar (Turkish F)' 'crh_alt' 'tr: Crimean Tatar (Turkish Alt-Q)' 'indigenous' 'tw: Indigenous' 'saisiyat' 'tw: Saisiyat' 'phonetic' 'ua: Phonetic' 'typewriter' 'ua: Typewriter' 'winkeys' 'ua: Winkeys' 'legacy' 'ua: Legacy' 'rstu' 'ua: Standard RSTU' 'rstu_ru' 'ua: Standard RSTU on Russian layout' 'homophonic' 'ua: Homophonic' 'crh' 'ua: Crimean Tatar (Turkish Q)' 'crh_f' 'ua: Crimean Tatar (Turkish F)' 'crh_alt' 'ua: Crimean Tatar (Turkish Alt-Q)' 'extd' 'gb: Extended - Winkeys' 'intl' 'gb: International (with dead keys)' 'dvorak' 'gb: Dvorak' 'dvorakukp' 'gb: Dvorak (UK Punctuation)' 'mac' 'gb: Macintosh' 'colemak' 'gb: Colemak' 'latin' 'uz: Latin' 'crh' 'uz: Crimean Tatar (Turkish Q)' 'crh_f' 'uz: Crimean Tatar (Turkish F)' 'crh_alt' 'uz: Crimean Tatar (Turkish Alt-Q)' 'kr104' 'kr: 101/104 key Compatible' 'CloGaelach' 'ie: CloGaelach' 'UnicodeExpert' 'ie: UnicodeExpert' 'ogam' 'ie: Ogham' 'ogam_is434' 'ie: Ogham IS434' 'urd-crulp' 'pk: CRULP' 'urd-nla' 'pk: NLA' 'ara' 'pk: Arabic' 'legacy' 'epo: displaced semicolon and quote (obsolete)' 'igbo' 'ng: Igbo' 'yoruba' 'ng: Yoruba' 'hausa' 'ng: Hausa' 'left_hand' 'brai: Left hand' 'right_hand' 'brai: Right hand' 'alt' 'tm: Alt-Q' 'fr-oss' 'ml: Français (France Alternative)' 'us-mac' 'ml: English (USA Macintosh)' 'us-intl' 'ml: English (USA International)' ")

layout=$(sh -c "dialog --stdout \
--backtitle \"Slackware Post-Install Scripts v0.2\" \
--title \"Set Keyboard Layout:\" \
--menu \"Select a keyboard layout:\" \
0 0 10 \
$LAYOUTS")
status=$?
[ $status -eq $DIALOG_CANCEL ] && exit 0
[ $status -eq $DIALOG_ESC ] && exit 0

dialog --stdout \
--backtitle "Slackware Post-Install Scripts v0.2" \
--title "Set Keyboard Layout:" \
--yesno "Would you like to select a variant for 
the layout '$layout'?" \
0 0 
OPTION=$?

if [ $OPTION -eq 0 ] 
then 
	variant=$(sh -c "dialog --stdout \
	--backtitle \"Slackware Post-Install Scripts v0.2\" \
	--title \"Set Keyboard Layout:\" \
	--menu \"Select a keyboard layout variant:\" \
	0 0 10 \
	$VARIANTS")
fi

cat << EOF > /etc/X11/xorg.conf.d/90-keyboard-layout-evdev.conf
Section "InputClass"
	Identifier "keyboard-all"
	MatchIsKeyboard "on"
	MatchDevicePath "/dev/input/event*"
	Driver "evdev"
	Option "XkbLayout" "$layout"
	Option "XkbVariant" "$variant"
	Option "XkbOptions" "terminate:ctrl_alt_bksp"
EndSection
EOF


echo "$layout:$variant" > "$PIS_DIR/gui_keyboard"


dialog --backtitle "Slackware Post-Install Scripts v0.2" --msgbox "The new keyboard layout has been selected with success! You have to restart the X environment for\nthe new configurations become active!" 7 55

