76 lines
2.1 KiB
Bash
76 lines
2.1 KiB
Bash
|
#!/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 <https://www.gnu.org/licenses/>.
|
||
|
|
||
|
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 <stdio.h>\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
|