-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- local groups = {} groups[1] = { '=~', '\'"', ',<', '.>', 'pP', 'yY', 'BS', 'fF', 'gG', 'cC', 'rR', 'lL', '/?', 'TB', 'aA', 'oO', 'eE', 'uU', 'iI', 'RT', 'dD', 'hH', 'tT', 'nN', 'sS', '-_', '*!', ';:', 'qQ', 'jJ', 'kK', 'xX', 'ES', 'bB', 'mM', 'wW', 'vV', 'zZ', '\\|', 'ES', 'IN', 'PU', 'SHL', 'SP', 'CTL', 'CTR', 'SP', 'SHR', 'HM', 'AU', 'ED', 'ES', 'DL', 'PD', 'M2L', 'M1L', 'ATL', 'ATR', 'M1R', 'M2R', 'AL', 'AD', 'AR', } groups[2] = { '~', '`', '#', '{', '}', '!', 'BS', '+', '7', '8', '9', '*', '', 'TB', '%', '&', '(', ')', '=', 'RT', '0', '4', '5', '6', '.', '', '^', '@', '$', '[', ']', '-', 'ES', '-', '1', '2', '3', '/', 'LK', 'ES', 'IN', 'PU', 'SHL', 'SP', 'CTL', 'CTR', 'SP', 'SHR', 'HM', 'AU', 'ED', 'ES', 'DL', 'PD', 'M2L', 'M1L', 'ATL', 'ATR', 'M1R', 'M2R', 'AL', 'AD', 'AR', } groups[3] = { '', 'F9', 'F10', 'F11', 'F12', '', 'BS', 'PU', 'HM', 'AU', 'ED', 'PA', '', 'TB', 'F5', 'F6', 'F7', 'F8', '', 'RT', 'PD', 'AL', 'AD', 'AR', 'CL', '', '', 'F1', 'F2', 'F3', 'F4', '', 'ES', 'IN', 'TB', 'BS', 'DL', 'SL', 'LK', 'ES', 'IN', 'PU', 'SHL', 'SP', 'CTL', 'CTR', 'SP', 'SHR', 'HM', 'AU', 'ED', 'ES', 'DL', 'PD', 'M2L', 'M1L', 'ATL', 'ATR', 'M1R', 'M2R', 'AL', 'AD', 'AR', } groups[4] = { '', 'F21', 'F22', 'F23', 'F24', '', 'BS', 'KP+', 'KP7', 'KP8', 'KP9', 'KP*', '', 'TB', 'F16', 'F18', 'F19', 'F20', '', 'RT', 'KP0', 'KP4', 'KP5', 'KP6', 'KP.', '', '', 'F13', 'F14', 'F15', 'F16', '', 'ES', 'KP-', 'KP1', 'KP2', 'KP3', 'KP/', 'LK', 'ES', 'IN', 'PU', 'SHL', 'SP', 'CTL', 'CTR', 'SP', 'SHR', 'HM', 'AU', 'ED', 'ES', 'DL', 'PD', 'M2L', 'M1L', 'ATL', 'ATR', 'M1R', 'M2R', 'AL', 'AD', 'AR', } -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- local function SwapEntries(map) for g, group in ipairs(groups) do local newgrp = {} for i, kn in ipairs(group) do newgrp[i] = map[kn] or kn end groups[g] = newgrp end end -------------------------------------------------------------------------------- if (nil) then SwapEntries({ ['SHL'] = 'M1L', ['M1L'] = 'SHL', ['SHR'] = 'M1R', ['M2L'] = 'SHL', }) end if (true) then SwapEntries({ [',<'] = ',(', ['.>'] = '.)', ['('] = '{', [')'] = '}', ['{'] = '[', ['}'] = ']', ['['] = '<', [']'] = '>', }) end if (nil) then SwapEntries({ ['1'] = '7', ['KP1'] = 'KP7', ['2'] = '8', ['KP2'] = 'KP8', ['3'] = '9', ['KP3'] = 'KP9', ['4'] = '1', ['KP4'] = 'KP1', ['5'] = '2', ['KP5'] = 'KP2', ['6'] = '3', ['KP6'] = 'KP3', ['7'] = '4', ['KP7'] = 'KP4', ['8'] = '5', ['KP8'] = 'KP5', ['9'] = '6', ['KP9'] = 'KP6', }) end -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- local keysyms = { [''] = 'NoSymbol', SP = 'space', SHL = 'Shift_L', SHR = 'Shift_R', CTL = 'Control_L', CTR = 'Control_R', ATL = 'Alt_L', ATR = 'Alt_R', SHL = 'Shift_L', M1L = 'Super_L', M1R = 'Super_R', M2L = 'Hyper_L', M2R = 'Hyper_R', RT = 'Return', TB = 'Tab', ES = 'Escape', BS = 'BackSpace', DL = 'Delete', IN = 'Insert', HM = 'Home', ED = 'End', AU = 'Up', AD = 'Down', AL = 'Left', AR = 'Right', PU = 'Page_Up', PD = 'Page_Down', ['"'] = 'quotedbl', ["'"] = 'quoteright', ['='] = 'equal', [','] = 'comma', ['.'] = 'period', ['<'] = 'less', ['>'] = 'greater', ['~'] = 'asciitilde', ['`'] = 'grave', ['!'] = 'exclam', ['@'] = 'at', ['#'] = 'numbersign', ['$'] = 'dollar', ['%'] = 'percent', ['^'] = 'asciicircum', ['&'] = 'ampersand', ['*'] = 'asterisk', ['('] = 'parenleft', [')'] = 'parenright', ['['] = 'bracketleft', [']'] = 'bracketright', ['{'] = 'braceleft', ['}'] = 'braceright', [';'] = 'semicolon', [':'] = 'colon', ['/'] = 'slash', ['?'] = 'question', ['\\'] = 'backslash', ['|'] = 'bar', ['-'] = 'minus', ['+'] = 'plus', ['_'] = 'underscore', ['0'] = '0', ['1'] = '1', ['2'] = '2', ['3'] = '3', ['4'] = '4', ['5'] = '5', ['6'] = '6', ['7'] = '7', ['8'] = '8', ['9'] = '9', ['KP0'] = 'KP_0', ['KP1'] = 'KP_1', ['KP2'] = 'KP_2', ['KP3'] = 'KP_3', ['KP4'] = 'KP_4', ['KP5'] = 'KP_5', ['KP6'] = 'KP_6', ['KP7'] = 'KP_7', ['KP8'] = 'KP_8', ['KP9'] = 'KP_9', ['KP+'] = 'KP_Add', ['KP-'] = 'KP_Subtract', ['KP*'] = 'KP_Multiply', ['KP/'] = 'KP_Divide', ['KP.'] = 'KP_Decimal', F1 = 'F1', F2 = 'F2', F3 = 'F3', F4 = 'F4', F5 = 'F5', F6 = 'F6', F7 = 'F7', F8 = 'F8', F9 = 'F9', F10 = 'F10', F11 = 'F11', F12 = 'F12', F13 = 'F13', F14 = 'F14', F15 = 'F15', F16 = 'F16', F17 = 'F17', F18 = 'F18', F19 = 'F19', F20 = 'F20', F20 = 'F21', F21 = 'F22', F22 = 'F23', F23 = 'F24', } -------------------------------------------------------------------------------- local keynames = {} do for letter in ('ABCDE'):gmatch('.') do for i = 5, 0, -1 do keynames[#keynames + 1] = 'L'..letter..i end for i = 0, 5, 1 do keynames[#keynames + 1] = 'R'..letter..i end end table.insert(keynames, 0 + 7, 'MA') table.insert(keynames, 13 + 7, 'MC') table.insert(keynames, 26 + 7, 'ME') end -------------------------------------------------------------------------------- local function ParseKeyset(ks) local lower, upper = ks:match('^(%l)(%u)$') if (lower and upper) then return '['..lower..','..upper..']' end if (keysyms[ks]) then return '[' .. keysyms[ks] .. ']' end local s = '[' for c in ks:gmatch('.') do if (keysyms[c]) then if (s ~= '[') then s = s .. ',' end s = s .. keysyms[c] end end s = s .. ']' return s end -------------------------------------------------------------------------------- print('default xkb_symbols "kbmodal" {') print() print(' name[Group1] = "ascii";') print(' name[Group2] = "NumChars";') print(' name[Group3] = "FuncKeys";') print(' name[Group4] = "MiscKeys";') print() for i, kn in ipairs(keynames) do if (kn ~= 'LE5') then local s = ' key <'..kn..'> { ' for g = 1, 4 do if (g ~= 1) then s = s .. ', ' end s = s .. ParseKeyset(groups[g][i]) end s = s .. ', type = "KBMODAL" };' print(s) end end print(' key { [ ] };') print(' key { [ Cancel ] };') print() print(' // modifier map') print(' modifier_map Shift { Shift_L, Shift_R };') print(' modifier_map Lock { Caps_Lock, ISO_Lock };') print(' modifier_map Control { Control_L, Control_R };') print(' modifier_map Mod1 { Alt_L, Alt_R };') print(' modifier_map Mod2 { Num_Lock };') print() print('};') --------------------------------------------------------------------------------