fix modifier key order, add EU badge template icons, rename build scripts

- fix modifier key order to Apple canonical: Option+Shift (not Shift+Option)
  across parser, validator, PDF generator, website keyboard viewer, README
- add EU badge template icons for v1.2/v1.3/v1.4 matching Apple's built-in
  keyboard layout icon style (edge-to-edge rounded square, text knockout)
- add build-icons.sh to generate .icns from SVG source via rsvg-convert
- rename create-dmg.sh → build-dmg.sh, update CI workflows
- add website feature icons (install, pdf, versions)
- update website icon to star-on-key design

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-14 11:01:56 +01:00
parent 1b9ce5dd86
commit 92422e1bf1
26 changed files with 412 additions and 772 deletions

View File

@@ -35,7 +35,7 @@ jobs:
run: python3 scripts/validate_layouts.py run: python3 scripts/validate_layouts.py
- name: create DMG - name: create DMG
run: bash scripts/create-dmg.sh run: bash scripts/build-dmg.sh
- name: upload DMG - name: upload DMG
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4

View File

@@ -26,7 +26,7 @@ jobs:
run: bash scripts/build-bundle.sh --version "${{ steps.version.outputs.version }}" run: bash scripts/build-bundle.sh --version "${{ steps.version.outputs.version }}"
- name: create DMG - name: create DMG
run: bash scripts/create-dmg.sh --version "${{ steps.version.outputs.version }}" run: bash scripts/build-dmg.sh --version "${{ steps.version.outputs.version }}"
- name: create GitHub release - name: create GitHub release
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2

View File

@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<!-- Template badge: rounded square nearly filling the canvas.
Matches Apple's built-in keyboard layout icon style (ABC, DE, etc.). -->
<defs>
<mask id="textmask">
<rect width="1024" height="1024" fill="white"/>
<text x="512" y="700" text-anchor="middle"
font-family="Helvetica, Arial, sans-serif"
font-size="640" font-weight="bold"
fill="black">EU</text>
</mask>
</defs>
<rect x="0" y="0" width="1024" height="1024" rx="220" fill="black" mask="url(#textmask)"/>
</svg>

After

Width:  |  Height:  |  Size: 567 B

View File

@@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<!-- Draft C: Single key cap with EU star — minimal, reads well at any size -->
<rect width="1024" height="1024" rx="180" fill="#003399"/>
<!-- Large key cap shape, centered -->
<rect x="172" y="172" width="680" height="680" rx="80" fill="rgba(255,255,255,0.92)"
stroke="rgba(255,255,255,0.3)" stroke-width="8"/>
<!-- Key shadow/depth -->
<rect x="172" y="180" width="680" height="680" rx="80" fill="none"
stroke="rgba(0,0,0,0.08)" stroke-width="8"/>
<!-- Single EU gold star centered on key -->
<polygon points="512,220 568,398 756,398 604,506 646,680 512,580 378,680 420,506 268,398 456,398"
fill="#FFCC00"/>
</svg>

After

Width:  |  Height:  |  Size: 699 B

View File

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<!-- Template icon: "EU" — transparent bg, black text
macOS TISIconIsTemplate renders this adaptively:
light mode: dark text, light pill background
dark mode: light text, dark pill background -->
<text x="512" y="700" text-anchor="middle" font-family="'SF Pro Text', '.AppleSystemUIFont', 'Helvetica Neue', sans-serif" font-size="620" font-weight="600" fill="#000" letter-spacing="-10">EU</text>
</svg>

After

Width:  |  Height:  |  Size: 490 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<!-- Template icon: "EUR" text — macOS renders black in light mode, white in dark mode -->
<text x="512" y="640" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Helvetica Neue', sans-serif" font-size="480" font-weight="700" fill="#000" letter-spacing="-20">EUR</text>
</svg>

After

Width:  |  Height:  |  Size: 384 B

View File

@@ -13,7 +13,7 @@ The bundle ships 4 layout versions:
| Version | Description | | Version | Description |
| ------- | ----------- | | ------- | ----------- |
| **v1.3** | Official EurKEY spec implementation. **Recommended for most users.** | | **v1.3** | Official EurKEY spec implementation. **Recommended for most users.** |
| **v1.2** | Legacy version based on [Leonardo Schenkel's port](https://github.com/lbschenkel/EurKEY-Mac). Predates the v1.3 spec (no `¬` dead key, `§` instead of `` on Shift+Option+S). | | **v1.2** | Legacy version based on [Leonardo Schenkel's port](https://github.com/lbschenkel/EurKEY-Mac). Predates the v1.3 spec (no `¬` dead key, `§` instead of `` on Option+Shift+S). |
| **v1.4** | v1.3 with `` (capital sharp s) on Caps+`§` key. | | **v1.4** | v1.3 with `` (capital sharp s) on Caps+`§` key. |
| **v2.0** | Custom edition — complete rework. Every key configures exactly as printed on the MacBook keyboard. Removes left/right modifier key distinction. New monochrome template icon. | | **v2.0** | Custom edition — complete rework. Every key configures exactly as printed on the MacBook keyboard. Removes left/right modifier key distinction. New monochrome template icon. |
@@ -54,7 +54,7 @@ python3 scripts/parse_keylayout.py "EurKey-macOS.bundle/Contents/Resources/EurKE
bash scripts/build-bundle.sh bash scripts/build-bundle.sh
# create a DMG installer # create a DMG installer
bash scripts/create-dmg.sh bash scripts/build-dmg.sh
``` ```
## Dead key compositions (v2.0) ## Dead key compositions (v2.0)

View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none">
<!-- DMG disk shape (rounded rectangle base) -->
<rect x="6" y="26" width="36" height="18" rx="4" stroke="#003399" stroke-width="2.5" fill="none"/>
<!-- Slot/opening on the disk -->
<line x1="16" y1="38" x2="32" y2="38" stroke="#003399" stroke-width="2" stroke-linecap="round"/>
<!-- Download arrow -->
<line x1="24" y1="4" x2="24" y2="22" stroke="#003399" stroke-width="2.5" stroke-linecap="round"/>
<path d="M18 17 L24 23 L30 17" stroke="#003399" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 604 B

View File

@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none">
<!-- Document with folded corner -->
<path d="M10 4 H30 L38 12 V42 Q38 44 36 44 H12 Q10 44 10 42 Z" stroke="#003399" stroke-width="2.5" fill="none"/>
<!-- Folded corner -->
<path d="M30 4 V12 H38" stroke="#003399" stroke-width="2" fill="none" stroke-linejoin="round"/>
<!-- Keyboard diagram lines on the document -->
<line x1="16" y1="22" x2="32" y2="22" stroke="#003399" stroke-width="1.5" stroke-linecap="round" opacity="0.5"/>
<line x1="16" y1="27" x2="32" y2="27" stroke="#003399" stroke-width="1.5" stroke-linecap="round" opacity="0.5"/>
<line x1="16" y1="32" x2="28" y2="32" stroke="#003399" stroke-width="1.5" stroke-linecap="round" opacity="0.5"/>
<!-- PDF label -->
<text x="24" y="40" text-anchor="middle" font-family="-apple-system, system-ui, sans-serif" font-size="7" font-weight="700" fill="#003399">PDF</text>
</svg>

After

Width:  |  Height:  |  Size: 915 B

View File

@@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none">
<!-- Stacked key caps representing multiple versions -->
<!-- Back card -->
<rect x="12" y="6" width="28" height="20" rx="3" stroke="#003399" stroke-width="2" fill="none" opacity="0.3"/>
<!-- Middle card -->
<rect x="8" y="12" width="28" height="20" rx="3" stroke="#003399" stroke-width="2" fill="none" opacity="0.6"/>
<!-- Front card -->
<rect x="4" y="18" width="28" height="20" rx="3" stroke="#003399" stroke-width="2.5" fill="none"/>
<!-- Version label on front card -->
<text x="18" y="32" text-anchor="middle" font-family="-apple-system, system-ui, sans-serif" font-size="10" font-weight="700" fill="#003399">2.0</text>
<!-- Checkmark on front card -->
<path d="M32 42 L36 46 L44 36" stroke="#003399" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 866 B

View File

@@ -1,28 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" fill="none"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
<!-- EurKEY: EU star on a key cap -->
<rect width="128" height="128" rx="28" fill="#003399"/> <rect width="128" height="128" rx="28" fill="#003399"/>
<g fill="#FFCC00"> <rect x="22" y="22" width="84" height="84" rx="12" fill="rgba(255,255,255,0.92)"/>
<circle cx="64" cy="34" r="3"/> <polygon points="64,28 71,50 94,50 75,62 81,84 64,72 47,84 53,62 34,50 57,50" fill="#FFCC00"/>
<circle cx="71.5" cy="35.5" r="3"/>
<circle cx="77.5" cy="40" r="3"/>
<circle cx="80" cy="47" r="3"/>
<circle cx="77.5" cy="54" r="3"/>
<circle cx="71.5" cy="58.5" r="3"/>
<circle cx="64" cy="60" r="3"/>
<circle cx="56.5" cy="58.5" r="3"/>
<circle cx="50.5" cy="54" r="3"/>
<circle cx="48" cy="47" r="3"/>
<circle cx="50.5" cy="40" r="3"/>
<circle cx="56.5" cy="35.5" r="3"/>
</g>
<g fill="#fff" opacity=".9">
<rect x="22" y="74" width="14" height="12" rx="3"/>
<rect x="39" y="74" width="14" height="12" rx="3"/>
<rect x="56" y="74" width="14" height="12" rx="3"/>
<rect x="73" y="74" width="14" height="12" rx="3"/>
<rect x="90" y="74" width="14" height="12" rx="3"/>
<rect x="30" y="90" width="14" height="12" rx="3"/>
<rect x="47" y="90" width="14" height="12" rx="3"/>
<rect x="64" y="90" width="14" height="12" rx="3"/>
<rect x="81" y="90" width="14" height="12" rx="3"/>
</g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 346 B

View File

@@ -35,11 +35,11 @@ const KEYBOARD_ROWS = [
const MOD_BASE = "0"; const MOD_BASE = "0";
const MOD_SHIFT = "1"; const MOD_SHIFT = "1";
const MOD_OPTION = "3"; const MOD_OPTION = "3";
const MOD_SHIFT_OPTION = "4"; const MOD_OPTION_SHIFT = "4";
const LAYERS = [ const LAYERS = [
{ mod: MOD_SHIFT, cls: "key-char--shift" }, { mod: MOD_SHIFT, cls: "key-char--shift" },
{ mod: MOD_SHIFT_OPTION, cls: "key-char--shift-option" }, { mod: MOD_OPTION_SHIFT, cls: "key-char--option-shift" },
{ mod: MOD_BASE, cls: "key-char--base" }, { mod: MOD_BASE, cls: "key-char--base" },
{ mod: MOD_OPTION, cls: "key-char--option" }, { mod: MOD_OPTION, cls: "key-char--option" },
]; ];
@@ -261,7 +261,7 @@ function enterDeadKeyMode(deadState) {
const shiftComposed = charMap[shiftChar] || ""; const shiftComposed = charMap[shiftChar] || "";
const spans = keyEl.querySelectorAll(".key-char"); const spans = keyEl.querySelectorAll(".key-char");
// order: shift, shift-option, base, option // order: shift, option-shift, base, option
if (spans[0]) spans[0].textContent = displayChar(shiftComposed); if (spans[0]) spans[0].textContent = displayChar(shiftComposed);
if (spans[1]) spans[1].textContent = ""; if (spans[1]) spans[1].textContent = "";
if (spans[2]) spans[2].textContent = displayChar(baseComposed); if (spans[2]) spans[2].textContent = displayChar(baseComposed);
@@ -298,7 +298,7 @@ function exitDeadKeyMode() {
keyEl.classList.remove("key--has-composition", "key--no-composition", "key--dead-active"); keyEl.classList.remove("key--has-composition", "key--no-composition", "key--dead-active");
const spans = keyEl.querySelectorAll(".key-char"); const spans = keyEl.querySelectorAll(".key-char");
const layerOrder = [MOD_SHIFT, MOD_SHIFT_OPTION, MOD_BASE, MOD_OPTION]; const layerOrder = [MOD_SHIFT, MOD_OPTION_SHIFT, MOD_BASE, MOD_OPTION];
for (let i = 0; i < spans.length; i++) { for (let i = 0; i < spans.length; i++) {
const info = charForKey(currentData, layerOrder[i], keyCode); const info = charForKey(currentData, layerOrder[i], keyCode);
spans[i].textContent = info ? displayChar(info.char) : ""; spans[i].textContent = info ? displayChar(info.char) : "";
@@ -324,7 +324,7 @@ function updateActiveLayer() {
const shift = activeModifiers.has("shift"); const shift = activeModifiers.has("shift");
const option = activeModifiers.has("option"); const option = activeModifiers.has("option");
let layer = null; let layer = null;
if (shift && option) layer = "shift-option"; if (shift && option) layer = "option-shift";
else if (shift) layer = "shift"; else if (shift) layer = "shift";
else if (option) layer = "option"; else if (option) layer = "option";
@@ -338,7 +338,7 @@ function updateActiveLayer() {
function getActiveModIndex() { function getActiveModIndex() {
const shift = activeModifiers.has("shift"); const shift = activeModifiers.has("shift");
const option = activeModifiers.has("option"); const option = activeModifiers.has("option");
if (shift && option) return MOD_SHIFT_OPTION; if (shift && option) return MOD_OPTION_SHIFT;
if (shift) return MOD_SHIFT; if (shift) return MOD_SHIFT;
if (option) return MOD_OPTION; if (option) return MOD_OPTION;
return MOD_BASE; return MOD_BASE;

View File

@@ -308,7 +308,7 @@ img {
color: #0028aa; color: #0028aa;
} }
.key-char--shift-option { .key-char--option-shift {
justify-content: flex-end; justify-content: flex-end;
color: #780078; color: #780078;
} }
@@ -427,7 +427,7 @@ img {
.keyboard[data-active-layer="shift"] .key-char--shift, .keyboard[data-active-layer="shift"] .key-char--shift,
.keyboard[data-active-layer="option"] .key-char--option, .keyboard[data-active-layer="option"] .key-char--option,
.keyboard[data-active-layer="shift-option"] .key-char--shift-option { .keyboard[data-active-layer="option-shift"] .key-char--option-shift {
opacity: 1; opacity: 1;
font-weight: 700; font-weight: 700;
font-size: 15px; font-size: 15px;
@@ -436,8 +436,8 @@ img {
/* Pressed modifier key visual */ /* Pressed modifier key visual */
.keyboard[data-active-layer="shift"] .key--mod[data-mod="shift"], .keyboard[data-active-layer="shift"] .key--mod[data-mod="shift"],
.keyboard[data-active-layer="option"] .key--mod[data-mod="option"], .keyboard[data-active-layer="option"] .key--mod[data-mod="option"],
.keyboard[data-active-layer="shift-option"] .key--mod[data-mod="shift"], .keyboard[data-active-layer="option-shift"] .key--mod[data-mod="shift"],
.keyboard[data-active-layer="shift-option"] .key--mod[data-mod="option"] { .keyboard[data-active-layer="option-shift"] .key--mod[data-mod="option"] {
transform: translateY(1px); transform: translateY(1px);
background: linear-gradient(to bottom, #d4d4d4, #ccc); background: linear-gradient(to bottom, #d4d4d4, #ccc);
box-shadow: box-shadow:
@@ -454,7 +454,7 @@ img {
background: linear-gradient(to bottom, #fef9e7, #fef3cd 95%, #f5e6a8); background: linear-gradient(to bottom, #fef9e7, #fef3cd 95%, #f5e6a8);
} }
.keyboard--dead-mode .key--has-composition .key-char--shift-option, .keyboard--dead-mode .key--has-composition .key-char--option-shift,
.keyboard--dead-mode .key--has-composition .key-char--option { .keyboard--dead-mode .key--has-composition .key-char--option {
visibility: hidden; visibility: hidden;
} }

View File

@@ -32,6 +32,9 @@ echo "Building ${BUNDLE_NAME} ${VERSION}"
echo "Bundle: ${BUNDLE_DIR}" echo "Bundle: ${BUNDLE_DIR}"
echo echo
# --- generate icons from SVG sources ---
bash "${SCRIPT_DIR}/build-icons.sh"
# --- assemble bundle from src/ --- # --- assemble bundle from src/ ---
rm -rf "${BUNDLE_DIR}" rm -rf "${BUNDLE_DIR}"
mkdir -p "${RESOURCES_DIR}" mkdir -p "${RESOURCES_DIR}"

View File

@@ -26,11 +26,8 @@ STAGING_DIR="${BUILD_DIR}/dmg-staging"
echo "Creating DMG: ${DMG_NAME}" echo "Creating DMG: ${DMG_NAME}"
# --- auto-build bundle if missing --- # --- build bundle (includes validation) ---
if [[ ! -f "${BUNDLE_DIR}/Contents/Info.plist" ]]; then bash "${SCRIPT_DIR}/build-bundle.sh" --version "${VERSION}"
echo "Bundle not found, building..."
bash "${SCRIPT_DIR}/build-bundle.sh" --version "${VERSION}"
fi
# --- auto-build PDFs --- # --- auto-build PDFs ---
echo "Building PDFs..." echo "Building PDFs..."

66
scripts/build-icons.sh Executable file
View File

@@ -0,0 +1,66 @@
#!/usr/bin/env bash
# Generate .icns icon files from SVG sources.
#
# Requires: rsvg-convert (librsvg), iconutil (macOS built-in)
#
# The v1.2/v1.3/v1.4 icon is a template badge with "EU" text.
# The v2.0 icon is a monochrome star ring (managed separately).
#
# Usage: bash scripts/build-icons.sh
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
ICON_DIR="${PROJECT_DIR}/src/icons"
SVG_DIR="${PROJECT_DIR}/EurKEY-macOS-icon/drafts"
BADGE_SVG="${SVG_DIR}/badge-eu-template.svg"
if ! command -v rsvg-convert &> /dev/null; then
echo "SKIP: rsvg-convert not found (install librsvg for icon generation)"
echo "Using existing .icns files from src/icons/"
exit 0
fi
if [[ ! -f "${BADGE_SVG}" ]]; then
echo "ERROR: ${BADGE_SVG} not found"
exit 1
fi
ICONSET="$(mktemp -d)/badge-eu.iconset"
mkdir -p "${ICONSET}"
echo "Generating EU badge icon..."
# render at all required sizes
for size in 16 32 64 128 256 512 1024; do
rsvg-convert -w "${size}" -h "${size}" "${BADGE_SVG}" -o "${ICONSET}/tmp_${size}.png"
done
# map to iconset naming convention
cp "${ICONSET}/tmp_16.png" "${ICONSET}/icon_16x16.png"
cp "${ICONSET}/tmp_32.png" "${ICONSET}/icon_16x16@2x.png"
cp "${ICONSET}/tmp_32.png" "${ICONSET}/icon_32x32.png"
cp "${ICONSET}/tmp_64.png" "${ICONSET}/icon_32x32@2x.png"
cp "${ICONSET}/tmp_128.png" "${ICONSET}/icon_128x128.png"
cp "${ICONSET}/tmp_256.png" "${ICONSET}/icon_128x128@2x.png"
cp "${ICONSET}/tmp_256.png" "${ICONSET}/icon_256x256.png"
cp "${ICONSET}/tmp_512.png" "${ICONSET}/icon_256x256@2x.png"
cp "${ICONSET}/tmp_512.png" "${ICONSET}/icon_512x512.png"
cp "${ICONSET}/tmp_1024.png" "${ICONSET}/icon_512x512@2x.png"
rm "${ICONSET}"/tmp_*.png
# convert to .icns
ICNS_PATH="${ICON_DIR}/badge-eu.icns"
iconutil --convert icns --output "${ICNS_PATH}" "${ICONSET}"
# install for v1.2, v1.3, v1.4 (v2.0 keeps its own icon)
cp "${ICNS_PATH}" "${ICON_DIR}/EurKEY v1.2.icns"
cp "${ICNS_PATH}" "${ICON_DIR}/EurKEY v1.3.icns"
cp "${ICNS_PATH}" "${ICON_DIR}/EurKEY v1.4.icns"
rm "${ICNS_PATH}"
# clean up
rm -rf "$(dirname "${ICONSET}")"
echo "Icons generated for v1.2, v1.3, v1.4"

View File

@@ -2,7 +2,7 @@
"""Generate keyboard layout PDFs from .keylayout files. """Generate keyboard layout PDFs from .keylayout files.
Renders an ISO keyboard diagram showing Base, Shift, Option, and Renders an ISO keyboard diagram showing Base, Shift, Option, and
Shift+Option layers on each key, plus dead key composition tables. Option+Shift layers on each key, plus dead key composition tables.
Requires: fpdf2 (pip install fpdf2) Requires: fpdf2 (pip install fpdf2)
@@ -72,12 +72,12 @@ KEYBOARD_ROWS = [
MOD_BASE = "0" MOD_BASE = "0"
MOD_SHIFT = "1" MOD_SHIFT = "1"
MOD_OPTION = "3" MOD_OPTION = "3"
MOD_SHIFT_OPTION = "4" MOD_OPTION_SHIFT = "4"
# Display layers: (modifier_index, color_rgb, position) # Display layers: (modifier_index, color_rgb, position)
DISPLAY_LAYERS = [ DISPLAY_LAYERS = [
(MOD_SHIFT, (0, 40, 170), "top_left"), (MOD_SHIFT, (0, 40, 170), "top_left"),
(MOD_SHIFT_OPTION, (120, 0, 120), "top_right"), (MOD_OPTION_SHIFT, (120, 0, 120), "top_right"),
(MOD_BASE, (0, 0, 0), "bottom_left"), (MOD_BASE, (0, 0, 0), "bottom_left"),
(MOD_OPTION, (170, 0, 0), "bottom_right"), (MOD_OPTION, (170, 0, 0), "bottom_right"),
] ]
@@ -202,7 +202,7 @@ class LayoutPDF(FPDF):
((0, 0, 0), "Base"), ((0, 0, 0), "Base"),
((0, 40, 170), "Shift"), ((0, 40, 170), "Shift"),
((170, 0, 0), "Option"), ((170, 0, 0), "Option"),
((120, 0, 120), "Shift+Option"), ((120, 0, 120), "Option+Shift"),
] ]
for color, label in items: for color, label in items:
self._color(color) self._color(color)
@@ -316,7 +316,7 @@ class LayoutPDF(FPDF):
"""Find which key combo triggers a dead key state.""" """Find which key combo triggers a dead key state."""
mod_names = { mod_names = {
"0": "", "1": "", "2": "", "3": "", "0": "", "1": "", "2": "", "3": "",
"4": "", "5": "⇪⌥ ", "4": " ", "5": "⇪⌥ ",
} }
# map key codes to physical labels from KEYBOARD_ROWS # map key codes to physical labels from KEYBOARD_ROWS
code_labels = {} code_labels = {}

View File

@@ -74,9 +74,9 @@ MODIFIER_LABELS = {
1: "Shift", 1: "Shift",
2: "Caps", 2: "Caps",
3: "Option", 3: "Option",
4: "Shift+Option", 4: "Option+Shift",
5: "Caps+Option", 5: "Caps+Option",
6: "Command+Option", 6: "Option+Command",
7: "Control", 7: "Control",
} }

View File

@@ -21,7 +21,7 @@ from parse_keylayout import parse_keylayout, TYPING_KEY_CODES, MODIFIER_LABELS,
BUNDLE_DIR = Path(__file__).parent.parent / "build" / "EurKey-macOS.bundle" / "Contents" / "Resources" BUNDLE_DIR = Path(__file__).parent.parent / "build" / "EurKey-macOS.bundle" / "Contents" / "Resources"
# modifier indices that contain meaningful typing output # modifier indices that contain meaningful typing output
# (exclude index 6 = Command+Option and 7 = Control — these are system shortcuts) # (exclude index 6 = Option+Command and 7 = Control — these are system shortcuts)
VALIDATED_MODIFIER_INDICES = {"0", "1", "2", "3", "4", "5"} VALIDATED_MODIFIER_INDICES = {"0", "1", "2", "3", "4", "5"}
@@ -182,14 +182,14 @@ def format_char_display(c):
# v1.2 predates v1.3 — known differences documented here # v1.2 predates v1.3 — known differences documented here
V1_2_EXCEPTIONS = { V1_2_EXCEPTIONS = {
# Shift+Option S: v1.2 has § where v1.3 has ẞ (capital sharp s) # Option+Shift S: v1.2 has § where v1.3 has ẞ (capital sharp s)
"4:1": {"output": "§"}, "4:1": {"output": "§"},
# v1.2 does not have the ¬ (negation) dead key — added in v1.3 # v1.2 does not have the ¬ (negation) dead key — added in v1.3
# instead, Option+- has the © dead key, and Option+\ outputs plain ¬ # instead, Option+- has the © dead key, and Option+\ outputs plain ¬
"_dead_key_skip": ["dead: ¬"], "_dead_key_skip": ["dead: ¬"],
"3:27": {"deadKey": "dead: ©"}, # Option+-: © dead key instead of ¬ dead key "3:27": {"deadKey": "dead: ©"}, # Option+-: © dead key instead of ¬ dead key
"3:42": {"output": "¬"}, # Option+\: plain ¬ instead of ¬ dead key "3:42": {"output": "¬"}, # Option+\: plain ¬ instead of ¬ dead key
"4:27": {"output": ""}, # Shift+Option+-: № instead of ✗ "4:27": {"output": ""}, # Option+Shift+-: № instead of ✗
"5:27": {"deadKey": "dead: ©"}, # Caps+Option+-: © dead key instead of ¬ dead key "5:27": {"deadKey": "dead: ©"}, # Caps+Option+-: © dead key instead of ¬ dead key
} }

View File

@@ -954,7 +954,8 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "^" "action": "=",
"output": "="
}, },
"25": { "25": {
"code": 25, "code": 25,
@@ -989,7 +990,8 @@
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "[" "action": "]",
"output": "]"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -1006,7 +1008,8 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "@" "action": "[",
"output": "["
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -1040,7 +1043,8 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": ":" "action": "'",
"output": "'"
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -1057,7 +1061,7 @@
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "]" "output": "\\"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -1243,21 +1247,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "¥"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -1291,8 +1280,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -1302,8 +1290,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -1536,7 +1523,8 @@
"19": { "19": {
"code": 19, "code": 19,
"keyName": "2", "keyName": "2",
"output": "\"" "action": "@",
"output": "@"
}, },
"20": { "20": {
"code": 20, "code": 20,
@@ -1553,7 +1541,8 @@
"22": { "22": {
"code": 22, "code": 22,
"keyName": "6", "keyName": "6",
"output": "&" "action": "^",
"output": "^"
}, },
"23": { "23": {
"code": 23, "code": 23,
@@ -1564,37 +1553,44 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "~" "action": "+",
"output": "+"
}, },
"25": { "25": {
"code": 25, "code": 25,
"keyName": "9", "keyName": "9",
"output": ")" "action": "(",
"output": "("
}, },
"26": { "26": {
"code": 26, "code": 26,
"keyName": "7", "keyName": "7",
"output": "'" "action": "&",
"output": "&"
}, },
"27": { "27": {
"code": 27, "code": 27,
"keyName": "-", "keyName": "-",
"output": "=" "action": "_",
"output": "_"
}, },
"28": { "28": {
"code": 28, "code": 28,
"keyName": "8", "keyName": "8",
"output": "(" "action": "*",
"output": "*"
}, },
"29": { "29": {
"code": 29, "code": 29,
"keyName": "0", "keyName": "0",
"output": "0" "action": ")",
"output": ")"
}, },
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "{" "action": "}",
"output": "}"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -1611,7 +1607,8 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "`" "action": "{",
"output": "{"
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -1645,7 +1642,8 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": "*" "action": "\"",
"output": "\""
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -1656,12 +1654,14 @@
"41": { "41": {
"code": 41, "code": 41,
"keyName": ";", "keyName": ";",
"output": "+" "action": ":",
"output": ":"
}, },
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "}" "action": "|",
"output": "|"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -1849,21 +1849,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -1897,8 +1882,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -1908,8 +1892,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -2172,7 +2155,8 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "^" "action": "=",
"output": "="
}, },
"25": { "25": {
"code": 25, "code": 25,
@@ -2207,7 +2191,7 @@
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "[" "output": "]"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -2224,7 +2208,7 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "@" "output": "["
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -2258,7 +2242,7 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": ":" "output": "'"
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -2274,7 +2258,7 @@
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "]" "output": "\\"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -2459,21 +2443,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "¥"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -2507,8 +2476,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -2518,8 +2486,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -3044,22 +3011,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"action": "`",
"deadKey": "dead: `"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -3093,8 +3044,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -3104,8 +3054,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -3220,7 +3169,7 @@
} }
}, },
"4": { "4": {
"label": "Shift+Option", "label": "Option+Shift",
"keys": { "keys": {
"0": { "0": {
"code": 0, "code": 0,
@@ -3629,21 +3578,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "`"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -3677,8 +3611,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -3688,8 +3621,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -4210,21 +4142,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "`"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -4258,8 +4175,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -4269,8 +4185,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -4385,7 +4300,7 @@
} }
}, },
"6": { "6": {
"label": "Command+Option", "label": "Option+Command",
"keys": { "keys": {
"0": { "0": {
"code": 0, "code": 0,
@@ -4782,21 +4697,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -4830,8 +4730,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -4841,8 +4740,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -5356,21 +5254,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -5404,8 +5287,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -5415,8 +5297,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -5972,4 +5853,4 @@
} }
} }
} }
} }

View File

@@ -964,7 +964,8 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "^" "action": "=",
"output": "="
}, },
"25": { "25": {
"code": 25, "code": 25,
@@ -999,7 +1000,8 @@
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "[" "action": "]",
"output": "]"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -1016,7 +1018,8 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "@" "action": "[",
"output": "["
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -1050,7 +1053,8 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": ":" "action": "'",
"output": "'"
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -1067,7 +1071,7 @@
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "]" "output": "\\"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -1253,21 +1257,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "¥"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -1301,8 +1290,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -1312,8 +1300,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -1546,7 +1533,8 @@
"19": { "19": {
"code": 19, "code": 19,
"keyName": "2", "keyName": "2",
"output": "\"" "action": "@",
"output": "@"
}, },
"20": { "20": {
"code": 20, "code": 20,
@@ -1563,7 +1551,8 @@
"22": { "22": {
"code": 22, "code": 22,
"keyName": "6", "keyName": "6",
"output": "&" "action": "^",
"output": "^"
}, },
"23": { "23": {
"code": 23, "code": 23,
@@ -1574,37 +1563,44 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "~" "action": "+",
"output": "+"
}, },
"25": { "25": {
"code": 25, "code": 25,
"keyName": "9", "keyName": "9",
"output": ")" "action": "(",
"output": "("
}, },
"26": { "26": {
"code": 26, "code": 26,
"keyName": "7", "keyName": "7",
"output": "'" "action": "&",
"output": "&"
}, },
"27": { "27": {
"code": 27, "code": 27,
"keyName": "-", "keyName": "-",
"output": "=" "action": "_",
"output": "_"
}, },
"28": { "28": {
"code": 28, "code": 28,
"keyName": "8", "keyName": "8",
"output": "(" "action": "*",
"output": "*"
}, },
"29": { "29": {
"code": 29, "code": 29,
"keyName": "0", "keyName": "0",
"output": "0" "action": ")",
"output": ")"
}, },
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "{" "action": "}",
"output": "}"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -1621,7 +1617,8 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "`" "action": "{",
"output": "{"
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -1655,7 +1652,8 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": "*" "action": "\"",
"output": "\""
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -1666,12 +1664,14 @@
"41": { "41": {
"code": 41, "code": 41,
"keyName": ";", "keyName": ";",
"output": "+" "action": ":",
"output": ":"
}, },
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "}" "action": "|",
"output": "|"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -1859,21 +1859,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -1907,8 +1892,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -1918,8 +1902,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -2182,7 +2165,8 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "^" "action": "=",
"output": "="
}, },
"25": { "25": {
"code": 25, "code": 25,
@@ -2217,7 +2201,7 @@
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "[" "output": "]"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -2234,7 +2218,7 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "@" "output": "["
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -2268,7 +2252,7 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": ":" "output": "'"
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -2284,7 +2268,7 @@
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "]" "output": "\\"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -2469,21 +2453,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "¥"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -2517,8 +2486,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -2528,8 +2496,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -3055,22 +3022,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"action": "`",
"deadKey": "dead: `"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -3104,8 +3055,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -3115,8 +3065,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -3231,7 +3180,7 @@
} }
}, },
"4": { "4": {
"label": "Shift+Option", "label": "Option+Shift",
"keys": { "keys": {
"0": { "0": {
"code": 0, "code": 0,
@@ -3640,21 +3589,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "`"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -3688,8 +3622,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -3699,8 +3632,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -4221,21 +4153,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "`"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -4269,8 +4186,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -4280,8 +4196,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -4396,7 +4311,7 @@
} }
}, },
"6": { "6": {
"label": "Command+Option", "label": "Option+Command",
"keys": { "keys": {
"0": { "0": {
"code": 0, "code": 0,
@@ -4793,21 +4708,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -4841,8 +4741,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -4852,8 +4751,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -5367,21 +5265,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -5415,8 +5298,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -5426,8 +5308,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -5984,4 +5865,4 @@
} }
} }
} }
} }

View File

@@ -951,7 +951,8 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "^" "action": "a27",
"output": "="
}, },
"25": { "25": {
"code": 25, "code": 25,
@@ -986,7 +987,8 @@
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "[" "action": "a57",
"output": "]"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -1003,7 +1005,8 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "@" "action": "a56",
"output": "["
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -1037,7 +1040,8 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": ":" "action": "a6",
"output": "'"
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -1054,7 +1058,7 @@
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "]" "output": "\\"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -1240,21 +1244,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "¥"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -1288,8 +1277,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -1299,8 +1287,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -1533,7 +1520,8 @@
"19": { "19": {
"code": 19, "code": 19,
"keyName": "2", "keyName": "2",
"output": "\"" "action": "a29",
"output": "@"
}, },
"20": { "20": {
"code": 20, "code": 20,
@@ -1550,7 +1538,8 @@
"22": { "22": {
"code": 22, "code": 22,
"keyName": "6", "keyName": "6",
"output": "&" "action": "a58",
"output": "^"
}, },
"23": { "23": {
"code": 23, "code": 23,
@@ -1561,37 +1550,44 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "~" "action": "a10",
"output": "+"
}, },
"25": { "25": {
"code": 25, "code": 25,
"keyName": "9", "keyName": "9",
"output": ")" "action": "a7",
"output": "("
}, },
"26": { "26": {
"code": 26, "code": 26,
"keyName": "7", "keyName": "7",
"output": "'" "action": "a5",
"output": "&"
}, },
"27": { "27": {
"code": 27, "code": 27,
"keyName": "-", "keyName": "-",
"output": "=" "action": "a59",
"output": "_"
}, },
"28": { "28": {
"code": 28, "code": 28,
"keyName": "8", "keyName": "8",
"output": "(" "action": "a9",
"output": "*"
}, },
"29": { "29": {
"code": 29, "code": 29,
"keyName": "0", "keyName": "0",
"output": "0" "action": "a8",
"output": ")"
}, },
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "{" "action": "a90",
"output": "}"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -1608,7 +1604,8 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "`" "action": "a88",
"output": "{"
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -1642,7 +1639,8 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": "*" "action": "a1",
"output": "\""
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -1653,12 +1651,14 @@
"41": { "41": {
"code": 41, "code": 41,
"keyName": ";", "keyName": ";",
"output": "+" "action": "a24",
"output": ":"
}, },
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "}" "action": "a89",
"output": "|"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -1846,21 +1846,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -1894,8 +1879,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -1905,8 +1889,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -2169,7 +2152,8 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "^" "action": "a27",
"output": "="
}, },
"25": { "25": {
"code": 25, "code": 25,
@@ -2204,7 +2188,7 @@
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "[" "output": "]"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -2221,7 +2205,7 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "@" "output": "["
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -2255,7 +2239,7 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": ":" "output": "'"
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -2271,7 +2255,7 @@
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "]" "output": "\\"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -2456,21 +2440,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "¥"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -2504,8 +2473,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -2515,8 +2483,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -3041,22 +3008,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"action": "a60",
"deadKey": "3"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -3090,8 +3041,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -3101,8 +3051,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -3217,7 +3166,7 @@
} }
}, },
"4": { "4": {
"label": "Shift+Option", "label": "Option+Shift",
"keys": { "keys": {
"0": { "0": {
"code": 0, "code": 0,
@@ -3626,21 +3575,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "`"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -3674,8 +3608,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -3685,8 +3618,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -4201,21 +4133,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "`"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -4249,8 +4166,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -4260,8 +4176,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -4376,7 +4291,7 @@
} }
}, },
"6": { "6": {
"label": "Command+Option", "label": "Option+Command",
"keys": { "keys": {
"0": { "0": {
"code": 0, "code": 0,
@@ -4773,21 +4688,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -4821,8 +4721,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -4832,8 +4731,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -5347,21 +5245,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -5395,8 +5278,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -5406,8 +5288,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "a80", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -5960,4 +5841,4 @@
} }
} }
} }
} }

View File

@@ -955,7 +955,8 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "^" "action": "=",
"output": "="
}, },
"25": { "25": {
"code": 25, "code": 25,
@@ -990,7 +991,8 @@
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "[" "action": "]",
"output": "]"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -1007,7 +1009,8 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "@" "action": "[",
"output": "["
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -1041,7 +1044,8 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": ":" "action": "'",
"output": "'"
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -1058,7 +1062,7 @@
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "]" "output": "\\"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -1259,21 +1263,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "¥"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -1307,8 +1296,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -1318,8 +1306,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -1553,7 +1540,8 @@
"19": { "19": {
"code": 19, "code": 19,
"keyName": "2", "keyName": "2",
"output": "\"" "action": "@",
"output": "@"
}, },
"20": { "20": {
"code": 20, "code": 20,
@@ -1570,7 +1558,8 @@
"22": { "22": {
"code": 22, "code": 22,
"keyName": "6", "keyName": "6",
"output": "&" "action": "^",
"output": "^"
}, },
"23": { "23": {
"code": 23, "code": 23,
@@ -1581,37 +1570,44 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "~" "action": "+",
"output": "+"
}, },
"25": { "25": {
"code": 25, "code": 25,
"keyName": "9", "keyName": "9",
"output": ")" "action": "(",
"output": "("
}, },
"26": { "26": {
"code": 26, "code": 26,
"keyName": "7", "keyName": "7",
"output": "'" "action": "&",
"output": "&"
}, },
"27": { "27": {
"code": 27, "code": 27,
"keyName": "-", "keyName": "-",
"output": "=" "action": "_",
"output": "_"
}, },
"28": { "28": {
"code": 28, "code": 28,
"keyName": "8", "keyName": "8",
"output": "(" "action": "*",
"output": "*"
}, },
"29": { "29": {
"code": 29, "code": 29,
"keyName": "0", "keyName": "0",
"output": "0" "action": ")",
"output": ")"
}, },
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "{" "action": "}",
"output": "}"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -1628,7 +1624,8 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "`" "action": "{",
"output": "{"
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -1662,7 +1659,8 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": "*" "action": "\"",
"output": "\""
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -1673,12 +1671,14 @@
"41": { "41": {
"code": 41, "code": 41,
"keyName": ";", "keyName": ";",
"output": "+" "action": ":",
"output": ":"
}, },
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "}" "action": "|",
"output": "|"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -1866,21 +1866,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -1914,8 +1899,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -1925,8 +1909,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -2189,7 +2172,8 @@
"24": { "24": {
"code": 24, "code": 24,
"keyName": "=", "keyName": "=",
"output": "^" "action": "=",
"output": "="
}, },
"25": { "25": {
"code": 25, "code": 25,
@@ -2224,7 +2208,7 @@
"30": { "30": {
"code": 30, "code": 30,
"keyName": "]", "keyName": "]",
"output": "[" "output": "]"
}, },
"31": { "31": {
"code": 31, "code": 31,
@@ -2241,7 +2225,7 @@
"33": { "33": {
"code": 33, "code": 33,
"keyName": "[", "keyName": "[",
"output": "@" "output": "["
}, },
"34": { "34": {
"code": 34, "code": 34,
@@ -2275,7 +2259,7 @@
"39": { "39": {
"code": 39, "code": 39,
"keyName": "'", "keyName": "'",
"output": ":" "output": "'"
}, },
"40": { "40": {
"code": 40, "code": 40,
@@ -2291,7 +2275,7 @@
"42": { "42": {
"code": 42, "code": 42,
"keyName": "\\", "keyName": "\\",
"output": "]" "output": "\\"
}, },
"43": { "43": {
"code": 43, "code": 43,
@@ -2476,21 +2460,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "¥"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -2524,8 +2493,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -2535,8 +2503,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -3081,22 +3048,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"action": "`",
"deadKey": "⌥`"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -3130,8 +3081,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -3141,8 +3091,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -3257,7 +3206,7 @@
} }
}, },
"4": { "4": {
"label": "Shift+Option", "label": "Option+Shift",
"keys": { "keys": {
"0": { "0": {
"code": 0, "code": 0,
@@ -3666,21 +3615,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "`"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -3714,8 +3648,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -3725,8 +3658,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -4241,21 +4173,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "`"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -4289,8 +4206,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -4300,8 +4216,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -4416,7 +4331,7 @@
} }
}, },
"6": { "6": {
"label": "Command+Option", "label": "Option+Command",
"keys": { "keys": {
"0": { "0": {
"code": 0, "code": 0,
@@ -4833,21 +4748,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "\\"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -4881,8 +4781,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -4892,8 +4791,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -5417,21 +5315,6 @@
"keyName": "KP9", "keyName": "KP9",
"output": "9" "output": "9"
}, },
"93": {
"code": 93,
"keyName": "ISO§",
"output": "|"
},
"94": {
"code": 94,
"keyName": "ISO_backslash",
"output": "_"
},
"95": {
"code": 95,
"keyName": "ISO_comma",
"output": ","
},
"96": { "96": {
"code": 96, "code": 96,
"keyName": "F5", "keyName": "F5",
@@ -5465,8 +5348,7 @@
"102": { "102": {
"code": 102, "code": 102,
"keyName": "code102", "keyName": "code102",
"action": "space", "output": "\u0010"
"output": " "
}, },
"103": { "103": {
"code": 103, "code": 103,
@@ -5476,8 +5358,7 @@
"104": { "104": {
"code": 104, "code": 104,
"keyName": "code104", "keyName": "code104",
"action": "space", "output": "\u0010"
"output": " "
}, },
"105": { "105": {
"code": 105, "code": 105,
@@ -6031,4 +5912,4 @@
} }
} }
} }
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.