Ein Knotenskript, das die aktuelle aktive App überprüft, die in Ihrem Betriebssystem ausgeführt wird, anpassbare Regeln anpendelt und den Zielschichtindex an eine QMK -Tastatur über RAW HID sendet, sodass Sie die Ebenen programmatisch ändern können.
Mein Z12 -Mikropad verwendet 4 Schichten: VIM, Browser, Figma und Standard. Encoder machen auf jeder Schicht unterschiedliche Dinge. Meistens wollte ich beim Arbeiten in Figma mit dem richtigen Encoder zoomen, aber wenn ich die Standardschicht aktiv hätte, scrollte der Encoder stattdessen. Dieses Skript behebt diese Art von Problemen und sorgt für die automatische Änderung der Ebene je nach der in OSX ausgeführten Haupt -App -App und vergisst, die Ebene selbst manuell wechseln zu müssen.
Die erste Anforderung ist eine Tastatur, die QMK ausführt und sie so konfigurieren, dass sie RAW HID verwendet. Siehe Beispiel im Abschnitt unten.
Dieses Knotenskript erfordert einen Knoten mit drei Abhängigkeiten: Knoten-HID, JSON-basierte Konditionen und Rules-Logic-Evaluator und Active-Win-Cli. Da der Knoten wahrscheinlich bereits installiert ist, installieren Sie einfach Abhängigkeiten vom Paket.json:
$ npm install
Das Skript überprüft jede halbe Sekunde die App- und Titeloptionen von active-win-cli und senden an den Mikropad den Index der Ebene, die ich je nach App mit der write von node-hid abzielen möchte.
Um zu bestimmen, welcher Index zu senden ist, müssen wir eine Reihe von Bedingungen und Regeln analysieren, die mit einer einfachen JSON -Datei vollständig konfigurierbar sind. Auf diese Weise können wir auch mehrere Skripte verwenden, um gleichzeitig mehrere QMK -Geräte abzuzielen.
Die JSON -Datei ist ein Objekt, das den Produktnamen, die Timer -Werte für die Initialisierung, das Relink im Falle einer Trennung und eines Läufers enthalten (wie oft wir nach den aktuellen App -Daten überprüfen möchten). Es enthält auch zwei Objekte für Bedingungen und Regeln.
Conditons ist ein Objekt, das ein Objekt pro Bedingung enthält, das durch die Regeln analysiert werden soll.
Befolgen Sie die Dokumentation für die Objektstruktur der Conditons und/oder sehen Sie sich auch die in diesem Repo verwendeten Konfiguration an.
Regeln sind ein Array, das ein Objekt pro Satz von Bedingungen enthält.
Befolgen Sie die Dokumentation für die Regelnobjektstruktur und/oder sehen Sie sich auch die in diesem Repo verwendeten Konfigurationen an.
Auf der QMK -Seite müssen Sie in der Datei "Regeln.mk" RAW_ENABLE = yes hinzufügen. Der write aus dem Knotenskript löst die Methode raw_hid_receive auf der QMK aus, wobei Sie layer_clear(); Um frühere Anrufe zu bereinigen, können Sie dann layer_on(data[0]) in die Ebene des Streams ändern.
HINWEIS: Wir senden 99 , wenn wir die Standardschicht (0) wiederherstellen möchten, anscheinend layer_on(data[0]) in raw_hid_receive nicht funktioniert, wenn wir 0 senden.
Beispielcode in Keymap.c:
#include "raw_hid.h"
#ifdef RAW_ENABLE
void raw_hid_receive ( uint8_t * data , uint8_t length ) {
layer_clear ();
if ( data [ 0 ] == 99 ) {
layer_on ( _TERM );
}
else {
layer_on ( data [ 0 ]);
}
}
#endif Das Skript prüft, ob eine Verbindung zu dem Gerät vorhanden ist, das wir steuern möchten, indem Sie node-hid verwenden (wir übergeben nur den Produktnamen, in diesem Fall z12 und die Standard-Nutzungs- und Verwendungswerte). Es wartet darauf, dass eine Verbindung hergestellt wird (es wird alle 2s übertroffen). Es verbindet auch nach der Trennung wieder:
$ node index.js
Die Standard -JSON -Datei ist config.json , aber Sie können einen anderen verwenden und ihren Namen als Argument zum Hauptaufruf hinzufügen:
$ node index.js otherfile.json
Es kann auch aus einem Cron -Job aufgerufen werden.
Sie müssen eine terminale ScreenRecordingPermission in macOS angeben, ansonsten ist Active-Win immer eine leere Zeichenfolge für den Titel.
Vielen Dank an Sindresorhus für den hervorragenden active-win-cli , FauxPark, Voraussetzung und Rible, um mir zu helfen, die Knoten-HID-Verbindung zu verstehen, uint8_t* data Datenzeiger und Methoden, um die Ebene programmatisch zu ändern. Ale Muñoz, der mir geholfen hat, alle globalen DEPs zu entfernen und sie in das Paket zu verlegen.json.