From 381a9fd55319d1f29783748f5d6d5c5820e81636 Mon Sep 17 00:00:00 2001 From: Manuel Barkhau Date: Sat, 2 Apr 2016 23:07:58 +0200 Subject: [PATCH] use action function for unicode --- .../keymaps/german-manuneo/compile_keymap.py | 273 ++-- .../keymaps/german-manuneo/german-manuneo.hex | Bin 73024 -> 55744 bytes .../keymaps/german-manuneo/keymap.c | 1186 +++++------------ .../keymaps/german-manuneo/keymap.md | 52 +- 4 files changed, 503 insertions(+), 1008 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py b/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py index af68672226..3d26672762 100644 --- a/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py +++ b/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py @@ -20,6 +20,7 @@ import sys import json import unicodedata import collections +import itertools as it PY2 = sys.version_info.major == 2 @@ -27,11 +28,6 @@ if PY2: chr = unichr -BASEPATH = os.path.abspath(os.path.join( - os.path.dirname(__file__), "..", ".." -)) - - KEYBOARD_LAYOUTS = { # These map positions in the parsed layout to # positions in the KEYMAP MATRIX @@ -73,34 +69,33 @@ BLANK_LAYOUTS = [ # Wide Layout """ -.--------------------------------------------. .--------------------------------------------. -| | | | | | | | ! | | | | | | | -!------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+------! -| | | | | | | | ! | | | | | | | -!------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+------! -| | | | | | |-------! !-------! | | | | | | -!------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+------! -| | | | | | | | ! | | | | | | | -'------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+------' - | | | | | | ! | | | | | - '-----------------------------' '-----------------------------' - .---------------. .---------------. - | | | ! | | - .-------+-------+-------! !-------+-------+-------. - ! ! | | ! | ! ! - ! ! !-------! !-------! ! ! - | | | | ! | | | - '-----------------------' '-----------------------' +.---------------------------------------------. .---------------------------------------------. +| | | | | | | | ! | | | | | | | +!-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! +| | | | | | | | ! | | | | | | | +!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! +| | | | | | |-------! !-------! | | | | | | +!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! +| | | | | | | | ! | | | | | | | +'-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' + | | | | | | ! | | | | | + '------------------------------' '------------------------------' + .---------------. .---------------. + | | | ! | | + .-------+-------+-------! !-------+-------+-------. + ! ! | | ! | ! ! + ! ! !-------! !-------! ! ! + | | | | ! | | | + '-----------------------' '-----------------------' """, ] DEFAULT_CONFIG = { - "includes_basedir": "quantum/", "keymaps_includes": [ "keymap_common.h", ], - 'filler': "-+.':x", + 'filler': "-+.'!:x", 'separator': "|", 'default_key_prefix': ["KC_"], } @@ -114,31 +109,34 @@ SECTIONS = [ # Markdown Parsing +ONELINE_COMMENT_RE = re.compile(r""" + ^ # comment must be at the start of the line + \s* # arbitrary whitespace + // # start of the comment + (.*) # the comment + $ # until the end of line +""", re.MULTILINE | re.VERBOSE +) + +INLINE_COMMENT_RE = re.compile(r""" + ([\,\"\[\]\{\}\d]) # anythig that might end a expression + \s+ # comment must be preceded by whitespace + // # start of the comment + \s # and succeded by whitespace + (?:[^\"\]\}\{\[]*) # the comment (except things which might be json) + $ # until the end of line +""", re.MULTILINE | re.VERBOSE) + +TRAILING_COMMA_RE = re.compile(r""" + , # the comma + (?:\s*) # arbitrary whitespace + $ # only works if the trailing comma is followed by newline + (\s*) # arbitrary whitespace + ([\]\}]) # end of an array or object +""", re.MULTILINE | re.VERBOSE) + + def loads(raw_data): - ONELINE_COMMENT_RE = re.compile(r""" - ^ # comment must be at the start of the line - \s* # arbitrary whitespace - // # start of the comment - (.*) # the comment - $ # until the end of line - """, re.MULTILINE | re.VERBOSE) - - INLINE_COMMENT_RE = re.compile(r""" - ([\,\"\[\]\{\}\d]) # anythig that might end a expression - \s+ # comment must be preceded by whitespace - // # start of the comment - \s # and succeded by whitespace - (?:[^\"\]\}\{\[]*) # the comment (except things which might be json) - $ # until the end of line - """, re.MULTILINE | re.VERBOSE) - - TRAILING_COMMA_RE = re.compile(r""" - , # the comma - (?:\s*) # arbitrary whitespace - $ # only works if the trailing comma is followed by newline - (\s*) # arbitrary whitespace - ([\]\}]) # end of an array or object - """, re.MULTILINE | re.VERBOSE) if isinstance(raw_data, bytes): raw_data = raw_data.decode('utf-8') @@ -164,6 +162,8 @@ def parse_config(path): name = line[2:] elif line.startswith("## "): name = line[3:] + else: + name = "" name = name.strip().replace(" ", "_").lower() if name in SECTIONS: @@ -209,6 +209,7 @@ def parse_config(path): pass end_section() + assert 'layout' in config return config # header file parsing @@ -218,16 +219,15 @@ IF0_RE = re.compile(r""" #if 0 $.*? #endif - """, re.MULTILINE | re.DOTALL | re.VERBOSE -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) COMMENT_RE = re.compile(r""" /\* .*? \*/" - """, re.MULTILINE | re.DOTALL | re.VERBOSE -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) + def read_header_file(path): with io.open(path, encoding="utf-8") as fh: @@ -237,7 +237,7 @@ def read_header_file(path): return data -def regex_partial(re_str_fmt, flags=re.MULTILINE | re.DOTALL | re.VERBOSE): +def regex_partial(re_str_fmt, flags): def partial(*args, **kwargs): re_str = re_str_fmt.format(*args, **kwargs) return re.compile(re_str, flags) @@ -251,8 +251,7 @@ KEYDEF_REP = regex_partial(r""" (?:{}) # the prefixes (?:\w+) # the key name ) # capture group end - """ -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) ENUM_RE = re.compile(r""" @@ -264,8 +263,7 @@ ENUM_RE = re.compile(r""" \} ; ) # capture group end - """, re.MULTILINE | re.DOTALL | re.VERBOSE -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) ENUM_KEY_REP = regex_partial(r""" @@ -273,8 +271,8 @@ ENUM_KEY_REP = regex_partial(r""" {} # the prefixes \w+ # the key name ) # capture group end - """ -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) + def parse_keydefs(config, data): prefix_options = "|".join(config['key_prefixes']) @@ -289,26 +287,31 @@ def parse_keydefs(config, data): yield key_match.groups()[0] -def parse_valid_keys(config): - valid_keycodes = set() - paths = [ - os.path.join(BASEPATH, "tmk_core", "common", "keycode.h") - ] + [ - os.path.join( - BASEPATH, config['includes_dir'], include_path - ) for include_path in config['keymaps_includes'] - ] +def parse_valid_keys(config, out_path): + basepath = os.path.abspath(os.path.join(os.path.dirname(out_path))) + dirpaths = [] + subpaths = [] + while len(subpaths) < 6: + path = os.path.join(basepath, *subpaths) + dirpaths.append(path) + dirpaths.append(os.path.join(path, "tmk_core", "common")) + dirpaths.append(os.path.join(path, "quantum")) + subpaths.append('..') - for path in paths: - path = path.replace("/", os.sep) - # the config always uses forward slashe - if os.path.exists(path): - header_data = read_header_file(path) + includes = set(config['keymaps_includes']) + includes.add("keycode.h") + + valid_keycodes = set() + for dirpath, include in it.product(dirpaths, includes): + include_path = os.path.join(dirpath, include) + if os.path.exists(include_path): + header_data = read_header_file(include_path) valid_keycodes.update( parse_keydefs(config, header_data) ) return valid_keycodes + # Keymap Parsing def iter_raw_codes(layer_lines, filler, separator): @@ -325,6 +328,7 @@ def iter_raw_codes(layer_lines, filler, separator): def iter_indexed_codes(raw_codes, key_indexes): key_rows = {} key_indexes_flat = [] + for row_index, key_indexes in enumerate(key_indexes): for key_index in key_indexes: key_rows[key_index] = row_index @@ -384,8 +388,8 @@ def parse_code(raw_code, key_prefixes, valid_keycodes): return raw_code, None, None if MACRO_RE.match(raw_code): - code = macro_id = raw_code[2:-1] - return code, macro_id, None + macro_id = raw_code[2:-1] + return raw_code, macro_id, None if UNICODE_RE.match(raw_code): hex_code = raw_code[1:] @@ -404,10 +408,17 @@ def parse_keymap(config, key_indexes, layer_lines, valid_keycodes): layer_lines, config['filler'], config['separator'] )) indexed_codes = iter_indexed_codes(raw_codes, key_indexes) + key_prefixes = config['key_prefixes'] for raw_code, key_index, row_index in indexed_codes: code, macro_id, uc_hex = parse_code( - raw_code, config['key_prefixes'], valid_keycodes + raw_code, key_prefixes, valid_keycodes ) + # TODO: line numbers for invalid codes + err_msg = "Could not parse key '{}' on row {}".format( + raw_code, row_index + ) + assert code is not None, err_msg + # print(repr(raw_code), repr(code), macro_id, uc_hex) if macro_id: config['macro_ids'].add(macro_id) if uc_hex: @@ -482,9 +493,64 @@ void matrix_scan_user(void) { MACROCODE = """ #define UC_MODE_WIN 0 #define UC_MODE_LINUX 1 +#define UC_MODE_OSX 2 +// TODO: allow default mode to be configured static uint16_t unicode_mode = UC_MODE_WIN; +uint16_t hextokeycode(uint8_t hex) {{ + if (hex == 0x0) {{ + return KC_P0; + }} + if (hex < 0xA) {{ + return KC_P1 + (hex - 0x1); + }} + return KC_A + (hex - 0xA); +}} + +void unicode_action_function(uint16_t hi, uint16_t lo) {{ + switch (unicode_mode) {{ + case UC_MODE_WIN: + register_code(KC_LALT); + + register_code(KC_PPLS); + unregister_code(KC_PPLS); + + register_code(hextokeycode((hi & 0xF0) >> 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LALT); + break; + case UC_MODE_LINUX: + register_code(KC_LCTL); + register_code(KC_LSFT); + + register_code(KC_U); + unregister_code(KC_U); + + register_code(hextokeycode((hi & 0xF0) >> 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LCTL); + unregister_code(KC_LSFT); + break; + case UC_MODE_OSX: + break; + }} +}} + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{ if (!record->event.pressed) {{ return MACRO_NONE; @@ -494,57 +560,35 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{ case UM: unicode_mode = (unicode_mode + 1) % 2; break; - {macro_cases} +{macro_cases} +{unicode_macro_cases} default: break; }} - if (unicode_mode == UC_MODE_WIN) {{ - switch(id) {{ - {win_macro_cases} - default: - break; - }} - }} else if (unicode_mode == UC_MODE_LINUX) {{ - switch(id) {{ - {linux_macro_cases} - default: - break; - }} - }} return MACRO_NONE; }}; """ -WIN_UNICODE_MACRO_TEMPLATE = """ -case {0}: - return MACRODOWN( - D(LALT), T(KP_PLUS), {1}, U(LALT), END - ); -""" -LINUX_UNICODE_MACRO_TEMPLATE = """ -case {0}: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), {1}, T(KP_ENTER), END - ); -""" +UNICODE_MACRO_TEMPLATE = """ +case {macro_id}: + unicode_action_function(0x{hi:02x}, 0x{lo:02x}); + break; +""".strip() -def macro_cases(config, mode): - if mode == 'win': - template = WIN_UNICODE_MACRO_TEMPLATE - elif mode == 'linux': - template = LINUX_UNICODE_MACRO_TEMPLATE - else: - raise ValueError("Invalid mode: ", mode) - template = template.strip() +def unicode_macro_cases(config): for macro_id, uc_hex in config['unicode_macros'].items(): + hi = int(uc_hex, 16) >> 8 + lo = int(uc_hex, 16) & 0xFF unimacro_keys = ", ".join( "T({})".format( "KP_" + digit if digit.isdigit() else digit ) for digit in uc_hex ) - yield template.format(macro_id, unimacro_keys) + yield UNICODE_MACRO_TEMPLATE.format( + macro_id=macro_id, hi=hi, lo=lo + ) def iter_keymap_lines(keymap): @@ -599,8 +643,7 @@ def iter_keymap_parts(config, keymaps): # macros yield MACROCODE.format( macro_cases="", - win_macro_cases="\n".join(macro_cases(config, mode='win')), - linux_macro_cases="\n".join(macro_cases(config, mode='linux')), + unicode_macro_cases="\n".join(unicode_macro_cases(config)), ) # TODO: dynamically create blinking lights @@ -624,7 +667,7 @@ def main(argv=sys.argv[1:]): out_path = os.path.join(dirname, "keymap.c") config = parse_config(in_path) - valid_keys = parse_valid_keys(config) + valid_keys = parse_valid_keys(config, out_path) keymaps = parse_keymaps(config, valid_keys) with io.open(out_path, mode="w", encoding="utf-8") as fh: diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex b/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex index cb8b7fa8d4c84f892194da543aab7cbdb0dee60c..ee1d30967d6a6df904d2875e98ca005b264311ec 100644 GIT binary patch literal 55744 zcma)_S(fX%j&1*QjO>e5xO#ss``@HD=OUm`I3mu@eQsRa5=DX_2%=b|{@-+{e~;@r z&4=~C=kfIObA9~p|NK7-=Yc;8^~3K=6`rm9m%{7&@b>yVQQfl&FMkx?lk@DF*N?)_ z)BJ<>xeFgZ3ZIYD>yxbWyT~|w6y7)A58b-v^Z%jnwF_VV4}~vX`1*e+eD1=x|0sN0 z4oAp5uE*-&ox;aE|2rOz&&T1&P@LY=;rKrD{c$)gx5Mex!~LM}Y=PV1xXg#sdO93m zJUlOl(@f#hlZv|VlftK!3-jT4yB>~LYCTcw%tQCr;W(|_Zkk^do}SclJ)Eu-dhmCn zAR~L6Bmwe{UGtm5mkTx0+?5v2(2a1NE|9X&%8Pr?*XUp*^a2SFZcylWqwtaDS3b|Q zaE2puaYF$-Jm}n&zr%^%L&k-sZ*K}w@J`K#Q`H=KrsoG}esc3j!Iw4j{X_-G_3?79 z!pidlTHpLF)Imp&4Ak)s&2Reg;O}^^!pbwm%Bs_g&xM;8YChUA9z4;PM~UbZd8YS_ z)DfN^pVCU_Rthc*)^t9c9*3$~c|LmsGM@IH!VJXmLY246bhs|lbZXWq&wcTAb8=2o z3NTZdH58oImW@ey_QLfs{+@iFZWE(7o&8(p>G)WR4CUF2^L2s~)9JlVr!IK7K=F|- zG#QcS6@E>s(|g&o2w|$tWJs zbO$(dfaiyqW@qkgtW%y5MMRH3_^8O9VE*jWTt{IZ&TG{idCsh*Qa)!ctmz1!*2KS8 z3BM##;*@{jN~2G5~PrNu-6V{jXkn_K;tn$T!-f6Hpr0vaO=g*m4{{@ zkZpV}_JO~pq%QqHa1KZv45bj`&jd&#Go7CKeknncqyvIOmni^IN19rx8QDHeRstzY zaU-NLyARBW@vrIHeJ-W>L!zY^UR#-$3tZV1gkAHiWFw@W)@h~CL6W*46wNd{Q^UNJ zY)HSI_*UD@!?RPMT6lJ0N4YP~X9}IF(C+%XJD8EShQ8UKO*g-f*BX?F!M-rxQCmve zJU_$K!@ZQu95JX`(58;y%t(Ff!=;B?d8W_|TV{s$TOs?hFl2Lπ>2!e1EYO=_06 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

A3n*N%w!9N=Y($G8_sd_KSy*eCh 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 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LALT); + break; + case UC_MODE_LINUX: + register_code(KC_LCTL); + register_code(KC_LSFT); + + register_code(KC_U); + unregister_code(KC_U); + + register_code(hextokeycode((hi & 0xF0) >> 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LCTL); + unregister_code(KC_LSFT); + break; + case UC_MODE_OSX: + break; + } +} + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { if (!record->event.pressed) { return MACRO_NONE; @@ -470,773 +447,292 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { case UM: unicode_mode = (unicode_mode + 1) % 2; break; - + +case UC_GREEK_SMALL_LETTER_OMICRON: + unicode_action_function(0x03, 0xbf); + break; +case UC_LEFTWARDS_ARROW: + unicode_action_function(0x21, 0x90); + break; +case UC_GREEK_CAPITAL_LETTER_RHO: + unicode_action_function(0x03, 0xa1); + break; +case UC_SUBSCRIPT_THREE: + unicode_action_function(0x20, 0x83); + break; +case UC_VULGAR_FRACTION_ONE_EIGHTH: + unicode_action_function(0x21, 0x5b); + break; +case UC_GREEK_SMALL_LETTER_LAMDA: + unicode_action_function(0x03, 0xbb); + break; +case UC_VULGAR_FRACTION_ONE_THIRD: + unicode_action_function(0x21, 0x53); + break; +case UC_GREEK_SMALL_LETTER_XI: + unicode_action_function(0x03, 0xbe); + break; +case UC_THERE_DOES_NOT_EXIST: + unicode_action_function(0x22, 0x04); + break; +case UC_SUPERSCRIPT_ONE: + unicode_action_function(0x00, 0xb9); + break; +case UC_GREEK_SMALL_LETTER_BETA: + unicode_action_function(0x03, 0xb2); + break; +case UC_SUBSCRIPT_FIVE: + unicode_action_function(0x20, 0x85); + break; +case UC_GREEK_CAPITAL_LETTER_IOTA: + unicode_action_function(0x03, 0x99); + break; +case UC_VULGAR_FRACTION_ONE_FIFTH: + unicode_action_function(0x21, 0x55); + break; +case UC_GREEK_SMALL_LETTER_PSI: + unicode_action_function(0x03, 0xc8); + break; +case UC_SUBSCRIPT_NINE: + unicode_action_function(0x20, 0x89); + break; +case UC_SUPERSCRIPT_FOUR: + unicode_action_function(0x20, 0x74); + break; +case UC_RIGHTWARDS_ARROW: + unicode_action_function(0x21, 0x92); + break; +case UC_SUPERSCRIPT_SIX: + unicode_action_function(0x20, 0x76); + break; +case UC_DOWNWARDS_ARROW: + unicode_action_function(0x21, 0x93); + break; +case UC_GREEK_SMALL_LETTER_PI: + unicode_action_function(0x03, 0xc0); + break; +case UC_SUPERSCRIPT_TWO: + unicode_action_function(0x00, 0xb2); + break; +case UC_GREEK_CAPITAL_LETTER_OMEGA: + unicode_action_function(0x03, 0xa9); + break; +case UC_GREEK_CAPITAL_LETTER_PSI: + unicode_action_function(0x03, 0xa8); + break; +case UC_SUBSCRIPT_FOUR: + unicode_action_function(0x20, 0x84); + break; +case UC_GREEK_CAPITAL_LETTER_NU: + unicode_action_function(0x03, 0x9d); + break; +case UC_DIVISION_SIGN: + unicode_action_function(0x00, 0xf7); + break; +case UC_GREEK_SMALL_LETTER_SIGMA: + unicode_action_function(0x03, 0xc3); + break; +case UC_GREEK_SMALL_LETTER_RHO: + unicode_action_function(0x03, 0xc1); + break; +case UC_VULGAR_FRACTION_ONE_SIXTH: + unicode_action_function(0x21, 0x59); + break; +case UC_GREEK_SMALL_LETTER_GAMMA: + unicode_action_function(0x03, 0xb3); + break; +case UC_VULGAR_FRACTION_TWO_THIRDS: + unicode_action_function(0x21, 0x54); + break; +case UC_GREEK_SMALL_LETTER_NU: + unicode_action_function(0x03, 0xbd); + break; +case UC_GREEK_SMALL_LETTER_ZETA: + unicode_action_function(0x03, 0xb6); + break; +case UC_GREEK_SMALL_LETTER_EPSILON: + unicode_action_function(0x03, 0xb5); + break; +case UC_GREEK_SMALL_LETTER_KAPPA: + unicode_action_function(0x03, 0xba); + break; +case UC_SUPERSCRIPT_SEVEN: + unicode_action_function(0x20, 0x77); + break; +case UC_GREEK_CAPITAL_LETTER_PI: + unicode_action_function(0x03, 0xa0); + break; +case UC_GREEK_SMALL_LETTER_FINAL_SIGMA: + unicode_action_function(0x03, 0xc2); + break; +case UC_GREEK_CAPITAL_LETTER_XI: + unicode_action_function(0x03, 0x9e); + break; +case UC_GREEK_SMALL_LETTER_THETA: + unicode_action_function(0x03, 0xb8); + break; +case UC_GREEK_SMALL_LETTER_ETA: + unicode_action_function(0x03, 0xb7); + break; +case UC_SUBSCRIPT_TWO: + unicode_action_function(0x20, 0x82); + break; +case UC_ASYMPTOTICALLY_EQUAL_TO: + unicode_action_function(0x22, 0x43); + break; +case UC_GREEK_SMALL_LETTER_ALPHA: + unicode_action_function(0x03, 0xb1); + break; +case UC_GREEK_CAPITAL_LETTER_PHI: + unicode_action_function(0x03, 0xa6); + break; +case UC_GREEK_SMALL_LETTER_PHI: + unicode_action_function(0x03, 0xc6); + break; +case UC_INFINITY: + unicode_action_function(0x22, 0x1e); + break; +case UC_GREEK_CAPITAL_LETTER_OMICRON: + unicode_action_function(0x03, 0x9f); + break; +case UC_ELEMENT_OF: + unicode_action_function(0x22, 0x08); + break; +case UC_MULTIPLICATION_SIGN: + unicode_action_function(0x00, 0xd7); + break; +case UC_SUBSCRIPT_ZERO: + unicode_action_function(0x20, 0x80); + break; +case UC_GREEK_CAPITAL_LETTER_SIGMA: + unicode_action_function(0x03, 0xa3); + break; +case UC_GREEK_SMALL_LETTER_OMEGA: + unicode_action_function(0x03, 0xc9); + break; +case UC_SUBSCRIPT_ONE: + unicode_action_function(0x20, 0x81); + break; +case UC_GREEK_CAPITAL_LETTER_ZETA: + unicode_action_function(0x03, 0x96); + break; +case UC_GREEK_SMALL_LETTER_TAU: + unicode_action_function(0x03, 0xc4); + break; +case UC_SUPERSCRIPT_FIVE: + unicode_action_function(0x20, 0x75); + break; +case UC_THERE_EXISTS: + unicode_action_function(0x22, 0x03); + break; +case UC_PLUS_MINUS_SIGN: + unicode_action_function(0x00, 0xb1); + break; +case UC_VULGAR_FRACTION_THREE_QUARTERS: + unicode_action_function(0x00, 0xbe); + break; +case UC_SUPERSCRIPT_THREE: + unicode_action_function(0x00, 0xb3); + break; +case UC_EMPTY_SET: + unicode_action_function(0x22, 0x05); + break; +case UC_UPWARDS_ARROW: + unicode_action_function(0x21, 0x91); + break; +case UC_SUPERSCRIPT_NINE: + unicode_action_function(0x20, 0x79); + break; +case UC_GREEK_SMALL_LETTER_DELTA: + unicode_action_function(0x03, 0xb4); + break; +case UC_GREEK_SMALL_LETTER_MU: + unicode_action_function(0x03, 0xbc); + break; +case UC_GREEK_CAPITAL_LETTER_KAPPA: + unicode_action_function(0x03, 0x9a); + break; +case UC_SUBSCRIPT_EIGHT: + unicode_action_function(0x20, 0x88); + break; +case UC_GREEK_CAPITAL_LETTER_ALPHA: + unicode_action_function(0x03, 0x91); + break; +case UC_SUBSCRIPT_SEVEN: + unicode_action_function(0x20, 0x87); + break; +case UC_GREEK_CAPITAL_LETTER_BETA: + unicode_action_function(0x03, 0x92); + break; +case UC_GREEK_CAPITAL_LETTER_ETA: + unicode_action_function(0x03, 0x97); + break; +case UC_SUPERSCRIPT_EIGHT: + unicode_action_function(0x20, 0x78); + break; +case UC_SUPERSCRIPT_ZERO: + unicode_action_function(0x20, 0x70); + break; +case UC_NOT_AN_ELEMENT_OF: + unicode_action_function(0x22, 0x09); + break; +case UC_GREEK_SMALL_LETTER_UPSILON: + unicode_action_function(0x03, 0xc5); + break; +case UC_NOT_EQUAL_TO: + unicode_action_function(0x22, 0x60); + break; +case UC_GREEK_CAPITAL_LETTER_CHI: + unicode_action_function(0x03, 0xa7); + break; +case UC_FOR_ALL: + unicode_action_function(0x22, 0x00); + break; +case UC_GREEK_CAPITAL_LETTER_TAU: + unicode_action_function(0x03, 0xa4); + break; +case UC_VULGAR_FRACTION_ONE_QUARTER: + unicode_action_function(0x00, 0xbc); + break; +case UC_GREEK_SMALL_LETTER_CHI: + unicode_action_function(0x03, 0xc7); + break; +case UC_GREEK_CAPITAL_LETTER_THETA: + unicode_action_function(0x03, 0x98); + break; +case UC_GREEK_SMALL_LETTER_IOTA: + unicode_action_function(0x03, 0xb9); + break; +case UC_GREEK_CAPITAL_LETTER_LAMDA: + unicode_action_function(0x03, 0x9b); + break; +case UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N: + unicode_action_function(0x20, 0x7f); + break; +case UC_GREEK_CAPITAL_LETTER_UPSILON: + unicode_action_function(0x03, 0xa5); + break; +case UC_GREEK_CAPITAL_LETTER_MU: + unicode_action_function(0x03, 0x9c); + break; +case UC_GREEK_CAPITAL_LETTER_EPSILON: + unicode_action_function(0x03, 0x95); + break; +case UC_GREEK_CAPITAL_LETTER_GAMMA: + unicode_action_function(0x03, 0x93); + break; +case UC_SUBSCRIPT_SIX: + unicode_action_function(0x20, 0x86); + break; +case UC_GREEK_CAPITAL_LETTER_DELTA: + unicode_action_function(0x03, 0x94); + break; +case UC_VULGAR_FRACTION_ONE_HALF: + unicode_action_function(0x00, 0xbd); + break; default: break; } - if (unicode_mode == UC_MODE_WIN) { - switch(id) { - case UC_GREEK_SMALL_LETTER_OMICRON: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(F), U(LALT), END - ); -case UC_LEFTWARDS_ARROW: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_1), T(KP_9), T(KP_0), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_RHO: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(A), T(KP_1), U(LALT), END - ); -case UC_SUBSCRIPT_THREE: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_3), U(LALT), END - ); -case UC_VULGAR_FRACTION_ONE_EIGHTH: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_1), T(KP_5), T(B), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_LAMDA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(B), U(LALT), END - ); -case UC_VULGAR_FRACTION_ONE_THIRD: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_1), T(KP_5), T(KP_3), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_XI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(E), U(LALT), END - ); -case UC_THERE_DOES_NOT_EXIST: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_2), T(KP_0), T(KP_4), U(LALT), END - ); -case UC_SUPERSCRIPT_ONE: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_0), T(B), T(KP_9), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_BETA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(KP_2), U(LALT), END - ); -case UC_SUBSCRIPT_FIVE: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_5), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_IOTA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(KP_9), U(LALT), END - ); -case UC_VULGAR_FRACTION_ONE_FIFTH: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_1), T(KP_5), T(KP_5), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_PSI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_8), U(LALT), END - ); -case UC_SUBSCRIPT_NINE: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_9), U(LALT), END - ); -case UC_SUPERSCRIPT_FOUR: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_7), T(KP_4), U(LALT), END - ); -case UC_RIGHTWARDS_ARROW: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_1), T(KP_9), T(KP_2), U(LALT), END - ); -case UC_SUPERSCRIPT_SIX: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_7), T(KP_6), U(LALT), END - ); -case UC_DOWNWARDS_ARROW: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_1), T(KP_9), T(KP_3), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_PI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_0), U(LALT), END - ); -case UC_SUPERSCRIPT_TWO: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_0), T(B), T(KP_2), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_OMEGA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(A), T(KP_9), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_PSI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(A), T(KP_8), U(LALT), END - ); -case UC_SUBSCRIPT_FOUR: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_4), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_NU: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(D), U(LALT), END - ); -case UC_DIVISION_SIGN: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_0), T(F), T(KP_7), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_SIGMA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_3), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_RHO: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_1), U(LALT), END - ); -case UC_VULGAR_FRACTION_ONE_SIXTH: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_1), T(KP_5), T(KP_9), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_GAMMA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(KP_3), U(LALT), END - ); -case UC_VULGAR_FRACTION_TWO_THIRDS: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_1), T(KP_5), T(KP_4), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_NU: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(D), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_ZETA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(KP_6), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_EPSILON: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(KP_5), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_KAPPA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(A), U(LALT), END - ); -case UC_SUPERSCRIPT_SEVEN: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_7), T(KP_7), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_PI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(A), T(KP_0), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_FINAL_SIGMA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_2), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_XI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(E), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_THETA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(KP_8), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_ETA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(KP_7), U(LALT), END - ); -case UC_SUBSCRIPT_TWO: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_2), U(LALT), END - ); -case UC_ASYMPTOTICALLY_EQUAL_TO: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_2), T(KP_4), T(KP_3), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_ALPHA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(KP_1), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_PHI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(A), T(KP_6), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_PHI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_6), U(LALT), END - ); -case UC_INFINITY: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_2), T(KP_1), T(E), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_OMICRON: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(F), U(LALT), END - ); -case UC_ELEMENT_OF: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_2), T(KP_0), T(KP_8), U(LALT), END - ); -case UC_MULTIPLICATION_SIGN: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_0), T(D), T(KP_7), U(LALT), END - ); -case UC_SUBSCRIPT_ZERO: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_0), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_SIGMA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(A), T(KP_3), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_OMEGA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_9), U(LALT), END - ); -case UC_SUBSCRIPT_ONE: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_1), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_ZETA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(KP_6), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_TAU: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_4), U(LALT), END - ); -case UC_SUPERSCRIPT_FIVE: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_7), T(KP_5), U(LALT), END - ); -case UC_THERE_EXISTS: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_2), T(KP_0), T(KP_3), U(LALT), END - ); -case UC_PLUS_MINUS_SIGN: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_0), T(B), T(KP_1), U(LALT), END - ); -case UC_VULGAR_FRACTION_THREE_QUARTERS: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_0), T(B), T(E), U(LALT), END - ); -case UC_SUPERSCRIPT_THREE: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_0), T(B), T(KP_3), U(LALT), END - ); -case UC_EMPTY_SET: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_2), T(KP_0), T(KP_5), U(LALT), END - ); -case UC_UPWARDS_ARROW: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_1), T(KP_9), T(KP_1), U(LALT), END - ); -case UC_SUPERSCRIPT_NINE: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_7), T(KP_9), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_DELTA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(KP_4), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_MU: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(C), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_KAPPA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(A), U(LALT), END - ); -case UC_SUBSCRIPT_EIGHT: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_8), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_ALPHA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(KP_1), U(LALT), END - ); -case UC_SUBSCRIPT_SEVEN: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_7), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_BETA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(KP_2), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_ETA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(KP_7), U(LALT), END - ); -case UC_SUPERSCRIPT_EIGHT: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_7), T(KP_8), U(LALT), END - ); -case UC_SUPERSCRIPT_ZERO: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_7), T(KP_0), U(LALT), END - ); -case UC_NOT_AN_ELEMENT_OF: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_2), T(KP_0), T(KP_9), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_UPSILON: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_5), U(LALT), END - ); -case UC_NOT_EQUAL_TO: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_2), T(KP_6), T(KP_0), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_CHI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(A), T(KP_7), U(LALT), END - ); -case UC_FOR_ALL: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_2), T(KP_0), T(KP_0), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_TAU: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(A), T(KP_4), U(LALT), END - ); -case UC_VULGAR_FRACTION_ONE_QUARTER: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_0), T(B), T(C), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_CHI: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(C), T(KP_7), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_THETA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(KP_8), U(LALT), END - ); -case UC_GREEK_SMALL_LETTER_IOTA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(B), T(KP_9), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_LAMDA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(B), U(LALT), END - ); -case UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_7), T(F), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_UPSILON: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(A), T(KP_5), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_MU: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(C), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_EPSILON: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(KP_5), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_GAMMA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(KP_3), U(LALT), END - ); -case UC_SUBSCRIPT_SIX: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_2), T(KP_0), T(KP_8), T(KP_6), U(LALT), END - ); -case UC_GREEK_CAPITAL_LETTER_DELTA: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_3), T(KP_9), T(KP_4), U(LALT), END - ); -case UC_VULGAR_FRACTION_ONE_HALF: - return MACRODOWN( - D(LALT), T(KP_PLUS), T(KP_0), T(KP_0), T(B), T(D), U(LALT), END - ); - default: - break; - } - } else if (unicode_mode == UC_MODE_LINUX) { - switch(id) { - case UC_GREEK_SMALL_LETTER_OMICRON: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(F), T(KP_ENTER), END - ); -case UC_LEFTWARDS_ARROW: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_1), T(KP_9), T(KP_0), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_RHO: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(A), T(KP_1), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_THREE: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_3), T(KP_ENTER), END - ); -case UC_VULGAR_FRACTION_ONE_EIGHTH: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_1), T(KP_5), T(B), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_LAMDA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(B), T(KP_ENTER), END - ); -case UC_VULGAR_FRACTION_ONE_THIRD: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_1), T(KP_5), T(KP_3), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_XI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(E), T(KP_ENTER), END - ); -case UC_THERE_DOES_NOT_EXIST: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_2), T(KP_0), T(KP_4), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_ONE: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_0), T(B), T(KP_9), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_BETA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(KP_2), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_FIVE: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_5), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_IOTA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(KP_9), T(KP_ENTER), END - ); -case UC_VULGAR_FRACTION_ONE_FIFTH: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_1), T(KP_5), T(KP_5), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_PSI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_8), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_NINE: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_9), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_FOUR: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_7), T(KP_4), T(KP_ENTER), END - ); -case UC_RIGHTWARDS_ARROW: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_1), T(KP_9), T(KP_2), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_SIX: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_7), T(KP_6), T(KP_ENTER), END - ); -case UC_DOWNWARDS_ARROW: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_1), T(KP_9), T(KP_3), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_PI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_0), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_TWO: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_0), T(B), T(KP_2), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_OMEGA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(A), T(KP_9), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_PSI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(A), T(KP_8), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_FOUR: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_4), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_NU: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(D), T(KP_ENTER), END - ); -case UC_DIVISION_SIGN: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_0), T(F), T(KP_7), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_SIGMA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_3), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_RHO: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_1), T(KP_ENTER), END - ); -case UC_VULGAR_FRACTION_ONE_SIXTH: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_1), T(KP_5), T(KP_9), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_GAMMA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(KP_3), T(KP_ENTER), END - ); -case UC_VULGAR_FRACTION_TWO_THIRDS: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_1), T(KP_5), T(KP_4), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_NU: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(D), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_ZETA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(KP_6), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_EPSILON: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(KP_5), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_KAPPA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(A), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_SEVEN: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_7), T(KP_7), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_PI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(A), T(KP_0), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_FINAL_SIGMA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_2), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_XI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(E), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_THETA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(KP_8), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_ETA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(KP_7), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_TWO: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_2), T(KP_ENTER), END - ); -case UC_ASYMPTOTICALLY_EQUAL_TO: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_2), T(KP_4), T(KP_3), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_ALPHA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(KP_1), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_PHI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(A), T(KP_6), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_PHI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_6), T(KP_ENTER), END - ); -case UC_INFINITY: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_2), T(KP_1), T(E), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_OMICRON: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(F), T(KP_ENTER), END - ); -case UC_ELEMENT_OF: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_2), T(KP_0), T(KP_8), T(KP_ENTER), END - ); -case UC_MULTIPLICATION_SIGN: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_0), T(D), T(KP_7), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_ZERO: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_0), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_SIGMA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(A), T(KP_3), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_OMEGA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_9), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_ONE: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_1), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_ZETA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(KP_6), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_TAU: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_4), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_FIVE: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_7), T(KP_5), T(KP_ENTER), END - ); -case UC_THERE_EXISTS: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_2), T(KP_0), T(KP_3), T(KP_ENTER), END - ); -case UC_PLUS_MINUS_SIGN: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_0), T(B), T(KP_1), T(KP_ENTER), END - ); -case UC_VULGAR_FRACTION_THREE_QUARTERS: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_0), T(B), T(E), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_THREE: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_0), T(B), T(KP_3), T(KP_ENTER), END - ); -case UC_EMPTY_SET: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_2), T(KP_0), T(KP_5), T(KP_ENTER), END - ); -case UC_UPWARDS_ARROW: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_1), T(KP_9), T(KP_1), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_NINE: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_7), T(KP_9), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_DELTA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(KP_4), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_MU: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(C), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_KAPPA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(A), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_EIGHT: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_8), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_ALPHA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(KP_1), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_SEVEN: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_7), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_BETA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(KP_2), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_ETA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(KP_7), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_EIGHT: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_7), T(KP_8), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_ZERO: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_7), T(KP_0), T(KP_ENTER), END - ); -case UC_NOT_AN_ELEMENT_OF: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_2), T(KP_0), T(KP_9), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_UPSILON: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_5), T(KP_ENTER), END - ); -case UC_NOT_EQUAL_TO: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_2), T(KP_6), T(KP_0), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_CHI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(A), T(KP_7), T(KP_ENTER), END - ); -case UC_FOR_ALL: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_2), T(KP_0), T(KP_0), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_TAU: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(A), T(KP_4), T(KP_ENTER), END - ); -case UC_VULGAR_FRACTION_ONE_QUARTER: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_0), T(B), T(C), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_CHI: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(C), T(KP_7), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_THETA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(KP_8), T(KP_ENTER), END - ); -case UC_GREEK_SMALL_LETTER_IOTA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(B), T(KP_9), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_LAMDA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(B), T(KP_ENTER), END - ); -case UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_7), T(F), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_UPSILON: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(A), T(KP_5), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_MU: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(C), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_EPSILON: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(KP_5), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_GAMMA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(KP_3), T(KP_ENTER), END - ); -case UC_SUBSCRIPT_SIX: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_2), T(KP_0), T(KP_8), T(KP_6), T(KP_ENTER), END - ); -case UC_GREEK_CAPITAL_LETTER_DELTA: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_3), T(KP_9), T(KP_4), T(KP_ENTER), END - ); -case UC_VULGAR_FRACTION_ONE_HALF: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), T(KP_0), T(KP_0), T(B), T(D), T(KP_ENTER), END - ); - default: - break; - } - } return MACRO_NONE; }; diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md b/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md index 1dc019ab05..2c9e0a8376 100644 --- a/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md +++ b/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md @@ -2,14 +2,15 @@ Compile this file to a `keymap.c` file using `compile_keymap.py` - compile_keymap.py keymaps/german-manuneo/keymap.md + python compile_keymap.py keymaps/german-manuneo/keymap.md + +Tested with python 2.7 and python 3.4 # Layout Config { "layout": "ergodox_ez", - "includes_dir": "quantum/", "keymaps_includes": [ "ergodox_ez.h", "action_layer.h", @@ -17,8 +18,6 @@ Compile this file to a `keymap.c` file using `compile_keymap.py` "keymap_extras/keymap_german.h", ], "key_prefixes": ["DE_", "KC_"], - "filler": "-+.'!x", - "separator": "|", "macros": { // TODO: implement macros // "MUC": "", @@ -41,7 +40,7 @@ Compile this file to a `keymap.c` file using `compile_keymap.py` !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |MO(3)| UE | OE | AE | C | V |END | TAB | B | M |COMM| DOT| UP | Y | '-----+----+----+----+----+----------'----------+----+----+----+----+-----' - | | |LGUI|LALT|LCTL| !LALT| |LEFT|DOWN|RGHT| + | | |LGUI|LALT|LCTL| !RCTL|RALT|LEFT|DOWN|RGHT| '------------------------' '------------------------' .-----------. .-----------. |INS |TG(2)| !M(UM)|DELT | @@ -187,46 +186,3 @@ http://symbolcodes.tlt.psu.edu/bylanguage/mathchart.html | | | | ! | | | '-----------------' '-----------------' - -## Layer 7 - - .------------------------------------.------------------------------------. - | | | | | | | | | | | | | | | - !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! - | | | | | | | | | | | | | | | - !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | | | | | | |-----!-----! | | | | | | - !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | | | | | | | | | | | | | | | - '-----+----+----+----+----+----------'----------+----+----+----+----+-----' - | | | | | | ! | | | | | - '------------------------' '------------------------' - .-----------. .-----------. - | | | ! | | - .-----+-----+-----! !-----+-----+-----. - ! ! | | ! | ! ! - ! ! !-----! !-----! ! ! - | | | | ! | | | - '-----------------' '-----------------' - - -## Layer 8 - - .------------------------------------.------------------------------------. - | | | | | | | | | | | | | | | - !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! - | | | | | | | | | | | | | | | - !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | | | | | | |-----!-----! | | | | | | - !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | | | | | | | | | | | | | | | - '-----+----+----+----+----+----------'----------+----+----+----+----+-----' - | | | | | | ! | | | | | - '------------------------' '------------------------' - .-----------. .-----------. - | | | ! | | - .-----+-----+-----! !-----+-----+-----. - ! ! | | ! | ! ! - ! ! !-----! !-----! ! ! - | | | | ! | | | - '-----------------' '-----------------'