import json import sys def usage(): print("python swap_layers.py ") sys.exit(1) if len(sys.argv) != 5: usage() try: first = int(sys.argv[3]) second = int(sys.argv[4]) except ValueError: usage() if first < 0 or first > 9 or second < 0 or second > 9: print("Layers must be between 0 and 9") usage() if first == second: print("Layers must be unique") usage() layout = json.load(open(sys.argv[1])) maps = layout['keymaps'] first_layer = maps[first] maps[first] = maps[second] maps[second] = first_layer for m in maps: for k in m: if 'layer' in k.get('categories', []): target = k['target'] if target == first: shift = second - first k['target'] = second elif target == second: shift = first - second k['target'] = first else: continue # One shot and pure layer shift keys offset by the layer index into their base, # so we shift by the difference directly for them # dualuse keys multiply by 256 to get the offset, so make that adjustment for it: # https://github.com/keyboardio/Chrysalis/blob/master/src/api/keymap/db/base/dualuse.js#L34 if 'dualuse' in k['categories']: shift *= 256 k['code'] += shift json.dump(layout, open(sys.argv[2], 'w'), sort_keys=True, indent=4)