Merge pull request #535 from algernon/ergodox-ez/algernon
ergodox_ez: Update my keymap to v1.3b6_b7_audio
commit
36f2e22283
After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 103 KiB |
After Width: | Height: | Size: 135 KiB |
@ -0,0 +1,533 @@ |
||||
[ |
||||
{ |
||||
"backcolor": "#ffffff", |
||||
"name": "ErgoDox - algernon's layout: Heatmap", |
||||
"author": "Gergely Nagy <kbd@gergo.csillger.hu>", |
||||
"notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.", |
||||
"switchMount": "cherry", |
||||
"switchBrand": "gateron", |
||||
"switchType": "KS-3-Tea", |
||||
"pcb": true, |
||||
"css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }" |
||||
}, |
||||
[ |
||||
{ |
||||
"x": 3.5, |
||||
"c": "#a7d0db", |
||||
"fa": [ |
||||
0, |
||||
0, |
||||
2 |
||||
] |
||||
}, |
||||
"#\n3\nF3", |
||||
{ |
||||
"x": 10.5, |
||||
"c": "#a7d0db", |
||||
"t": "#000000", |
||||
"a": 4, |
||||
"fa": [ |
||||
0, |
||||
0, |
||||
2 |
||||
] |
||||
}, |
||||
"*\n8\nF8" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"x": 2.5, |
||||
"c": "#bfbad1", |
||||
"t": "#0d0d0b" |
||||
}, |
||||
"@\n2\nF2", |
||||
{ |
||||
"x": 1, |
||||
"c": "#7adabd", |
||||
"t": "#000000" |
||||
}, |
||||
"$\n4\nF4", |
||||
{ |
||||
"x": 8.5 |
||||
}, |
||||
"&\n7\nF7", |
||||
{ |
||||
"x": 1, |
||||
"c": "#bfbad1", |
||||
"t": "#0d0d0b" |
||||
}, |
||||
"(\n9\nF9" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"x": 5.5, |
||||
"c": "#7adabd", |
||||
"t": "#000000" |
||||
}, |
||||
"%\n5\nF5", |
||||
{ |
||||
"c": "#f9cd31", |
||||
"a": 7, |
||||
"f": 2 |
||||
}, |
||||
"STENO", |
||||
{ |
||||
"x": 4.5, |
||||
"f": 6 |
||||
}, |
||||
"<i class='mss mss-Unicode-Option-3'></i>", |
||||
{ |
||||
"c": "#7adabd", |
||||
"a": 4, |
||||
"f": 3, |
||||
"fa": [ |
||||
0, |
||||
0, |
||||
2 |
||||
] |
||||
}, |
||||
"^\n6\nF6" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"c": "#ffb2d2", |
||||
"f": 3, |
||||
"w": 1.5 |
||||
}, |
||||
"\n\n~\n`", |
||||
{ |
||||
"t": "#0d0d0b" |
||||
}, |
||||
"!\n1\nF1", |
||||
{ |
||||
"x": 14.5 |
||||
}, |
||||
")\n0\nF10", |
||||
{ |
||||
"a": 7, |
||||
"w": 1.5 |
||||
}, |
||||
"F11" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.375, |
||||
"x": 3.5, |
||||
"c": "#a7d0db", |
||||
"t": "#000000", |
||||
"a": 4 |
||||
}, |
||||
">\n.", |
||||
{ |
||||
"x": 10.5, |
||||
"a": 6 |
||||
}, |
||||
"C" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"x": 2.5, |
||||
"c": "#bfbad1", |
||||
"t": "#0d0d0b", |
||||
"a": 4 |
||||
}, |
||||
"<\n,", |
||||
{ |
||||
"x": 1, |
||||
"c": "#7adabd", |
||||
"t": "#000000", |
||||
"a": 6 |
||||
}, |
||||
"P", |
||||
{ |
||||
"x": 8.5 |
||||
}, |
||||
"G", |
||||
{ |
||||
"x": 1, |
||||
"c": "#bfbad1", |
||||
"t": "#0d0d0b" |
||||
}, |
||||
"R" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"x": 5.5, |
||||
"c": "#7adabd", |
||||
"t": "#000000" |
||||
}, |
||||
"Y", |
||||
{ |
||||
"c": "#93c9b7", |
||||
"a": 4, |
||||
"h": 1.5 |
||||
}, |
||||
"{\n[", |
||||
{ |
||||
"x": 4.5, |
||||
"h": 1.5 |
||||
}, |
||||
"}\n]", |
||||
{ |
||||
"c": "#7adabd", |
||||
"a": 6 |
||||
}, |
||||
"F" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"c": "#ffb07b", |
||||
"t": "#0d0d0b", |
||||
"f": 6, |
||||
"w": 1.5 |
||||
}, |
||||
"<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>", |
||||
{ |
||||
"c": "#ffb2d2", |
||||
"a": 4, |
||||
"f": 3 |
||||
}, |
||||
"\"\n'", |
||||
{ |
||||
"x": 14.5, |
||||
"a": 6 |
||||
}, |
||||
"L", |
||||
{ |
||||
"a": 4, |
||||
"w": 1.5 |
||||
}, |
||||
"|\n\\" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.375, |
||||
"x": 3.5, |
||||
"c": "#a7d0db", |
||||
"t": "#000000", |
||||
"a": 6 |
||||
}, |
||||
"E", |
||||
{ |
||||
"x": 10.5 |
||||
}, |
||||
"T" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"x": 2.5, |
||||
"c": "#bfbad1", |
||||
"t": "#0d0d0b" |
||||
}, |
||||
"O", |
||||
{ |
||||
"x": 1, |
||||
"c": "#7adabd", |
||||
"t": "#000000", |
||||
"n": true |
||||
}, |
||||
"U", |
||||
{ |
||||
"x": 8.5, |
||||
"n": true |
||||
}, |
||||
"H", |
||||
{ |
||||
"x": 1, |
||||
"c": "#bfbad1", |
||||
"t": "#0d0d0b" |
||||
}, |
||||
"N" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"x": 5.5, |
||||
"c": "#7adabd", |
||||
"t": "#000000" |
||||
}, |
||||
"I", |
||||
{ |
||||
"x": 6.5 |
||||
}, |
||||
"D" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"c": "#ffb2d2", |
||||
"t": "#0d0d0b", |
||||
"fa": [ |
||||
6 |
||||
], |
||||
"w": 1.5 |
||||
}, |
||||
"<i class='fa fa-arrows'></i>\n\nTab", |
||||
{ |
||||
"f": 3 |
||||
}, |
||||
"A", |
||||
{ |
||||
"x": 14.5, |
||||
"f": 3 |
||||
}, |
||||
"S", |
||||
{ |
||||
"a": 4, |
||||
"fa": [ |
||||
0, |
||||
0, |
||||
0, |
||||
0, |
||||
0, |
||||
0, |
||||
0, |
||||
6 |
||||
], |
||||
"w": 1.5 |
||||
}, |
||||
"+\n=" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.625, |
||||
"x": 6.5, |
||||
"c": "#93c9b7", |
||||
"t": "#000000", |
||||
"a": 7, |
||||
"h": 1.5 |
||||
}, |
||||
"(", |
||||
{ |
||||
"x": 4.5, |
||||
"h": 1.5 |
||||
}, |
||||
")" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.75, |
||||
"x": 3.5, |
||||
"c": "#a7d0db", |
||||
"a": 6 |
||||
}, |
||||
"J", |
||||
{ |
||||
"x": 10.5 |
||||
}, |
||||
"W" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"x": 2.5, |
||||
"c": "#bfbad1", |
||||
"t": "#0d0d0b" |
||||
}, |
||||
"Q", |
||||
{ |
||||
"x": 1, |
||||
"c": "#7adabd", |
||||
"t": "#000000" |
||||
}, |
||||
"K", |
||||
{ |
||||
"x": 8.5 |
||||
}, |
||||
"M", |
||||
{ |
||||
"x": 1, |
||||
"c": "#bfbad1", |
||||
"t": "#0d0d0b" |
||||
}, |
||||
"V" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"x": 5.5, |
||||
"c": "#7adabd", |
||||
"t": "#000000" |
||||
}, |
||||
"X", |
||||
{ |
||||
"x": 6.5 |
||||
}, |
||||
"B" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"c": "#ffb07b", |
||||
"f": 9, |
||||
"w": 1.5 |
||||
}, |
||||
"\n\n<i class='kb kb-Multimedia-Play-Pause'></i>", |
||||
{ |
||||
"c": "#ffb2d2", |
||||
"t": "#0d0d0b", |
||||
"a": 4, |
||||
"f": 3 |
||||
}, |
||||
"?\n/", |
||||
{ |
||||
"x": 14.5, |
||||
"a": 6 |
||||
}, |
||||
"Z", |
||||
{ |
||||
"c": "#ffb07b", |
||||
"t": "#000000", |
||||
"f": 9, |
||||
"w": 1.5 |
||||
}, |
||||
"<i class='kb kb-Multimedia-Stop'></i>" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.375, |
||||
"x": 3.5, |
||||
"c": "#d9dae0", |
||||
"g": true, |
||||
"a": 7, |
||||
"f": 3 |
||||
}, |
||||
"", |
||||
{ |
||||
"x": 10.5 |
||||
}, |
||||
"" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.875, |
||||
"x": 2.5 |
||||
}, |
||||
"", |
||||
{ |
||||
"x": 1, |
||||
"c": "#d4872a", |
||||
"g": false, |
||||
"a": 5 |
||||
}, |
||||
";\n:", |
||||
{ |
||||
"x": 8.5 |
||||
}, |
||||
"_\n-", |
||||
{ |
||||
"x": 1, |
||||
"c": "#d9dae0", |
||||
"g": true, |
||||
"a": 7 |
||||
}, |
||||
"" |
||||
], |
||||
[ |
||||
{ |
||||
"y": -0.75, |
||||
"x": 0.5 |
||||
}, |
||||
"", |
||||
{}, |
||||
"", |
||||
{ |
||||
"x": 14.5 |
||||
}, |
||||
"", |
||||
{}, |
||||
"" |
||||
], |
||||
[ |
||||
{ |
||||
"r": 30, |
||||
"rx": 6.5, |
||||
"ry": 4.25, |
||||
"y": -1, |
||||
"x": 1, |
||||
"c": "#f9cd31", |
||||
"g": false |
||||
}, |
||||
"Alt", |
||||
{ |
||||
"a": 4, |
||||
"fa": [ |
||||
0, |
||||
0, |
||||
0, |
||||
9 |
||||
] |
||||
}, |
||||
"\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>" |
||||
], |
||||
[ |
||||
{ |
||||
"c": "#d4872a", |
||||
"a": 7, |
||||
"f": 9, |
||||
"h": 2 |
||||
}, |
||||
"<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>", |
||||
{ |
||||
"h": 2 |
||||
}, |
||||
"<i class='fa fa-angle-double-up'></i>", |
||||
{ |
||||
"c": "#f9cd31", |
||||
"f": 3 |
||||
}, |
||||
"Ctrl" |
||||
], |
||||
[ |
||||
{ |
||||
"x": 2, |
||||
"c": "#e26757" |
||||
}, |
||||
"ESC" |
||||
], |
||||
[ |
||||
{ |
||||
"r": -30, |
||||
"rx": 13, |
||||
"y": -1, |
||||
"x": -3, |
||||
"c": "#f9cd31", |
||||
"f": 2 |
||||
}, |
||||
"MEDIA", |
||||
{}, |
||||
"1HAND" |
||||
], |
||||
[ |
||||
{ |
||||
"x": -3 |
||||
}, |
||||
"LEAD", |
||||
{ |
||||
"c": "#d4872a", |
||||
"f": 9, |
||||
"h": 2 |
||||
}, |
||||
"<i class='kb kb-Return-2'></i>", |
||||
{ |
||||
"f": 3, |
||||
"h": 2 |
||||
}, |
||||
"SPC" |
||||
], |
||||
[ |
||||
{ |
||||
"x": -3, |
||||
"c": "#f9cd31", |
||||
"f": 2 |
||||
}, |
||||
"HUN" |
||||
] |
||||
] |
@ -0,0 +1,145 @@ |
||||
#! /usr/bin/env python |
||||
import json |
||||
import os |
||||
import sys |
||||
import re |
||||
|
||||
from math import floor |
||||
|
||||
cr_coord_map = [ |
||||
[ |
||||
# Row 0 |
||||
[ 4, 0], [ 4, 2], [ 2, 0], [ 1, 0], [ 2, 2], [ 3, 0], [ 3, 2], |
||||
[ 3, 4], [ 3, 6], [ 2, 4], [ 1, 2], [ 2, 6], [ 4, 4], [ 4, 6], |
||||
], |
||||
[ |
||||
# Row 1 |
||||
[ 8, 0], [ 8, 2], [ 6, 0], [ 5, 0], [ 6, 2], [ 7, 0], [ 7, 2], |
||||
[ 7, 4], [ 7, 6], [ 6, 4], [ 5, 2], [ 6, 6], [ 8, 4], [ 8, 6], |
||||
], |
||||
[ |
||||
# Row 2 |
||||
[12, 0], [12, 2], [10, 0], [ 9, 0], [10, 2], [11, 0], [ ], |
||||
[ ], [11, 2], [10, 4], [ 9, 2], [10, 6], [12, 4], [12, 6], |
||||
], |
||||
[ |
||||
# Row 3 |
||||
[17, 0], [17, 2], [15, 0], [14, 0], [15, 2], [16, 0], [13, 0], |
||||
[13, 2], [16, 2], [15, 4], [14, 2], [15, 6], [17, 4], [17, 6], |
||||
], |
||||
[ |
||||
# Row 4 |
||||
[20, 0], [20, 2], [19, 0], [18, 0], [19, 2], [], [], [], [], |
||||
[19, 4], [18, 2], [19, 6], [20, 4], [20, 6], |
||||
], |
||||
[ |
||||
# Row 5 |
||||
[ ], [23, 0], [22, 2], [22, 0], [22, 4], [21, 0], [21, 2], |
||||
[24, 0], [24, 2], [25, 0], [25, 4], [25, 2], [26, 0], [ ], |
||||
], |
||||
] |
||||
|
||||
def set_attr_at(j, b, n, attr, fn, val): |
||||
blk = j[b][n] |
||||
if attr in blk: |
||||
blk[attr] = fn(blk[attr], val) |
||||
else: |
||||
blk[attr] = fn(None, val) |
||||
|
||||
def coord(col, row): |
||||
return cr_coord_map[row][col] |
||||
|
||||
def set_attr(orig, new): |
||||
return new |
||||
|
||||
def set_bg(j, (b, n), color): |
||||
set_attr_at(j, b, n, "c", set_attr, color) |
||||
#set_attr_at(j, b, n, "g", set_attr, False) |
||||
|
||||
def _set_tap_info(o, count, cap): |
||||
ns = 4 - o.count ("\n") |
||||
return o + "\n" * ns + "%.02f%%" % (float(count) / float(cap) * 100) |
||||
|
||||
def set_tap_info(j, (b, n), count, cap): |
||||
j[b][n + 1] = _set_tap_info (j[b][n + 1], count, cap) |
||||
|
||||
def heatmap_color (v): |
||||
colors = [ [0.3, 0.3, 1], [0.3, 1, 0.3], [1, 1, 0.3], [1, 0.3, 0.3]] |
||||
fb = 0 |
||||
if v <= 0: |
||||
idx1, idx2 = 0, 0 |
||||
elif v >= 1: |
||||
idx1, idx2 = len(colors) - 1, len(colors) - 1 |
||||
else: |
||||
val = v * (len(colors) - 1) |
||||
idx1 = int(floor(val)) |
||||
idx2 = idx1 + 1 |
||||
fb = val - float(idx1) |
||||
|
||||
r = (colors[idx2][0] - colors[idx1][0]) * fb + colors[idx1][0] |
||||
g = (colors[idx2][1] - colors[idx1][1]) * fb + colors[idx1][1] |
||||
b = (colors[idx2][2] - colors[idx1][2]) * fb + colors[idx1][2] |
||||
|
||||
r, g, b = [x * 255 for x in r, g, b] |
||||
return "#%02x%02x%02x" % (r, g, b) |
||||
|
||||
# Load the keylog |
||||
def load_keylog(fname, restrict_row): |
||||
keylog = {} |
||||
total = 0 |
||||
with open(fname, "r") as f: |
||||
lines = f.readlines() |
||||
for line in lines: |
||||
m = re.search ('KL: col=(\d+), row=(\d+)', line) |
||||
if not m: |
||||
continue |
||||
(c, r) = (int(m.group (2)), int(m.group (1))) |
||||
if restrict_row != None and r != int(restrict_row): |
||||
continue |
||||
if (c, r) in keylog: |
||||
keylog[(c, r)] = keylog[(c, r)] + 1 |
||||
else: |
||||
keylog[(c, r)] = 1 |
||||
total = total + 1 |
||||
return total / 2, keylog |
||||
|
||||
def l_flat(s): |
||||
f = s.split("\n") |
||||
return ", ".join (f) |
||||
|
||||
def main(base_fn, log_fn, restrict_row = None): |
||||
|
||||
with open(base_fn, "r") as f: |
||||
layout = json.load (f) |
||||
|
||||
## Reset colors |
||||
for row in cr_coord_map: |
||||
for col in row: |
||||
if col != []: |
||||
set_bg (layout, col, "#d9dae0") |
||||
#set_attr_at (layout, col[0], col[1], "g", set_attr, True) |
||||
|
||||
total, log = load_keylog (log_fn, restrict_row) |
||||
max_cnt = 0 |
||||
for (c, r) in log: |
||||
max_cnt = max(max_cnt, log[(c, r)]) |
||||
|
||||
# Create the heatmap |
||||
for (c, r) in log: |
||||
coords = coord(c, r) |
||||
b, n = coords |
||||
cap = max_cnt |
||||
v = float(log[(c, r)]) / cap |
||||
print >> sys.stderr, "%s => %d/%d => %f = %s" % (l_flat(layout[b][n+1]), log[(c,r)], cap, v, heatmap_color(v)) |
||||
set_bg (layout, coord(c, r), heatmap_color (v)) |
||||
set_tap_info (layout, coord (c, r), log[(c, r)], total) |
||||
|
||||
print json.dumps(layout) |
||||
|
||||
if __name__ == "__main__": |
||||
if len(sys.argv) < 3: |
||||
print """Log to Heatmap -- creates a heatmap out of keyboard logs |
||||
|
||||
Usage: log-to-heatmap.py base-layout.json logfile [row] >layout.json""" |
||||
sys.exit (1) |
||||
main(*sys.argv[1:]) |
Loading…
Reference in new issue