#!/usr/bin/env bash
#
# This script produces layout data for the System76 Keyboard Configurator.
#
# Copyright (C) 2021 System76
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
set -eEuo pipefail
R=$(git rev-parse --show-toplevel)
cd "${R}"
rm -rf .build/layouts
mkdir -p .build/layouts
D="$(realpath .build/layouts)"
binary="${D}/keymap"
source="${binary}.c"
header="quantum/keycode.h"
printf "#include \n" >"$source"
printf "#include \"%s\"\n\n" "${header}" >>"$source"
echo "int main(int argc, char **argv) {" >>"$source"
grep '^ KC_' "$header" |
cut -d ' ' -f5 |
cut -d ',' -f1 |
while read -r keycode; do
name=$(echo "${keycode}" | cut -d '_' -f2-)
printf " printf(\"%s,0x%%04X\\\n\", $keycode);\n" "${name}" >>"$source"
done
printf "\n return 0;\n}\n" >>"$source"
gcc -I. "$source" -o "$binary"
"${binary}" | tee "${D}/keymap.csv"
cd keyboards
for board in system76/launch_*; do
file="$board/$(basename "$board").h"
if [ ! -e "$file" ]; then
continue
fi
echo "# ${board}"
mkdir -p "${D}/${board}"
cp "${D}/keymap.csv" "${D}/${board}"
row=0
rg \
--multiline \
--multiline-dotall \
--regexp '#define LAYOUT\(.*\) \{.*\}' \
"$file" |
grep --only-matching '\{.*\}' |
sed 's/^{ //' |
sed 's/ }$//' |
sed 's/, / /g' |
while read -r line; do
col=0
for word in $line; do
if [[ "${word}" != "___" ]]; then
echo "${word},${row},${col}"
fi
col=$((col + 1))
done
row=$((row + 1))
done |
sort -n |
tee "${D}/${board}/layout.csv"
done