From 993d3f99f32d5b37a1e8367db9a0556cd161eb6d Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Wed, 27 May 2026 18:30:14 +0900 Subject: [PATCH] first commit --- .gitignore | 5 + README.md | 52 ++++++ cmd/hhkb-web/main.go | 237 ++++++++++++++++++++++++ cmd/hhkb-web/web/app.js | 360 ++++++++++++++++++++++++++++++++++++ cmd/hhkb-web/web/index.html | 36 ++++ cmd/hhkb-web/web/style.css | 88 +++++++++ doc/base.png | Bin 0 -> 85833 bytes doc/fn.png | Bin 0 -> 91123 bytes doc/protocol.md | 91 +++++++++ go.mod | 3 + internal/hhkb/device.go | 123 ++++++++++++ internal/hhkb/keymap.go | 43 +++++ internal/hhkb/models.go | 110 +++++++++++ internal/hhkb/palette.go | 29 +++ internal/hhkb/proto.go | 168 +++++++++++++++++ internal/hhkb/scancode.go | 39 ++++ run.sh | 46 +++++ 17 files changed, 1430 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 cmd/hhkb-web/main.go create mode 100644 cmd/hhkb-web/web/app.js create mode 100644 cmd/hhkb-web/web/index.html create mode 100644 cmd/hhkb-web/web/style.css create mode 100644 doc/base.png create mode 100644 doc/fn.png create mode 100644 doc/protocol.md create mode 100644 go.mod create mode 100644 internal/hhkb/device.go create mode 100644 internal/hhkb/keymap.go create mode 100644 internal/hhkb/models.go create mode 100644 internal/hhkb/palette.go create mode 100644 internal/hhkb/proto.go create mode 100644 internal/hhkb/scancode.go create mode 100755 run.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6bae665 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# build artifacts +/hhkb-web + +# cloned reference repositories, not part of this project +/research/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..e739c6b --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# hkkb + +A keymap editor for the HHKB Professional on Linux — what PFU's Windows/Mac-only +tool does, in a browser. It reads and rewrites the keyboard over the keyboard's +own USB-HID protocol; no firmware patching. + +![editor](doc/base.png) + +## Requires + +- **Go** 1.20+ to build — standard library only (no cgo, no Node). +- A **browser**. +- `doas` (or `sudo`) **once**, to let your user open `/dev/hidraw*`. + +## Run + + ./run.sh + +Builds, grants device access the first time (one `doas` prompt), serves +, and opens it. Later runs need no password. + +Change the port with `-port` (e.g. `./run.sh -port 9000`). + +By hand, if you prefer: `go build -o hhkb-web ./cmd/hhkb-web && ./hhkb-web`. + +## Device access + +The vendor interface is root-only by default; `run.sh` installs this rule for you +(use `sudo` if you have no `doas`): + + doas mkdir -p /etc/udev/rules.d + echo 'KERNEL=="hidraw*", ATTRS{idVendor}=="04fe", MODE="0660", GROUP="input"' | doas tee /etc/udev/rules.d/70-hhkb.rules + doas udevadm control --reload-rules && doas udevadm trigger + +You must be in the `input` group. Then `ls -l /dev/hidraw3` reads `root input`. + +## Use + +It auto-detects the model and reads your keymap on connect. Click a key, pick a +keycode, then **Write**. The **Fn** tab edits the Fn layer (`Fn + [` → Up). +**Read** reloads, **Reset** restores defaults, **Save/Load** are JSON, **Key +test** highlights presses while the page is focused. Bottom-row Alt/GUI follow +the keyboard's HHK/Mac mode and come from the live read. + +## Layout + + internal/hhkb/ protocol + data, no UI, no cgo + cmd/hhkb-web/ web server + embedded UI + doc/protocol.md the wire protocol + +Protocol reverse-engineered by happy-hacking-gnu +(). diff --git a/cmd/hhkb-web/main.go b/cmd/hhkb-web/main.go new file mode 100644 index 0000000..9d1e42a --- /dev/null +++ b/cmd/hhkb-web/main.go @@ -0,0 +1,237 @@ +// Command hhkb-web serves a browser-based HHKB keymap editor, styled after the +// QMK Configurator. The Go backend reuses internal/hhkb for all device I/O; the +// browser is just the renderer. +package main + +import ( + "embed" + "encoding/json" + "errors" + "flag" + "fmt" + "io/fs" + "log" + "net/http" + "os" + "os/exec" + "sync" + "time" + + "hkkb/internal/hhkb" +) + +//go:embed web +var webFS embed.FS + +// devMu serializes access: only one request may touch the keyboard at a time. +var devMu sync.Mutex + +func withDevice(fn func(*hhkb.Device) error) error { + devMu.Lock() + defer devMu.Unlock() + d, err := hhkb.Open() + if err != nil { + return err + } + defer d.Close() + return fn(d) +} + +type keyDTO struct { + Num int `json:"num"` + Row int `json:"row"` + X float64 `json:"x"` + W float64 `json:"w"` + Def int `json:"def"` + DefName string `json:"defname"` +} + +type modelDTO struct { + Name string `json:"name"` + Variant string `json:"variant"` + Hybrid bool `json:"hybrid"` + Keys []keyDTO `json:"keys"` +} + +type codeDTO struct { + Code int `json:"code"` + Name string `json:"name"` +} + +type groupDTO struct { + Name string `json:"name"` + Keys []codeDTO `json:"keys"` +} + +type deviceDTO struct { + Connected bool `json:"connected"` + Model string `json:"model"` + Type string `json:"type"` + Serial string `json:"serial"` + Mode string `json:"mode"` + Error string `json:"error"` +} + +func modelsDTO() []modelDTO { + out := make([]modelDTO, 0, len(hhkb.Models)) + for _, m := range hhkb.Models { + md := modelDTO{Name: m.Name, Variant: m.Variant.String(), Hybrid: m.Hybrid} + for _, k := range m.Keys { + w := k.W + if w == 0 { + w = 1 + } + md.Keys = append(md.Keys, keyDTO{ + Num: k.Num, Row: k.Row, X: k.X, W: w, + Def: int(k.Def), DefName: hhkb.KeyName(k.Def), + }) + } + out = append(out, md) + } + return out +} + +func paletteDTO() []groupDTO { + out := make([]groupDTO, 0, len(hhkb.Palette)) + for _, g := range hhkb.Palette { + gd := groupDTO{Name: g.Name} + for _, c := range g.Codes { + gd.Keys = append(gd.Keys, codeDTO{Code: int(c), Name: hhkb.KeyName(c)}) + } + out = append(out, gd) + } + return out +} + +func deviceStatus() deviceDTO { + var out deviceDTO + err := withDevice(func(d *hhkb.Device) error { + out.Connected = true + if m, ok, e := d.DetectModel(); e == nil && ok { + out.Model = m.Name + } + if i, e := d.Info(); e == nil { + out.Type, out.Serial = i.TypeNumber, i.Serial + } + if md, e := d.Mode(); e == nil { + out.Mode = md.String() + } + return nil + }) + if err != nil { + out.Connected = false + out.Error = friendlyErr(err) + } + return out +} + +func friendlyErr(err error) string { + if errors.Is(err, os.ErrPermission) { + return "No access to /dev/hidraw. Run once as root:\n" + + `echo 'KERNEL=="hidraw*", ATTRS{idVendor}=="04fe", MODE="0660", GROUP="input"' | sudo tee /etc/udev/rules.d/70-hhkb.rules` + + "\nsudo udevadm control --reload-rules && sudo udevadm trigger" + } + return err.Error() +} + +func writeJSON(w http.ResponseWriter, v any) { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Cache-Control", "no-store") + _ = json.NewEncoder(w).Encode(v) +} + +func handleInit(w http.ResponseWriter, r *http.Request) { + writeJSON(w, map[string]any{ + "models": modelsDTO(), + "palette": paletteDTO(), + "device": deviceStatus(), + }) +} + +// handleDevice reports just the current device status, for lightweight polling. +func handleDevice(w http.ResponseWriter, r *http.Request) { + writeJSON(w, deviceStatus()) +} + +func handleKeymap(w http.ResponseWriter, r *http.Request) { + fn := r.URL.Query().Get("layer") == "fn" + keys := []map[string]any{} + err := withDevice(func(d *hhkb.Device) error { + lay, err := d.ReadLayer(fn) + if err != nil { + return err + } + for num := 1; num < hhkb.LayerLen; num++ { + code := lay[num] + keys = append(keys, map[string]any{"num": num, "code": int(code), "name": hhkb.KeyName(code)}) + } + return nil + }) + if err != nil { + writeJSON(w, map[string]any{"error": friendlyErr(err)}) + return + } + writeJSON(w, map[string]any{"keys": keys}) +} + +func handleRemap(w http.ResponseWriter, r *http.Request) { + var req struct { + Num int `json:"num"` + Code int `json:"code"` + Fn bool `json:"fn"` + } + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + writeJSON(w, map[string]any{"error": err.Error()}) + return + } + err := withDevice(func(d *hhkb.Device) error { + return d.Remap(req.Num, byte(req.Code), req.Fn) + }) + if err != nil { + writeJSON(w, map[string]any{"error": friendlyErr(err)}) + return + } + writeJSON(w, map[string]any{"ok": true}) +} + +func handleReset(w http.ResponseWriter, r *http.Request) { + err := withDevice(func(d *hhkb.Device) error { return d.Reset() }) + if err != nil { + writeJSON(w, map[string]any{"error": friendlyErr(err)}) + return + } + writeJSON(w, map[string]any{"ok": true}) +} + +func main() { + port := flag.Int("port", 8080, "port to listen on (localhost)") + open := flag.Bool("open", true, "open the editor in a browser") + flag.Parse() + + static, err := fs.Sub(webFS, "web") + if err != nil { + log.Fatal(err) + } + mux := http.NewServeMux() + mux.Handle("/", http.FileServer(http.FS(static))) + mux.HandleFunc("/api/init", handleInit) + mux.HandleFunc("/api/device", handleDevice) + mux.HandleFunc("/api/keymap", handleKeymap) + mux.HandleFunc("/api/remap", handleRemap) + mux.HandleFunc("/api/reset", handleReset) + + addr := fmt.Sprintf("127.0.0.1:%d", *port) + url := "http://" + addr + log.Printf("hkkb editor on %s", url) + if *open { + go openBrowser(url) + } + log.Fatal(http.ListenAndServe(addr, mux)) +} + +func openBrowser(url string) { + time.Sleep(300 * time.Millisecond) + if err := exec.Command("xdg-open", url).Start(); err != nil { + fmt.Println("open", url, "in your browser") + } +} diff --git a/cmd/hhkb-web/web/app.js b/cmd/hhkb-web/web/app.js new file mode 100644 index 0000000..da57110 --- /dev/null +++ b/cmd/hhkb-web/web/app.js @@ -0,0 +1,360 @@ +"use strict"; + +const $ = (sel, el = document) => el.querySelector(sel); +const api = async (path, opts) => (await fetch(path, opts)).json(); + +const U = 54; // pixels per key unit +const GAP = 4; // gap between keycaps + +let DATA; // /api/init payload +const modelsByName = {}; +const names = {}; // scancode -> label +let model; // selected modelDTO +let layer = "base"; // "base" | "fn" +let selected = null; // selected key number +const live = { base: {}, fn: {} }; // num -> code, from device/defaults +const edits = { base: {}, fn: {} };// num -> pending code + +let testMode = false; // key-test: highlight presses (focus-gated, no device needed) +const pressed = new Set(); // key numbers currently held +const keyEls = {}; // num -> DOM element +let codeToNum = {}; // KeyboardEvent.code -> key number +let defByNum = {}; // key number -> default (base) scancode +let deviceReady = false; // auto-read already done since the device appeared + +// HID usage -> KeyboardEvent.code (physical position, OS-layout independent). +const USAGE_TO_CODE = (() => { + const m = {}; + "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("").forEach((c, i) => (m[0x04 + i] = "Key" + c)); + for (let i = 0; i < 9; i++) m[0x1e + i] = "Digit" + (i + 1); + m[0x27] = "Digit0"; + for (let i = 0; i < 12; i++) m[0x3a + i] = "F" + (i + 1); + Object.assign(m, { + 0x28: "Enter", 0x29: "Escape", 0x2a: "Backspace", 0x2b: "Tab", 0x2c: "Space", + 0x2d: "Minus", 0x2e: "Equal", 0x2f: "BracketLeft", 0x30: "BracketRight", 0x31: "Backslash", + 0x33: "Semicolon", 0x34: "Quote", 0x35: "Backquote", 0x36: "Comma", 0x37: "Period", + 0x38: "Slash", 0x39: "CapsLock", + 0x46: "PrintScreen", 0x47: "ScrollLock", 0x48: "Pause", + 0x49: "Insert", 0x4a: "Home", 0x4b: "PageUp", 0x4c: "Delete", 0x4d: "End", 0x4e: "PageDown", + 0x4f: "ArrowRight", 0x50: "ArrowLeft", 0x51: "ArrowDown", 0x52: "ArrowUp", + 0xe0: "ControlLeft", 0xe1: "ShiftLeft", 0xe2: "AltLeft", 0xe3: "MetaLeft", + 0xe4: "ControlRight", 0xe5: "ShiftRight", 0xe6: "AltRight", 0xe7: "MetaRight", + }); + return m; +})(); + +// inverse: KeyboardEvent.code -> HID usage (names the key the keyboard sent). +const CODE_TO_USAGE = Object.fromEntries( + Object.entries(USAGE_TO_CODE).map(([usage, code]) => [code, Number(usage)]) +); + +function codeName(code) { + return names[code] ?? ("0x" + code.toString(16).padStart(2, "0")); +} +function shown(num) { + if (num in edits[layer]) return edits[layer][num]; + if (num in live[layer]) return live[layer][num]; + return layer === "base" ? (defByNum[num] ?? 0) : 0; +} + +async function boot() { + DATA = await api("/api/init"); + DATA.models.forEach(m => (modelsByName[m.name] = m)); + DATA.palette.forEach(g => g.keys.forEach(k => (names[k.code] = k.name))); + DATA.models.forEach(m => m.keys.forEach(k => (names[k.def] = k.defname))); + + buildModelSelect(); + buildLayers(); + buildPalette(); + + const want = DATA.device.model && modelsByName[DATA.device.model] + ? DATA.device.model : DATA.models[0].name; + $("#model").value = want; + selectModel(want); + + // Auto-read on connect: read now if the keyboard is ready, otherwise keep + // checking so it reads by itself the moment you plug in / grant access. + if (!(await refreshDevice())) { + const timer = setInterval(async () => { + if (await refreshDevice()) clearInterval(timer); + }, 2500); + } +} + +// refreshDevice updates the banner and, the first time the keyboard becomes +// available, selects the detected model and reads its keymap. Returns whether +// the device is currently connected. +async function refreshDevice() { + let dev; + try { dev = await api("/api/device"); } catch { return false; } + showBanner(dev); + if (dev.connected && !deviceReady) { + deviceReady = true; + if (dev.model && modelsByName[dev.model] && $("#model").value !== dev.model) { + $("#model").value = dev.model; + selectModel(dev.model); + } + await readAll(); + } + return dev.connected; +} + +function buildModelSelect() { + const sel = $("#model"); + sel.innerHTML = ""; + DATA.models.forEach(m => { + const o = document.createElement("option"); + o.value = m.name; + o.textContent = m.name; + sel.appendChild(o); + }); + sel.onchange = () => selectModel(sel.value); +} + +function selectModel(name) { + model = modelsByName[name]; + defByNum = {}; + model.keys.forEach(k => (defByNum[k.num] = k.def)); + codeToNum = buildCodeMap(); + selected = null; + renderBoard(); +} + +function buildLayers() { + const box = $("#layers"); + box.innerHTML = ""; + [["base", "Base"], ["fn", "Fn"]].forEach(([id, label]) => { + const b = document.createElement("button"); + b.textContent = label; + b.className = "layer" + (id === layer ? " active" : ""); + b.onclick = () => { layer = id; selected = null; buildLayers(); renderBoard(); }; + box.appendChild(b); + }); +} + +function renderBoard() { + const board = $("#board"); + board.innerHTML = ""; + Object.keys(keyEls).forEach(k => delete keyEls[k]); + let maxX = 0, maxRow = 0; + model.keys.forEach(k => { + const d = document.createElement("div"); + d.className = "key"; + keyEls[k.num] = d; + if (k.num === selected) d.classList.add("selected"); + if (k.num in edits[layer]) d.classList.add("changed"); + if (pressed.has(k.num)) d.classList.add("pressed"); + d.style.left = (k.x * U) + "px"; + d.style.top = (k.row * U) + "px"; + d.style.width = (k.w * U - GAP) + "px"; + d.style.height = (U - GAP) + "px"; + d.textContent = codeName(shown(k.num)); + d.title = "key " + k.num; + d.onclick = () => { selected = selected === k.num ? null : k.num; renderBoard(); }; + board.appendChild(d); + maxX = Math.max(maxX, k.x + k.w); + maxRow = Math.max(maxRow, k.row); + }); + board.style.width = (maxX * U) + "px"; + board.style.height = ((maxRow + 1) * U) + "px"; + updateHint(); +} + +function buildPalette() { + const pal = $("#palette"); + pal.innerHTML = ""; + DATA.palette.forEach(g => { + const sec = document.createElement("div"); + sec.className = "group"; + const h = document.createElement("div"); + h.className = "ghead"; + h.textContent = g.name; + sec.appendChild(h); + const row = document.createElement("div"); + row.className = "gkeys"; + g.keys.forEach(c => { + const b = document.createElement("button"); + b.className = "cap"; + b.textContent = c.name; + b.title = "0x" + c.code.toString(16).padStart(2, "0"); + b.onclick = () => assign(c.code); + row.appendChild(b); + }); + sec.appendChild(row); + pal.appendChild(sec); + }); +} + +function assign(code) { + if (selected == null) { toast("Select a key first"); return; } + if ((live[layer][selected] ?? 0) === code) delete edits[layer][selected]; + else edits[layer][selected] = code; + renderBoard(); +} + +function buildCodeMap() { + const m = {}; + model.keys.forEach(k => { + const code = USAGE_TO_CODE[k.def]; + if (code) m[code] = k.num; + }); + return m; +} + +// Focus-gated: we listen only while this page has focus, never in the background. +function setTest(on) { + testMode = on; + $("#test").classList.toggle("active", on); + const recv = $("#recv"); + if (on) { + window.addEventListener("keydown", onKeyDown); + window.addEventListener("keyup", onKeyUp); + recv.hidden = false; + recv.textContent = "Press a key. (The Fn key is handled inside the keyboard and never reaches the computer.)"; + toast("Key test ON — only while this page is focused. Click again to stop."); + } else { + window.removeEventListener("keydown", onKeyDown); + window.removeEventListener("keyup", onKeyUp); + pressed.forEach(n => keyEls[n] && keyEls[n].classList.remove("pressed")); + pressed.clear(); + recv.hidden = true; + } +} + +function onKeyDown(e) { + const usage = CODE_TO_USAGE[e.code]; + if (usage != null && !(e.ctrlKey || e.altKey || e.metaKey)) e.preventDefault(); + $("#recv").textContent = "Keyboard sent: " + (usage != null ? codeName(usage) : e.code); + const num = codeToNum[e.code]; + if (num == null) return; // e.g. an Fn-layer result like Up has no base position + pressed.add(num); + if (keyEls[num]) keyEls[num].classList.add("pressed"); +} + +function onKeyUp(e) { + const num = codeToNum[e.code]; + if (num == null) return; + pressed.delete(num); + if (keyEls[num]) keyEls[num].classList.remove("pressed"); +} + +// baseLabel is what's printed on the physical key (its base-layer assignment). +function baseLabel(num) { + return codeName(live.base[num] ?? defByNum[num] ?? 0); +} + +function updateHint() { + const h = $("#hint"); + const n = changedNums().length; + const pend = n ? ` • ${n} unsaved (press Write)` : ""; + if (selected == null) { + h.textContent = (layer === "fn" + ? "Fn layer — click a key to set what “Fn + that key” sends." + : "Click a key, then pick a keycode below.") + pend; + return; + } + const lhs = layer === "fn" ? `Fn + ${baseLabel(selected)}` : baseLabel(selected); + h.textContent = `${lhs} → ${codeName(shown(selected))}${pend}`; +} + +function changedNums() { return Object.keys(edits[layer]).map(Number); } + +async function write() { + const nums = changedNums(); + if (nums.length === 0) { toast("No changes to write"); return; } + for (const num of nums) { + const res = await api("/api/remap", { + method: "POST", + body: JSON.stringify({ num, code: edits[layer][num], fn: layer === "fn" }), + }); + if (res.error) { toast(res.error); return; } + live[layer][num] = edits[layer][num]; + delete edits[layer][num]; + renderBoard(); + } + toast("Written to keyboard"); +} + +async function readAll() { + for (const lyr of ["base", "fn"]) { + const res = await api("/api/keymap?layer=" + lyr); + if (res.error) { toast(res.error); return; } + live[lyr] = {}; + res.keys.forEach(k => { live[lyr][k.num] = k.code; names[k.code] = k.name; }); + } + edits.base = {}; + edits.fn = {}; + renderBoard(); + toast("Read from keyboard"); +} + +async function reset() { + if (!confirm("Restore the factory default keymap on the keyboard?")) return; + const res = await api("/api/reset", { method: "POST" }); + if (res.error) { toast(res.error); return; } + await readAll(); + toast("Reset to factory defaults"); +} + +function save() { + const data = { model: model.name, base: {}, fn: {} }; + ["base", "fn"].forEach(l => + model.keys.forEach(k => { + const e = edits[l], li = live[l]; + data[l][k.num] = (k.num in e) ? e[k.num] : (li[k.num] ?? 0); + })); + const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json" }); + const a = document.createElement("a"); + a.href = URL.createObjectURL(blob); + a.download = "hkkb-keymap.json"; + a.click(); +} + +function load(file) { + const r = new FileReader(); + r.onload = () => { + try { + const data = JSON.parse(r.result); + ["base", "fn"].forEach(l => { + for (const num in (data[l] || {})) { + if (!(num in defByNum)) continue; // ignore keys not on this model + const code = data[l][num]; + const cur = live[l][num] ?? (l === "base" ? defByNum[num] : 0); + if (cur !== code) edits[l][num] = code; + } + }); + renderBoard(); + toast("Loaded — review the changes, then Write"); + } catch (e) { + toast("Bad file: " + e); + } + }; + r.readAsText(file); +} + +let toastTimer; +function toast(msg) { + const t = $("#toast"); + t.textContent = msg; + t.hidden = false; + clearTimeout(toastTimer); + toastTimer = setTimeout(() => (t.hidden = true), 3500); +} + +function showBanner(dev) { + const b = $("#banner"); + if (dev.connected) { b.hidden = true; return; } + b.hidden = false; + b.textContent = dev.error || "No keyboard connected — showing factory defaults."; +} + +window.addEventListener("DOMContentLoaded", () => { + $("#read").onclick = readAll; + $("#write").onclick = write; + $("#reset").onclick = reset; + $("#save").onclick = save; + $("#load").onclick = () => $("#file").click(); + $("#file").onchange = e => e.target.files[0] && load(e.target.files[0]); + $("#test").onclick = () => setTest(!testMode); + boot().catch(e => toast(String(e))); +}); diff --git a/cmd/hhkb-web/web/index.html b/cmd/hhkb-web/web/index.html new file mode 100644 index 0000000..aba19d3 --- /dev/null +++ b/cmd/hhkb-web/web/index.html @@ -0,0 +1,36 @@ + + + + + +hkkb — HHKB Keymap + + + +
+ hkkb + +
+ + + + + + + + +
+ + +
+ + +
+
+
+
+ + + + + diff --git a/cmd/hhkb-web/web/style.css b/cmd/hhkb-web/web/style.css new file mode 100644 index 0000000..1c6d093 --- /dev/null +++ b/cmd/hhkb-web/web/style.css @@ -0,0 +1,88 @@ +* { box-sizing: border-box; } +body { + margin: 0; + font: 14px/1.4 -apple-system, "Segoe UI", Roboto, sans-serif; + background: #eceff1; + color: #263238; +} + +/* toolbar */ +.toolbar { + display: flex; align-items: center; gap: 14px; + background: #263238; color: #eceff1; + padding: 0 16px; height: 52px; +} +.brand { font-weight: 700; color: #26c6da; letter-spacing: .5px; font-size: 16px; } +.toolbar label { font-size: 13px; color: #b0bec5; display: flex; gap: 6px; align-items: center; } +.toolbar select { + background: #37474f; color: #fff; border: 1px solid #455a64; + border-radius: 4px; padding: 5px 8px; font-size: 13px; +} +.layers { display: flex; gap: 4px; } +.layer { + background: #37474f; color: #cfd8dc; border: 1px solid #455a64; + border-radius: 4px; padding: 5px 14px; cursor: pointer; font-size: 13px; +} +.layer.active { background: #26c6da; color: #06343b; border-color: #26c6da; font-weight: 600; } +.spacer { flex: 1; } +.toolbar button { + background: #37474f; color: #eceff1; border: 1px solid #455a64; + border-radius: 4px; padding: 6px 12px; cursor: pointer; font-size: 13px; +} +.toolbar button:hover { background: #455a64; } +.toolbar button.primary { background: #26c6da; color: #06343b; border-color: #26c6da; font-weight: 600; } +.toolbar button.primary:hover { background: #4dd0e1; } + +/* banners */ +.banner { + background: #fff3cd; border: 1px solid #ffe69c; color: #664d03; + padding: 10px 16px; margin: 12px 16px; border-radius: 6px; + white-space: pre-wrap; font-family: ui-monospace, monospace; font-size: 12px; +} +.hint { margin: 14px 16px 6px; color: #546e7a; font-size: 13px; min-height: 18px; } +.recv { margin: 0 16px 8px; color: #00695c; font-size: 13px; font-weight: 600; } + +/* keyboard */ +.board { + position: relative; margin: 4px 16px 24px; + background: #cfd8dc; border-radius: 10px; padding: 10px; + box-shadow: inset 0 0 0 1px #b0bec5; +} +.key { + position: absolute; + background: linear-gradient(#ffffff, #eceff1); + border: 1px solid #b0bec5; border-bottom-width: 2px; + border-radius: 5px; cursor: pointer; + display: flex; align-items: center; justify-content: center; + font-size: 11px; color: #37474f; text-align: center; + overflow: hidden; user-select: none; padding: 0 2px; +} +.key:hover { border-color: #26c6da; } +.key.selected { outline: 2px solid #26c6da; outline-offset: -1px; z-index: 2; box-shadow: 0 0 0 3px rgba(38,198,218,.25); } +.key.changed { background: linear-gradient(#fff6e6, #ffe2b3); border-color: #e0a040; } + +/* palette */ +.palette { margin: 0 16px 48px; display: flex; flex-wrap: wrap; gap: 18px; align-items: flex-start; } +.group { background: #fff; border: 1px solid #cfd8dc; border-radius: 8px; padding: 10px 12px; } +.ghead { font-size: 11px; text-transform: uppercase; letter-spacing: .6px; color: #78909c; margin-bottom: 8px; } +.gkeys { display: flex; flex-wrap: wrap; gap: 5px; max-width: 330px; } +.cap { + min-width: 38px; height: 34px; padding: 0 7px; + background: linear-gradient(#ffffff, #eceff1); + border: 1px solid #b0bec5; border-bottom-width: 2px; + border-radius: 5px; cursor: pointer; font-size: 11px; color: #37474f; +} +.cap:hover { background: #e0f7fa; border-color: #26c6da; } + +/* key-test highlight + toggled buttons */ +.key.pressed { background: linear-gradient(#b9f6ca, #69f0ae); border-color: #00c853; color: #064d2e; box-shadow: 0 0 0 3px rgba(0,200,83,.25); z-index: 1; } +.toolbar button.active { background: #26c6da; color: #06343b; border-color: #26c6da; font-weight: 600; } + +/* toast */ +.toast { + position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%); + background: #263238; color: #fff; padding: 10px 18px; border-radius: 6px; + box-shadow: 0 4px 16px rgba(0,0,0,.25); white-space: pre-wrap; max-width: 80vw; +} + +[hidden] { display: none !important; } diff --git a/doc/base.png b/doc/base.png new file mode 100644 index 0000000000000000000000000000000000000000..c14b5b3cf91fc3de877ccff59a78949dffe48fc9 GIT binary patch literal 85833 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 literal 0 HcmV?d00001 diff --git a/doc/fn.png b/doc/fn.png new file mode 100644 index 0000000000000000000000000000000000000000..2ece0fb8ab7cfcae6b6247244f6e99a3d6379a79 GIT binary patch literal 91123 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 | — | +| 2 | get info | — | type[20] rev[4] serial[16] fw… | +| 3 | factory reset | — | header `55 55 03 00` on success | +| 4 | confirm keymap | — | — | +| 5 | get DIP | — | 6 bytes, one per switch | +| 6 | get mode | — | 1 byte: 0 HHK, 1 Mac, 2 Lite, 3 Secret | +| 7 | reset DIP | `00 01` | — | +| 134 | write keymap | see below | — | +| 135 | get keymap | `00 02 ` | streamed, see below | + +Firmware commands (208, 224–231) exist but are deliberately unimplemented here. + +## Keymap layout + +A layer is 128 bytes: `layer[keyNumber] = scancode`. Key numbers and the US +(ANSI) geometry live in `keymap.go` (`ANSI`). `` selects base (0) or Fn (1). + +### Read (command 135) + +One request, then three input reports tiling the layer (data at byte 6 of each): + +``` +report 1 -> layer[0:58] +report 2 -> layer[58:116] +report 3 -> layer[116:128] +``` + +### Write (command 134) + +Three requests. The pair after the command id marks offset/length; the first +pass also carries mode and fn before the key bytes: + +``` +AA AA 86 41 3B layer[0:57] +AA AA 86 82 3B layer[57:116] +AA AA 86 C3 0C layer[116:128] +``` + +A full remap is: notify-app(open) → get mode → read layer → set the byte → +write (3 passes) → confirm (4) → reset DIP (7) → notify-app(closed). Reversible +via factory reset (3). diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ab75f44 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module hkkb + +go 1.25.4 diff --git a/internal/hhkb/device.go b/internal/hhkb/device.go new file mode 100644 index 0000000..45f7253 --- /dev/null +++ b/internal/hhkb/device.go @@ -0,0 +1,123 @@ +// Package hhkb talks to the vendor HID interface of an HHKB Professional +// keyboard (PFU, USB 04fe:0020-0022) over /dev/hidraw, the same channel the +// official Keymap Tool uses. It needs no cgo: just file I/O on the device node. +package hhkb + +import ( + "fmt" + "os" + "path/filepath" + "strings" +) + +const reportLen = 64 + +// Device is an open handle to the keyboard's vendor HID interface. +type Device struct { + f *os.File + product uint16 +} + +// Open finds the HHKB vendor interface and opens it for reading and writing. +// +// It identifies the interface from sysfs alone: the right hidraw node belongs +// to USB 04fe:0020 and carries a report descriptor that begins with +// 06 00 ff (Usage Page = Vendor-Defined 0xFF00). The keyboard exposes three +// hidraw nodes; only this one accepts keymap commands. +func Open() (*Device, error) { + nodes, err := filepath.Glob("/sys/class/hidraw/hidraw*") + if err != nil { + return nil, err + } + for _, node := range nodes { + name := filepath.Base(node) + + uevent, err := os.ReadFile(filepath.Join(node, "device/uevent")) + if err != nil { + continue + } + product, ok := parseProduct(string(uevent)) + if !ok { + continue + } + desc, err := os.ReadFile(filepath.Join(node, "device/report_descriptor")) + if err != nil || len(desc) < 3 || desc[0] != 0x06 || desc[1] != 0x00 || desc[2] != 0xff { + continue + } + + f, err := os.OpenFile("/dev/"+name, os.O_RDWR, 0) + if err != nil { + return nil, fmt.Errorf("found %s but cannot open it: %w", name, err) + } + return &Device{f: f, product: product}, nil + } + return nil, fmt.Errorf("HHKB vendor interface (04fe:0020-0022) not found") +} + +// Close releases the device. +func (d *Device) Close() error { return d.f.Close() } + +// Product is the USB product id of the open device: 0x0020 Classic, +// 0x0021 Hybrid, 0x0022 Hybrid Type-S. +func (d *Device) Product() uint16 { return d.product } + +// parseProduct reads the USB product id from a hidraw uevent and reports +// whether the node is a supported HHKB (vendor 04fe, product 0020-0022). +func parseProduct(uevent string) (uint16, bool) { + for _, line := range strings.Split(uevent, "\n") { + v, ok := strings.CutPrefix(line, "HID_ID=") + if !ok { + continue + } + parts := strings.Split(v, ":") // bus:vendor:product + if len(parts) != 3 || !strings.EqualFold(parts[1], "000004FE") { + return 0, false + } + var p uint32 + if _, err := fmt.Sscanf(parts[2], "%x", &p); err != nil { + return 0, false + } + if p < 0x0020 || p > 0x0022 { + return 0, false + } + return uint16(p), true + } + return 0, false +} + +// request builds a 64-byte report: AA AA followed by args, zero-padded. +func request(cmd byte, args ...byte) []byte { + b := make([]byte, reportLen) + b[0], b[1], b[2] = 0xAA, 0xAA, cmd + copy(b[3:], args) + return b +} + +// send writes one report. hidraw takes a leading report-number byte, which the +// kernel discards because this device uses unnumbered reports. +func (d *Device) send(report []byte) error { + _, err := d.f.Write(append([]byte{0x00}, report...)) + return err +} + +// recv reads one 64-byte report. In a reply, the payload starts at byte 6; +// bytes 0..1 are an acknowledgement header (55 55). +func (d *Device) recv() ([]byte, error) { + b := make([]byte, reportLen) + n, err := d.f.Read(b) + if err != nil { + return nil, err + } + if n != reportLen { + return nil, fmt.Errorf("short read: %d/%d bytes", n, reportLen) + } + return b, nil +} + +// do sends a command and returns its single reply. +func (d *Device) do(cmd byte, args ...byte) ([]byte, error) { + if err := d.send(request(cmd, args...)); err != nil { + return nil, err + } + return d.recv() +} diff --git a/internal/hhkb/keymap.go b/internal/hhkb/keymap.go new file mode 100644 index 0000000..9f93133 --- /dev/null +++ b/internal/hhkb/keymap.go @@ -0,0 +1,43 @@ +package hhkb + +// Mode is the keyboard personality selected by the DIP switches. +type Mode byte + +const ( + ModeHHK Mode = iota + ModeMac + ModeLite + ModeSecret +) + +func (m Mode) String() string { + switch m { + case ModeHHK: + return "HHK" + case ModeMac: + return "Mac" + case ModeLite: + return "Lite" + case ModeSecret: + return "Secret" + } + return "unknown" +} + +// LayerLen is the size of one key layer. A key's number indexes directly into +// the layer to give its scancode. +const LayerLen = 128 + +// Layer holds the scancode assigned to every key on one layer. +type Layer [LayerLen]byte + +// Key describes one physical key: its protocol key number, factory default +// scancode, visual row, and position/width in key units (as in QMK layouts, +// where 1.0 is a normal keycap). The key tables live in models.go. +type Key struct { + Num int + Def byte + Row int + X float64 + W float64 +} diff --git a/internal/hhkb/models.go b/internal/hhkb/models.go new file mode 100644 index 0000000..9ee6fea --- /dev/null +++ b/internal/hhkb/models.go @@ -0,0 +1,110 @@ +package hhkb + +import "strings" + +// Variant is the physical key layout of a model. +type Variant int + +const ( + US Variant = iota + JIS +) + +func (v Variant) String() string { + if v == JIS { + return "JIS" + } + return "US" +} + +// Model is a keyboard this tool understands. Keys is its physical layout, in +// reading order; Hybrid marks the Hybrid/Type-S boards, which reserve a few Fn +// keys in firmware. +type Model struct { + Name string + Product uint16 + Variant Variant + Hybrid bool + Keys []Key +} + +// Models lists every supported model. The US/JIS split mirrors the official +// tool; the product id groups the Classic, Hybrid, and Hybrid Type-S families. +var Models = []Model{ + {"HHKB Professional Classic (US)", 0x0020, US, false, ansiKeys}, + {"HHKB Professional Classic (JIS)", 0x0020, JIS, false, jisKeys}, + {"HHKB Professional Hybrid (US)", 0x0021, US, true, ansiKeys}, + {"HHKB Professional Hybrid (JIS)", 0x0021, JIS, true, jisKeys}, + {"HHKB Professional Hybrid Type-S (US)", 0x0022, US, true, ansiKeys}, + {"HHKB Professional Hybrid Type-S (JIS)", 0x0022, JIS, true, jisKeys}, +} + +// MatchModel picks the model for a USB product id and reported type number. +// JIS boards carry "20" in their type number (PD-KB420, PD-KB820); the rest +// are US. Falls back to any model sharing the product id. +func MatchModel(product uint16, typeNumber string) (Model, bool) { + want := US + if strings.Contains(typeNumber, "20") { + want = JIS + } + for _, m := range Models { + if m.Product == product && m.Variant == want { + return m, true + } + } + for _, m := range Models { + if m.Product == product { + return m, true + } + } + return Model{}, false +} + +// DetectModel identifies the connected keyboard from its product id and info. +func (d *Device) DetectModel() (Model, bool, error) { + info, err := d.Info() + if err != nil { + return Model{}, false, err + } + m, ok := MatchModel(d.product, info.TypeNumber) + return m, ok, nil +} + +// ansiKeys is the US (60-key) layout. Geometry matches QMK's LAYOUT_60_hhkb: +// {Num, Def, Row, X, W}, in key units. +var ansiKeys = []Key{ + {60, 0x29, 0, 0, 1}, {59, 0x1e, 0, 1, 1}, {58, 0x1f, 0, 2, 1}, {57, 0x20, 0, 3, 1}, {56, 0x21, 0, 4, 1}, + {55, 0x22, 0, 5, 1}, {54, 0x23, 0, 6, 1}, {53, 0x24, 0, 7, 1}, {52, 0x25, 0, 8, 1}, {51, 0x26, 0, 9, 1}, + {50, 0x27, 0, 10, 1}, {49, 0x2d, 0, 11, 1}, {48, 0x2e, 0, 12, 1}, {47, 0x31, 0, 13, 1}, {46, 0x35, 0, 14, 1}, + {45, 0x2b, 1, 0, 1.5}, {44, 0x14, 1, 1.5, 1}, {43, 0x1a, 1, 2.5, 1}, {42, 0x08, 1, 3.5, 1}, {41, 0x15, 1, 4.5, 1}, + {40, 0x17, 1, 5.5, 1}, {39, 0x1c, 1, 6.5, 1}, {38, 0x18, 1, 7.5, 1}, {37, 0x0c, 1, 8.5, 1}, {36, 0x12, 1, 9.5, 1}, + {35, 0x13, 1, 10.5, 1}, {34, 0x2f, 1, 11.5, 1}, {33, 0x30, 1, 12.5, 1}, {32, 0x2a, 1, 13.5, 1.5}, + {31, 0xe0, 2, 0, 1.75}, {30, 0x04, 2, 1.75, 1}, {29, 0x16, 2, 2.75, 1}, {28, 0x07, 2, 3.75, 1}, {27, 0x09, 2, 4.75, 1}, + {26, 0x0a, 2, 5.75, 1}, {25, 0x0b, 2, 6.75, 1}, {24, 0x0d, 2, 7.75, 1}, {23, 0x0e, 2, 8.75, 1}, {22, 0x0f, 2, 9.75, 1}, + {21, 0x33, 2, 10.75, 1}, {20, 0x34, 2, 11.75, 1}, {19, 0x28, 2, 12.75, 2.25}, + {18, 0xe1, 3, 0, 2.25}, {17, 0x1d, 3, 2.25, 1}, {16, 0x1b, 3, 3.25, 1}, {15, 0x06, 3, 4.25, 1}, {14, 0x19, 3, 5.25, 1}, + {13, 0x05, 3, 6.25, 1}, {12, 0x11, 3, 7.25, 1}, {11, 0x10, 3, 8.25, 1}, {10, 0x36, 3, 9.25, 1}, {9, 0x37, 3, 10.25, 1}, + {8, 0x38, 3, 11.25, 1}, {7, 0xe5, 3, 12.25, 1.75}, {6, 0x01, 3, 14, 1}, + // row 4 — key5/key1 are the narrow outer keys, key4/key2 the wide ones next to + // Space. Which sends Alt vs GUI(◇) depends on the keyboard's mode (HHK vs Mac), + // so the labels come from the live read; the Def values here are the HHK defaults. + {5, 0xe3, 4, 1.5, 1}, {4, 0xe2, 4, 2.5, 1.5}, {3, 0x2c, 4, 4, 7}, {2, 0xe6, 4, 11, 1.5}, {1, 0xe7, 4, 12.5, 1}, +} + +// jisKeys is the Japanese (69-key) layout. Key numbers and rows are fixed; the +// geometry is a uniform grid for now (exact JIS widths are a later refinement), +// and default scancodes are read from the device when connected. +var jisKeys = buildJIS() + +func buildJIS() []Key { + rows := [...][2]int{{69, 55}, {54, 41}, {40, 28}, {27, 14}, {13, 1}} + var keys []Key + for row, span := range rows { + x := 0.0 + for n := span[0]; n >= span[1]; n-- { + keys = append(keys, Key{Num: n, Row: row, X: x, W: 1}) + x++ + } + } + return keys +} diff --git a/internal/hhkb/palette.go b/internal/hhkb/palette.go new file mode 100644 index 0000000..73ff191 --- /dev/null +++ b/internal/hhkb/palette.go @@ -0,0 +1,29 @@ +package hhkb + +// KeycodeGroup is one labelled section of the keycode palette. +type KeycodeGroup struct { + Name string + Codes []byte +} + +// Palette groups the assignable scancodes for the editor, roughly the way the +// official tool and QMK present them. +var Palette = []KeycodeGroup{ + {"Letters", codeRange(0x04, 0x1d)}, + {"Numbers", codeRange(0x1e, 0x27)}, + {"Symbols", []byte{0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}}, + {"Editing", []byte{0x29, 0x2a, 0x2b, 0x28, 0x2c, 0x39}}, + {"Navigation", codeRange(0x49, 0x52)}, + {"Function", codeRange(0x3a, 0x45)}, + {"Modifiers", []byte{0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7}}, + {"Media", []byte{0xe8, 0xe9, 0xea, 0xeb}}, + {"Special", []byte{0x00, 0x01, 0x46, 0x47, 0x48}}, +} + +func codeRange(lo, hi byte) []byte { + out := make([]byte, 0, int(hi-lo)+1) + for c := lo; c <= hi; c++ { + out = append(out, c) + } + return out +} diff --git a/internal/hhkb/proto.go b/internal/hhkb/proto.go new file mode 100644 index 0000000..12b4086 --- /dev/null +++ b/internal/hhkb/proto.go @@ -0,0 +1,168 @@ +package hhkb + +import ( + "bytes" + "fmt" + "strings" +) + +// Command ids — byte 3 of every request. +const ( + cmdNotifyApp = 1 + cmdGetInfo = 2 + cmdFactoryReset = 3 + cmdConfirmKeymap = 4 + cmdGetMode = 6 + cmdResetDIP = 7 + cmdWriteKeymap = 134 + cmdGetKeymap = 135 +) + +// Info describes the connected keyboard. +type Info struct { + TypeNumber string + Revision string + Serial string + AppFirmware string + BootFirmware string +} + +// Info reads the keyboard's identification. +func (d *Device) Info() (Info, error) { + r, err := d.do(cmdGetInfo) + if err != nil { + return Info{}, err + } + p := r[6:] + return Info{ + TypeNumber: cstr(p[0:20]), + Revision: cstr(p[20:24]), + Serial: cstr(p[24:40]), + AppFirmware: fmt.Sprintf("%X", p[40:48]), + BootFirmware: fmt.Sprintf("%X", p[48:56]), + }, nil +} + +// Mode reads the active keyboard mode (set by DIP switches). +func (d *Device) Mode() (Mode, error) { + r, err := d.do(cmdGetMode) + if err != nil { + return 0, err + } + return Mode(r[6]), nil +} + +// ReadLayer reads one full key layer: the base layer, or the Fn layer when +// fn is true. The reply arrives as three reports that tile the 128-byte layer. +func (d *Device) ReadLayer(fn bool) (Layer, error) { + mode, err := d.Mode() + if err != nil { + return Layer{}, err + } + return d.readLayer(mode, fn) +} + +func (d *Device) readLayer(mode Mode, fn bool) (Layer, error) { + var lay Layer + if err := d.send(request(cmdGetKeymap, 0, 2, byte(mode), boolByte(fn))); err != nil { + return lay, err + } + for _, seg := range [...]struct{ off, n int }{{0, 58}, {58, 58}, {116, 12}} { + r, err := d.recv() + if err != nil { + return lay, err + } + copy(lay[seg.off:seg.off+seg.n], r[6:6+seg.n]) + } + return lay, nil +} + +// writeLayer uploads a full layer in the three passes the firmware expects. +// The leading byte pairs (65,59 / 130,59 / 195,12) are offset and length +// markers the controller verifies; the data window is mode+fn followed by the +// 128 key bytes. +func (d *Device) writeLayer(mode Mode, fn bool, lay Layer) error { + passes := []struct { + mark [2]byte + head []byte + data []byte + }{ + {[2]byte{65, 59}, []byte{byte(mode), boolByte(fn)}, lay[0:57]}, + {[2]byte{130, 59}, nil, lay[57:116]}, + {[2]byte{195, 12}, nil, lay[116:128]}, + } + for _, p := range passes { + args := append([]byte{p.mark[0], p.mark[1]}, p.head...) + args = append(args, p.data...) + if _, err := d.do(cmdWriteKeymap, args...); err != nil { + return err + } + } + return nil +} + +// Remap assigns scancode to a key (by its key number) on the base or Fn layer. +// It mirrors the official tool's sequence: announce the tool, edit the layer, +// write it back, commit, and reset DIP state. The change is reversible with +// Reset or by remapping again. +func (d *Device) Remap(keyNum int, scancode byte, fn bool) error { + if keyNum < 1 || keyNum >= LayerLen { + return fmt.Errorf("key number %d out of range", keyNum) + } + if err := d.notifyApp(true); err != nil { + return err + } + defer d.notifyApp(false) + + mode, err := d.Mode() + if err != nil { + return err + } + lay, err := d.readLayer(mode, fn) + if err != nil { + return err + } + lay[keyNum] = scancode + + if err := d.writeLayer(mode, fn, lay); err != nil { + return err + } + if _, err := d.do(cmdConfirmKeymap); err != nil { + return err + } + _, err = d.do(cmdResetDIP, 0, 1) + return err +} + +// Reset restores the factory default keymap. +func (d *Device) Reset() error { + r, err := d.do(cmdFactoryReset) + if err != nil { + return err + } + if !bytes.HasPrefix(r, []byte{0x55, 0x55, 0x03, 0x00}) { + return fmt.Errorf("unexpected factory-reset reply: % X", r[:6]) + } + return nil +} + +// notifyApp tells the keyboard whether the configuration tool is active. +func (d *Device) notifyApp(open bool) error { + _, err := d.do(cmdNotifyApp, 0, 1, boolByte(!open)) + return err +} + +func boolByte(b bool) byte { + if b { + return 1 + } + return 0 +} + +// cstr converts a fixed-width, NUL-padded field into a Go string. +func cstr(b []byte) string { + if i := strings.IndexByte(string(b), 0); i >= 0 { + b = b[:i] + } + return strings.TrimSpace(string(b)) +} diff --git a/internal/hhkb/scancode.go b/internal/hhkb/scancode.go new file mode 100644 index 0000000..130dd52 --- /dev/null +++ b/internal/hhkb/scancode.go @@ -0,0 +1,39 @@ +package hhkb + +import "fmt" + +// scancodeName maps USB HID keyboard usage ids to short labels. 0x01 is the +// HHKB Fn key, which the firmware handles internally rather than reporting. +var scancodeName = map[byte]string{ + 0x00: "--", 0x01: "Fn", + 0x04: "A", 0x05: "B", 0x06: "C", 0x07: "D", 0x08: "E", 0x09: "F", + 0x0a: "G", 0x0b: "H", 0x0c: "I", 0x0d: "J", 0x0e: "K", 0x0f: "L", + 0x10: "M", 0x11: "N", 0x12: "O", 0x13: "P", 0x14: "Q", 0x15: "R", + 0x16: "S", 0x17: "T", 0x18: "U", 0x19: "V", 0x1a: "W", 0x1b: "X", + 0x1c: "Y", 0x1d: "Z", + 0x1e: "1", 0x1f: "2", 0x20: "3", 0x21: "4", 0x22: "5", + 0x23: "6", 0x24: "7", 0x25: "8", 0x26: "9", 0x27: "0", + 0x28: "Enter", 0x29: "Esc", 0x2a: "Bksp", 0x2b: "Tab", 0x2c: "Space", + 0x2d: "-", 0x2e: "=", 0x2f: "[", 0x30: "]", 0x31: "\\", + 0x33: ";", 0x34: "'", 0x35: "`", 0x36: ",", 0x37: ".", 0x38: "/", + 0x39: "Caps", + 0x3a: "F1", 0x3b: "F2", 0x3c: "F3", 0x3d: "F4", 0x3e: "F5", 0x3f: "F6", + 0x40: "F7", 0x41: "F8", 0x42: "F9", 0x43: "F10", 0x44: "F11", 0x45: "F12", + 0x46: "PrtSc", 0x47: "ScrLk", 0x48: "Pause", + 0x49: "Ins", 0x4a: "Home", 0x4b: "PgUp", 0x4c: "Del", 0x4d: "End", 0x4e: "PgDn", + 0x4f: "Right", 0x50: "Left", 0x51: "Down", 0x52: "Up", + 0xe0: "LCtrl", 0xe1: "LShift", 0xe2: "LAlt", 0xe3: "LGUI", + 0xe4: "RCtrl", 0xe5: "RShift", 0xe6: "RAlt", 0xe7: "RGUI", + 0x53: "Numlk", 0x54: "KP/", 0x55: "KP*", 0x56: "KP-", 0x57: "KP+", 0x58: "KPEnt", + 0x66: "Power", + // HHKB media keys (sent via the consumer interface; values are HHKB-internal). + 0xe8: "Vol-", 0xe9: "Vol+", 0xea: "Mute", 0xeb: "Play", +} + +// KeyName returns a label for a scancode, falling back to hex for unknowns. +func KeyName(code byte) string { + if name, ok := scancodeName[code]; ok { + return name + } + return fmt.Sprintf("0x%02x", code) +} diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..5db915a --- /dev/null +++ b/run.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# run.sh — build, ensure the keyboard is accessible, and launch the web editor. +# +# On the first run it asks for your doas password once to install a udev rule +# (and fix the current device node). After that, access is persistent and no +# password is needed. Pass extra flags through to hhkb-web, e.g. ./run.sh -open=false +set -u +cd "$(dirname "$0")" + +echo "[1/3] building hhkb-web…" +go build -o hhkb-web ./cmd/hhkb-web || { echo "build failed"; exit 1; } + +# Locate the HHKB (USB vendor 04fe) hidraw nodes. +node="" +for n in /dev/hidraw*; do + [ -e "$n" ] || continue + if grep -q 000004FE "/sys/class/hidraw/${n##*/}/device/uevent" 2>/dev/null; then + node="$n" + break + fi +done + +if [ -z "$node" ]; then + echo "[2/3] no HHKB detected (is it plugged in?) — starting anyway." +elif [ -r "$node" ] && [ -w "$node" ]; then + echo "[2/3] keyboard already accessible — no password needed." +else + echo "[2/3] granting access (doas password needed once)…" + doas sh -c ' + mkdir -p /etc/udev/rules.d + printf "%s\n" "KERNEL==\"hidraw*\", ATTRS{idVendor}==\"04fe\", MODE=\"0660\", GROUP=\"input\"" \ + > /etc/udev/rules.d/70-hhkb.rules + udevadm control --reload-rules + udevadm trigger + for n in /dev/hidraw*; do + grep -q 000004FE "/sys/class/hidraw/${n##*/}/device/uevent" 2>/dev/null \ + && chgrp input "$n" && chmod g+rw "$n" + done + true + ' && echo " done — rule installed, future runs need no password." \ + || echo " setup failed; the editor will show the access banner." +fi + +pkill -x hhkb-web 2>/dev/null || true # stop any previous instance so the new build is served +echo "[3/3] http://127.0.0.1:8080" +exec ./hhkb-web "$@"