Update the ergodox/algernon keymap to v1.7
Overall changes =============== * The number row has been completely rearranged on both the **Base** and the **ADORE** layers. * The number/function key behavior was changed: function keys are now on the **Media**. * The `:`/`;` and `-`/`_` keys were put back to their thumb position on the bottom row, on both the **Base** and **ADORE** layers. * The bottom large keys on the inner side of each half now function as [tmux](http://tmux.github.io/) keys: the left to send the prefix, the right to send the `display-panes` key. The left also doubles as a GNU screen prefix key, and sends `C-a` when double tapped. * A number of functions, such as the **AppSel** layer, now require the `hid-commands` tool to be running, with the output of `hid_listen` being piped to it. ADORE ===== * `Y` and `X` have been swapped again. Media/Navigation layer ====================== * The function keys are now on this layer. * Mouse keys have been removed. * Media start/stop/prev/next have been removed. * `Print screen` has been removed. * There is only one screen lock key now. Heatmap ======= * Fixed a few issues in the finger-stats calculation. * The tool now also timestamps and saves all input lines to a logfile, which it loads on start, allowing one to continue the collection after upgrading the tool. * The heatmap tool will now colorize the stats by default. * The periodic stats are now printed in a more compact format. Tools ===== * Added a new tool, `tools/layer-notify` that listens to layer change events on the HID console, and pops up a notification on layer changes. * Another new tool, `tools/text-to-log.py` has been added that converts arbitrary text to a keylogger output, which can be fed to the heatmap generator. * A number of features have been moved to the `tools/hid-commands` utility. These generally are OS dependent, and are easier to implement on the software side. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
This commit is contained in:
parent
a258358b6c
commit
3e128552d9
13 changed files with 619 additions and 478 deletions
|
@ -13,18 +13,15 @@
|
|||
[
|
||||
{
|
||||
"x": 3.5,
|
||||
"c": "#a7d0db",
|
||||
"fa": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
]
|
||||
},
|
||||
"#\n3\nF3",
|
||||
"*\n5\nF5",
|
||||
{
|
||||
"x": 10.5,
|
||||
"c": "#a7d0db",
|
||||
"t": "#000000",
|
||||
"a": 4,
|
||||
"fa": [
|
||||
0,
|
||||
|
@ -32,54 +29,44 @@
|
|||
2
|
||||
]
|
||||
},
|
||||
"*\n8\nF8"
|
||||
"#\n4\nF4"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 2.5,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 2.5
|
||||
},
|
||||
"@\n2\nF2",
|
||||
"@\n7\nF7",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 1
|
||||
},
|
||||
"$\n4\nF4",
|
||||
"^\n3\nF3",
|
||||
{
|
||||
"x": 8.5
|
||||
},
|
||||
"&\n7\nF7",
|
||||
"!\n2\nF2",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 1
|
||||
},
|
||||
"(\n9\nF9"
|
||||
"&\n6\nF6"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 5.5,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 5.5
|
||||
},
|
||||
"%\n5\nF5",
|
||||
"$\n1\nF1",
|
||||
{
|
||||
"c": "#f9cd31",
|
||||
"a": 7,
|
||||
"f": 2
|
||||
"f": 3
|
||||
},
|
||||
"STENO",
|
||||
"F11",
|
||||
{
|
||||
"x": 4.5,
|
||||
"f": 3
|
||||
},
|
||||
"F12",
|
||||
{
|
||||
"c": "#7adabd",
|
||||
"a": 4,
|
||||
"f": 3,
|
||||
"fa": [
|
||||
|
@ -88,19 +75,17 @@
|
|||
2
|
||||
]
|
||||
},
|
||||
"^\n6\nF6"
|
||||
"%\n0\nF10"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"c": "#ffb2d2",
|
||||
"f": 9,
|
||||
"a": 6,
|
||||
"w": 1.5
|
||||
},
|
||||
"\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
|
||||
{
|
||||
"t": "#0d0d0b",
|
||||
"f": 3,
|
||||
"a": 4,
|
||||
"fa": [
|
||||
|
@ -109,23 +94,21 @@
|
|||
2
|
||||
]
|
||||
},
|
||||
"!\n1\nF1",
|
||||
" \n9\nF9",
|
||||
{
|
||||
"x": 14.5
|
||||
},
|
||||
")\n0\nF10",
|
||||
" \n8\nF8",
|
||||
{
|
||||
"a": 7,
|
||||
"w": 1.5
|
||||
},
|
||||
"F11"
|
||||
"STENO"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.375,
|
||||
"x": 3.5,
|
||||
"c": "#a7d0db",
|
||||
"t": "#000000",
|
||||
"a": 6
|
||||
},
|
||||
"G",
|
||||
|
@ -138,15 +121,11 @@
|
|||
{
|
||||
"y": -0.875,
|
||||
"x": 2.5,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b",
|
||||
"a": 6
|
||||
},
|
||||
"W",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000",
|
||||
"a": 6
|
||||
},
|
||||
"L",
|
||||
|
@ -155,22 +134,17 @@
|
|||
},
|
||||
"H",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 1
|
||||
},
|
||||
"P"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 5.5,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 5.5
|
||||
},
|
||||
"M",
|
||||
{
|
||||
"c": "#93c9b7",
|
||||
"a": 4,
|
||||
"fa": [0, 0, 0],
|
||||
"h": 1.5
|
||||
|
@ -182,7 +156,6 @@
|
|||
},
|
||||
"}\n)\n]",
|
||||
{
|
||||
"c": "#7adabd",
|
||||
"a": 6
|
||||
},
|
||||
"F"
|
||||
|
@ -190,24 +163,21 @@
|
|||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"c": "#ffb07b",
|
||||
"t": "#0d0d0b",
|
||||
"f": 3,
|
||||
"a": 4,
|
||||
"w": 1.5
|
||||
},
|
||||
"\n\n~\n`",
|
||||
{
|
||||
"c": "#ffb2d2",
|
||||
"a": 6,
|
||||
"f": 3
|
||||
},
|
||||
"Y",
|
||||
"X",
|
||||
{
|
||||
"x": 14.5,
|
||||
"a": 6
|
||||
},
|
||||
"X",
|
||||
"Y",
|
||||
{
|
||||
"a": 4,
|
||||
"w": 1.5
|
||||
|
@ -218,8 +188,6 @@
|
|||
{
|
||||
"y": -0.375,
|
||||
"x": 3.5,
|
||||
"c": "#a7d0db",
|
||||
"t": "#000000",
|
||||
"a": 6
|
||||
},
|
||||
"E",
|
||||
|
@ -231,15 +199,11 @@
|
|||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 2.5,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 2.5
|
||||
},
|
||||
"O",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000",
|
||||
"n": true
|
||||
},
|
||||
"I",
|
||||
|
@ -249,18 +213,14 @@
|
|||
},
|
||||
"R",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 1
|
||||
},
|
||||
"N"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 5.5,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 5.5
|
||||
},
|
||||
"U",
|
||||
{
|
||||
|
@ -271,8 +231,6 @@
|
|||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"c": "#ffb2d2",
|
||||
"t": "#0d0d0b",
|
||||
"fa": [
|
||||
6
|
||||
],
|
||||
|
@ -308,22 +266,21 @@
|
|||
{
|
||||
"y": -0.625,
|
||||
"x": 6.5,
|
||||
"c": "#93c9b7",
|
||||
"t": "#000000",
|
||||
"a": 7,
|
||||
"f": 9,
|
||||
"h": 1.5
|
||||
},
|
||||
";\n:",
|
||||
"<i class='fa fa-columns'></i>",
|
||||
{
|
||||
"x": 4.5,
|
||||
"h": 1.5
|
||||
},
|
||||
"_\n-"
|
||||
"<i class='fa fa-table'></i>"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.75,
|
||||
"x": 3.5,
|
||||
"c": "#a7d0db",
|
||||
"a": 4,
|
||||
"f": 3
|
||||
},
|
||||
|
@ -339,15 +296,11 @@
|
|||
{
|
||||
"y": -0.875,
|
||||
"x": 2.5,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b",
|
||||
"a": 6
|
||||
},
|
||||
"Q",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000",
|
||||
"a": 4
|
||||
},
|
||||
"<\n,",
|
||||
|
@ -357,9 +310,7 @@
|
|||
},
|
||||
"K",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 1
|
||||
},
|
||||
"J"
|
||||
],
|
||||
|
@ -367,8 +318,6 @@
|
|||
{
|
||||
"y": -0.875,
|
||||
"x": 5.5,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000",
|
||||
"a": 4
|
||||
},
|
||||
">\n.",
|
||||
|
@ -381,15 +330,12 @@
|
|||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"c": "#ffb07b",
|
||||
"f": 9,
|
||||
"w": 1.5,
|
||||
"g": true
|
||||
},
|
||||
"",
|
||||
{
|
||||
"c": "#ffb2d2",
|
||||
"t": "#0d0d0b",
|
||||
"a": 6,
|
||||
"f": 3,
|
||||
"g": false
|
||||
|
@ -401,8 +347,6 @@
|
|||
},
|
||||
"?\n/",
|
||||
{
|
||||
"c": "#ffb07b",
|
||||
"t": "#000000",
|
||||
"f": 9,
|
||||
"g": true,
|
||||
"w": 1.5,
|
||||
|
@ -414,7 +358,6 @@
|
|||
{
|
||||
"y": -0.375,
|
||||
"x": 3.5,
|
||||
"c": "#d9dae0",
|
||||
"g": true,
|
||||
"a": 7,
|
||||
"f": 3
|
||||
|
@ -433,18 +376,16 @@
|
|||
"",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#d4872a",
|
||||
"g": true,
|
||||
"g": false,
|
||||
"a": 5
|
||||
},
|
||||
"",
|
||||
";\n:",
|
||||
{
|
||||
"x": 8.5
|
||||
},
|
||||
"",
|
||||
"_\n-",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#d9dae0",
|
||||
"g": true,
|
||||
"a": 7
|
||||
},
|
||||
|
@ -472,7 +413,6 @@
|
|||
"ry": 4.25,
|
||||
"y": -1,
|
||||
"x": 1,
|
||||
"c": "#f9cd31",
|
||||
"g": false
|
||||
},
|
||||
"Alt",
|
||||
|
@ -489,7 +429,6 @@
|
|||
],
|
||||
[
|
||||
{
|
||||
"c": "#d4872a",
|
||||
"a": 7,
|
||||
"f": 9,
|
||||
"h": 2
|
||||
|
@ -500,15 +439,13 @@
|
|||
},
|
||||
"<i class='fa fa-angle-double-up'></i>",
|
||||
{
|
||||
"c": "#f9cd31",
|
||||
"f": 3
|
||||
},
|
||||
"Ctrl"
|
||||
],
|
||||
[
|
||||
{
|
||||
"x": 2,
|
||||
"c": "#e26757"
|
||||
"x": 2
|
||||
},
|
||||
"ESC"
|
||||
],
|
||||
|
@ -518,7 +455,6 @@
|
|||
"rx": 13,
|
||||
"y": -1,
|
||||
"x": -3,
|
||||
"c": "#f9cd31",
|
||||
"f": 2
|
||||
},
|
||||
"MEDIA",
|
||||
|
@ -531,7 +467,6 @@
|
|||
},
|
||||
"HUN",
|
||||
{
|
||||
"c": "#d4872a",
|
||||
"f": 9,
|
||||
"h": 2
|
||||
},
|
||||
|
@ -545,7 +480,6 @@
|
|||
[
|
||||
{
|
||||
"x": -3,
|
||||
"c": "#f9cd31",
|
||||
"f": 2
|
||||
},
|
||||
"LEAD"
|
||||
|
|
|
@ -13,18 +13,15 @@
|
|||
[
|
||||
{
|
||||
"x": 3.5,
|
||||
"c": "#a7d0db",
|
||||
"fa": [
|
||||
0,
|
||||
0,
|
||||
2
|
||||
]
|
||||
},
|
||||
"#\n3\nF3",
|
||||
"*\n5\nF5",
|
||||
{
|
||||
"x": 10.5,
|
||||
"c": "#a7d0db",
|
||||
"t": "#000000",
|
||||
"a": 4,
|
||||
"fa": [
|
||||
0,
|
||||
|
@ -32,54 +29,44 @@
|
|||
2
|
||||
]
|
||||
},
|
||||
"*\n8\nF8"
|
||||
"#\n4\nF4"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 2.5,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 2.5
|
||||
},
|
||||
"@\n2\nF2",
|
||||
"@\n7\nF7",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 1
|
||||
},
|
||||
"$\n4\nF4",
|
||||
"^\n3\nF3",
|
||||
{
|
||||
"x": 8.5
|
||||
},
|
||||
"&\n7\nF7",
|
||||
"!\n2\nF2",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 1
|
||||
},
|
||||
"(\n9\nF9"
|
||||
"&\n6\nF6"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 5.5,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 5.5
|
||||
},
|
||||
"%\n5\nF5",
|
||||
"$\n1\nF1",
|
||||
{
|
||||
"c": "#f9cd31",
|
||||
"a": 7,
|
||||
"f": 2
|
||||
"f": 3
|
||||
},
|
||||
"STENO",
|
||||
"F11",
|
||||
{
|
||||
"x": 4.5,
|
||||
"f": 3
|
||||
},
|
||||
"F12",
|
||||
{
|
||||
"c": "#7adabd",
|
||||
"a": 4,
|
||||
"f": 3,
|
||||
"fa": [
|
||||
|
@ -88,12 +75,11 @@
|
|||
2
|
||||
]
|
||||
},
|
||||
"^\n6\nF6"
|
||||
"%\n0\nF10"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"c": "#ffb2d2",
|
||||
"f": 6,
|
||||
"a": 6,
|
||||
"w": 1.5
|
||||
|
@ -101,7 +87,6 @@
|
|||
"<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>",
|
||||
{
|
||||
"f": 3,
|
||||
"t": "#0d0d0b",
|
||||
"a": 4,
|
||||
"fa": [
|
||||
0,
|
||||
|
@ -110,23 +95,21 @@
|
|||
]
|
||||
|
||||
},
|
||||
"!\n1\nF1",
|
||||
" \n9\nF9",
|
||||
{
|
||||
"x": 14.5
|
||||
},
|
||||
")\n0\nF10",
|
||||
" \n8\nF8",
|
||||
{
|
||||
"a": 7,
|
||||
"w": 1.5
|
||||
},
|
||||
"F11"
|
||||
"STENO"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.375,
|
||||
"x": 3.5,
|
||||
"c": "#a7d0db",
|
||||
"t": "#000000",
|
||||
"a": 4
|
||||
},
|
||||
">\n.",
|
||||
|
@ -140,15 +123,11 @@
|
|||
{
|
||||
"y": -0.875,
|
||||
"x": 2.5,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b",
|
||||
"a": 4
|
||||
},
|
||||
"<\n,",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000",
|
||||
"a": 6
|
||||
},
|
||||
"P",
|
||||
|
@ -157,22 +136,17 @@
|
|||
},
|
||||
"G",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 1
|
||||
},
|
||||
"R"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 5.5,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 5.5
|
||||
},
|
||||
"Y",
|
||||
{
|
||||
"c": "#93c9b7",
|
||||
"a": 4,
|
||||
"h": 1.5
|
||||
},
|
||||
|
@ -183,7 +157,6 @@
|
|||
},
|
||||
"}\n)\n]",
|
||||
{
|
||||
"c": "#7adabd",
|
||||
"a": 6
|
||||
},
|
||||
"F"
|
||||
|
@ -191,14 +164,12 @@
|
|||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"c": "#ffb07b",
|
||||
"t": "#0d0d0b",
|
||||
"f": 3,
|
||||
"a": 4,
|
||||
"w": 1.5
|
||||
},
|
||||
"\n\n~\n`",
|
||||
{
|
||||
"c": "#ffb2d2",
|
||||
"a": 4,
|
||||
"f": 3
|
||||
},
|
||||
|
@ -218,8 +189,6 @@
|
|||
{
|
||||
"y": -0.375,
|
||||
"x": 3.5,
|
||||
"c": "#a7d0db",
|
||||
"t": "#000000",
|
||||
"a": 6
|
||||
},
|
||||
"E",
|
||||
|
@ -231,15 +200,11 @@
|
|||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 2.5,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 2.5
|
||||
},
|
||||
"O",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000",
|
||||
"n": true
|
||||
},
|
||||
"U",
|
||||
|
@ -249,18 +214,14 @@
|
|||
},
|
||||
"H",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 1
|
||||
},
|
||||
"N"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 5.5,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 5.5
|
||||
},
|
||||
"I",
|
||||
{
|
||||
|
@ -271,8 +232,6 @@
|
|||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"c": "#ffb2d2",
|
||||
"t": "#0d0d0b",
|
||||
"fa": [
|
||||
6
|
||||
],
|
||||
|
@ -308,23 +267,22 @@
|
|||
{
|
||||
"y": -0.625,
|
||||
"x": 6.5,
|
||||
"c": "#93c9b7",
|
||||
"t": "#000000",
|
||||
"a": 7,
|
||||
"f": 9,
|
||||
"h": 1.5
|
||||
},
|
||||
"(",
|
||||
"<i class='fa fa-columns'></i>",
|
||||
{
|
||||
"x": 4.5,
|
||||
"h": 1.5
|
||||
},
|
||||
")"
|
||||
"<i class='fa fa-table'></i>"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.75,
|
||||
"x": 3.5,
|
||||
"c": "#a7d0db",
|
||||
"f": 3,
|
||||
"a": 6
|
||||
},
|
||||
"J",
|
||||
|
@ -336,15 +294,11 @@
|
|||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 2.5,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 2.5
|
||||
},
|
||||
"Q",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 1
|
||||
},
|
||||
"K",
|
||||
{
|
||||
|
@ -352,18 +306,14 @@
|
|||
},
|
||||
"M",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#bfbad1",
|
||||
"t": "#0d0d0b"
|
||||
"x": 1
|
||||
},
|
||||
"V"
|
||||
],
|
||||
[
|
||||
{
|
||||
"y": -0.875,
|
||||
"x": 5.5,
|
||||
"c": "#7adabd",
|
||||
"t": "#000000"
|
||||
"x": 5.5
|
||||
},
|
||||
"X",
|
||||
{
|
||||
|
@ -374,14 +324,11 @@
|
|||
[
|
||||
{
|
||||
"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
|
||||
},
|
||||
|
@ -392,8 +339,6 @@
|
|||
},
|
||||
"Z",
|
||||
{
|
||||
"c": "#ffb07b",
|
||||
"t": "#000000",
|
||||
"f": 9,
|
||||
"w": 1.5
|
||||
},
|
||||
|
@ -403,7 +348,6 @@
|
|||
{
|
||||
"y": -0.375,
|
||||
"x": 3.5,
|
||||
"c": "#d9dae0",
|
||||
"g": true,
|
||||
"a": 7,
|
||||
"f": 3
|
||||
|
@ -422,7 +366,6 @@
|
|||
"",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#d4872a",
|
||||
"g": false,
|
||||
"a": 5
|
||||
},
|
||||
|
@ -433,7 +376,6 @@
|
|||
"_\n-",
|
||||
{
|
||||
"x": 1,
|
||||
"c": "#d9dae0",
|
||||
"g": true,
|
||||
"a": 7
|
||||
},
|
||||
|
@ -461,7 +403,6 @@
|
|||
"ry": 4.25,
|
||||
"y": -1,
|
||||
"x": 1,
|
||||
"c": "#f9cd31",
|
||||
"g": false
|
||||
},
|
||||
"Alt",
|
||||
|
@ -478,7 +419,6 @@
|
|||
],
|
||||
[
|
||||
{
|
||||
"c": "#d4872a",
|
||||
"a": 7,
|
||||
"f": 9,
|
||||
"h": 2
|
||||
|
@ -489,15 +429,13 @@
|
|||
},
|
||||
"<i class='fa fa-angle-double-up'></i>",
|
||||
{
|
||||
"c": "#f9cd31",
|
||||
"f": 3
|
||||
},
|
||||
"Ctrl"
|
||||
],
|
||||
[
|
||||
{
|
||||
"x": 2,
|
||||
"c": "#e26757"
|
||||
"x": 2
|
||||
},
|
||||
"ESC"
|
||||
],
|
||||
|
@ -507,7 +445,6 @@
|
|||
"rx": 13,
|
||||
"y": -1,
|
||||
"x": -3,
|
||||
"c": "#f9cd31",
|
||||
"f": 2
|
||||
},
|
||||
"MEDIA",
|
||||
|
@ -520,7 +457,6 @@
|
|||
},
|
||||
"LEAD",
|
||||
{
|
||||
"c": "#d4872a",
|
||||
"f": 9,
|
||||
"h": 2
|
||||
},
|
||||
|
@ -534,7 +470,6 @@
|
|||
[
|
||||
{
|
||||
"x": -3,
|
||||
"c": "#f9cd31",
|
||||
"f": 2
|
||||
},
|
||||
"HUN"
|
||||
|
|
61
keyboards/ergodox/keymaps/algernon/tools/hid-commands
Executable file
61
keyboards/ergodox/keymaps/algernon/tools/hid-commands
Executable file
|
@ -0,0 +1,61 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
cmd_wm () {
|
||||
WIN="$(xdotool getactivewindow)"
|
||||
wmctrl -i -r ${WIN} -b remove,maximized_vert,maximized_horz
|
||||
xdotool windowsize ${WIN} 100% 100%
|
||||
wmctrl -i -r ${WIN} -b add,maximized_vert,maximized_horz
|
||||
}
|
||||
|
||||
_cmd_appsel () {
|
||||
wmctrl -x -a $1 || true
|
||||
xdotool key Escape
|
||||
}
|
||||
|
||||
cmd_appsel_music () {
|
||||
wmctrl -x -a rhythmbox || wmctrl -x -a spotify || true
|
||||
xdotool key Escape
|
||||
}
|
||||
|
||||
cmd_appsel_slack () {
|
||||
_cmd_appsel slack
|
||||
}
|
||||
|
||||
cmd_appsel_emacs () {
|
||||
_cmd_appsel emacs24
|
||||
}
|
||||
|
||||
cmd_appsel_term () {
|
||||
_cmd_appsel gnome-terminal
|
||||
}
|
||||
|
||||
cmd_appsel_chrome () {
|
||||
_cmd_appsel chromium
|
||||
}
|
||||
|
||||
cmd_help () {
|
||||
cat <<EOF
|
||||
Use the source, Luke!
|
||||
EOF
|
||||
}
|
||||
|
||||
while read l; do
|
||||
case "$l" in
|
||||
"CMD:"*)
|
||||
;;
|
||||
*)
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
|
||||
cmd="$(echo $l | cut -d: -f2-)"
|
||||
|
||||
echo "Got command: ${cmd}"
|
||||
|
||||
if type cmd_${cmd} >/dev/null 2>&1; then
|
||||
cmd_${cmd}
|
||||
fi
|
||||
done
|
||||
|
||||
|
12
keyboards/ergodox/keymaps/algernon/tools/layer-notify
Executable file
12
keyboards/ergodox/keymaps/algernon/tools/layer-notify
Executable file
|
@ -0,0 +1,12 @@
|
|||
#!/bin/sh
|
||||
HL="${HID_LISTEN:-$HOME/src/ext/hid_listen/hid_listen}"
|
||||
|
||||
sudo "${HL}" | grep --line-buffered LAYER: | \
|
||||
(while read line; do
|
||||
case $line in
|
||||
LAYER:*)
|
||||
layer="$(echo $(echo $line | cut -d: -f2-))"
|
||||
notify-send -i mark-location-symbolic "Switched to layer: $layer"
|
||||
;;
|
||||
esac
|
||||
done)
|
|
@ -1,12 +1,15 @@
|
|||
#! /usr/bin/env python
|
||||
#! /usr/bin/env python3
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import argparse
|
||||
import time
|
||||
|
||||
from math import floor
|
||||
from os.path import dirname
|
||||
from subprocess import Popen, PIPE, STDOUT
|
||||
from blessings import Terminal
|
||||
|
||||
class Heatmap(object):
|
||||
coords = [
|
||||
|
@ -33,7 +36,7 @@ class Heatmap(object):
|
|||
[
|
||||
# Row 4
|
||||
[20, 0], [20, 2], [19, 0], [18, 0], [19, 2], [], [], [], [],
|
||||
[19, 4], [18, 2], [19, 6], [20, 4], [20, 6],
|
||||
[19, 4], [18, 2], [19, 6], [20, 4], [20, 6], [], [], [], []
|
||||
],
|
||||
[
|
||||
# Row 5
|
||||
|
@ -56,11 +59,13 @@ class Heatmap(object):
|
|||
def set_attr(orig, new):
|
||||
return new
|
||||
|
||||
def set_bg(self, (block, n), color):
|
||||
def set_bg(self, coords, color):
|
||||
(block, n) = coords
|
||||
self.set_attr_at(block, n, "c", self.set_attr, color)
|
||||
#self.set_attr_at(block, n, "g", self.set_attr, False)
|
||||
|
||||
def set_tap_info(self, (block, n), count, cap):
|
||||
def set_tap_info(self, coords, count, cap):
|
||||
(block, n) = coords
|
||||
def _set_tap_info(o, _count, _cap):
|
||||
ns = 4 - o.count ("\n")
|
||||
return o + "\n" * ns + "%.02f%%" % (float(_count) / float(_cap) * 100)
|
||||
|
@ -87,8 +92,8 @@ class Heatmap(object):
|
|||
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)
|
||||
r, g, b = [x * 255 for x in (r, g, b)]
|
||||
return "#%02x%02x%02x" % (int(r), int(g), int(b))
|
||||
|
||||
def __init__(self, layout):
|
||||
self.log = {}
|
||||
|
@ -96,7 +101,8 @@ class Heatmap(object):
|
|||
self.max_cnt = 0
|
||||
self.layout = layout
|
||||
|
||||
def update_log(self, (c, r)):
|
||||
def update_log(self, coords):
|
||||
(c, r) = coords
|
||||
if not (c, r) in self.log:
|
||||
self.log[(c, r)] = 0
|
||||
self.log[(c, r)] = self.log[(c, r)] + 1
|
||||
|
@ -132,18 +138,17 @@ class Heatmap(object):
|
|||
# right hand
|
||||
[0, 0, 0, 0, 0]
|
||||
]
|
||||
finger_map = [0, 0, 1, 2, 3, 4, 4]
|
||||
finger_map = [0, 0, 1, 2, 3, 3, 3, 1, 1, 1, 2, 3, 4, 4]
|
||||
for (c, r) in self.log:
|
||||
if r == 5: # thumb cluster
|
||||
if c <= 6: # left side
|
||||
usage[0][4] = usage[0][4] + self.log[(c, r)]
|
||||
else:
|
||||
usage[1][4] = usage[1][4] + self.log[(c, r)]
|
||||
usage[1][0] = usage[1][0] + self.log[(c, r)]
|
||||
else:
|
||||
fc = c
|
||||
hand = 0
|
||||
if fc >= 7:
|
||||
fc = fc - 7
|
||||
hand = 1
|
||||
fm = finger_map[fc]
|
||||
usage[hand][fm] = usage[hand][fm] + self.log[(c, r)]
|
||||
|
@ -157,79 +162,158 @@ class Heatmap(object):
|
|||
if total == 0:
|
||||
total = 1
|
||||
stats = {
|
||||
"total-keys": total,
|
||||
"hands": {
|
||||
"left": {
|
||||
"usage": float(hand_usage[0]) / total * 100,
|
||||
"usage": round(float(hand_usage[0]) / total * 100, 2),
|
||||
"fingers": {
|
||||
"0 - pinky": 0,
|
||||
"1 - ring": 0,
|
||||
"2 - middle": 0,
|
||||
"3 - index": 0,
|
||||
"4 - thumb": 0,
|
||||
"pinky": 0,
|
||||
"ring": 0,
|
||||
"middle": 0,
|
||||
"index": 0,
|
||||
"thumb": 0,
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"usage": float(hand_usage[1]) / total * 100,
|
||||
"usage": round(float(hand_usage[1]) / total * 100, 2),
|
||||
"fingers": {
|
||||
"0 - thumb": 0,
|
||||
"1 - index": 0,
|
||||
"2 - middle": 0,
|
||||
"3 - ring": 0,
|
||||
"4 - pinky": 0,
|
||||
"thumb": 0,
|
||||
"index": 0,
|
||||
"middle": 0,
|
||||
"ring": 0,
|
||||
"pinky": 0,
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
hmap = ['left', 'right']
|
||||
fmap = ['0 - pinky', '1 - ring', '2 - middle', '3 - index', '4 - thumb',
|
||||
'0 - thumb', '1 - index', '2 - middle', '3 - ring', '4 - pinky']
|
||||
fmap = ['pinky', 'ring', 'middle', 'index', 'thumb',
|
||||
'thumb', 'index', 'middle', 'ring', 'pinky']
|
||||
for hand_idx in range(len(usage)):
|
||||
hand = usage[hand_idx]
|
||||
for finger_idx in range(len(hand)):
|
||||
stats['hands'][hmap[hand_idx]]['fingers'][fmap[finger_idx + hand_idx * 5]] = float(hand[finger_idx]) / total * 100
|
||||
stats['hands'][hmap[hand_idx]]['fingers'][fmap[finger_idx + hand_idx * 5]] = round(float(hand[finger_idx]) / total * 100, 2)
|
||||
return stats
|
||||
|
||||
def dump_all(out_dir, heatmaps):
|
||||
for layer in heatmaps.keys():
|
||||
stats = {}
|
||||
t = Terminal()
|
||||
t.clear()
|
||||
sys.stdout.write("\x1b[2J\x1b[H")
|
||||
|
||||
print ('{t.underline}{outdir}{t.normal}\n'.format(t=t, outdir=out_dir))
|
||||
|
||||
keys = list(heatmaps.keys())
|
||||
keys.sort()
|
||||
|
||||
for layer in keys:
|
||||
if len(heatmaps[layer].log) == 0:
|
||||
continue
|
||||
|
||||
with open ("%s/%s.json" % (out_dir, layer), "w") as f:
|
||||
json.dump(heatmaps[layer].get_heatmap(), f)
|
||||
print >>sys.stderr, "%s stats:" % (layer)
|
||||
json.dump (heatmaps[layer].get_stats(), sys.stderr,
|
||||
indent = 4, sort_keys = True)
|
||||
print >>sys.stderr, ""
|
||||
print >>sys.stderr, ""
|
||||
stats[layer] = heatmaps[layer].get_stats()
|
||||
|
||||
left = stats[layer]['hands']['left']
|
||||
right = stats[layer]['hands']['right']
|
||||
|
||||
print ('{t.bold}{layer}{t.normal} ({total:,} taps):'.format(t=t, layer=layer,
|
||||
total=int(stats[layer]['total-keys'] / 2)))
|
||||
print (('{t.underline} | ' + \
|
||||
'left ({l[usage]:6.2f}%) | ' + \
|
||||
'right ({r[usage]:6.2f}%) |{t.normal}').format(t=t, l=left, r=right))
|
||||
print ((' {t.bright_magenta}pinky{t.white} | {left[pinky]:6.2f}% | {right[pinky]:6.2f}% |\n' + \
|
||||
' {t.bright_cyan}ring{t.white} | {left[ring]:6.2f}% | {right[ring]:6.2f}% |\n' + \
|
||||
' {t.bright_blue}middle{t.white} | {left[middle]:6.2f}% | {right[middle]:6.2f}% |\n' + \
|
||||
' {t.bright_green}index{t.white} | {left[index]:6.2f}% | {right[index]:6.2f}% |\n' + \
|
||||
' {t.bright_red}thumb{t.white} | {left[thumb]:6.2f}% | {right[thumb]:6.2f}% |\n' + \
|
||||
'').format(left=left['fingers'], right=right['fingers'], t=t))
|
||||
|
||||
def process_line(line, heatmaps, opts, stamped_log = None):
|
||||
m = re.search ('KL: col=(\d+), row=(\d+), pressed=(\d+), layer=(.*)', line)
|
||||
if not m:
|
||||
return False
|
||||
if stamped_log is not None:
|
||||
if line.startswith("KL:"):
|
||||
print ("%10.10f %s" % (time.time(), line),
|
||||
file = stamped_log, end = '')
|
||||
else:
|
||||
print (line,
|
||||
file = stamped_log, end = '')
|
||||
stamped_log.flush()
|
||||
|
||||
(c, r, l) = (int(m.group (2)), int(m.group (1)), m.group (4))
|
||||
if (c, r) not in opts.allowed_keys:
|
||||
return False
|
||||
|
||||
heatmaps[l].update_log ((c, r))
|
||||
|
||||
return True
|
||||
|
||||
def setup_allowed_keys(opts):
|
||||
if len(opts.only_key):
|
||||
incmap={}
|
||||
for v in opts.only_key:
|
||||
m = re.search ('(\d+),(\d+)', v)
|
||||
if not m:
|
||||
continue
|
||||
(c, r) = (int(m.group(1)), int(m.group(2)))
|
||||
incmap[(c, r)] = True
|
||||
else:
|
||||
incmap={}
|
||||
for r in range(0, 6):
|
||||
for c in range(0, 14):
|
||||
incmap[(c, r)] = True
|
||||
|
||||
for v in opts.ignore_key:
|
||||
m = re.search ('(\d+),(\d+)', v)
|
||||
if not m:
|
||||
continue
|
||||
(c, r) = (int(m.group(1)), int(m.group(2)))
|
||||
del(incmap[(c, r)])
|
||||
|
||||
return incmap
|
||||
|
||||
def main(opts):
|
||||
|
||||
heatmaps = {"Dvorak": Heatmap("Dvorak"),
|
||||
"ADORE": Heatmap("ADORE")
|
||||
}
|
||||
cnt = 0
|
||||
restrict_row = opts.restrict_row
|
||||
out_dir = opts.outdir
|
||||
|
||||
if not os.path.exists(out_dir):
|
||||
os.makedirs(out_dir)
|
||||
|
||||
opts.allowed_keys = setup_allowed_keys(opts)
|
||||
|
||||
if not opts.one_shot:
|
||||
|
||||
try:
|
||||
with open("%s/stamped-log" % out_dir, "r") as f:
|
||||
while True:
|
||||
line = f.readline()
|
||||
if not line:
|
||||
break
|
||||
if not process_line(line, heatmaps, opts):
|
||||
continue
|
||||
except:
|
||||
pass
|
||||
|
||||
stamped_log = open ("%s/stamped-log" % (out_dir), "a+")
|
||||
else:
|
||||
stamped_log = None
|
||||
|
||||
while True:
|
||||
line = sys.stdin.readline()
|
||||
if not line:
|
||||
break
|
||||
m = re.search ('KL: col=(\d+), row=(\d+), pressed=(\d+), layer=(.*)', line)
|
||||
if not m:
|
||||
if not process_line(line, heatmaps, opts, stamped_log):
|
||||
continue
|
||||
|
||||
cnt = cnt + 1
|
||||
(c, r, l) = (int(m.group (2)), int(m.group (1)), m.group (4))
|
||||
if restrict_row != -1 and r != restrict_row:
|
||||
continue
|
||||
if c in opts.ignore_columns:
|
||||
continue
|
||||
|
||||
heatmaps[l].update_log ((c, r))
|
||||
|
||||
if opts.dump_interval != -1 and cnt >= opts.dump_interval:
|
||||
if opts.dump_interval != -1 and cnt >= opts.dump_interval and not opts.one_shot:
|
||||
cnt = 0
|
||||
dump_all(out_dir, heatmaps)
|
||||
|
||||
|
@ -239,11 +323,17 @@ if __name__ == "__main__":
|
|||
parser = argparse.ArgumentParser (description = "keylog to heatmap processor")
|
||||
parser.add_argument ('outdir', action = 'store',
|
||||
help = 'Output directory')
|
||||
parser.add_argument ('--row', dest = 'restrict_row', action = 'store', type = int,
|
||||
default = -1, help = 'Restrict processing to this row only')
|
||||
parser.add_argument ('--dump-interval', dest = 'dump_interval', action = 'store', type = int,
|
||||
default = 100, help = 'Dump stats and heatmap at every Nth event, -1 for dumping at EOF only')
|
||||
parser.add_argument ('--ignore-column', dest = 'ignore_columns', action = 'append', type = int,
|
||||
default = [], help = 'Ignore the specified columns')
|
||||
parser.add_argument ('--ignore-key', dest = 'ignore_key', action = 'append', type = str,
|
||||
default = [], help = 'Ignore the key at position (x, y)')
|
||||
parser.add_argument ('--only-key', dest = 'only_key', action = 'append', type = str,
|
||||
default = [], help = 'Only include key at position (x, y)')
|
||||
parser.add_argument ('--one-shot', dest = 'one_shot', action = 'store_true',
|
||||
help = 'Do not load previous data, and do not update it, either.')
|
||||
args = parser.parse_args()
|
||||
if len(args.ignore_key) and len(args.only_key):
|
||||
print ("--ignore-key and --only-key are mutually exclusive, please only use one of them!",
|
||||
file = sys.stderr)
|
||||
sys.exit(1)
|
||||
main(args)
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
#! /bin/sh
|
||||
WIN="$(xdotool getactivewindow)"
|
||||
wmctrl -i -r ${WIN} -b remove,maximized_vert,maximized_horz
|
||||
xdotool windowsize ${WIN} 100% 100%
|
||||
wmctrl -i -r ${WIN} -b add,maximized_vert,maximized_horz
|
107
keyboards/ergodox/keymaps/algernon/tools/text-to-log.py
Executable file
107
keyboards/ergodox/keymaps/algernon/tools/text-to-log.py
Executable file
|
@ -0,0 +1,107 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
charmap = {
|
||||
'9': [[1, 0]],
|
||||
'7': [[2, 0]], '@': [[2, 5], [2, 0]],
|
||||
'5': [[3, 0]], '*': [[2, 5], [3, 0]],
|
||||
'3': [[4, 0]], '^': [[2, 5], [4, 0]],
|
||||
'1': [[5, 0]], '$': [[2, 5], [5, 0]],
|
||||
'0': [[8, 0]], '%': [[2, 5], [8, 0]],
|
||||
'2': [[9, 0]], '!': [[2, 5], [9, 0]],
|
||||
'4': [[10, 0]], '#': [[2, 5], [10, 0]],
|
||||
'6': [[11, 0]], '&': [[2, 5], [11, 0]],
|
||||
'8': [[12, 0]],
|
||||
|
||||
'`': [[0, 1]], '~': [[2, 5], [0, 1]],
|
||||
'y': [[1, 1]], 'Y': [[2, 5], [1, 1]],
|
||||
'w': [[2, 1]], 'W': [[2, 5], [2, 1]],
|
||||
'g': [[3, 1]], 'G': [[2, 5], [3, 1]],
|
||||
'l': [[4, 1]], 'L': [[2, 5], [4, 1]],
|
||||
'm': [[5, 1]], 'M': [[2, 5], [5, 1]],
|
||||
'[': [[6, 1]], '{': [[2, 5], [6, 1]], '(': [[6, 1], [6, 1]],
|
||||
']': [[7, 1]], '}': [[2, 5], [7, 1]], ')': [[7, 1], [7, 1]],
|
||||
'f': [[8, 1]], 'F': [[2, 5], [8, 1]],
|
||||
'h': [[9, 1]], 'H': [[2, 5], [9, 1]],
|
||||
'c': [[10, 1]], 'C': [[2, 5], [10, 1]],
|
||||
'p': [[11, 1]], 'P': [[2, 5], [11, 1]],
|
||||
'x': [[12, 1]], 'X': [[2, 5], [12, 1]],
|
||||
'\\': [[13, 1]], '|': [[2, 5], [13, 1]],
|
||||
|
||||
'\t': [[0, 2]],
|
||||
'a': [[1, 2]], 'A': [[2, 5], [1, 2]],
|
||||
'o': [[2, 2]], 'O': [[2, 5], [2, 2]],
|
||||
'e': [[3, 2]], 'E': [[2, 5], [3, 2]],
|
||||
'i': [[4, 2]], 'I': [[2, 5], [4, 2]],
|
||||
'u': [[5, 2]], 'U': [[2, 5], [5, 2]],
|
||||
'd': [[8, 2]], 'D': [[2, 5], [8, 2]],
|
||||
'r': [[9, 2]], 'R': [[2, 5], [9, 2]],
|
||||
't': [[10, 2]], 'T': [[2, 5], [10, 2]],
|
||||
'n': [[11, 2]], 'N': [[2, 5], [11, 2]],
|
||||
's': [[12, 2]], 'S': [[2, 5], [12, 2]],
|
||||
'=': [[13, 2]], '+': [[2, 5], [13, 2]],
|
||||
|
||||
'z': [[1, 3]], 'Z': [[2, 5], [1, 3]],
|
||||
'q': [[2, 3]], 'Q': [[2, 5], [2, 3]],
|
||||
'\'': [[3, 3]], '"': [[2, 5], [3, 3]],
|
||||
',': [[4, 3]], '<': [[2, 5], [4, 3]],
|
||||
'.': [[5, 3]], '>': [[2, 5], [5, 3]],
|
||||
'b': [[8, 3]], 'B': [[2, 5], [8, 3]],
|
||||
'k': [[9, 3]], 'K': [[2, 5], [9, 3]],
|
||||
'v': [[10, 3]], 'V': [[2, 5], [10, 3]],
|
||||
'j': [[11, 3]], 'J': [[2, 5], [11, 3]],
|
||||
'/': [[12, 3]], '?': [[2, 5], [12, 3]],
|
||||
|
||||
':': [[4, 4]], ';': [[4, 4], [4, 4]],
|
||||
'-': [[9, 4]], '_': [[2, 5], [9, 4]],
|
||||
|
||||
' ': [[10, 5]],
|
||||
'\n': [[11, 5]],
|
||||
|
||||
## Layered things
|
||||
# Hungarian
|
||||
'á': [[9, 5], [1, 2]], 'Á': [[2, 5], [9, 5], [1, 2]],
|
||||
'ó': [[9, 5], [2, 2]], 'Ó': [[2, 5], [9, 5], [2, 2]],
|
||||
'ő': [[9, 5], [2, 1]], 'Ő': [[2, 5], [9, 5], [2, 1]],
|
||||
'ö': [[9, 5], [2, 3]], 'Ö': [[2, 5], [9, 5], [2, 3]],
|
||||
'é': [[9, 5], [3, 2]], 'É': [[2, 5], [9, 5], [3, 2]],
|
||||
'ú': [[9, 5], [4, 2]], 'Ú': [[2, 5], [9, 5], [4, 2]],
|
||||
'ű': [[9, 5], [4, 1]], 'Ű': [[2, 5], [9, 5], [4, 1]],
|
||||
'ü': [[9, 5], [4, 3]], 'Ü': [[2, 5], [9, 5], [4, 3]],
|
||||
'í': [[9, 5], [5, 2]], 'Í': [[2, 5], [9, 5], [5, 2]],
|
||||
}
|
||||
|
||||
def lookup_char(layer, ch):
|
||||
if ch in charmap:
|
||||
return charmap[ch]
|
||||
return None
|
||||
|
||||
def process_char(layer, ch, out=sys.stdout):
|
||||
keys = lookup_char(layer, ch)
|
||||
if not keys:
|
||||
print ("Unknown char: %s" % ch, file=sys.stderr)
|
||||
else:
|
||||
for (c, r) in keys:
|
||||
print ("KL: col=%d, row=%d, pressed=1, layer=%s" % (r, c, layer), file=out)
|
||||
print ("KL: col=%d, row=%d, pressed=0, layer=%s" % (r, c, layer), file=out)
|
||||
|
||||
def process_file(fn, layer, out=sys.stdout):
|
||||
with open(fn, "r") as f:
|
||||
ch = f.read(1)
|
||||
while ch:
|
||||
process_char(layer, ch, out)
|
||||
ch = f.read(1)
|
||||
|
||||
if sys.argv[1] == '-':
|
||||
out='/dev/stdin'
|
||||
else:
|
||||
out=sys.argv[1]
|
||||
|
||||
if len(sys.argv) >= 2:
|
||||
layer = 'ADORE'
|
||||
else:
|
||||
layer = sys.argv[2]
|
||||
|
||||
process_file(out, layer = layer)
|
Loading…
Add table
Add a link
Reference in a new issue