#!/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